commit f53016aedacd6ca6db29b493f5cfdc7667b24ef4 Author: StepanovPlaton Date: Mon Feb 2 22:47:52 2026 +0300 Initial commit diff --git a/.env b/.env new file mode 100644 index 0000000..d6bcd8c --- /dev/null +++ b/.env @@ -0,0 +1,11 @@ +# GitHub OAuth +OAUTH_GITHUB_CLIENT_ID= +OAUTH_GITHUB_CLIENT_SECRET= + +# Decap CMS +PUBLIC_DECAP_CMS_SRC_URL=https://unpkg.com/decap-cms@^3.3.3/dist/decap-cms.js +PUBLIC_DECAP_CMS_VERSION=3.3.3 + +# Umami Analytics +UMAMI_API_KEY= +UMAMI_TRACKING_CODE= \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c944400 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.js linguist-language=astro \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6c2f99b --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# editor config +**/.vscode/ + +# dependencies +node_modules/ + +# generated types +.astro/ +.vercel/ + +# build output +dist/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# private config +.env \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..6baea02 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +manage-package-manager-versions = true \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..309db86 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Spr_Aachen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b8f6418 --- /dev/null +++ b/README.md @@ -0,0 +1,122 @@ +
+ +# Twilight + +A CMS integrated static blog template built with Astro framework. + +[**🖥️ Live Demo**](https://twilight.spr-aachen.com) +[**📝 Documentation**](https://docs.twilight.spr-aachen.com/en) + +[![Bilibili](https://img.shields.io/badge/Bilibili-Intro-blue?logo=Bilibili)](https://space.bilibili.com/359461611/lists/6641229)  +[![YouTube](https://img.shields.io/badge/YouTube-Intro-red?logo=YouTube)](https://youtube.com/playlist?list=PLzjq8Hx1SRV7yqZQiACcCJmKPeg5D8JKe&si=Bcz2o0PF8MFvx8ec) + + + + + + + + + + + + +
Desktop
Mobile_4Mobile_2Mobile_1Mobile_3Mobile_5
+ +
+ +--- + +
+ +English | [**中文**](docs/README_ZH.md) + +
+ + +## ✨ Features + +### Content +- **CMS Functionality**: Easy content management with Decap CMS integration +- **Data Visualization**: Visualized personal data like projects, skills etc. +- **Automatic Navigation**: Automatic generation of post navigation + +### Components +- **Analytics Support**: Umami analytics integration for visitor insights +- **Comment System**: Twikoo-powered comment functionality +- **Music Player**: Background music support with playlist management +- **PIO Widget**: Interactive live2d character support + +### VFX +- **Smooth Transition Animations**: Polished page component transition animations +- **Customizable Theme Colors**: Realtime customizable color schemes +- **Dynamic Wallpaper System**: Carousel support with multiple display modes +- **Immersive Particle Effects**: Highly customizable animated particles + +### Compability +- **Modern & Responsive Design**: Fully optimized for desktop and mobile devices +- **Multilingual Capability**: Built-in translation functionality for global accessibility + + +## 📦 Installation + +1. **Clone the repository:** + ```bash + git clone https://github.com/Spr-Aachen/Twilight.git + cd Twilight + ``` + +2. **Install dependencies:** + ```bash + # Install pnpm if not already installed + npm install -g pnpm + + # Install project dependencies + pnpm install + ``` + +3. **Configure your blog:** + - [Customize blog settings](https://docs.twilight.spr-aachen.com/en/config/core) inside `twilight.config.yaml` + - [Support CMS functionality](https://docs.twilight.spr-aachen.com/en/config/cms) inside `.env` + - [Support Umami analytics](https://docs.twilight.spr-aachen.com/en/config/analytics) inside `.env` + - [Manage site content](https://docs.twilight.spr-aachen.com/en/config/content) inside `src/content` + +4. **Start the development server:** + ```bash + pnpm dev + ``` + + +## 🚀 Deployment + +Deploy your blog to any static hosting platform + + +## ⚡ Commands + +| Command | Action | +|:----------------------------|:----------------------------| +| `pnpm lint` | Check and fix code issues | +| `pnpm format` | Format code with Biome | +| `pnpm check` | Run Astro error checking | +| `pnpm dev` | Start local dev server | +| `pnpm build` | Build site to `./dist/` | +| `pnpm preview` | Preview build locally | +| `pnpm astro ...` | Run Astro CLI commands | +| `pnpm new-post ` | Create a new blog post | + + +## 🙏 Acknowledgements + +- Prototype - [Fuwari](https://github.com/saicaca/fuwari) +- Inspiration - [Yukina](https://github.com/WhitePaper233/yukina) & [Mizuki](https://github.com/matsuzaka-yuki/Mizuki) +- CMS - [astro-decap-cms-oauth](https://github.com/dorukgezici/astro-decap-cms-oauth) +- Translation - [translate](https://gitee.com/mail_osc/translate) + + +## 🤝 Support + +This project is supported by Alibaba Cloud ESA for accelerated delivery, compute, and protection. + + Alibaba Cloud ESA Support + \ No newline at end of file diff --git a/_frontmatter.json b/_frontmatter.json new file mode 100644 index 0000000..d37d700 --- /dev/null +++ b/_frontmatter.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://frontmatter.codes/frontmatter.schema.json", + "frontMatter.framework.id": "astro", + "frontMatter.preview.host": "http://localhost:4321", + "frontMatter.content.publicFolder": "public", + "frontMatter.content.pageFolders": [ + { + "title": "posts", + "path": "[[workspace]]/src/content/posts" + } + ], + "frontMatter.taxonomy.contentTypes": [ + { + "name": "default", + "pageBundle": true, + "previewPath": "'blog'", + "filePrefix": null, + "clearEmpty": true, + "fields": [ + { + "title": "title", + "name": "title", + "type": "string", + "single": true + }, + { + "title": "description", + "name": "description", + "type": "string" + }, + { + "title": "published", + "name": "published", + "type": "datetime", + "default": "{{now}}", + "isPublishDate": true + }, + { + "title": "preview", + "name": "image", + "type": "image", + "isPreviewImage": true + }, + { + "title": "tags", + "name": "tags", + "type": "list" + }, + { + "title": "category", + "name": "category", + "type": "string" + }, + { + "title": "draft", + "name": "draft", + "type": "boolean" + }, + { + "title": "language", + "name": "language", + "type": "string" + } + ] + } + ] +} \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..7e1a8e4 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,209 @@ +import { defineConfig } from "astro/config"; +import { pluginCollapsibleSections } from "@expressive-code/plugin-collapsible-sections"; +import { pluginLineNumbers } from "@expressive-code/plugin-line-numbers"; +import svelte, { vitePreprocess } from "@astrojs/svelte"; +import tailwindcss from "@tailwindcss/vite"; +import swup from "@swup/astro"; +import sitemap from "@astrojs/sitemap"; +import vercel from "@astrojs/vercel"; +import cloudflarePages from "@astrojs/cloudflare"; +import decapCmsOauth from "astro-decap-cms-oauth"; +import expressiveCode from "astro-expressive-code"; +import icon from "astro-icon"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +import rehypeComponents from "rehype-components"; /* Render the custom directive content */ +import rehypeKatex from "rehype-katex"; +import rehypeSlug from "rehype-slug"; +import remarkDirective from "remark-directive"; /* Handle directives */ +import remarkGithubAdmonitionsToDirectives from "remark-github-admonitions-to-directives"; +import remarkMath from "remark-math"; +import remarkSectionize from "remark-sectionize"; + +import { siteConfig } from "./src/config.ts"; +import { pluginCollapseButton } from "./src/plugins/expressive-code/collapse-button.ts"; +import { pluginCopyButton } from "./src/plugins/expressive-code/copy-button.js"; +import { pluginLanguageBadge } from "./src/plugins/expressive-code/language-badge.ts"; +import { AdmonitionComponent } from "./src/plugins/rehype-component-admonition.mjs"; +import { GithubCardComponent } from "./src/plugins/rehype-component-github-card.mjs"; +import { rehypeMermaid } from "./src/plugins/rehype-mermaid.mjs"; +import { parseDirectiveNode } from "./src/plugins/remark-directive-rehype.js"; +import { remarkExcerpt } from "./src/plugins/remark-excerpt.js"; +import { remarkMermaid } from "./src/plugins/remark-mermaid.js"; +import { remarkReadingTime } from "./src/plugins/remark-reading-time.mjs"; + + +// https://astro.build/config +// Choose adapter depending on deployment environment +const adapter = process.env.CF_PAGES ? cloudflarePages() : vercel({ mode: "serverless" }); + +export default defineConfig({ + site: siteConfig.siteURL, + base: "/", + trailingSlash: "always", + adapter: adapter, + integrations: [ + decapCmsOauth({ + decapCMSVersion: "3.3.3", + oauthDisabled: true, // Disable it to use oauth, requires .env configuration + }), + swup({ + theme: false, + animationClass: "transition-swup-", // see https://swup.js.org/options/#animationselector + containers: [ + "#swup-container", + "#left-sidebar", + "#right-sidebar", + ], + cache: true, + preload: true, + accessibility: true, + updateHead: true, + updateBodyClass: false, + globalInstance: true, + // Scroll related configuration optimization + smoothScrolling: false, // Disable smooth scrolling to improve performance and avoid conflicts with anchor navigation + resolveUrl: (url) => url, + animateHistoryBrowsing: false, + skipPopStateHandling: (event) => { + // Skip anchor link handling, let the browser handle it natively + return event.state && event.state.url && event.state.url.includes("#"); + }, + }), + icon({ + include: { + "fa6-brands": ["*"], + "fa6-regular": ["*"], + "fa6-solid": ["*"], + mdi: ["*"], + }, + }), + expressiveCode({ + themes: ["github-light", "github-dark"], + themeCSSSelector: (theme) => `[data-theme="${theme}"]`, + plugins: [ + pluginCollapsibleSections(), + pluginLineNumbers(), + pluginCollapseButton(), + pluginCopyButton(), + pluginLanguageBadge(), + ], + defaultProps: { + wrap: true, + overridesByLang: { + shellsession: { + showLineNumbers: false, + }, + }, + }, + styleOverrides: { + codeBackground: "var(--codeblock-bg)", + borderRadius: "0.75rem", + borderColor: "none", + codeFontSize: "0.875rem", + codeFontFamily: + "'JetBrains Mono Variable', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace", + codeLineHeight: "1.5rem", + frames: { + editorBackground: "var(--codeblock-bg)", + terminalBackground: "var(--codeblock-bg)", + terminalTitlebarBackground: "var(--codeblock-bg)", + editorTabBarBackground: "var(--codeblock-bg)", + editorActiveTabBackground: "none", + editorActiveTabIndicatorBottomColor: "var(--primary)", + editorActiveTabIndicatorTopColor: "none", + editorTabBarBorderBottomColor: "var(--codeblock-bg)", + terminalTitlebarBorderBottomColor: "none", + copyButtonBackground: "var(--btn-regular-bg)", + copyButtonBackgroundHover: "var(--btn-regular-bg-hover)", + copyButtonBackgroundActive: "var(--btn-regular-bg-active)", + copyButtonForeground: "var(--btn-content)", + }, + textMarkers: { + delHue: 0, + insHue: 180, + markHue: 250, + }, + }, + frames: { + showCopyToClipboardButton: false, + }, + }), + svelte({ + preprocess: vitePreprocess(), + }), + sitemap(), + ], + markdown: { + remarkPlugins: [ + remarkMath, + remarkReadingTime, + remarkExcerpt, + remarkGithubAdmonitionsToDirectives, + remarkDirective, + remarkSectionize, + parseDirectiveNode, + remarkMermaid, + ], + rehypePlugins: [ + rehypeKatex, + rehypeSlug, + rehypeMermaid, + [ + rehypeComponents, + { + components: { + github: GithubCardComponent, + note: (x, y) => AdmonitionComponent(x, y, "note"), + tip: (x, y) => AdmonitionComponent(x, y, "tip"), + important: (x, y) => AdmonitionComponent(x, y, "important"), + caution: (x, y) => AdmonitionComponent(x, y, "caution"), + warning: (x, y) => AdmonitionComponent(x, y, "warning"), + }, + }, + ], + [ + rehypeAutolinkHeadings, + { + behavior: "append", + properties: { + className: ["anchor"], + }, + content: { + type: "element", + tagName: "span", + properties: { + className: ["anchor-icon"], + "data-pagefind-ignore": true, + }, + children: [ + { + type: "text", + value: "#", + }, + ], + }, + }, + ], + ], + }, + vite: { + plugins: [tailwindcss()], + build: { + rollupOptions: { + onwarn(warning, warn) { + // temporarily suppress this warning + if ( + warning.message.includes("is dynamically imported by") && + warning.message.includes("but also statically imported by") + ) { + return; + } + warn(warning); + }, + }, + }, + }, + build: { + inlineStylesheets: "always", + }, +}); \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..7d32d92 --- /dev/null +++ b/biome.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**", + "!**/src/**/*.css", + "!**/src/public/**/*", + "!**/dist/**/*", + "!**/node_modules/**/*" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "overrides": [ + { + "includes": ["**/*.svelte", "**/*.astro", "**/*.vue"], + "linter": { + "rules": { + "style": { + "useConst": "off", + "useImportType": "off" + }, + "correctness": { + "noUnusedVariables": "off", + "noUnusedImports": "off" + } + } + } + } + ] +} \ No newline at end of file diff --git a/docs/README_ZH.md b/docs/README_ZH.md new file mode 100644 index 0000000..657e596 --- /dev/null +++ b/docs/README_ZH.md @@ -0,0 +1,122 @@ +
+ +# Twilight + +一个支持后台管理的静态博客主题模板,基于 Astro 框架打造 + +[**🖥️ 演示**](https://twilight.spr-aachen.com) +[**📝 文档**](https://docs.twilight.spr-aachen.com) + +[![Bilibili](https://img.shields.io/badge/Bilibili-Intro-blue?logo=Bilibili)](https://space.bilibili.com/359461611/lists/6641229)  +[![YouTube](https://img.shields.io/badge/YouTube-Intro-red?logo=YouTube)](https://youtube.com/playlist?list=PLzjq8Hx1SRV7yqZQiACcCJmKPeg5D8JKe&si=Bcz2o0PF8MFvx8ec) + + + + + + + + + + + + +
Desktop
Mobile_4Mobile_2Mobile_1Mobile_3Mobile_5
+ +
+ +--- + +
+ +[**English**](../README.md) | 中文 + +
+ + +## ✨ 特性 + +### 内容 +- **CMS 功能**: 基于 Decap CMS 的便捷内容管理 +- **数据可视化**: 可视化的项目、技能等个人数据 +- **自动化导航**: 自动化生成的文章导航 + +### 组件 +- **站点统计**: 集成 Umami 访客统计的站点分析 +- **评论系统**: 基于 Twikoo 的评论功能 +- **音乐播放器**: 背景音乐播放和播放列表管理 +- **看板娘插件**: 可交互的 live2d 角色 + +### 视效 +- **平滑过渡动画**: 精心设计的页面组件过渡动画 +- **自定义主题色**: 可实时调整的个性化配色方案 +- **动态壁纸系统**: 拥有多种显示模式的轮播壁纸 +- **动态粒子系统**: 可高度自定义的动画粒子特效 + +### 适配 +- **响应式设计**: 支持桌面端、移动端无缝切换 +- **多语言能力**: 内置翻译功能,方便全球访问 + + +## 📦 安装 + +1. **克隆仓库** + ```bash + git clone https://github.com/Spr-Aachen/Twilight.git + cd Twilight + ``` + +2. **安装依赖** + ```bash + # Install pnpm if not already installed + npm install -g pnpm + + # Install project dependencies + pnpm install + ``` + +3. **配置博客** + - 在 `twilight.config.yaml` 中 [自定义博客设置](https://docs.twilight.spr-aachen.com/config/core) + - 在 `.env` 中 [配置 CMS 功能](https://docs.twilight.spr-aachen.com/config/cms) + - 在 `.env` 中 [配置站点统计功能](https://docs.twilight.spr-aachen.com/config/analytics) + - 在 `src/content` 中 [管理站点内容](https://docs.twilight.spr-aachen.com/config/content) + +4. **本地调试** + ```bash + pnpm dev + ``` + + +## 🚀 部署 + +将你的博客部署到任何静态托管平台 + + +## ⚡ 命令 + +| 指令 | 说明 | +|:---------------------------|:-------------------------| +| `pnpm lint` | 检查并修复代码问题 | +| `pnpm format` | 使用 Biome 格式化代码 | +| `pnpm check` | 运行 Astro 错误检查 | +| `pnpm dev` | 启动本地服务器 | +| `pnpm build` | 构建站点到 `./dist/` | +| `pnpm preview` | 预览本地构建结果 | +| `pnpm astro ...` | 运行 `Astro CLI` 命令 | +| `pnpm new-post ` | 创建新博客文章 | + + +## 🙏 致谢 + +- 原型 - [Fuwari](https://github.com/saicaca/fuwari) +- 灵感 - [Yukina](https://github.com/WhitePaper233/yukina) & [Mizuki](https://github.com/matsuzaka-yuki/Mizuki) +- CMS - [astro-decap-cms-oauth](https://github.com/dorukgezici/astro-decap-cms-oauth) +- 翻译 - [translate](https://gitee.com/mail_osc/translate) + + +## 🤝 支持 + +本项目由阿里云ESA提供加速、计算和保护 + + 阿里云ESA支持 + \ No newline at end of file diff --git a/docs/image/Desktop.jpg b/docs/image/Desktop.jpg new file mode 100644 index 0000000..78ee9a9 Binary files /dev/null and b/docs/image/Desktop.jpg differ diff --git a/docs/image/Mobile_1.jpg b/docs/image/Mobile_1.jpg new file mode 100644 index 0000000..4c02737 Binary files /dev/null and b/docs/image/Mobile_1.jpg differ diff --git a/docs/image/Mobile_2.jpg b/docs/image/Mobile_2.jpg new file mode 100644 index 0000000..f04443f Binary files /dev/null and b/docs/image/Mobile_2.jpg differ diff --git a/docs/image/Mobile_3.jpg b/docs/image/Mobile_3.jpg new file mode 100644 index 0000000..15b850a Binary files /dev/null and b/docs/image/Mobile_3.jpg differ diff --git a/docs/image/Mobile_4.jpg b/docs/image/Mobile_4.jpg new file mode 100644 index 0000000..17bac10 Binary files /dev/null and b/docs/image/Mobile_4.jpg differ diff --git a/docs/image/Mobile_5.jpg b/docs/image/Mobile_5.jpg new file mode 100644 index 0000000..0f1b273 Binary files /dev/null and b/docs/image/Mobile_5.jpg differ diff --git a/esa.jsonc b/esa.jsonc new file mode 100644 index 0000000..0209a6f --- /dev/null +++ b/esa.jsonc @@ -0,0 +1,17 @@ +{ + // 指定部署的目标项目 + "name": "twilight", + // // 边缘函数的入口执行文件路径 + // "entry": "./src/index.ts", + // 配置自定义安装指令 + "installCommand": "pnpm install", + // 配置自定义构建命令 + "buildCommand": "pnpm run build", + // 静态资源托管功能 + "assets": { + // 构建产物中将被静态托管的目录 + "directory": "./dist", + // 当请求的路径未匹配到任何静态资源时执行的策略 + "notFoundStrategy": "singlePageApplication" + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..289067b --- /dev/null +++ b/package.json @@ -0,0 +1,89 @@ +{ + "name": "twilight", + "type": "module", + "version": "1.0.0", + "description": "A blog template", + "scripts": { + "type-check": "tsc --noEmit --isolatedDeclarations", + "check-stylus": "node scripts/compile-inline-stylus.cjs", + "lint": "biome check --write ./src", + "format": "biome format --write ./src", + "check": "astro check", + "dev": "astro dev", + "build": "node scripts/build-with-pagefind.cjs", + "preview": "astro preview", + "astro": "astro", + "new-post": "node scripts/new-post.js" + }, + "dependencies": { + "@astrojs/check": "^0.9.6", + "@astrojs/cloudflare": "^12.6.12", + "@astrojs/rss": "^4.0.15", + "@astrojs/sitemap": "^3.7.0", + "@astrojs/svelte": "7.2.5", + "@astrojs/vercel": "^9.0.4", + "@expressive-code/core": "^0.41.6", + "@expressive-code/plugin-collapsible-sections": "^0.41.6", + "@expressive-code/plugin-line-numbers": "^0.41.6", + "@fancyapps/ui": "^6.1.10", + "@fontsource-variable/jetbrains-mono": "^5.2.8", + "@fontsource/roboto": "^5.2.9", + "@iconify-json/fa6-brands": "^1.2.6", + "@iconify-json/fa6-regular": "^1.2.4", + "@iconify-json/fa6-solid": "^1.2.4", + "@iconify-json/material-symbols": "^1.2.53", + "@iconify/svelte": "^5.2.1", + "@swup/astro": "^1.7.0", + "@tailwindcss/typography": "^0.5.19", + "@tailwindcss/vite": "^4.1.18", + "@types/js-yaml": "^4.0.9", + "astro": "5.16.15", + "astro-decap-cms-oauth": "^0.5.1", + "astro-expressive-code": "^0.41.6", + "astro-icon": "^1.1.5", + "bcryptjs": "^3.0.3", + "crypto-js": "^4.2.0", + "dayjs": "^1.11.19", + "echarts": "^6.0.0", + "hastscript": "^9.0.1", + "js-yaml": "^4.1.1", + "katex": "^0.16.28", + "markdown-it": "^14.1.0", + "marked": "^17.0.1", + "mdast-util-to-string": "^4.0.0", + "node-html-parser": "^7.0.2", + "overlayscrollbars": "^2.14.0", + "pagefind": "^1.4.0", + "photoswipe": "^5.4.4", + "reading-time": "^1.5.0", + "rehype-autolink-headings": "^7.1.0", + "rehype-components": "^0.3.0", + "rehype-katex": "^7.0.1", + "rehype-slug": "^6.0.0", + "remark-directive": "^4.0.0", + "remark-directive-rehype": "^0.4.2", + "remark-github-admonitions-to-directives": "^2.1.0", + "remark-math": "^6.0.0", + "remark-sectionize": "^2.1.0", + "sanitize-html": "^2.17.0", + "satori": "^0.19.1", + "sharp": "^0.34.5", + "stylus": "^0.64.0", + "svelte": "^5.49.1", + "tailwindcss": "^4.1.18", + "typescript": "^5.9.3", + "unist-util-visit": "^5.1.0" + }, + "devDependencies": { + "@astrojs/ts-plugin": "^1.10.6", + "@biomejs/biome": "2.3.13", + "@iconify-json/mdi": "^1.2.3", + "@rollup/plugin-yaml": "^4.1.2", + "@types/hast": "^3.0.4", + "@types/markdown-it": "^14.1.2", + "@types/mdast": "^4.0.4", + "@types/sanitize-html": "^2.16.0", + "postcss-import": "^16.1.1" + }, + "packageManager": "pnpm@9.14.4" +} \ No newline at end of file diff --git a/pagefind.yml b/pagefind.yml new file mode 100644 index 0000000..49c9348 --- /dev/null +++ b/pagefind.yml @@ -0,0 +1,6 @@ +exclude_selectors: + - "span.katex" + - "span.katex-display" + - "[data-pagefind-ignore]" + - ".search-panel" + - "#search-panel" \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..cbd6f67 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,11999 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@astrojs/check': + specifier: ^0.9.6 + version: 0.9.6(prettier@3.8.1)(typescript@5.9.3) + '@astrojs/cloudflare': + specifier: ^12.6.12 + version: 12.6.12(@types/node@25.1.0)(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + '@astrojs/rss': + specifier: ^4.0.15 + version: 4.0.15 + '@astrojs/sitemap': + specifier: ^3.7.0 + version: 3.7.0 + '@astrojs/svelte': + specifier: 7.2.5 + version: 7.2.5(@types/node@25.1.0)(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(svelte@5.49.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + '@astrojs/vercel': + specifier: ^9.0.4 + version: 9.0.4(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@2.79.2)(svelte@5.49.1) + '@expressive-code/core': + specifier: ^0.41.6 + version: 0.41.6 + '@expressive-code/plugin-collapsible-sections': + specifier: ^0.41.6 + version: 0.41.6 + '@expressive-code/plugin-line-numbers': + specifier: ^0.41.6 + version: 0.41.6 + '@fancyapps/ui': + specifier: ^6.1.10 + version: 6.1.10 + '@fontsource-variable/jetbrains-mono': + specifier: ^5.2.8 + version: 5.2.8 + '@fontsource/roboto': + specifier: ^5.2.9 + version: 5.2.9 + '@iconify-json/fa6-brands': + specifier: ^1.2.6 + version: 1.2.6 + '@iconify-json/fa6-regular': + specifier: ^1.2.4 + version: 1.2.4 + '@iconify-json/fa6-solid': + specifier: ^1.2.4 + version: 1.2.4 + '@iconify-json/material-symbols': + specifier: ^1.2.53 + version: 1.2.53 + '@iconify/svelte': + specifier: ^5.2.1 + version: 5.2.1(svelte@5.49.1) + '@swup/astro': + specifier: ^1.7.0 + version: 1.7.0(@types/babel__core@7.20.5) + '@tailwindcss/typography': + specifier: ^0.5.19 + version: 0.5.19(tailwindcss@4.1.18) + '@tailwindcss/vite': + specifier: ^4.1.18 + version: 4.1.18(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)) + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 + astro: + specifier: 5.16.15 + version: 5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + astro-decap-cms-oauth: + specifier: ^0.5.1 + version: 0.5.1(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + astro-expressive-code: + specifier: ^0.41.6 + version: 0.41.6(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)) + astro-icon: + specifier: ^1.1.5 + version: 1.1.5 + bcryptjs: + specifier: ^3.0.3 + version: 3.0.3 + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 + dayjs: + specifier: ^1.11.19 + version: 1.11.19 + echarts: + specifier: ^6.0.0 + version: 6.0.0 + hastscript: + specifier: ^9.0.1 + version: 9.0.1 + js-yaml: + specifier: ^4.1.1 + version: 4.1.1 + katex: + specifier: ^0.16.28 + version: 0.16.28 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + marked: + specifier: ^17.0.1 + version: 17.0.1 + mdast-util-to-string: + specifier: ^4.0.0 + version: 4.0.0 + node-html-parser: + specifier: ^7.0.2 + version: 7.0.2 + overlayscrollbars: + specifier: ^2.14.0 + version: 2.14.0 + pagefind: + specifier: ^1.4.0 + version: 1.4.0 + photoswipe: + specifier: ^5.4.4 + version: 5.4.4 + reading-time: + specifier: ^1.5.0 + version: 1.5.0 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-components: + specifier: ^0.3.0 + version: 0.3.0 + rehype-katex: + specifier: ^7.0.1 + version: 7.0.1 + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark-directive: + specifier: ^4.0.0 + version: 4.0.0 + remark-directive-rehype: + specifier: ^0.4.2 + version: 0.4.2 + remark-github-admonitions-to-directives: + specifier: ^2.1.0 + version: 2.1.0 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 + remark-sectionize: + specifier: ^2.1.0 + version: 2.1.0 + sanitize-html: + specifier: ^2.17.0 + version: 2.17.0 + satori: + specifier: ^0.19.1 + version: 0.19.1 + sharp: + specifier: ^0.34.5 + version: 0.34.5 + stylus: + specifier: ^0.64.0 + version: 0.64.0 + svelte: + specifier: ^5.49.1 + version: 5.49.1 + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + unist-util-visit: + specifier: ^5.1.0 + version: 5.1.0 + devDependencies: + '@astrojs/ts-plugin': + specifier: ^1.10.6 + version: 1.10.6 + '@biomejs/biome': + specifier: 2.3.13 + version: 2.3.13 + '@iconify-json/mdi': + specifier: ^1.2.3 + version: 1.2.3 + '@rollup/plugin-yaml': + specifier: ^4.1.2 + version: 4.1.2(rollup@2.79.2) + '@types/hast': + specifier: ^3.0.4 + version: 3.0.4 + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@types/mdast': + specifier: ^4.0.4 + version: 4.0.4 + '@types/sanitize-html': + specifier: ^2.16.0 + version: 2.16.0 + postcss-import: + specifier: ^16.1.1 + version: 16.1.1(postcss@8.5.6) + +packages: + + '@adobe/css-tools@4.3.3': + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + + '@astrojs/check@0.9.6': + resolution: {integrity: sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + '@astrojs/cloudflare@12.6.12': + resolution: {integrity: sha512-f6iXreyJc02EhokqsoPf7D/s3tebyZ8dBNVOyY2JDY87ujft4RokVS1f+zNwNFyu0wkehC4ALUboU5z590DE4w==} + peerDependencies: + astro: ^5.7.0 + + '@astrojs/compiler@2.13.0': + resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} + + '@astrojs/internal-helpers@0.7.5': + resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} + + '@astrojs/language-server@2.16.3': + resolution: {integrity: sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@6.3.10': + resolution: {integrity: sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==} + + '@astrojs/prism@3.3.0': + resolution: {integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/rss@4.0.15': + resolution: {integrity: sha512-uXO/k6AhRkIDXmRoc6xQpoPZrimQNUmS43X4+60yunfuMNHtSRN5e/FiSi7NApcZqmugSMc5+cJi8ovqgO+qIg==} + + '@astrojs/sitemap@3.7.0': + resolution: {integrity: sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==} + + '@astrojs/svelte@7.2.5': + resolution: {integrity: sha512-Tl5aF/dYbzzd7sLpxMBX6pRz3yJ1B4pilt9G3GJbj0I0/doJHIEmerNQsnlxX0/InNKUhMXXN8wyyet9VhA+Zw==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + peerDependencies: + astro: ^5.0.0 + svelte: ^5.1.16 + typescript: ^5.3.3 + + '@astrojs/telemetry@3.3.0': + resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@astrojs/ts-plugin@1.10.6': + resolution: {integrity: sha512-Ke5CNwxn/ozsh6THJKuayUlBToa3uiPDi2oSwcXmTdeiJ0PGr+UkdQJf9hdMgBjbIka9fhnSn3UhYamfNfJ73A==} + + '@astrojs/underscore-redirects@1.0.0': + resolution: {integrity: sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ==} + + '@astrojs/vercel@9.0.4': + resolution: {integrity: sha512-Nn5c0CODcx69FnNUhAcAhlDQ/Je2lLrlPmbMMI77ZvLMfyZI5NZyKD7MiKEeaYK/VTnx6fNI5rFHm6seqEPRtQ==} + peerDependencies: + astro: ^5.0.0 + + '@astrojs/yaml2ts@0.2.2': + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} + + '@babel/code-frame@7.28.6': + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.6': + resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.6': + resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-class-properties@7.12.1': + resolution: {integrity: sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.28.6': + resolution: {integrity: sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.6': + resolution: {integrity: sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.28.6': + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': + resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.6': + resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.28.6': + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.6': + resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.28.6': + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.28.6': + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6': + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.6': + resolution: {integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.28.5': + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@2.3.13': + resolution: {integrity: sha512-Fw7UsV0UAtWIBIm0M7g5CRerpu1eKyKAXIazzxhbXYUyMkwNrkX/KLkGI7b+uVDQ5cLUMfOC9vR60q9IDYDstA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.3.13': + resolution: {integrity: sha512-0OCwP0/BoKzyJHnFdaTk/i7hIP9JHH9oJJq6hrSCPmJPo8JWcJhprK4gQlhFzrwdTBAW4Bjt/RmCf3ZZe59gwQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.3.13': + resolution: {integrity: sha512-AGr8OoemT/ejynbIu56qeil2+F2WLkIjn2d8jGK1JkchxnMUhYOfnqc9sVzcRxpG9Ycvw4weQ5sprRvtb7Yhcw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.3.13': + resolution: {integrity: sha512-TUdDCSY+Eo/EHjhJz7P2GnWwfqet+lFxBZzGHldrvULr59AgahamLs/N85SC4+bdF86EhqDuuw9rYLvLFWWlXA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.3.13': + resolution: {integrity: sha512-xvOiFkrDNu607MPMBUQ6huHmBG1PZLOrqhtK6pXJW3GjfVqJg0Z/qpTdhXfcqWdSZHcT+Nct2fOgewZvytESkw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.3.13': + resolution: {integrity: sha512-0bdwFVSbbM//Sds6OjtnmQGp4eUjOTt6kHvR/1P0ieR9GcTUAlPNvPC3DiavTqq302W34Ae2T6u5VVNGuQtGlQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.3.13': + resolution: {integrity: sha512-s+YsZlgiXNq8XkgHs6xdvKDFOj/bwTEevqEY6rC2I3cBHbxXYU1LOZstH3Ffw9hE5tE1sqT7U23C00MzkXztMw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.3.13': + resolution: {integrity: sha512-QweDxY89fq0VvrxME+wS/BXKmqMrOTZlN9SqQ79kQSIc3FrEwvW/PvUegQF6XIVaekncDykB5dzPqjbwSKs9DA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.3.13': + resolution: {integrity: sha512-trDw2ogdM2lyav9WFQsdsfdVy1dvZALymRpgmWsvSez0BJzBjulhOT/t+wyKeh3pZWvwP3VMs1SoOKwO3wecMQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@capsizecss/unpack@4.0.0': + resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} + engines: {node: '>=18'} + + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + + '@cloudflare/unenv-preset@2.7.11': + resolution: {integrity: sha512-se23f1D4PxKrMKOq+Stz+Yn7AJ9ITHcEecXo2Yjb+UgbUDCEBch1FXQC6hx6uT5fNA3kmX3mfzeZiUmpK1W9IQ==} + peerDependencies: + unenv: 2.0.0-rc.24 + workerd: ^1.20251106.1 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20251118.0': + resolution: {integrity: sha512-UmWmYEYS/LkK/4HFKN6xf3Hk8cw70PviR+ftr3hUvs9HYZS92IseZEp16pkL6ZBETrPRpZC7OrzoYF7ky6kHsg==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20251118.0': + resolution: {integrity: sha512-RockU7Qzf4rxNfY1lx3j4rvwutNLjTIX7rr2hogbQ4mzLo8Ea40/oZTzXVxl+on75joLBrt0YpenGW8o/r44QA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20251118.0': + resolution: {integrity: sha512-aT97GnOAbJDuuOG0zPVhgRk0xFtB1dzBMrxMZ09eubDLoU4djH4BuORaqvxNRMmHgKfa4T6drthckT0NjUvBdw==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20251118.0': + resolution: {integrity: sha512-bXZPJcwlq00MPOXqP7DMWjr+goYj0+Fqyw6zgEC2M3FR1+SWla4yjghnZ4IdpN+H1t7VbUrsi5np2LzMUFs0NA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20251118.0': + resolution: {integrity: sha512-2LV99AHSlpr8WcCb/BYbU2QsYkXLUL1izN6YKWkN9Eibv80JKX0RtgmD3dfmajE5sNvClavxZejgzVvHD9N9Ag==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20260131.0': + resolution: {integrity: sha512-ELgvb2mp68Al50p+FmpgCO2hgU5o4tmz8pi7kShN+cRXc0UZoEdxpDIikR0CeT7b3tV7wlnEnsUzd0UoJLS0oQ==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.1': + resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@expressive-code/core@0.41.6': + resolution: {integrity: sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==} + + '@expressive-code/plugin-collapsible-sections@0.41.6': + resolution: {integrity: sha512-LxSa49aziWKgpGoOoZlTbXW1V1/mEPyxKb+J9JFgUtTizXNKX363uiCHcKQYzSLmIN7HII5WxF+uArGHwb+X+w==} + + '@expressive-code/plugin-frames@0.41.6': + resolution: {integrity: sha512-d+hkSYXIQot6fmYnOmWAM+7TNWRv/dhfjMsNq+mIZz8Tb4mPHOcgcfZeEM5dV9TDL0ioQNvtcqQNuzA1sRPjxg==} + + '@expressive-code/plugin-line-numbers@0.41.6': + resolution: {integrity: sha512-YS8oLrGNBjY8qVVl6ZntwPXIh5HGrLEq23R6eyJ0tCJQmq03tCOOiWw9cc2R3J/XobXAI7coAtVbqAiGFB8pXQ==} + + '@expressive-code/plugin-shiki@0.41.6': + resolution: {integrity: sha512-Y6zmKBmsIUtWTzdefqlzm/h9Zz0Rc4gNdt2GTIH7fhHH2I9+lDYCa27BDwuBhjqcos6uK81Aca9dLUC4wzN+ng==} + + '@expressive-code/plugin-text-markers@0.41.6': + resolution: {integrity: sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==} + + '@fancyapps/ui@6.1.10': + resolution: {integrity: sha512-sLiIk2jLPY10nzuZu5fMMaS5//8g44QrSREVnI4VXs4Kih+g2wMUyfgsOdTqw36BfVh6ghmMKadm+Mmxy5ynvw==} + + '@fontsource-variable/jetbrains-mono@5.2.8': + resolution: {integrity: sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==} + + '@fontsource/roboto@5.2.9': + resolution: {integrity: sha512-ZTkyHiPk74B/aj8BZWbsxD5Yu+Lq+nR64eV4wirlrac2qXR7jYk2h6JlLYuOuoruTkGQWNw2fMuKNavw7/rg0w==} + + '@iconify-json/fa6-brands@1.2.6': + resolution: {integrity: sha512-twL3X4KWcxAhbc1vz/mIDsVr+CAItk1/EIfxKUVQtpv6O4eydk5KNYqTZWdvJNHGInUgd6vKg21aWfVgb5DXEg==} + + '@iconify-json/fa6-regular@1.2.4': + resolution: {integrity: sha512-fnUS/MLj3ZAp29oRsC8/aY8Wau7NIg7VesTz3jCcE6VJBzcz95Yxp/Dl5yHvkP+aQxrNw5Lj3nrOXB4nQh+oNA==} + + '@iconify-json/fa6-solid@1.2.4': + resolution: {integrity: sha512-LmDNNdJVyvF5mPm1yxWvL8KjCc/E8LzoqnF1LNTVpyY2ZJRUlGOWuPIThdbuFBF2IovgttkIyumhyqfmlHdwKg==} + + '@iconify-json/material-symbols@1.2.53': + resolution: {integrity: sha512-2jXBKFdNzL9zy6chnJqubykL9WZno7rEP6/isSzpp6fKJJMXXhRtVkaGw1Clle0RlXGWzVkd/eiYUH8f9/ILrQ==} + + '@iconify-json/mdi@1.2.3': + resolution: {integrity: sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg==} + + '@iconify/svelte@5.2.1': + resolution: {integrity: sha512-zHmsIPmnIhGd5gc95bNN5FL+GifwMZv7M2rlZEpa7IXYGFJm/XGHdWf6PWQa6OBoC+R69WyiPO9NAj5wjfjbow==} + peerDependencies: + svelte: '>5.0.0' + + '@iconify/tools@4.2.0': + resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@pagefind/darwin-arm64@1.4.0': + resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.4.0': + resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} + cpu: [x64] + os: [darwin] + + '@pagefind/freebsd-x64@1.4.0': + resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.4.0': + resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.4.0': + resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-x64@1.4.0': + resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} + cpu: [x64] + os: [win32] + + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + + '@poppinss/dumper@0.6.5': + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + + '@rollup/plugin-alias@3.1.9': + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} + engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-babel@5.3.1': + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + + '@rollup/plugin-commonjs@17.1.0': + resolution: {integrity: sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.30.0 + + '@rollup/plugin-json@4.1.0': + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + + '@rollup/plugin-node-resolve@11.2.1': + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/plugin-yaml@4.1.2': + resolution: {integrity: sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@3.1.0': + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.22.0': + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} + + '@shikijs/engine-javascript@3.22.0': + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} + + '@shikijs/engine-oniguruma@3.22.0': + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} + + '@shikijs/langs@3.22.0': + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} + + '@shikijs/themes@3.22.0': + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} + + '@shikijs/types@3.22.0': + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@shuding/opentype.js@1.4.0-beta.0': + resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} + engines: {node: '>= 8.0.0'} + hasBin: true + + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.14': + resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + + '@sveltejs/acorn-typescript@1.0.8': + resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@swup/a11y-plugin@5.0.0': + resolution: {integrity: sha512-t0pVWAVea+Imjj05n9QMPfqZhw9i5rx7BV/l3Ejeic+X3Qs0VZwVvEJIcdqireCVJgAJGZAPlmgbiuaj5UHJaQ==} + peerDependencies: + swup: ^4.0.0 + + '@swup/astro@1.7.0': + resolution: {integrity: sha512-OxZskzeYkEZ4+McbwJKyD018sHNlrKQLdtHzlmNjivrzQY/dB7ncnWqDs3d4IkA7Y+ydNjpwBqpR/asjDhTiag==} + + '@swup/body-class-plugin@3.3.0': + resolution: {integrity: sha512-4h/6mAgDd0+ml8Gc2kX8tikIR0HZZLF+WTnfm0JTVrGDw74bgEBenbsaWFfIS+gn4RWKZdWBUOfaZ+Im5J7Gvw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/browserslist-config@1.0.1': + resolution: {integrity: sha512-/3nBqG7LqmK1uqaCSTA6s2NwQBDQXNyLAFBzlX6uaxqjIQcAZyq6K+sgcQ40oj02Vn/2mLSkeL9DOfP7BPOwVA==} + + '@swup/debug-plugin@4.1.0': + resolution: {integrity: sha512-R+RP4hjoeXrO+wowSswaTM4P05lu6iDg6UwdbQn0wfJ082KiUpH+DDwHYNOatxusKVExFuhLec+X9IbyAyiv8w==} + peerDependencies: + swup: ^4.0.0 + + '@swup/fade-theme@2.0.2': + resolution: {integrity: sha512-x2XLIzAk8akrmVkozrlv0cU8wWnzt8MC164F1801qdffzY7mOi1v2mHl5Db9pqrP3BZ4UqC+5683/hQJ4obYEA==} + peerDependencies: + swup: ^4.0.0 + + '@swup/forms-plugin@3.6.0': + resolution: {integrity: sha512-pRN6OR5wR27LvJqQOlCgu1fP9Z0ZsGauxWOE6nRCtjP1+98wlGTMiMsQ+jGvvs+IOK9IDTJQ7jvprnJAZaw9zw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/fragment-plugin@1.2.0': + resolution: {integrity: sha512-pn8NsIlvM3xYn4XCWOp3T9m5jEjt2dszSqiZUQmf1/77b/K8o/zes2RFjpZOwJiB8TtcuMvnXCml3cZuSA2J4w==} + peerDependencies: + swup: ^4.6.0 + + '@swup/head-plugin@2.3.1': + resolution: {integrity: sha512-kdv60fO9c0/3+K40f7Fj/uV34nSuuPeCsld83J5uVVFizOmoovA737C5M1Iqac5Spf2GLU7q+mhN6AbohSIBjA==} + peerDependencies: + swup: ^4.6.0 + + '@swup/overlay-theme@2.0.2': + resolution: {integrity: sha512-nfk5jrEru0lbFzlOzkT/f77sUwVHM/iUzlPMAT/KkWecn4/YuT4Y+lgIY3Se9VtD8TbSFrXYoHJea4GMZPJRAg==} + peerDependencies: + swup: ^4.0.0 + + '@swup/parallel-plugin@0.4.0': + resolution: {integrity: sha512-un37RpdFz2vuJV1r9Hr0nCl5qgloN/Z3SczC3wi1XfkiHtzZ8kFTcm5pIW5rUkDVwtCTil44mlAA/STouBEgDw==} + peerDependencies: + swup: ^4.6.0 + + '@swup/plugin@3.0.1': + resolution: {integrity: sha512-A9yiJeKTmQ9kac2Eo3MbMWW+Tiw23W5OSzAHVTCfW6n5zze6dexY3FLEUSDTcvRgciknvXfMZ9JTnebbvCKKWw==} + hasBin: true + + '@swup/plugin@4.0.0': + resolution: {integrity: sha512-3Kq31BJxnzoPg643YxGoWQggoU6VPKZpdE5CqqmP7wwkpCYTzkRmrfcQ29mGhsSS7xfS7D33iZoBiwY+wPoo2A==} + + '@swup/preload-plugin@3.2.11': + resolution: {integrity: sha512-dq50u+d8L+63/pU6dUDnypuBoF49ubjRzRJqitGem2K7wRn7xccxRSvdyeGKdA2vNvzGDAmLfwVTZdSotvvDrw==} + peerDependencies: + swup: ^4.0.0 + + '@swup/prettier-config@1.1.0': + resolution: {integrity: sha512-EF4DMdIGieEsuY2XK0PuLf7Uw7yUQOMbA6IdCMvvRvKXj03WLLpnNIFfFp+6hmMtXRSUE88VBpRyp6Giiu1Pbg==} + + '@swup/progress-plugin@3.2.0': + resolution: {integrity: sha512-Ur+D4+aee9swR6pn7JbEyGMwVP1BTcN5ygjlno7IaSQ/vMZbuJ73po1RkKlIi86p+/PZ+1kynkH4K4eMZuHKKg==} + peerDependencies: + swup: ^4.0.0 + + '@swup/route-name-plugin@4.1.0': + resolution: {integrity: sha512-1tw3WeExEKwI3pVMXTptCGxFUDOSEpc63D741eeUCjjGW/f9q7ekuqEaPQd5YJ6POpzDjdt1jjuC9yv54CbeXA==} + peerDependencies: + swup: ^4.0.0 + + '@swup/scripts-plugin@2.1.0': + resolution: {integrity: sha512-JSMFsFCN9gn4q3m1Ccv0gq3gwRoZl6UGALOQO3OeQ8wOIq9vPC5dcUD3CMBuaPanksjR4GC8ZoukIjHrlT52fg==} + peerDependencies: + swup: ^4.2.0 + + '@swup/scroll-plugin@3.3.2': + resolution: {integrity: sha512-jwngTz8LZza8p7ZWqaqQIzkH8x4hwyPh8RbrJSwTKussx24YUQuV9sgjDCzvJ16k/aYk9NCCvqLbb+4TcT3jqA==} + peerDependencies: + swup: ^4.2.0 + + '@swup/slide-theme@2.0.2': + resolution: {integrity: sha512-CLFD+Nd/wIDLMOfg7D7sOX2d1AyhZsoLXT+G6xB4ARELaP1j+nQGDjyuRvgAESMW+GA1EL43y/BcXOAKTjzrsg==} + peerDependencies: + swup: ^4.0.0 + + '@swup/theme@2.1.0': + resolution: {integrity: sha512-nwAzx+GYySIYs6uSCFYGNdpLWv2z/mEryRD1gvmIqsaSP2N7sVd4mKAboraJAzIzbasRhTsTQzyN1LfLeti3AA==} + peerDependencies: + swup: ^4.0.0 + + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + '@tailwindcss/vite@4.1.18': + resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@0.0.39': + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@25.1.0': + resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/resolve@1.17.1': + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + + '@types/sanitize-html@2.16.0': + resolution: {integrity: sha512-l6rX1MUXje5ztPT0cAFtUayXF06DqPhRyfVXareEN5gGCFaP/iwsxIyKODr9XDhfxPpN6vXUFNfo5kZMXCxBtw==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vercel/analytics@1.6.1': + resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} + peerDependencies: + '@remix-run/react': ^2 + '@sveltejs/kit': ^1 || ^2 + next: '>= 13' + react: ^18 || ^19 || ^19.0.0-rc + svelte: '>= 4' + vue: ^3 + vue-router: ^4 + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + svelte: + optional: true + vue: + optional: true + vue-router: + optional: true + + '@vercel/functions@2.2.13': + resolution: {integrity: sha512-14ArBSIIcOBx9nrEgaJb4Bw+en1gl6eSoJWh8qjifLl5G3E4dRXCFOT8HP+w66vb9Wqyd1lAQBrmRhRwOj9X9A==} + engines: {node: '>= 18'} + peerDependencies: + '@aws-sdk/credential-provider-web-identity': '*' + peerDependenciesMeta: + '@aws-sdk/credential-provider-web-identity': + optional: true + + '@vercel/nft@0.30.4': + resolution: {integrity: sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA==} + engines: {node: '>=18'} + hasBin: true + + '@vercel/oidc@2.0.2': + resolution: {integrity: sha512-59PBFx3T+k5hLTEWa3ggiMpGRz1OVvl9eN8SUai+A43IsqiOuAe7qPBf+cray/Fj6mkgnxm/D7IAtjc8zSHi7g==} + engines: {node: '>= 18'} + + '@vercel/routing-utils@5.3.2': + resolution: {integrity: sha512-OKKhHKAON4vcwuPQvtxFRv7Ney0IGlp9CTsScKGbUsYYutRValK2GVdj7y4RRqm7RgzhuUMT/fSoK0ENKwrx9A==} + + '@volar/kit@2.4.28': + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/language-server@2.4.28': + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + + '@volar/language-service@2.4.28': + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vscode/emmet-helper@2.11.0': + resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + astro-decap-cms-oauth@0.5.1: + resolution: {integrity: sha512-dxIfwj+E5XuUCGhbTWVA0XRLK0qXDKvflC0Jy4n0H219RpGXcHCQ3lmwE8aNO2/R16dSRJ//xoBjkuqSpYK5CQ==} + peerDependencies: + astro: ^5.0.0 + + astro-expressive-code@0.41.6: + resolution: {integrity: sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==} + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta + + astro-icon@1.1.5: + resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==} + + astro@5.16.15: + resolution: {integrity: sha512-+X1Z0NTi2pa5a0Te6h77Dgc44fYj63j1yx6+39Nvg05lExajxSq7b1Uj/gtY45zoum8fD0+h0nak+DnHighs3A==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asyncro@3.0.0: + resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} + + autoprefixer@10.4.24: + resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-transform-async-to-promises@0.8.18: + resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} + + babel-plugin-transform-replace-expressions@0.2.0: + resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcryptjs@3.0.3: + resolution: {integrity: sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==} + hasBin: true + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brotli-size@4.0.0: + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001766: + resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} + engines: {node: '>=20.18.1'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-background-parser@0.1.0: + resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + + css-box-shadow@1.0.0-3: + resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-declaration-sorter@6.4.1: + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + + css-gradient-parser@0.0.17: + resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==} + engines: {node: '>=16'} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-default@5.2.14: + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-utils@3.1.0: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano@5.1.15: + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + dedent-js@1.0.1: + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delegate-it@6.3.0: + resolution: {integrity: sha512-WAa6cA61M5mfDR31PBgMNQQ3LY1q++TxnZzcm7E9XV8ODBPxDutxH0toTR/BXqIkLaVuU7ntFe1uOqDllhA22A==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@5.6.2: + resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.1: + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + echarts@6.0.0: + resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.283: + resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + + emoji-regex-xs@2.0.1: + resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} + engines: {node: '>=10.0.0'} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esrap@2.2.2: + resolution: {integrity: sha512-zA6497ha+qKvoWIK+WM9NAh5ni17sKZKhbS5B3PoYbBvaYHZWoS33zmFybmyqpn07RLUxSmn+RCls2/XF+d0oQ==} + + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + + estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + expressive-code@0.41.6: + resolution: {integrity: sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} + hasBin: true + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.7.4: + resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + + figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filesize@6.4.0: + resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} + engines: {node: '>= 0.4.0'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + focus-options-polyfill@1.6.0: + resolution: {integrity: sha512-uyrAmLZrPnUItQY5wTdg31TO9GGZRGsh/jmohUg9oLmLi/sw5y7LlTV/mwyd6rvbxIOGwmRiv6LcTS8w7Bk9NQ==} + + fontace@0.4.0: + resolution: {integrity: sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==} + + fontkitten@1.0.2: + resolution: {integrity: sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==} + engines: {node: '>=20'} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@3.0.0: + resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} + engines: {node: '>=0.12.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + h3@1.15.5: + resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hex-rgb@4.3.0: + resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} + engines: {node: '>=6'} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-cwd@3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-from@3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + katex@0.16.28: + resolution: {integrity: sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==} + hasBin: true + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@17.0.1: + resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + maxmin@2.1.0: + resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} + engines: {node: '>=0.12'} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + microbundle@0.15.1: + resolution: {integrity: sha512-aAF+nwFbkSIJGfrJk+HyzmJOq3KFaimH6OIFBU6J2DPjQeg1jXIYlIyEv81Gyisb9moUkudn+wj7zLNYMOv75Q==} + hasBin: true + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + miniflare@4.20251118.1: + resolution: {integrity: sha512-uLSAE/DvOm392fiaig4LOaatxLjM7xzIniFRG5Y3yF9IduOYLLK/pkCPQNCgKQH3ou0YJRHnTN+09LPfqYNTQQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + morphdom@2.7.8: + resolution: {integrity: sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-html-parser@7.0.2: + resolution: {integrity: sha512-DxodLVh7a6JMkYzWyc8nBX9MaF4M0lLFYkJHlWOiu7+9/I6mwNK9u5TbAMC7qfqDJEPX9OIoWA2A9t4C2l1mUQ==} + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opencollective-postinstall@2.0.3: + resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} + hasBin: true + + overlayscrollbars@2.14.0: + resolution: {integrity: sha512-RjV0pqc79kYhQLC3vTcLRb5GLpI1n6qh0Oua3g+bGH4EgNOJHVBGP7u0zZtxoAa0dkHlAqTTSYRb9MMmxNLjig==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + pagefind@1.4.0: + resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} + hasBin: true + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-css-color@0.2.1: + resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse-srcset@1.0.2: + resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + photoswipe@5.4.4: + resolution: {integrity: sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==} + engines: {node: '>= 0.12.0'} + + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-calc@8.2.4: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + + postcss-colormin@5.3.1: + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-convert-values@5.1.3: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-comments@5.1.2: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-empty@5.1.1: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-overridden@5.1.0: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-import@16.1.1: + resolution: {integrity: sha512-2xVS1NCZAfjtVdvXiyegxzJ447GyqCeEI5V7ApgQVOWnros1p5lGNovJNapwPpMombyFBfqDwt7AD3n2l0KOfQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-merge-longhand@5.1.7: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-rules@5.1.4: + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-font-values@5.1.0: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-gradients@5.1.1: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-params@5.1.4: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-selectors@5.2.1: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@4.3.1: + resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} + peerDependencies: + postcss: ^8.0.0 + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-normalize-charset@5.1.0: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-display-values@5.1.0: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-positions@5.1.1: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-repeat-style@5.1.1: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-string@5.1.0: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-timing-functions@5.1.0: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-unicode@5.1.1: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-url@5.1.0: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-whitespace@5.1.1: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-ordered-values@5.1.3: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-initial@5.1.2: + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-transforms@5.1.0: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-svgo@5.1.0: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-unique-selectors@5.1.1: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@3.0.1: + resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==} + engines: {node: '>=0.10.0'} + + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + promise.series@0.2.0: + resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} + engines: {node: '>=0.12'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-components@0.3.0: + resolution: {integrity: sha512-yl2bUkZi+sU0gxwVCun7IkjiDLPczSs1SKMKHmjlSLkk4mMryBd/aYba5J8suhJdquBEKSw6ZNxU3MvVQ9xqoQ==} + + rehype-expressive-code@0.41.6: + resolution: {integrity: sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==} + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-directive-rehype@0.4.2: + resolution: {integrity: sha512-T6e+IG+BwqU4++MK54vFb+KDFjs3a+tHeK6E0T0ctR1FSyngolfDtAEzqxHWlRzQZqGi2sB4DFXry6oqH87D/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-directive@4.0.0: + resolution: {integrity: sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-github-admonitions-to-directives@2.1.0: + resolution: {integrity: sha512-bI3E4Oj1pKY3ym2IQrrVCdORgEu0+mSrWgpCYFNy8QvytfnLs/nAacVPjkWU/JzDMUiQio2k4nTFP7bsIr9TSA==} + engines: {pnpm: '>=9.0.0'} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-sectionize@2.1.0: + resolution: {integrity: sha512-R/pHt1RLYrEqrbwOVXx8HnvvwOg+mxg8pE4kIWpIYE3/CuZhU8/PAx/0y1BbHWUA0jmTLTeWpUlDrS/B0pyd0g==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + rollup-plugin-bundle-size@1.0.3: + resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==} + + rollup-plugin-postcss@4.0.2: + resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} + engines: {node: '>=10'} + peerDependencies: + postcss: 8.x + + rollup-plugin-terser@7.0.2: + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + + rollup-plugin-typescript2@0.32.1: + resolution: {integrity: sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + + rollup-plugin-visualizer@5.14.0: + resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + + rollup@2.79.2: + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} + hasBin: true + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-html@2.17.0: + resolution: {integrity: sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==} + + sass@1.80.4: + resolution: {integrity: sha512-rhMQ2tSF5CsuuspvC94nPM9rToiAFw2h3JTrLlgmNw1MH79v8Cr3DH6KF6o6r+8oofY3iYVPUf66KzC8yuVN1w==} + engines: {node: '>=14.0.0'} + hasBin: true + + satori@0.19.1: + resolution: {integrity: sha512-/XaT/JiWLfNlgjlQdde4wXB1/6F+FEze9c3OW2QIH0ywsfOrY57YOetgESWyOFHW3JfEQ6dJAo2U9Xwb7+DDAw==} + engines: {node: '>=16'} + + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + + scrl@2.0.0: + resolution: {integrity: sha512-BbbVXxrOn58Ge4wjOORIRVZamssQu08ISLL/AC2z9aATIsKqZLESwZVW5YR0Yz0C7qqDRHb4yNXJlQ8yW0SGHw==} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs-live@0.0.5: + resolution: {integrity: sha512-IR5+gA7f+v/V8ao7ZKE4TQpbG6ABeGxQhwL0seIbOXvHdoFAHw3MEiUICrhUfuroRREKL0n7HDA5b/R5it8KHg==} + peerDependencies: + shelljs: ^0.8.4 + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + shiki@3.22.0: + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@8.0.2: + resolution: {integrity: sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + + style-inject@0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + + stylehacks@5.1.1: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + stylus@0.64.0: + resolution: {integrity: sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==} + engines: {node: '>=16'} + hasBin: true + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte2tsx@0.7.47: + resolution: {integrity: sha512-1aw/MFKVPM96OBevJdC12do2an9t5Zwr3Va9amLgTLpJje36ibD1iIHpuqCYWUrdR9vw6g6btKGQPmsqE8ZYCw==} + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + + svelte@5.49.1: + resolution: {integrity: sha512-jj95WnbKbXsXXngYj28a4zx8jeZx50CN/J4r0CEeax2pbfdsETv/J1K8V9Hbu3DCXnpHz5qAikICuxEooi7eNQ==} + engines: {node: '>=18'} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + svgo@4.0.0: + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + engines: {node: '>=16'} + hasBin: true + + swup-morph-plugin@1.3.0: + resolution: {integrity: sha512-vTqWYA5ZFkWMo54K8jlol5OCvboqRsELLfM1PUkS2IiL+1dDDChzMHa4ZBI5+yfl7bZUCWgd8EmuhMd/i/o+Qg==} + peerDependencies: + swup: ^4.6.0 + + swup@4.8.2: + resolution: {integrity: sha512-Art2vB4idZ7EFZQhhA47ZifkmZMPgcAwE6z28BhorbTYCO8jcovcc5MasX49GGdXYJWO43DTut7iZb5yrQdEfA==} + + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + engines: {node: '>=10'} + hasBin: true + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tosource@2.0.0-alpha.3: + resolution: {integrity: sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==} + engines: {node: '>=10'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici@7.14.0: + resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + engines: {node: '>=20.18.1'} + + undici@7.19.2: + resolution: {integrity: sha512-4VQSpGEGsWzk0VYxyB/wVX/Q7qf9t5znLRgs0dzszr9w9Fej/8RVNQ+S20vdXSAyra/bJ7ZQfGv6ZMj7UEbzSg==} + engines: {node: '>=20.18.1'} + + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.3: + resolution: {integrity: sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==} + + unist-util-find-after@4.0.1: + resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-map@3.1.3: + resolution: {integrity: sha512-4/mDauoxqZ6geK97lJ6n2kDk6JK88Vh+hWMSJqyaaP/7eqN1dDhjcjnNxKNm3YU6Sw7PVJtcFMUbnmHvYzb6Vg==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unstorage@1.17.4: + resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.68: + resolution: {integrity: sha512-lJSMh6f3QzZ1tdLOZOzovLX0xzAadPhx8EKwraDLPxBndLCYfoTvnNuiFFV8FARrpAlW5C0WkH+TstPaCxr00Q==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.68: + resolution: {integrity: sha512-nHvixrRQ83EzkQ4G/jFxu9Y4eSsXS/X2cltEPDM+K9qZmIv+Ey1w0tg1+6caSe8TU5Hgw4oSTwNMf/6cQb3LzQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.68: + resolution: {integrity: sha512-fru9gsLJxy33xAltXOh4TEdi312HP80hpuKhpYQD4O5hDnkNPEBdcQkpB+gcX0oK0VxRv1UOzcGQEUzWCVHLfA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.68: + resolution: {integrity: sha512-grUmWHkHlebMOd6V8vXs2eNQUw/bJGJMjekh/EPf/p2ZNTK0Uyz7hoBRngcvGfJHMsSXZH8w/dZTForIW/4ihw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.68: + resolution: {integrity: sha512-NugzXcM0iwuZFLCJg47vI93su5YhTIweQuLmZxvz5ZPTaman16JCvmDZexx2rd5T/75SNuvvZmrTOTNYUsfe5w==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.68: + resolution: {integrity: sha512-z7B/7CnJ0+TWWFp/gh2r5/QwMObHNDiQiv4C9pTBNI2Wxuwymd4bjEORzrJ/hJ5Yd5+OzeYK+nFCKevoGEEeKw==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.68: + resolution: {integrity: sha512-84XgE02LV0OvTcwfqhcSwVg4of3MLNUWPMArO6Aj8YXqyEVnPu8xTEMY2btKSq37mVAPuaEVASI4e3ptObmqcA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.9: + resolution: {integrity: sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==} + + vscode-html-languageservice@5.6.1: + resolution: {integrity: sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + workerd@1.20251118.0: + resolution: {integrity: sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ==} + engines: {node: '>=16'} + hasBin: true + + wrangler@4.50.0: + resolution: {integrity: sha512-+nuZuHZxDdKmAyXOSrHlciGshCoAPiy5dM+t6mEohWm7HpXvTHmWQGUf/na9jjWlWJHCJYOWzkA1P5HBJqrIEA==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20251118.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml-language-server@1.19.2: + resolution: {integrity: sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==} + hasBin: true + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yocto-spinner@0.2.3: + resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + peerDependencies: + zod: ^3.25 || ^4 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.22.3: + resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zrender@6.0.0: + resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@adobe/css-tools@4.3.3': {} + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.6.0 + tinyexec: 1.0.2 + + '@antfu/utils@8.1.1': {} + + '@astrojs/check@0.9.6(prettier@3.8.1)(typescript@5.9.3)': + dependencies: + '@astrojs/language-server': 2.16.3(prettier@3.8.1)(typescript@5.9.3) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 5.9.3 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/cloudflare@12.6.12(@types/node@25.1.0)(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)': + dependencies: + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/underscore-redirects': 1.0.0 + '@cloudflare/workers-types': 4.20260131.0 + astro: 5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + tinyglobby: 0.2.15 + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + wrangler: 4.50.0(@cloudflare/workers-types@4.20260131.0) + transitivePeerDependencies: + - '@types/node' + - bufferutil + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - utf-8-validate + - yaml + + '@astrojs/compiler@2.13.0': {} + + '@astrojs/internal-helpers@0.7.5': {} + + '@astrojs/language-server@2.16.3(prettier@3.8.1)(typescript@5.9.3)': + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.28(typescript@5.9.3) + '@volar/language-core': 2.4.28 + '@volar/language-server': 2.4.28 + '@volar/language-service': 2.4.28 + muggle-string: 0.4.1 + tinyglobby: 0.2.15 + volar-service-css: 0.0.68(@volar/language-service@2.4.28) + volar-service-emmet: 0.0.68(@volar/language-service@2.4.28) + volar-service-html: 0.0.68(@volar/language-service@2.4.28) + volar-service-prettier: 0.0.68(@volar/language-service@2.4.28)(prettier@3.8.1) + volar-service-typescript: 0.0.68(@volar/language-service@2.4.28) + volar-service-typescript-twoslash-queries: 0.0.68(@volar/language-service@2.4.28) + volar-service-yaml: 0.0.68(@volar/language-service@2.4.28) + vscode-html-languageservice: 5.6.1 + vscode-uri: 3.1.0 + optionalDependencies: + prettier: 3.8.1 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@6.3.10': + dependencies: + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.22.0 + smol-toml: 1.6.0 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/rss@4.0.15': + dependencies: + fast-xml-parser: 5.3.4 + piccolore: 0.1.3 + + '@astrojs/sitemap@3.7.0': + dependencies: + sitemap: 8.0.2 + stream-replace-string: 2.0.0 + zod: 3.25.76 + + '@astrojs/svelte@7.2.5(@types/node@25.1.0)(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(svelte@5.49.1)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)) + astro: 5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + svelte: 5.49.1 + svelte2tsx: 0.7.47(svelte@5.49.1)(typescript@5.9.3) + typescript: 5.9.3 + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.4.0 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@astrojs/ts-plugin@1.10.6': + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/language-core': 2.4.28 + '@volar/typescript': 2.4.28 + semver: 7.7.3 + vscode-languageserver-textdocument: 1.0.12 + + '@astrojs/underscore-redirects@1.0.0': {} + + '@astrojs/vercel@9.0.4(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@2.79.2)(svelte@5.49.1)': + dependencies: + '@astrojs/internal-helpers': 0.7.5 + '@vercel/analytics': 1.6.1(svelte@5.49.1) + '@vercel/functions': 2.2.13 + '@vercel/nft': 0.30.4(rollup@2.79.2) + '@vercel/routing-utils': 5.3.2 + astro: 5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + esbuild: 0.25.12 + tinyglobby: 0.2.15 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-web-identity' + - '@remix-run/react' + - '@sveltejs/kit' + - encoding + - next + - react + - rollup + - supports-color + - svelte + - vue + - vue-router + + '@astrojs/yaml2ts@0.2.2': + dependencies: + yaml: 2.8.2 + + '@babel/code-frame@7.28.6': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.6': {} + + '@babel/core@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.6 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.6 + + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-class-properties@7.12.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + + '@babel/plugin-syntax-flow@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.28.6) + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/preset-env@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.28.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.6) + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.28.6) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.6) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.28.6) + core-js-compat: 3.48.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.28.6 + esutils: 2.0.3 + + '@babel/preset-react@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@biomejs/biome@2.3.13': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.3.13 + '@biomejs/cli-darwin-x64': 2.3.13 + '@biomejs/cli-linux-arm64': 2.3.13 + '@biomejs/cli-linux-arm64-musl': 2.3.13 + '@biomejs/cli-linux-x64': 2.3.13 + '@biomejs/cli-linux-x64-musl': 2.3.13 + '@biomejs/cli-win32-arm64': 2.3.13 + '@biomejs/cli-win32-x64': 2.3.13 + + '@biomejs/cli-darwin-arm64@2.3.13': + optional: true + + '@biomejs/cli-darwin-x64@2.3.13': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.3.13': + optional: true + + '@biomejs/cli-linux-arm64@2.3.13': + optional: true + + '@biomejs/cli-linux-x64-musl@2.3.13': + optional: true + + '@biomejs/cli-linux-x64@2.3.13': + optional: true + + '@biomejs/cli-win32-arm64@2.3.13': + optional: true + + '@biomejs/cli-win32-x64@2.3.13': + optional: true + + '@capsizecss/unpack@4.0.0': + dependencies: + fontkitten: 1.0.2 + + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + + '@cloudflare/unenv-preset@2.7.11(unenv@2.0.0-rc.24)(workerd@1.20251118.0)': + dependencies: + unenv: 2.0.0-rc.24 + optionalDependencies: + workerd: 1.20251118.0 + + '@cloudflare/workerd-darwin-64@1.20251118.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20251118.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20251118.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20251118.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20251118.0': + optional: true + + '@cloudflare/workers-types@4.20260131.0': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@ctrl/tinycolor@4.2.0': {} + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.1': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.25.4': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.4': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.4': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.4': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.4': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.4': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.4': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.4': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.4': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.4': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.4': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.4': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.4': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.4': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.4': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.4': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.4': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.4': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.4': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.4': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.4': + optional: true + + '@expressive-code/core@0.41.6': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.6 + postcss-nested: 6.2.0(postcss@8.5.6) + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + + '@expressive-code/plugin-collapsible-sections@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + + '@expressive-code/plugin-frames@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + + '@expressive-code/plugin-line-numbers@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + + '@expressive-code/plugin-shiki@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + shiki: 3.22.0 + + '@expressive-code/plugin-text-markers@0.41.6': + dependencies: + '@expressive-code/core': 0.41.6 + + '@fancyapps/ui@6.1.10': {} + + '@fontsource-variable/jetbrains-mono@5.2.8': {} + + '@fontsource/roboto@5.2.9': {} + + '@iconify-json/fa6-brands@1.2.6': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/fa6-regular@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/fa6-solid@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/material-symbols@1.2.53': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify-json/mdi@1.2.3': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/svelte@5.2.1(svelte@5.49.1)': + dependencies: + '@iconify/types': 2.0.0 + svelte: 5.49.1 + + '@iconify/tools@4.2.0': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + cheerio: 1.2.0 + domhandler: 5.0.3 + extract-zip: 2.0.1 + local-pkg: 1.1.2 + pathe: 2.0.3 + svgo: 3.3.2 + tar: 7.5.7 + transitivePeerDependencies: + - supports-color + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.3 + tar: 7.5.7 + transitivePeerDependencies: + - encoding + - supports-color + + '@oslojs/encoding@1.1.0': {} + + '@pagefind/darwin-arm64@1.4.0': + optional: true + + '@pagefind/darwin-x64@1.4.0': + optional: true + + '@pagefind/freebsd-x64@1.4.0': + optional: true + + '@pagefind/linux-arm64@1.4.0': + optional: true + + '@pagefind/linux-x64@1.4.0': + optional: true + + '@pagefind/windows-x64@1.4.0': + optional: true + + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.3 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@poppinss/colors@4.1.6': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.5': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + + '@rollup/plugin-alias@3.1.9(rollup@2.79.2)': + dependencies: + rollup: 2.79.2 + slash: 3.0.0 + + '@rollup/plugin-babel@5.3.1(@babel/core@7.28.6)(@types/babel__core@7.20.5)(rollup@2.79.2)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + optionalDependencies: + '@types/babel__core': 7.20.5 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@17.1.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.2.3 + is-reference: 1.2.1 + magic-string: 0.25.9 + resolve: 1.22.11 + rollup: 2.79.2 + + '@rollup/plugin-json@4.1.0(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + rollup: 2.79.2 + + '@rollup/plugin-node-resolve@11.2.1(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + rollup: 2.79.2 + + '@rollup/plugin-yaml@4.1.2(rollup@2.79.2)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + js-yaml: 4.1.1 + tosource: 2.0.0-alpha.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.2 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/pluginutils@5.3.0(rollup@2.79.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 2.79.2 + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + + '@shikijs/core@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/themes@3.22.0': + dependencies: + '@shikijs/types': 3.22.0 + + '@shikijs/types@3.22.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@shuding/opentype.js@1.4.0-beta.0': + dependencies: + fflate: 0.7.4 + string.prototype.codepointat: 0.2.1 + + '@sindresorhus/is@7.2.0': {} + + '@speed-highlight/core@1.2.14': {} + + '@surma/rollup-plugin-off-main-thread@2.2.3': + dependencies: + ejs: 3.1.10 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.12 + + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.49.1)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)) + debug: 4.4.3 + svelte: 5.49.1 + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.49.1)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)))(svelte@5.49.1)(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.49.1 + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)) + transitivePeerDependencies: + - supports-color + + '@swup/a11y-plugin@5.0.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + focus-options-polyfill: 1.6.0 + swup: 4.8.2 + + '@swup/astro@1.7.0(@types/babel__core@7.20.5)': + dependencies: + '@swup/a11y-plugin': 5.0.0(swup@4.8.2) + '@swup/body-class-plugin': 3.3.0(swup@4.8.2) + '@swup/debug-plugin': 4.1.0(swup@4.8.2) + '@swup/fade-theme': 2.0.2(swup@4.8.2) + '@swup/forms-plugin': 3.6.0(swup@4.8.2) + '@swup/fragment-plugin': 1.2.0(swup@4.8.2) + '@swup/head-plugin': 2.3.1(swup@4.8.2) + '@swup/overlay-theme': 2.0.2(swup@4.8.2) + '@swup/parallel-plugin': 0.4.0(@types/babel__core@7.20.5)(swup@4.8.2) + '@swup/preload-plugin': 3.2.11(swup@4.8.2) + '@swup/progress-plugin': 3.2.0(swup@4.8.2) + '@swup/route-name-plugin': 4.1.0(@types/babel__core@7.20.5)(swup@4.8.2) + '@swup/scripts-plugin': 2.1.0(swup@4.8.2) + '@swup/scroll-plugin': 3.3.2(swup@4.8.2) + '@swup/slide-theme': 2.0.2(swup@4.8.2) + swup: 4.8.2 + swup-morph-plugin: 1.3.0(swup@4.8.2) + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/body-class-plugin@3.3.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/browserslist-config@1.0.1': {} + + '@swup/debug-plugin@4.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/fade-theme@2.0.2(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/forms-plugin@3.6.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/fragment-plugin@1.2.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/head-plugin@2.3.1(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/overlay-theme@2.0.2(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/parallel-plugin@0.4.0(@types/babel__core@7.20.5)(swup@4.8.2)': + dependencies: + '@swup/plugin': 3.0.1(@types/babel__core@7.20.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/plugin@3.0.1(@types/babel__core@7.20.5)': + dependencies: + '@swup/browserslist-config': 1.0.1 + '@swup/prettier-config': 1.1.0 + chalk: 5.6.2 + microbundle: 0.15.1(@types/babel__core@7.20.5) + prettier: 2.8.8 + shelljs: 0.8.5 + shelljs-live: 0.0.5(shelljs@0.8.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/plugin@4.0.0': + dependencies: + swup: 4.8.2 + + '@swup/preload-plugin@3.2.11(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/prettier-config@1.1.0': {} + + '@swup/progress-plugin@3.2.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/route-name-plugin@4.1.0(@types/babel__core@7.20.5)(swup@4.8.2)': + dependencies: + '@swup/plugin': 3.0.1(@types/babel__core@7.20.5) + swup: 4.8.2 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + '@swup/scripts-plugin@2.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@swup/scroll-plugin@3.3.2(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + scrl: 2.0.0 + swup: 4.8.2 + + '@swup/slide-theme@2.0.2(swup@4.8.2)': + dependencies: + '@swup/theme': 2.1.0(swup@4.8.2) + swup: 4.8.2 + + '@swup/theme@2.1.0(swup@4.8.2)': + dependencies: + '@swup/plugin': 4.0.0 + swup: 4.8.2 + + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/typography@0.5.19(tailwindcss@4.1.18)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.1.18 + + '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + + '@trysound/sax@0.2.0': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + optional: true + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.6 + optional: true + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + optional: true + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.6 + optional: true + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@0.0.39': {} + + '@types/estree@1.0.8': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/js-yaml@4.0.9': {} + + '@types/katex@0.16.8': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@17.0.45': {} + + '@types/node@25.1.0': + dependencies: + undici-types: 7.16.0 + + '@types/parse-json@4.0.2': {} + + '@types/resolve@1.17.1': + dependencies: + '@types/node': 25.1.0 + + '@types/sanitize-html@2.16.0': + dependencies: + htmlparser2: 8.0.2 + + '@types/sax@1.2.7': + dependencies: + '@types/node': 17.0.45 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 25.1.0 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + '@vercel/analytics@1.6.1(svelte@5.49.1)': + optionalDependencies: + svelte: 5.49.1 + + '@vercel/functions@2.2.13': + dependencies: + '@vercel/oidc': 2.0.2 + + '@vercel/nft@0.30.4(rollup@2.79.2)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.5.0 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/oidc@2.0.2': + dependencies: + '@types/ms': 2.1.0 + ms: 2.1.3 + + '@vercel/routing-utils@5.3.2': + dependencies: + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + optionalDependencies: + ajv: 6.12.6 + + '@volar/kit@2.4.28(typescript@5.9.3)': + dependencies: + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + typesafe-path: 0.2.2 + typescript: 5.9.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/language-server@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + '@volar/language-service': 2.4.28 + '@volar/typescript': 2.4.28 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} + + abbrev@3.0.1: {} + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.2: {} + + acorn@8.14.0: {} + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ajv-draft-04@1.0.0(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + optional: true + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@2.2.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-iterate@2.0.1: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + astro-decap-cms-oauth@0.5.1(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): + dependencies: + astro: 5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + + astro-expressive-code@0.41.6(astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2)): + dependencies: + astro: 5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2) + rehype-expressive-code: 0.41.6 + + astro-icon@1.1.5: + dependencies: + '@iconify/tools': 4.2.0 + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + transitivePeerDependencies: + - supports-color + + astro@5.16.15(@types/node@25.1.0)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@2.79.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(typescript@5.9.3)(yaml@2.8.2): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.5 + '@astrojs/markdown-remark': 6.3.10 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 4.0.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.1.1 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.6.2 + diff: 8.0.3 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.12 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.4.0 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.1 + magic-string: 0.30.21 + magicast: 0.5.1 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.6.0 + piccolore: 0.1.3 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.3 + shiki: 3.22.0 + smol-toml: 1.6.0 + svgo: 4.0.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tsconfck: 3.1.6(typescript@5.9.3) + ultrahtml: 1.6.0 + unifont: 0.7.3 + unist-util-visit: 5.1.0 + unstorage: 1.17.4(@vercel/functions@2.2.13) + vfile: 6.0.3 + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + async-function@1.0.0: {} + + async-sema@3.1.1: {} + + async@3.2.6: {} + + asyncro@3.0.0: {} + + autoprefixer@10.4.24(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001766 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axobject-query@4.1.0: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.28.6 + cosmiconfig: 7.1.0 + resolve: 1.22.11 + + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.28.6): + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + core-js-compat: 3.48.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-async-to-promises@0.8.18: {} + + babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + base64-js@0.0.8: {} + + baseline-browser-mapping@2.9.19: {} + + bcp-47-match@2.0.3: {} + + bcryptjs@3.0.3: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + blake3-wasm@2.1.5: {} + + boolbase@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + brotli-size@4.0.0: + dependencies: + duplexer: 0.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001766 + electron-to-chromium: 1.5.283 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + + builtin-modules@3.3.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + camelcase@8.0.0: {} + + camelize@1.0.1: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001766 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001766: {} + + ccount@2.0.1: {} + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.2.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.19.2 + whatwg-mimetype: 4.0.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chownr@3.0.0: {} + + ci-info@4.4.0: {} + + cli-boxes@3.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colord@2.9.3: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.1.0: {} + + commander@2.20.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + common-ancestor-path@1.0.1: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + concat-with-sourcemaps@1.1.0: + dependencies: + source-map: 0.6.1 + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + cookie@1.1.1: {} + + core-js-compat@3.48.0: + dependencies: + browserslist: 4.28.1 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + crypto-js@4.2.0: {} + + css-background-parser@0.1.0: {} + + css-box-shadow@1.0.0-3: {} + + css-color-keywords@1.0.0: {} + + css-declaration-sorter@6.4.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-gradient-parser@0.0.17: {} + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.3.0: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@5.2.14(postcss@8.5.6): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.5.6) + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 8.2.4(postcss@8.5.6) + postcss-colormin: 5.3.1(postcss@8.5.6) + postcss-convert-values: 5.1.3(postcss@8.5.6) + postcss-discard-comments: 5.1.2(postcss@8.5.6) + postcss-discard-duplicates: 5.1.0(postcss@8.5.6) + postcss-discard-empty: 5.1.1(postcss@8.5.6) + postcss-discard-overridden: 5.1.0(postcss@8.5.6) + postcss-merge-longhand: 5.1.7(postcss@8.5.6) + postcss-merge-rules: 5.1.4(postcss@8.5.6) + postcss-minify-font-values: 5.1.0(postcss@8.5.6) + postcss-minify-gradients: 5.1.1(postcss@8.5.6) + postcss-minify-params: 5.1.4(postcss@8.5.6) + postcss-minify-selectors: 5.2.1(postcss@8.5.6) + postcss-normalize-charset: 5.1.0(postcss@8.5.6) + postcss-normalize-display-values: 5.1.0(postcss@8.5.6) + postcss-normalize-positions: 5.1.1(postcss@8.5.6) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6) + postcss-normalize-string: 5.1.0(postcss@8.5.6) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6) + postcss-normalize-unicode: 5.1.1(postcss@8.5.6) + postcss-normalize-url: 5.1.0(postcss@8.5.6) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.6) + postcss-ordered-values: 5.1.3(postcss@8.5.6) + postcss-reduce-initial: 5.1.2(postcss@8.5.6) + postcss-reduce-transforms: 5.1.0(postcss@8.5.6) + postcss-svgo: 5.1.0(postcss@8.5.6) + postcss-unique-selectors: 5.1.1(postcss@8.5.6) + + cssnano-utils@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@5.1.15(postcss@8.5.6): + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.5.6) + lilconfig: 2.1.0 + postcss: 8.5.6 + yaml: 1.10.2 + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.19: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + dedent-js@1.0.1: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.4: {} + + delegate-it@6.3.0: + dependencies: + typed-query-selector: 2.12.0 + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.6.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@8.0.3: {} + + direction@2.0.1: {} + + dlv@1.1.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.1: {} + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + echarts@6.0.0: + dependencies: + tslib: 2.3.0 + zrender: 6.0.0 + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-to-chromium@1.5.283: {} + + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex-xs@2.0.1: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@2.2.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + entities@7.0.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + error-stack-parser-es@1.0.5: {} + + es-abstract@1.24.1: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.20 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + esm-env@1.2.2: {} + + esrap@2.2.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + estree-walker@0.6.1: {} + + estree-walker@1.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.4: {} + + exit-hook@2.2.1: {} + + expressive-code@0.41.6: + dependencies: + '@expressive-code/core': 0.41.6 + '@expressive-code/plugin-frames': 0.41.6 + '@expressive-code/plugin-shiki': 0.41.6 + '@expressive-code/plugin-text-markers': 0.41.6 + + exsolve@1.0.8: {} + + extend@3.0.2: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: + optional: true + + fast-uri@3.1.0: {} + + fast-xml-parser@5.3.4: + dependencies: + strnum: 2.1.2 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fflate@0.7.4: {} + + figures@1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + + file-uri-to-path@1.0.0: {} + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + filesize@6.4.0: {} + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flattie@1.1.1: {} + + focus-options-polyfill@1.6.0: {} + + fontace@0.4.0: + dependencies: + fontkitten: 1.0.2 + + fontkitten@1.0.2: + dependencies: + tiny-inflate: 1.0.3 + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fraction.js@5.3.4: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + github-slugger@2.0.0: {} + + glob-to-regexp@0.4.1: {} + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@15.15.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gzip-size@3.0.0: + dependencies: + duplexer: 0.1.2 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + h3@1.15.5: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.3 + uncrypto: 0.1.3 + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@3.1.1: + dependencies: + '@types/hast': 2.3.10 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + hex-rgb@4.3.0: {} + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + icss-replace-symbols@1.1.0: {} + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + immutable@4.3.7: + optional: true + + import-cwd@3.0.0: + dependencies: + import-from: 3.0.0 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-from@3.0.0: + dependencies: + resolve-from: 5.0.0 + + import-meta-resolve@4.2.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@1.4.0: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.4: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: + optional: true + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-module@1.0.0: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-plain-obj@4.1.0: {} + + is-plain-object@5.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.20 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + jest-worker@26.6.2: + dependencies: + '@types/node': 25.1.0 + merge-stream: 2.0.0 + supports-color: 7.2.0 + + jiti@2.6.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: + optional: true + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + katex@0.16.28: + dependencies: + commander: 8.3.0 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + kolorist@1.8.0: {} + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + lilconfig@2.1.0: {} + + linebreak@1.1.0: + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + loader-utils@3.3.1: {} + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + locate-character@3.0.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.camelcase@4.3.0: {} + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.5: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.1: + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + source-map-js: 1.2.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@3.0.4: {} + + marked@17.0.1: {} + + math-intrinsics@1.1.0: {} + + maxmin@2.1.0: + dependencies: + chalk: 1.1.3 + figures: 1.7.0 + gzip-size: 3.0.0 + pretty-bytes: 3.0.1 + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.14: {} + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + mdn-data@2.12.2: {} + + mdurl@2.0.0: {} + + merge-stream@2.0.0: {} + + microbundle@0.15.1(@types/babel__core@7.20.5): + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-proposal-class-properties': 7.12.1(@babel/core@7.28.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.6) + '@babel/preset-env': 7.28.6(@babel/core@7.28.6) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.6) + '@babel/preset-react': 7.28.5(@babel/core@7.28.6) + '@rollup/plugin-alias': 3.1.9(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.6)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@rollup/plugin-commonjs': 17.1.0(rollup@2.79.2) + '@rollup/plugin-json': 4.1.0(rollup@2.79.2) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.2) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + asyncro: 3.0.0 + autoprefixer: 10.4.24(postcss@8.5.6) + babel-plugin-macros: 3.1.0 + babel-plugin-transform-async-to-promises: 0.8.18 + babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.28.6) + brotli-size: 4.0.0 + builtin-modules: 3.3.0 + camelcase: 6.3.0 + escape-string-regexp: 4.0.0 + filesize: 6.4.0 + gzip-size: 6.0.0 + kleur: 4.1.5 + lodash.merge: 4.6.2 + postcss: 8.5.6 + pretty-bytes: 5.6.0 + rollup: 2.79.2 + rollup-plugin-bundle-size: 1.0.3 + rollup-plugin-postcss: 4.0.2(postcss@8.5.6) + rollup-plugin-terser: 7.0.2(rollup@2.79.2) + rollup-plugin-typescript2: 0.32.1(rollup@2.79.2)(typescript@4.9.5) + rollup-plugin-visualizer: 5.14.0(rollup@2.79.2) + sade: 1.8.1 + terser: 5.46.0 + tiny-glob: 0.2.9 + tslib: 2.8.1 + typescript: 4.9.5 + transitivePeerDependencies: + - '@types/babel__core' + - rolldown + - supports-color + - ts-node + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@4.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.28 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + mime@3.0.0: {} + + miniflare@4.20251118.1: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + sharp: 0.33.5 + stoppable: 1.1.0 + undici: 7.14.0 + workerd: 1.20251118.0 + ws: 8.18.0 + youch: 4.1.0-beta.10 + zod: 3.22.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + morphdom@2.7.8: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.11: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-addon-api@7.1.1: + optional: true + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + node-html-parser@7.0.2: + dependencies: + css-select: 5.2.2 + he: 1.2.0 + + node-mock-http@1.0.4: {} + + node-releases@2.0.27: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + number-is-nan@1.0.1: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 + + ohash@2.0.11: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + opencollective-postinstall@2.0.3: {} + + overlayscrollbars@2.14.0: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 6.1.4 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-timeout@6.1.4: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.6.0: {} + + pagefind@1.4.0: + optionalDependencies: + '@pagefind/darwin-arm64': 1.4.0 + '@pagefind/darwin-x64': 1.4.0 + '@pagefind/freebsd-x64': 1.4.0 + '@pagefind/linux-arm64': 1.4.0 + '@pagefind/linux-x64': 1.4.0 + '@pagefind/windows-x64': 1.4.0 + + pako@0.2.9: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-css-color@0.2.1: + dependencies: + color-name: 1.1.4 + hex-rgb: 4.3.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.28.6 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse-srcset@1.0.2: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@6.1.0: {} + + path-to-regexp@6.3.0: {} + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + photoswipe@5.4.4: {} + + piccolore@0.1.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@2.3.0: {} + + pify@5.0.0: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + + possible-typed-array-names@1.1.0: {} + + postcss-calc@8.2.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-colormin@5.3.1(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-convert-values@5.1.3(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@5.1.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-duplicates@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-empty@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-overridden@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-import@16.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.11 + + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-merge-longhand@5.1.7(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.5.6) + + postcss-merge-rules@5.1.4(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@5.1.1(postcss@8.5.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@5.1.4(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@5.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-modules@4.3.1(postcss@8.5.6): + dependencies: + generic-names: 4.0.0 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + string-hash: 1.1.3 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-normalize-charset@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-normalize-display-values@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@5.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@5.1.0(postcss@8.5.6): + dependencies: + normalize-url: 6.1.0 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@5.1.3(postcss@8.5.6): + dependencies: + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@5.1.2(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + postcss: 8.5.6 + + postcss-reduce-transforms@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + postcss-unique-selectors@5.1.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@2.8.8: {} + + prettier@3.8.1: {} + + pretty-bytes@3.0.1: + dependencies: + number-is-nan: 1.0.1 + + pretty-bytes@5.6.0: {} + + prismjs@1.30.0: {} + + promise.series@0.2.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode.js@2.3.1: {} + + punycode@2.3.1: + optional: true + + quansync@0.2.11: {} + + radix3@1.1.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@4.1.2: {} + + readdirp@5.0.0: {} + + reading-time@1.5.0: {} + + rechoir@0.6.2: + dependencies: + resolve: 1.22.11 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + rehype-components@0.3.0: + dependencies: + hast-util-is-element: 3.0.0 + unist-util-visit: 5.1.0 + + rehype-expressive-code@0.41.6: + dependencies: + expressive-code: 0.41.6 + + rehype-katex@7.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.8 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.28 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.1.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-directive-rehype@0.4.2: + dependencies: + hastscript: 7.2.0 + unist-util-map: 3.1.3 + + remark-directive@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 4.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-github-admonitions-to-directives@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + transitivePeerDependencies: + - supports-color + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-sectionize@2.1.0: + dependencies: + unist-util-find-after: 4.0.1 + unist-util-visit: 4.1.2 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + rollup-plugin-bundle-size@1.0.3: + dependencies: + chalk: 1.1.3 + maxmin: 2.1.0 + + rollup-plugin-postcss@4.0.2(postcss@8.5.6): + dependencies: + chalk: 4.1.2 + concat-with-sourcemaps: 1.1.0 + cssnano: 5.1.15(postcss@8.5.6) + import-cwd: 3.0.0 + p-queue: 6.6.2 + pify: 5.0.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-modules: 4.3.1(postcss@8.5.6) + promise.series: 0.2.0 + resolve: 1.22.11 + rollup-pluginutils: 2.8.2 + safe-identifier: 0.4.2 + style-inject: 0.3.0 + transitivePeerDependencies: + - ts-node + + rollup-plugin-terser@7.0.2(rollup@2.79.2): + dependencies: + '@babel/code-frame': 7.28.6 + jest-worker: 26.6.2 + rollup: 2.79.2 + serialize-javascript: 4.0.0 + terser: 5.46.0 + + rollup-plugin-typescript2@0.32.1(rollup@2.79.2)(typescript@4.9.5): + dependencies: + '@rollup/pluginutils': 4.2.1 + find-cache-dir: 3.3.2 + fs-extra: 10.1.0 + resolve: 1.22.11 + rollup: 2.79.2 + tslib: 2.8.1 + typescript: 4.9.5 + + rollup-plugin-visualizer@5.14.0(rollup@2.79.2): + dependencies: + open: 8.4.2 + picomatch: 4.0.3 + source-map: 0.7.6 + yargs: 17.7.2 + optionalDependencies: + rollup: 2.79.2 + + rollup-pluginutils@2.8.2: + dependencies: + estree-walker: 0.6.1 + + rollup@2.79.2: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-identifier@0.4.2: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sanitize-html@2.17.0: + dependencies: + deepmerge: 4.3.1 + escape-string-regexp: 4.0.0 + htmlparser2: 8.0.2 + is-plain-object: 5.0.0 + parse-srcset: 1.0.2 + postcss: 8.5.6 + + sass@1.80.4: + dependencies: + '@parcel/watcher': 2.5.6 + chokidar: 4.0.3 + immutable: 4.3.7 + source-map-js: 1.2.1 + optional: true + + satori@0.19.1: + dependencies: + '@shuding/opentype.js': 1.4.0-beta.0 + css-background-parser: 0.1.0 + css-box-shadow: 1.0.0-3 + css-gradient-parser: 0.0.17 + css-to-react-native: 3.2.0 + emoji-regex-xs: 2.0.1 + escape-html: 1.0.3 + linebreak: 1.1.0 + parse-css-color: 0.2.1 + postcss-value-parser: 4.2.0 + yoga-layout: 3.2.1 + + sax@1.4.4: {} + + scrl@2.0.0: {} + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + serialize-javascript@4.0.0: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shelljs-live@0.0.5(shelljs@0.8.5): + dependencies: + cross-spawn: 7.0.6 + shelljs: 0.8.5 + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + shiki@3.22.0: + dependencies: + '@shikijs/core': 3.22.0 + '@shikijs/engine-javascript': 3.22.0 + '@shikijs/engine-oniguruma': 3.22.0 + '@shikijs/langs': 3.22.0 + '@shikijs/themes': 3.22.0 + '@shikijs/types': 3.22.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + sisteransi@1.0.5: {} + + sitemap@8.0.2: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.4 + + slash@3.0.0: {} + + smol-toml@1.6.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + sourcemap-codec@1.4.8: {} + + space-separated-tokens@2.0.2: {} + + stable@0.1.8: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + stoppable@1.1.0: {} + + stream-replace-string@2.0.0: {} + + string-hash@1.1.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string.prototype.codepointat@0.2.1: {} + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.1 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strnum@2.1.2: {} + + style-inject@0.3.0: {} + + stylehacks@5.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + stylus@0.64.0: + dependencies: + '@adobe/css-tools': 4.3.3 + debug: 4.4.3 + glob: 10.5.0 + sax: 1.4.4 + source-map: 0.7.6 + transitivePeerDependencies: + - supports-color + + supports-color@10.2.2: {} + + supports-color@2.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte2tsx@0.7.47(svelte@5.49.1)(typescript@5.9.3): + dependencies: + dedent-js: 1.0.1 + scule: 1.3.0 + svelte: 5.49.1 + typescript: 5.9.3 + + svelte@5.49.1: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.6.2 + esm-env: 1.2.2 + esrap: 2.2.2 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + + svgo@4.0.0: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.4.4 + + swup-morph-plugin@1.3.0(swup@4.8.2): + dependencies: + '@swup/plugin': 4.0.0 + morphdom: 2.7.8 + swup: 4.8.2 + + swup@4.8.2: + dependencies: + delegate-it: 6.3.0 + opencollective-postinstall: 2.0.3 + path-to-regexp: 6.3.0 + + tailwindcss@4.1.18: {} + + tapable@2.3.0: {} + + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + terser@5.46.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + tiny-inflate@1.0.3: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tosource@2.0.0-alpha.3: {} + + tr46@0.0.3: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + tslib@2.3.0: {} + + tslib@2.8.1: {} + + type-fest@4.41.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typed-query-selector@2.12.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.7.3 + + typescript@4.9.5: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + ufo@1.6.3: {} + + ultrahtml@1.6.0: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + uncrypto@0.1.3: {} + + undici-types@7.16.0: {} + + undici@7.14.0: {} + + undici@7.19.2: {} + + unenv@2.0.0-rc.24: + dependencies: + pathe: 2.0.3 + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.3: + dependencies: + css-tree: 3.1.0 + ofetch: 1.5.1 + ohash: 2.0.11 + + unist-util-find-after@4.0.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-map@3.1.3: + dependencies: + '@types/unist': 2.0.11 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@2.0.1: {} + + unstorage@1.17.4(@vercel/functions@2.2.13): + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.5 + lru-cache: 11.2.5 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 + optionalDependencies: + '@vercel/functions': 2.2.13 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + optional: true + + util-deprecate@1.0.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.1.0 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + sass: 1.80.4 + stylus: 0.64.0 + terser: 5.46.0 + yaml: 2.8.2 + + vitefu@1.1.1(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2)): + optionalDependencies: + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.80.4)(stylus@0.64.0)(terser@5.46.0)(yaml@2.8.2) + + volar-service-css@0.0.68(@volar/language-service@2.4.28): + dependencies: + vscode-css-languageservice: 6.3.9 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-emmet@0.0.68(@volar/language-service@2.4.28): + dependencies: + '@emmetio/css-parser': 0.4.1 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-html@0.0.68(@volar/language-service@2.4.28): + dependencies: + vscode-html-languageservice: 5.6.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-prettier@0.0.68(@volar/language-service@2.4.28)(prettier@3.8.1): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + prettier: 3.8.1 + + volar-service-typescript-twoslash-queries@0.0.68(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-typescript@0.0.68(@volar/language-service@2.4.28): + dependencies: + path-browserify: 1.0.1 + semver: 7.7.3 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.28 + + volar-service-yaml@0.0.68(@volar/language-service@2.4.28): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.19.2 + optionalDependencies: + '@volar/language-service': 2.4.28 + + vscode-css-languageservice@6.3.9: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.6.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.1.0: {} + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.20 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-pm-runs@1.1.0: {} + + which-typed-array@1.1.20: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + workerd@1.20251118.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20251118.0 + '@cloudflare/workerd-darwin-arm64': 1.20251118.0 + '@cloudflare/workerd-linux-64': 1.20251118.0 + '@cloudflare/workerd-linux-arm64': 1.20251118.0 + '@cloudflare/workerd-windows-64': 1.20251118.0 + + wrangler@4.50.0(@cloudflare/workers-types@4.20260131.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.7.11(unenv@2.0.0-rc.24)(workerd@1.20251118.0) + blake3-wasm: 2.1.5 + esbuild: 0.25.4 + miniflare: 4.20251118.1 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.24 + workerd: 1.20251118.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20260131.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + ws@8.18.0: {} + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@5.0.0: {} + + yaml-language-server@1.19.2: + dependencies: + '@vscode/l10n': 0.0.18 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + lodash: 4.17.21 + prettier: 3.8.1 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + yaml: 2.7.1 + + yaml@1.10.2: {} + + yaml@2.7.1: {} + + yaml@2.8.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@1.2.2: {} + + yocto-spinner@0.2.3: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + yoga-layout@3.2.1: {} + + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.3 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.6.5 + '@speed-highlight/core': 1.2.14 + cookie: 1.1.1 + youch-core: 0.3.3 + + zimmerframe@1.1.4: {} + + zod-to-json-schema@3.25.1(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): + dependencies: + typescript: 5.9.3 + zod: 3.25.76 + + zod@3.22.3: {} + + zod@3.25.76: {} + + zrender@6.0.0: + dependencies: + tslib: 2.3.0 + + zwitch@2.0.4: {} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..c5de846 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,10 @@ +// PostCSS config for CSS imports +// Tailwind v4 is handled by @tailwindcss/vite plugin in astro.config.mjs +import postcssImport from 'postcss-import'; + + +export default { + plugins: { + 'postcss-import': postcssImport, + } +}; \ No newline at end of file diff --git a/public/FooterConfig.html b/public/FooterConfig.html new file mode 100644 index 0000000..b54c6c1 --- /dev/null +++ b/public/FooterConfig.html @@ -0,0 +1 @@ +这里是HTML注入示例,你可以在这个文件中添加自定义的HTML内容 \ No newline at end of file diff --git a/public/_headers b/public/_headers new file mode 100644 index 0000000..9cbb210 --- /dev/null +++ b/public/_headers @@ -0,0 +1,27 @@ +/* + X-Content-Type-Options: nosniff + X-Frame-Options: DENY + X-XSS-Protection: 1; mode=block + Referrer-Policy: strict-origin-when-cross-origin + +/atom.xml + Access-Control-Allow-Origin: * + Access-Control-Allow-Methods: GET + Access-Control-Max-Age: 86400 + +/rss.xml + Access-Control-Allow-Origin: * + Access-Control-Allow-Methods: GET + Access-Control-Max-Age: 86400 + +/_astro/* + Cache-Control: public, max-age=31536000, immutable + +/assets/* + Cache-Control: public, max-age=31536000, immutable + +/favicon/* + Cache-Control: public, max-age=31536000, immutable + +/pio/* + Cache-Control: public, max-age=31536000, immutable \ No newline at end of file diff --git a/public/admin/config.yml b/public/admin/config.yml new file mode 100644 index 0000000..60f6e4b --- /dev/null +++ b/public/admin/config.yml @@ -0,0 +1,293 @@ +# 后台系统配置 +backend: + name: github + repo: Spr-Aachen/Twilight # 请替换为您的 GitHub 仓库 + branch: main # 请替换为您的分支名称 + site_domain: twilight.spr-aachen.com # 请替换为您的域名 + base_url: https://twilight.spr-aachen.com # 请替换为您的 URL + auth_endpoint: oauth # OAuth 路由由集成提供 + + +# 媒体目录配置 +media_folder: "public/images" # 媒体文件存储路径 +public_folder: "/images" # 公共访问路径 + + +# 集合管理配置 +collections: + + - # 博客文章集合 + # 集合名称 + name: "posts" + # 后台显示标签 + label: "Posts" + # 内容存储目录 + folder: "src/content/posts" + # 允许创建新条目 + create: true + # 文件命名规则 + slug: "{{slug}}" + # 字段列表 + fields: + - # 标题 + {label: "Title", name: "title", widget: "string"} + - # 发布日期 + {label: "Published Date", name: "published", widget: "datetime"} + - # 更新日期 + {label: "Updated Date", name: "updated", widget: "datetime", required: false} + - # 描述 + {label: "Description", name: "description", widget: "text", required: false} + - # 封面图 + {label: "Cover", name: "cover", widget: "image", required: false} + - # 标签 + {label: "Tags", name: "tags", widget: "list", default: [], required: false} + - # 分类 + {label: "Category", name: "category", widget: "string", required: false} + - # 草稿 + {label: "Draft", name: "draft", widget: "boolean", default: false} + - # 正文 + {label: "Body", name: "body", widget: "markdown"} + + - # 项目集合 + # 集合名称 + name: "projects" + # 后台显示标签 + label: "Projects" + # 内容存储目录 + folder: "src/content/projects" + # 允许创建新条目 + create: true + # 文件命名规则 + slug: "{{slug}}" + # 文件存储格式 + format: "json" + # 字段列表 + fields: + - # 项目标题 + { label: "Title", name: "title", widget: "string" } + - # 项目描述 + { label: "Description", name: "description", widget: "text" } + - # 项目封面 + { label: "Image", name: "image", widget: "image", required: false } + - # 项目类别 + { label: "Category", name: "category", widget: "select", options: ["library","ai","software","website","game"] } + - # 技术栈 + { label: "Tech Stack", name: "techStack", widget: "list", default: [] } + - # 项目状态 + { label: "Status", name: "status", widget: "select", options: ["completed","in-progress","planned"] } + - # 在线演示 + { label: "Live Demo", name: "liveDemo", widget: "string", required: false } + - # 源代码 + { label: "Source Code", name: "sourceCode", widget: "string", required: false } + - # 开始日期 + { label: "Start Date", name: "startDate", widget: "datetime" } + - # 结束日期 + { label: "End Date", name: "endDate", widget: "datetime", required: false } + - # 是否精选 + { label: "Featured", name: "featured", widget: "boolean", required: false, default: false } + - # 标签 + { label: "Tags", name: "tags", widget: "list", required: false, default: [] } + + - # 技能集合 + # 集合名称 + name: "skills" + # 后台显示标签 + label: "Skills" + # 内容存储目录 + folder: "src/content/skills" + # 允许创建新条目 + create: true + # 文件命名规则 + slug: "{{slug}}" + # 文件存储格式 + format: "json" + # 字段列表 + fields: + - # 技能名称 + { label: "Name", name: "name", widget: "string" } + - # 技能描述 + { label: "Description", name: "description", widget: "text" } + - # 图标 + { label: "Icon", name: "icon", widget: "string" } + - # 技能类别 + { label: "Category", name: "category", widget: "select", options: ["ai","backend","client","frontend","database","engines","tools","others"] } + - # 熟练程度 + { label: "Level", name: "level", widget: "select", options: ["beginner","intermediate","advanced","expert"] } + - # 经验 + label: "Experience" + name: "experience" + widget: "object" + fields: + - # 年 + { label: "Years", name: "years", widget: "number", value_type: "int", min: 0 } + - # 月 + { label: "Months", name: "months", widget: "number", value_type: "int", min: 0, max: 11 } + - # 相关项目 + { label: "Projects", name: "projects", widget: "list", required: false, default: [] } + - # 相关认证 + { label: "Certifications", name: "certifications", widget: "list", required: false, default: [] } + - # 主题颜色 + { label: "Color", name: "color", widget: "string", required: false } + + - # 时间线集合 + # 集合名称 + name: "timeline" + # 后台显示标签 + label: "Timeline" + # 内容存储目录 + folder: "src/content/timeline" + # 允许创建新条目 + create: true + # 文件命名规则 + slug: "{{slug}}" + # 文件存储格式 + format: "json" + # 字段列表 + fields: + - # 标题 + { label: "Title", name: "title", widget: "string" } + - # 描述 + { label: "Description", name: "description", widget: "text" } + - # 类型 + { label: "Type", name: "type", widget: "select", options: ["education","work","project","achievement"] } + - # 开始日期 + { label: "Start Date", name: "startDate", widget: "datetime" } + - # 结束日期 + { label: "End Date", name: "endDate", widget: "datetime", required: false } + - # 地点 + { label: "Location", name: "location", widget: "string", required: false } + - # 组织/机构 + { label: "Organization", name: "organization", widget: "string", required: false } + - # 职位 + { label: "Position", name: "position", widget: "string", required: false } + - # 相关技能 + { label: "Skills", name: "skills", widget: "list", required: false, default: [] } + - # 相关成就 + { label: "Achievements", name: "achievements", widget: "list", required: false, default: [] } + - # 相关链接 + label: "Links" + name: "links" + widget: "list" + required: false + fields: + - # 链接名称 + { label: "Name", name: "name", widget: "string" } + - # 链接地址 + { label: "URL", name: "url", widget: "string" } + - # 链接类型 + { label: "Type", name: "type", widget: "select", options: ["certificate","project","other"] } + - # 图标 + { label: "Icon", name: "icon", widget: "string", required: false } + - # 主题颜色 + { label: "Color", name: "color", widget: "string", required: false } + + - # 日记集合 + # 集合名称 + name: "diary" + # 后台显示标签 + label: "Diary" + # 内容存储目录 + folder: "src/content/diary" + # 允许创建新条目 + create: true + # 文件命名规则 + slug: "{{year}}-{{month}}-{{day}}-{{hour}}-{{minute}}" + # 文件存储格式 + format: "json" + # 字段列表 + fields: + - # 日记内容 + { label: "Content", name: "content", widget: "text" } + - # 日记日期 + { label: "Date", name: "date", widget: "datetime" } + - # 图片列表 + label: "Images" + name: "images" + widget: "list" + required: false + default: [] + field: { label: "Image", name: "image", widget: "image" } + + - # 相册集合 + # 集合名称 + name: "albums" + # 后台显示标签 + label: "Albums" + # 内容存储目录 + folder: "src/content/albums" + # 允许创建新条目 + create: true + # 文件命名规则 + slug: "{{slug}}" + # 文件存储格式 + format: "json" + # 字段列表 + fields: + - # 相册标题 + { label: "Title", name: "title", widget: "string" } + - # 相册描述 + { label: "Description", name: "description", widget: "text", required: false } + - # 相册封面 + { label: "Cover", name: "cover", widget: "image" } + - # 日期 + { label: "Date", name: "date", widget: "datetime" } + - # 地点 + { label: "Location", name: "location", widget: "string", required: false } + - # 标签 + { label: "Tags", name: "tags", widget: "list", required: false, default: [] } + - # 布局方式 + { label: "Layout", name: "layout", widget: "select", options: ["grid", "masonry", "list"], default: "grid" } + - # 列数 + { label: "Columns", name: "columns", widget: "number", default: 3, value_type: "int", min: 1, max: 6 } + - # 照片列表 + label: "Photos" + name: "photos" + widget: "list" + required: false + fields: + - # 图片路径 + { label: "Image", name: "src", widget: "image" } + - # 图片描述 + { label: "Caption", name: "alt", widget: "string", required: false } + - # 图片标题 + { label: "Title", name: "title", widget: "string", required: false } + - # 图片说明 + { label: "Description", name: "description", widget: "text", required: false } + - # 标签 + { label: "Tags", name: "tags", widget: "list", required: false, default: [] } + - # 拍摄日期 + { label: "Date", name: "date", widget: "datetime", required: false } + - # 是否可见 + { label: "Visible", name: "visible", widget: "boolean", default: true, required: false } + + - # 友链集合 + # 集合名称 + name: "friends" + # 后台显示标签 + label: "Friends" + # 内容存储目录 + folder: "src/content/friends" + # 允许创建新条目 + create: true + # 文件命名规则 + slug: "{{slug}}" + # 文件存储格式 + format: "json" + # 字段列表 + fields: + - # 网站名称 + { label: "Title", name: "title", widget: "string" } + - # 头像链接 + { label: "Avatar URL", name: "imgurl", widget: "string" } + - # 网站描述 + { label: "Description", name: "desc", widget: "text" } + - # 网站链接 + { label: "Site URL", name: "siteurl", widget: "string" } + - # 标签 + { label: "Tags", name: "tags", widget: "list", required: false, default: [] } + + +# 编辑器配置 +editor: + # 启用预览功能 + preview: true \ No newline at end of file diff --git a/public/albums/example/智子_ASK.jpg b/public/albums/example/智子_ASK.jpg new file mode 100644 index 0000000..f679336 Binary files /dev/null and b/public/albums/example/智子_ASK.jpg differ diff --git a/public/assets/css/highlight-github-dark.min.css b/public/assets/css/highlight-github-dark.min.css new file mode 100644 index 0000000..03b6da8 --- /dev/null +++ b/public/assets/css/highlight-github-dark.min.css @@ -0,0 +1,10 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: GitHub Dark + Description: Dark theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-dark + Current colors taken from GitHub's CSS +*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c} \ No newline at end of file diff --git a/public/assets/images/avatar.jpg b/public/assets/images/avatar.jpg new file mode 100644 index 0000000..f5a9d70 Binary files /dev/null and b/public/assets/images/avatar.jpg differ diff --git a/public/assets/images/desktopWallpaper_1.jpg b/public/assets/images/desktopWallpaper_1.jpg new file mode 100644 index 0000000..5311062 Binary files /dev/null and b/public/assets/images/desktopWallpaper_1.jpg differ diff --git a/public/assets/images/desktopWallpaper_2.jpg b/public/assets/images/desktopWallpaper_2.jpg new file mode 100644 index 0000000..f7acb16 Binary files /dev/null and b/public/assets/images/desktopWallpaper_2.jpg differ diff --git a/public/assets/images/desktopWallpaper_3.jpg b/public/assets/images/desktopWallpaper_3.jpg new file mode 100644 index 0000000..e52b00c Binary files /dev/null and b/public/assets/images/desktopWallpaper_3.jpg differ diff --git a/public/assets/images/mobileWallpaper_1.jpg b/public/assets/images/mobileWallpaper_1.jpg new file mode 100644 index 0000000..23fd947 Binary files /dev/null and b/public/assets/images/mobileWallpaper_1.jpg differ diff --git a/public/assets/images/mobileWallpaper_2.jpg b/public/assets/images/mobileWallpaper_2.jpg new file mode 100644 index 0000000..cc5fb5f Binary files /dev/null and b/public/assets/images/mobileWallpaper_2.jpg differ diff --git a/public/assets/images/particle.png b/public/assets/images/particle.png new file mode 100644 index 0000000..18f2da0 Binary files /dev/null and b/public/assets/images/particle.png differ diff --git a/public/assets/js/highlight.min.js b/public/assets/js/highlight.min.js new file mode 100644 index 0000000..29b2c72 --- /dev/null +++ b/public/assets/js/highlight.min.js @@ -0,0 +1,1213 @@ +/*! + Highlight.js v11.9.0 (git: f47103d4f1) + (c) 2006-2023 undefined and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";function e(n){ +return n instanceof Map?n.clear=n.delete=n.set=()=>{ +throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ +const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) +})),n}class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] +;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope +;class r{constructor(e,n){ +this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ +this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ +if(e.startsWith("language:"))return e.replace("language:","language-") +;if(e.includes(".")){const t=e.split(".") +;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") +}return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} +closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const s=(e={})=>{const n={children:[]} +;return Object.assign(n,e),n};class o{constructor(){ +this.rootNode=s(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const n=s({scope:e}) +;this.add(n),this.stack.push(n)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ +return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), +n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} +addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ +this.closeNode()}__addSublanguage(e,n){const t=e.root +;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ +return new r(this,this.options).value()}finalize(){ +return this.closeAllNodes(),!0}}function c(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} +function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} +function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ +const n=e[e.length-1] +;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} +})(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} +function p(e){return RegExp(e.toString()+"|").exec("").length-1} +const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function h(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t +;let a=c(e),i="";for(;a.length>0;){const e=_.exec(a);if(!e){i+=a;break} +i+=a.substring(0,e.index), +a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], +"("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} +const f="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},O={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},x=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, +contains:[]},t);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:b(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},M=x("//","$"),S=x("/\\*","\\*/"),A=x("#","$");var C=Object.freeze({ +__proto__:null,APOS_STRING_MODE:O,BACKSLASH_ESCAPE:v,BINARY_NUMBER_MODE:{ +scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:x, +C_BLOCK_COMMENT_MODE:S,C_LINE_COMMENT_MODE:M,C_NUMBER_MODE:{scope:"number", +begin:N,relevance:0},C_NUMBER_RE:N,END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}}),HASH_COMMENT_MODE:A,IDENT_RE:f, +MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+E,relevance:0}, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y, +PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, +end:/\/[gimuy]*/,contains:[v,{begin:/\[/,end:/\]/,relevance:0,contains:[v]}]}, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const n=/^#![ ]*\// +;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, +end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, +TITLE_MODE:{scope:"title",begin:f,relevance:0},UNDERSCORE_IDENT_RE:E, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0}});function T(e,n){ +"."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ +n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function I(e,n){ +Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function L(e,n){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function B(e,n){ +void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] +})),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ +relevance:0,contains:[Object.assign(t,{endsParent:!0})] +},e.relevance=0,delete t.beforeMatch +},z=["of","and","for","in","not","or","if","then","parent","list","value"],F="keyword" +;function U(e,n,t=F){const a=Object.create(null) +;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ +Object.assign(a,U(e[t],n,t))})),a;function i(e,t){ +n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") +;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){ +return n?Number(n):(e=>z.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},H=(e,...n)=>{console.log("WARN: "+e,...n)},q=(e,n)=>{ +P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) +},G=Error();function Z(e,n,{key:t}){let a=0;const i=e[t],r={},s={} +;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=p(n[e-1]) +;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=h(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=h(e.end,{joinWith:""})}})(e)}function Q(e){ +function n(n,t){ +return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) +}class t{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,n){ +n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), +this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(h(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const n=this.matcherRe.exec(e);if(!n)return null +;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] +;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t +;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), +n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ +this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ +const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex +;let t=n.exec(e) +;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ +const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} +return t&&(this.regexIndex+=t.position+1, +this.regexIndex===this.count&&this.considerAll()),t}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(r,s){const o=r +;if(r.isCompiled)return o +;[R,L,W,$].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), +r.__beforeBegin=null,[D,I,B].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +l=r.keywords.$pattern, +delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=U(r.keywords,e.case_insensitive)), +o.keywordPatternRe=n(l,!0), +s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(o.endRe=n(o.end)), +o.terminatorEnd=c(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), +r.illegal&&(o.illegalRe=n(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ +variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) +})),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new i +;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ +return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ +constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} +const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ +const a=Object.create(null),i=Object.create(null),r=[];let s=!0 +;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let p={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function _(e){ +return p.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" +;"object"==typeof n?(a=e, +t=n.ignoreIllegals,i=n.language):(q("10.7.0","highlight(lang, code, ...args) has been deprecated."), +q("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};x("before:highlight",r) +;const s=r.result?r.result:f(r.language,r.code,t) +;return s.code=r.code,x("after:highlight",s),s}function f(e,t,i,r){ +const l=Object.create(null);function c(){if(!x.keywords)return void S.addText(A) +;let e=0;x.keywordPatternRe.lastIndex=0;let n=x.keywordPatternRe.exec(A),t="" +;for(;n;){t+=A.substring(e,n.index) +;const i=w.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,x.keywords[a]);if(r){ +const[e,a]=r +;if(S.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ +const t=w.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] +;e=x.keywordPatternRe.lastIndex,n=x.keywordPatternRe.exec(A)}var a +;t+=A.substring(e),S.addText(t)}function d(){null!=x.subLanguage?(()=>{ +if(""===A)return;let e=null;if("string"==typeof x.subLanguage){ +if(!a[x.subLanguage])return void S.addText(A) +;e=f(x.subLanguage,A,!0,M[x.subLanguage]),M[x.subLanguage]=e._top +}else e=E(A,x.subLanguage.length?x.subLanguage:null) +;x.relevance>0&&(C+=e.relevance),S.__addSublanguage(e._emitter,e.language) +})():c(),A=""}function g(e,n){ +""!==e&&(S.startScope(n),S.addText(e),S.endScope())}function u(e,n){let t=1 +;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} +const a=w.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(A=i,c(),A=""),t++}} +function b(e,n){ +return e.scope&&"string"==typeof e.scope&&S.openNode(w.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(g(A,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +A=""):e.beginScope._multi&&(u(e.beginScope,n),A="")),x=Object.create(e,{parent:{ +value:x}}),x}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) +;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) +;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,t,a)}function _(e){ +return 0===x.matcher.regexIndex?(A+=e[0],1):(D=!0,0)}function h(e){ +const n=e[0],a=t.substring(e.index),i=m(x,e,a);if(!i)return ee;const r=x +;x.endScope&&x.endScope._wrap?(d(), +g(n,x.endScope._wrap)):x.endScope&&x.endScope._multi?(d(), +u(x.endScope,e)):r.skip?A+=n:(r.returnEnd||r.excludeEnd||(A+=n), +d(),r.excludeEnd&&(A=n));do{ +x.scope&&S.closeNode(),x.skip||x.subLanguage||(C+=x.relevance),x=x.parent +}while(x!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} +let y={};function N(a,r){const o=r&&r[0];if(A+=a,null==o)return d(),0 +;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===o){ +if(A+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) +;throw n.languageName=e,n.badRule=y.rule,n}return 1} +if(y=r,"begin"===r.type)return(e=>{ +const t=e[0],a=e.rule,i=new n(a),r=[a.__beforeBegin,a["on:begin"]] +;for(const n of r)if(n&&(n(e,i),i.isMatchIgnored))return _(t) +;return a.skip?A+=t:(a.excludeBegin&&(A+=t), +d(),a.returnBegin||a.excludeBegin||(A=t)),b(a,e),a.returnBegin?0:t.length})(r) +;if("illegal"===r.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(x.scope||"")+'"') +;throw e.mode=x,e}if("end"===r.type){const e=h(r);if(e!==ee)return e} +if("illegal"===r.type&&""===o)return 1 +;if(R>1e5&&R>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return A+=o,o.length}const w=v(e) +;if(!w)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const O=Q(w);let k="",x=r||O;const M={},S=new p.__emitter(p);(()=>{const e=[] +;for(let n=x;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) +;e.forEach((e=>S.openNode(e)))})();let A="",C=0,T=0,R=0,D=!1;try{ +if(w.__emitTokens)w.__emitTokens(t,S);else{for(x.matcher.considerAll();;){ +R++,D?D=!1:x.matcher.considerAll(),x.matcher.lastIndex=T +;const e=x.matcher.exec(t);if(!e)break;const n=N(t.substring(T,e.index),e) +;T=e.index+n}N(t.substring(T))}return S.finalize(),k=S.toHTML(),{language:e, +value:k,relevance:C,illegal:!1,_emitter:S,_top:x}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, +context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:k},_emitter:S};if(s)return{ +language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:S,_top:x} +;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ +const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} +;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(k).map((n=>f(n,e,!1))) +;i.unshift(t);const r=i.sort(((e,n)=>{ +if(e.relevance!==n.relevance)return n.relevance-e.relevance +;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 +;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,l=s +;return l.secondBest=o,l}function y(e){let n=null;const t=(e=>{ +let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" +;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) +;return n||(H(o.replace("{}",t[1])), +H("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} +return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return +;if(x("before:highlightElement",{el:e,language:t +}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) +;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) +;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) +;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t +;e.classList.add("hljs"),e.classList.add("language-"+a) +})(e,t,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),x("after:highlightElement",{el:e,result:r,text:a})}let N=!1;function w(){ +"loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(y):N=!0 +}function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} +function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=n}))}function k(e){const n=v(e) +;return n&&!n.disableAutodetect}function x(e,n){const t=e;r.forEach((e=>{ +e[t]&&e[t](n)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +N&&w()}),!1),Object.assign(t,{highlight:h,highlightAuto:E,highlightAll:w, +highlightElement:y, +highlightBlock:e=>(q("10.7.0","highlightBlock will be removed entirely in v12.0"), +q("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)}, +initHighlighting:()=>{ +w(),q("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +w(),q("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!s)throw n;K(n),i=c} +i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&O(i.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete a[e] +;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, +listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:O, +autoDetection:k,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ +e["before:highlightBlock"](Object.assign({block:n.el},n)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ +e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}, +removePlugin:e=>{const n=r.indexOf(e);-1!==n&&r.splice(n,1)}}),t.debugMode=()=>{ +s=!1},t.safeMode=()=>{s=!0},t.versionString="11.9.0",t.regex={concat:b, +lookahead:d,either:m,optional:u,anyNumberOfTimes:g} +;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t +},te=ne({});te.newInstance=()=>ne({});var ae=te;const ie=e=>({IMPORTANT:{ +scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ +scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, +FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, +ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}),re=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],se=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],oe=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],le=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],ce=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","grow","shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline-solid","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),de=oe.concat(le) +;var ge="[0-9](_*[0-9])*",ue=`\\.(${ge})`,be="[0-9a-fA-F](_*[0-9a-fA-F])*",me={ +className:"number",variants:[{ +begin:`(\\b(${ge})((${ue})|\\.)?|(${ue}))[eE][+-]?(${ge})[fFdD]?\\b`},{ +begin:`\\b(${ge})((${ue})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${ue})[fFdD]?\\b`},{begin:`\\b(${ge})[fFdD]\\b`},{ +begin:`\\b0[xX]((${be})\\.?|(${be})?\\.(${be}))[pP][+-]?(${ge})[fFdD]?\\b`},{ +begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${be})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function pe(e,n,t){return-1===t?"":e.replace(n,(a=>pe(e,n,t-1)))} +const _e="[A-Za-z$_][0-9A-Za-z$_]*",he=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],fe=["true","false","null","undefined","NaN","Infinity"],Ee=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],ye=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Ne=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],we=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ve=[].concat(Ne,Ee,ye) +;function Oe(e){const n=e.regex,t=_e,a={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const t=e[0].length+e.index,a=e.input[t] +;if("<"===a||","===a)return void n.ignoreMatch();let i +;">"===a&&(((e,{after:n})=>{const t="",M={ +match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(x)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]} +;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ +PARAMS_CONTAINS:h,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/, +contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,y,{ +className:"attr",begin:t+n.lookahead(":"),relevance:0},M,{ +begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ +className:"function",begin:x,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, +excludeEnd:!0,keywords:i,contains:h}]}]},{begin:/,/,relevance:0},{match:/\s+/, +relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, +"on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ +begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},N,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:t, +className:"title.function"})]},{match:/\.\.\./,relevance:0},O,{match:"\\$"+t, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[f]},w,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},E,k,{match:/\$[(.]/}]}} +const ke=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),xe=["Protocol","Type"].map(ke),Me=["init","self"].map(ke),Se=["Any","Self"],Ae=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Ce=["false","nil","true"],Te=["assignment","associativity","higherThan","left","lowerThan","none","right"],Re=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],De=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Ie=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Le=m(Ie,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Be=b(Ie,Le,"*"),$e=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),ze=m($e,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Fe=b($e,ze,"*"),Ue=b(/[A-Z]/,ze,"*"),je=["attached","autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Fe,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Pe=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;var Ke=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ +begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} +;Object.assign(t,{className:"variable",variants:[{ +begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},r={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(s);const o={begin:/\$?\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,r,{match:/(\/[a-z._-]+)+/},s,{ +match:/\\"/},{className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}, +grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},b=[c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:b.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:b.concat(["self"]),relevance:0}]),relevance:0},p={ +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], +relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, +keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s] +}]},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, +strings:o,keywords:u}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="(?!struct)("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},b={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) +},m=[b,c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],p={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:m.concat(["self"]),relevance:0}]),relevance:0},_={className:"function", +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{ +begin:/:/,endsWithParent:!0,contains:[o,l]},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:u, +relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s]}] +},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:u,illegal:"",keywords:u,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:u},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ +keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/, +keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]}) +;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE], +o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},u={begin:"<",end:">",contains:[{beginKeywords:"in out"},t] +},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +keyword:"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,a,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ +const n=e.regex,t=ie(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ +name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ +keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, +contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+oe.join("|")+")"},{begin:":(:)?("+le.join("|")+")"}] +},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b"},{ +begin:/:/,end:/[;}{]/, +contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0, +excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", +relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ +},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:se.join(" ")},contains:[{ +begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ +className:"selector-tag",begin:"\\b("+re.join("|")+")\\b"}]}},grmr_diff:e=>{ +const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ +className:"meta",relevance:10, +match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) +},{className:"comment",variants:[{ +begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), +end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]}},grmr_go:e=>{const n={ +keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], +type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], +literal:["true","false","iota","nil"], +built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{const n=e.regex;return{name:"GraphQL",aliases:["gql"], +case_insensitive:!0,disableAutodetect:!1,keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:n.concat(/[_A-Za-z][_0-9A-Za-z]*/,n.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}},grmr_ini:e=>{const n=e.regex,t={ +className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{ +begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{begin:/;/,end:/$/},{begin:/#/, +end:/$/}];const i={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{ +begin:/\$\{(.*?)\}/}]},r={className:"literal", +begin:/\bon|off|true|false|yes|no\b/},s={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0 +},l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ +const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+pe("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},s={className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", +3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0, +contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,me,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},me,r]}},grmr_javascript:Oe, +grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", +beginKeywords:n.join(" ")};return{name:"JSON",keywords:{literal:n},contains:[{ +className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{ +match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], +illegal:"\\S"}},grmr_kotlin:e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] +},l=me,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 +},e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{ +begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ +3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, +excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},l]}},grmr_less:e=>{ +const n=ie(e),t=de,a="[\\w-]+",i="("+a+"|@\\{"+a+"\\})",r=[],s=[],o=e=>({ +className:"string",begin:"~?"+e+".*?"+e}),l=(e,n,t)=>({className:e,begin:n, +relevance:t}),c={$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:se.join(" ")},d={begin:"\\(",end:"\\)",contains:s,keywords:c, +relevance:0} +;s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,o("'"),o('"'),n.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},n.HEXCOLOR,d,l("variable","@@?"+a,10),l("variable","@\\{"+a+"\\}"),l("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const g=s.concat({ +begin:/\{/,end:/\}/,contains:r}),u={beginKeywords:"when",endsWithParent:!0, +contains:[{beginKeywords:"and not"}].concat(s)},b={begin:i+"\\s*:", +returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ +},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b", +end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}] +},m={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:c,returnEnd:!0,contains:s,relevance:0}},p={ +className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a +}],starts:{end:"[;}]",returnEnd:!0,contains:g}},_={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:i,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u,l("keyword","all\\b"),l("variable","@\\{"+a+"\\}"),{ +begin:"\\b("+re.join("|")+")\\b",className:"selector-tag" +},n.CSS_NUMBER_MODE,l("selector-tag",i,0),l("selector-id","#"+i),l("selector-class","\\."+i,0),l("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+oe.join("|")+")"},{ +className:"selector-pseudo",begin:":(:)?("+le.join("|")+")"},{begin:/\(/, +end:/\)/,relevance:0,contains:g},{begin:"!important"},n.FUNCTION_DISPATCH]},h={ +begin:a+":(:)?"+`(${t.join("|")})`,returnBegin:!0,contains:[_]} +;return r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,m,p,h,b,_,u,n.FUNCTION_DISPATCH), +{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:r}}, +grmr_lua:e=>{const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] +},i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,t,{contains:[a],relevance:10 +})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:i}].concat(i) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{ +const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={ +variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},r=e.inherit(a,{contains:[] +}),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r) +;let o=[n,t];return[a,i,r,s].forEach((e=>{e.contains=e.contains.concat(o) +})),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_objectivec:e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, +keyword:["@interface","@class","@protocol","@implementation"]};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{"variable.language":["this","super"],$pattern:n, +keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], +literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], +built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], +type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] +},illegal:"/,end:/$/,illegal:"\\n" +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", +begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, +contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, +relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={ +$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/, +end:/\}/},s={variants:[{begin:/\$\d/},{ +begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@][^\s\w{]/,relevance:0}] +},o=[e.BACKSLASH_ESCAPE,i,s],l=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],c=(e,a,i="\\1")=>{ +const r="\\1"===i?i:n.concat(i,a) +;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t) +},d=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),g=[s,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),r,{className:"string",contains:o,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", +begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", +relevance:0},{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:c("s|tr|y",n.either(...l,{capture:!0}))},{begin:c("s|tr|y","\\(","\\)")},{ +begin:c("s|tr|y","\\[","\\]")},{begin:c("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...l,{capture:!0 +}),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ +begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ +begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", +subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] +}];return i.contains=g,r.contains=g,{name:"Perl",aliases:["pl","pm"],keywords:a, +contains:g}},grmr_php:e=>{ +const n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={ +scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ +begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ +illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),o,{ +begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(s),"on:begin":(e,n)=>{ +n.data._beginMatch=e[1]||e[2]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}},e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ +begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" +}],relevance:0 +},g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],m={ +keyword:u,literal:(e=>{const n=[];return e.forEach((e=>{ +n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase()) +})),n})(g),built_in:b},p=e=>e.map((e=>e.replace(/\|\d+$/,""))),_={variants:[{ +match:[/new/,n.concat(l,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i],scope:{ +1:"keyword",4:"title.class"}}]},h=n.concat(a,"\\b(?!\\()"),f={variants:[{ +match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" +}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ +match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", +3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))], +scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class", +3:"variable.language"}}]},E={scope:"attr", +match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, +begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] +},N={relevance:0, +match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], +scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(N) +;const w=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, +keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, +endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ +begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, +contains:["self",...w]},...w,{scope:"meta",match:i}] +},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ +scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, +keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, +contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ +begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ +begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,N,f,{ +match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ +scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, +excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" +},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", +begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m, +contains:["self",r,f,e.C_BLOCK_COMMENT_MODE,c,d]}]},{scope:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ +beginKeywords:"use",relevance:0,end:";",contains:[{ +match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},c,d]} +},grmr_php_template:e=>({name:"PHP template",subLanguage:"xml",contains:[{ +begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*", +end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0 +},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null, +contains:null,skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0}),grmr_python:e=>{ +const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:a, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, +end:/\}/,keywords:i,illegal:/#/},o={begin:/\{\{/,relevance:0},l={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,o,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})` +}]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, +contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, +illegal:/(<\/|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,l]}]}}, +grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt", +starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{ +begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{ +const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) +;return{name:"R",keywords:{$pattern:t, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, +starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), +endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ +scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 +}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] +}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], +variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ +1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"}, +match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{ +2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"}, +match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ +match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`", +contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{ +const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={ +"variable.constant":["__FILE__","__LINE__","__ENCODING__"], +"variable.language":["self","super"], +keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], +built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], +literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},o={ +begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[s] +}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, +end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ +begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ +begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, +end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ +begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ +begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), +contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[e.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},b={variants:[{match:/\(\)/},{ +className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, +keywords:r}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ +match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", +4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{ +2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{ +1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ +match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ +begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, +relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", +keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], +illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ +begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", +end:"\\][a-z]*"}]}].concat(o,l),relevance:0}].concat(o,l) +;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} +},{className:"meta.prompt", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",keywords:r,contains:m}}];return l.unshift(o),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, +grmr_rust:e=>{const n=e.regex,t={className:"title.function.invoke",relevance:0, +begin:n.concat(/\b/,/(?!let|for|while|if|else|match\b)/,e.IDENT_RE,n.lookahead(/\s*\(/)) +},a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:r, +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},t]}}, +grmr_scss:e=>{const n=ie(e),t=le,a=oe,i="@[a-z-]+",r={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", +case_insensitive:!0,illegal:"[=/|']", +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+re.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+a.join("|")+")"},{className:"selector-pseudo", +begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, +contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+ce.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:/:/,end:/[;}{]/,relevance:0, +contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] +},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ +begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:se.join(" ")},contains:[{begin:i, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] +},n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta.prompt", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]}),grmr_sql:e=>{ +const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=r,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!r.includes(e))),c={ +begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} +;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t +;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, +keyword:l.concat(s),literal:a,type:i}},{className:"type", +begin:n.either("double precision","large object","with timezone","without timezone") +},c,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", +variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, +contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ +className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, +relevance:0}]}},grmr_swift:e=>{const n={match:/\s+/,relevance:0 +},t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ +match:[/\./,m(...xe,...Me)],className:{2:"keyword"}},r={match:b(/\./,m(...Ae)), +relevance:0},s=Ae.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ +className:"keyword", +match:m(...Ae.filter((e=>"string"!=typeof e)).concat(Se).map(ke),...Me)}]},l={ +$pattern:m(/\b\w+/,/#\w+/),keyword:s.concat(Re),literal:Ce},c=[i,r,o],g=[{ +match:b(/\./,m(...De)),relevance:0},{className:"built_in", +match:b(/\b/,m(...De),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ +className:"operator",relevance:0,variants:[{match:Be},{match:`\\.(\\.|${Le})+`}] +}],_="([0-9]_*)+",h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0, +variants:[{match:`\\b(${_})(\\.(${_}))?([eE][+-]?(${_}))?\\b`},{ +match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(${_}))?\\b`},{match:/\b0o([0-7]_*)+\b/ +},{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ +match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] +}),y=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) +}),N=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ +}),w=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),y(e),N(e)] +}),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),N(e)]}),O={ +className:"string", +variants:[w(),w("#"),w("##"),w("###"),v(),v("#"),v("##"),v("###")] +},k=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, +contains:[e.BACKSLASH_ESCAPE]}],x={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, +contains:k},M=e=>{const n=b(e,/\//),t=b(/\//,e);return{begin:n,end:t, +contains:[...k,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},S={ +scope:"regexp",variants:[M("###"),M("##"),M("#"),x]},A={match:b(/`/,Fe,/`/) +},C=[A,{className:"variable",match:/\$\d+/},{className:"variable", +match:`\\$${ze}+`}],T=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ +contains:[{begin:/\(/,end:/\)/,keywords:Pe,contains:[...p,f,O]}]}},{ +scope:"keyword",match:b(/@/,m(...je))},{scope:"meta",match:b(/@/,Fe)}],R={ +match:d(/\b[A-Z]/),relevance:0,contains:[{className:"type", +match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,ze,"+") +},{className:"type",match:Ue,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d(Ue)),relevance:0}]},D={ +begin://,keywords:l,contains:[...a,...c,...T,u,R]};R.contains.push(D) +;const I={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ +match:b(Fe,/\s*:/),keywords:"_|0",relevance:0 +},...a,S,...c,...g,...p,f,O,...C,...T,R]},L={begin://, +keywords:"repeat each",contains:[...a,R]},B={begin:/\(/,end:/\)/,keywords:l, +contains:[{begin:m(d(b(Fe,/\s*:/)),d(b(Fe,/\s+/,Fe,/\s*:/))),end:/:/, +relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params", +match:Fe}]},...a,...c,...p,f,O,...T,R,I],endsParent:!0,illegal:/["']/},$={ +match:[/(func|macro)/,/\s+/,m(A.match,Fe,Be)],className:{1:"keyword", +3:"title.function"},contains:[L,B,n],illegal:[/\[/,/%/]},z={ +match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, +contains:[L,B,n],illegal:/\[|%/},F={match:[/operator/,/\s+/,Be],className:{ +1:"keyword",3:"title"}},U={begin:[/precedencegroup/,/\s+/,Ue],className:{ +1:"keyword",3:"title"},contains:[R],keywords:[...Te,...Ce],end:/}/} +;for(const e of O.variants){const n=e.contains.find((e=>"interpol"===e.label)) +;n.keywords=l;const t=[...c,...g,...p,f,O,...C];n.contains=[...t,{begin:/\(/, +end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l, +contains:[...a,$,z,{beginKeywords:"struct protocol class extension enum actor", +end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{ +className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c] +},F,U,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 +},S,...c,...g,...p,f,O,...C,...T,R,I]}},grmr_typescript:e=>{ +const n=Oe(e),t=_e,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={ +beginKeywords:"namespace",end:/\{/,excludeEnd:!0, +contains:[n.exports.CLASS_REFERENCE]},r={beginKeywords:"interface",end:/\{/, +excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a}, +contains:[n.exports.CLASS_REFERENCE]},s={$pattern:_e, +keyword:he.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]), +literal:fe,built_in:ve.concat(a),"variable.language":we},o={className:"meta", +begin:"@"+t},l=(e,n,t)=>{const a=e.contains.findIndex((e=>e.label===n)) +;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} +;return Object.assign(n.keywords,s), +n.exports.PARAMS_CONTAINS.push(o),n.contains=n.contains.concat([o,i,r]), +l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ +name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n},grmr_vbnet:e=>{ +const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ +className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ +begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ +begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}] +},o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] +}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) +;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, +classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},o,l,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +keyword:"const disable else elseif enable end externalsource if region then"}, +contains:[l]}]}},grmr_wasm:e=>{e.regex;const n=e.COMMENT(/\(;/,/;\)/) +;return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/, +keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] +},contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/], +className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ +match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ +begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", +3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, +className:"type"},{className:"keyword", +match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ +},{className:"number",relevance:0, +match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ +}]}},grmr_xml:e=>{ +const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[i,r,o,s]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:n.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ +className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ +className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} +},grmr_yaml:e=>{ +const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/, +end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", +contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", +begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] +;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:l}}});const He=ae;for(const e of Object.keys(Ke)){ +const n=e.replace("grmr_","").replace("_","-");He.registerLanguage(n,Ke[e])} +return He}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/public/assets/js/marked.min.js b/public/assets/js/marked.min.js new file mode 100644 index 0000000..4bdacb5 --- /dev/null +++ b/public/assets/js/marked.min.js @@ -0,0 +1,74 @@ +/** + * marked v16.2.1 - a markdown parser + * Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ + +/** + * DO NOT EDIT THIS FILE + * The code in this file is generated from files in ./src/ + */ +(function(g,f){if(typeof exports=="object"&&typeof module<"u"){module.exports=f()}else if("function"==typeof define && define.amd){define("marked",f)}else {g["marked"]=f()}}(typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : this,function(){var exports={};var __exports=exports;var module={exports}; +"use strict";var H=Object.defineProperty;var be=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var Oe=Object.prototype.hasOwnProperty;var Te=(a,e)=>{for(var t in e)H(a,t,{get:e[t],enumerable:!0})},we=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Re(e))!Oe.call(a,r)&&r!==t&&H(a,r,{get:()=>e[r],enumerable:!(n=be(e,r))||n.enumerable});return a};var ye=a=>we(H({},"__esModule",{value:!0}),a);var dt={};Te(dt,{Hooks:()=>$,Lexer:()=>x,Marked:()=>A,Parser:()=>b,Renderer:()=>P,TextRenderer:()=>S,Tokenizer:()=>y,defaults:()=>O,getDefaults:()=>_,lexer:()=>ht,marked:()=>d,options:()=>it,parse:()=>pt,parseInline:()=>ut,parser:()=>ct,setOptions:()=>ot,use:()=>at,walkTokens:()=>lt});module.exports=ye(dt);function _(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var O=_();function N(a){O=a}var C={exec:()=>null};function h(a,e=""){let t=typeof a=="string"?a:a.source,n={replace:(r,i)=>{let s=typeof i=="string"?i:i.source;return s=s.replace(m.caret,"$1"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var m={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:a=>new RegExp(`^( {0,3}${a})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:a=>new RegExp(`^ {0,${Math.min(3,a-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:a=>new RegExp(`^ {0,${Math.min(3,a-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:a=>new RegExp(`^ {0,${Math.min(3,a-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:a=>new RegExp(`^ {0,${Math.min(3,a-1)}}#`),htmlBeginRegex:a=>new RegExp(`^ {0,${Math.min(3,a-1)}}<(?:[a-z].*>|!--)`,"i")},Pe=/^(?:[ \t]*(?:\n|$))+/,Se=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,$e=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,I=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,_e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,F=/(?:[*+-]|\d{1,9}[.)])/,ie=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,oe=h(ie).replace(/bull/g,F).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Le=h(ie).replace(/bull/g,F).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Q=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Me=/^[^\n]+/,U=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,ze=h(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",U).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ae=h(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,F).getRegex(),v="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",K=/|$))/,Ee=h("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",K).replace("tag",v).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),ae=h(Q).replace("hr",I).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",v).getRegex(),Ce=h(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",ae).getRegex(),W={blockquote:Ce,code:Se,def:ze,fences:$e,heading:_e,hr:I,html:Ee,lheading:oe,list:Ae,newline:Pe,paragraph:ae,table:C,text:Me},se=h("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",I).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",v).getRegex(),Ie={...W,lheading:Le,table:se,paragraph:h(Q).replace("hr",I).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",se).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",v).getRegex()},Be={...W,html:h(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",K).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:C,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:h(Q).replace("hr",I).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",oe).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},qe=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ve=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,le=/^( {2,}|\\)\n(?!\s*$)/,De=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,ce=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,je=h(ce,"u").replace(/punct/g,D).getRegex(),Fe=h(ce,"u").replace(/punct/g,pe).getRegex(),he="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Qe=h(he,"gu").replace(/notPunctSpace/g,ue).replace(/punctSpace/g,X).replace(/punct/g,D).getRegex(),Ue=h(he,"gu").replace(/notPunctSpace/g,He).replace(/punctSpace/g,Ge).replace(/punct/g,pe).getRegex(),Ke=h("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,ue).replace(/punctSpace/g,X).replace(/punct/g,D).getRegex(),We=h(/\\(punct)/,"gu").replace(/punct/g,D).getRegex(),Xe=h(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Je=h(K).replace("(?:-->|$)","-->").getRegex(),Ve=h("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Je).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),q=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`[^`]*`|[^\[\]\\`])*?/,Ye=h(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",q).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),de=h(/^!?\[(label)\]\[(ref)\]/).replace("label",q).replace("ref",U).getRegex(),ke=h(/^!?\[(ref)\](?:\[\])?/).replace("ref",U).getRegex(),et=h("reflink|nolink(?!\\()","g").replace("reflink",de).replace("nolink",ke).getRegex(),J={_backpedal:C,anyPunctuation:We,autolink:Xe,blockSkip:Ne,br:le,code:ve,del:C,emStrongLDelim:je,emStrongRDelimAst:Qe,emStrongRDelimUnd:Ke,escape:qe,link:Ye,nolink:ke,punctuation:Ze,reflink:de,reflinkSearch:et,tag:Ve,text:De,url:C},tt={...J,link:h(/^!?\[(label)\]\((.*?)\)/).replace("label",q).getRegex(),reflink:h(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",q).getRegex()},j={...J,emStrongRDelimAst:Ue,emStrongLDelim:Fe,url:h(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},ge=a=>rt[a];function w(a,e){if(e){if(m.escapeTest.test(a))return a.replace(m.escapeReplace,ge)}else if(m.escapeTestNoEncode.test(a))return a.replace(m.escapeReplaceNoEncode,ge);return a}function V(a){try{a=encodeURI(a).replace(m.percentDecode,"%")}catch{return null}return a}function Y(a,e){let t=a.replace(m.findPipe,(i,s,o)=>{let l=!1,u=s;for(;--u>=0&&o[u]==="\\";)l=!l;return l?"|":" |"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length0?-2:-1}function me(a,e,t,n,r){let i=e.href,s=e.title||null,o=a[1].replace(r.other.outputLinkReplace,"$1");n.state.inLink=!0;let l={type:a[0].charAt(0)==="!"?"image":"link",raw:t,href:i,title:s,text:o,tokens:n.inlineTokens(o)};return n.state.inLink=!1,l}function st(a,e,t){let n=a.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(` +`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[o]=s;return o.length>=r.length?i.slice(r.length):i}).join(` +`)}var y=class{options;rules;lexer;constructor(e){this.options=e||O}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:z(n,` +`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=st(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=z(n,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:z(t[0],` +`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=z(t[0],` +`).split(` +`),r="",i="",s=[];for(;n.length>0;){let o=!1,l=[],u;for(u=0;u1,i={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let s=this.rules.other.listItemRegex(n),o=!1;for(;e;){let u=!1,p="",c="";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let f=t[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,Z=>" ".repeat(3*Z.length)),k=e.split(` +`,1)[0],R=!f.trim(),g=0;if(this.options.pedantic?(g=2,c=f.trimStart()):R?g=t[1].length+1:(g=t[2].search(this.rules.other.nonSpaceChar),g=g>4?1:g,c=f.slice(g),g+=t[1].length),R&&this.rules.other.blankLine.test(k)&&(p+=k+` +`,e=e.substring(k.length+1),u=!0),!u){let Z=this.rules.other.nextBulletRegex(g),te=this.rules.other.hrRegex(g),ne=this.rules.other.fencesBeginRegex(g),re=this.rules.other.headingBeginRegex(g),xe=this.rules.other.htmlBeginRegex(g);for(;e;){let G=e.split(` +`,1)[0],E;if(k=G,this.options.pedantic?(k=k.replace(this.rules.other.listReplaceNesting," "),E=k):E=k.replace(this.rules.other.tabCharGlobal," "),ne.test(k)||re.test(k)||xe.test(k)||Z.test(k)||te.test(k))break;if(E.search(this.rules.other.nonSpaceChar)>=g||!k.trim())c+=` +`+E.slice(g);else{if(R||f.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||ne.test(f)||re.test(f)||te.test(f))break;c+=` +`+k}!R&&!k.trim()&&(R=!0),p+=G+` +`,e=e.substring(G.length+1),f=E.slice(g)}}i.loose||(o?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(o=!0));let T=null,ee;this.options.gfm&&(T=this.rules.other.listIsTask.exec(c),T&&(ee=T[0]!=="[ ] ",c=c.replace(this.rules.other.listReplaceTask,""))),i.items.push({type:"list_item",raw:p,task:!!T,checked:ee,loose:!1,text:c,tokens:[]}),i.raw+=p}let l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u=0;uf.type==="space"),c=p.length>0&&p.some(f=>this.rules.other.anyLine.test(f.raw));i.loose=c}if(i.loose)for(let u=0;u({text:l,tokens:this.lexer.inline(l),header:!1,align:s.align[u]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===` +`?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=z(n.slice(0,-1),"\\");if((n.length-s.length)%2===0)return}else{let s=fe(t[2],"()");if(s===-2)return;if(s>-1){let l=(t[0].indexOf("!")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,l).trim(),t[3]=""}}let r=t[2],i="";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),me(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:"text",raw:s,text:s}}return me(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||"")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,o,l,u=s,p=0,c=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!o)continue;if(l=[...o].length,r[3]||r[4]){u+=l;continue}else if((r[5]||r[6])&&s%3&&!((s+l)%3)){p+=l;continue}if(u-=l,u>0)continue;l=Math.min(l,l+u+p);let f=[...r[0]][0].length,k=e.slice(0,s+r.index+f+l);if(Math.min(s,l)%2){let g=k.slice(1,-1);return{type:"em",raw:k,text:g,tokens:this.lexer.inlineTokens(g)}}let R=k.slice(2,-2);return{type:"strong",raw:k,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]==="@"?(n=t[1],r="mailto:"+n):(n=t[1],r=n),{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]==="@")n=t[0],r="mailto:"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);n=t[0],t[1]==="www."?r="http://"+t[0]:r=t[0]}return{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}};var x=class a{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||O,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:B.normal,inline:M.normal};this.options.pedantic?(t.block=B.pedantic,t.inline=M.pedantic):this.options.gfm&&(t.block=B.gfm,this.options.breaks?t.inline=M.breaks:t.inline=M.gfm),this.tokenizer.rules=t}static get rules(){return{block:B,inline:M}}static lex(e,t){return new a(t).lex(e)}static lexInline(e,t){return new a(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let t=0;t(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=` +`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+r.raw,s.text+=` +`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+r.raw,s.text+=` +`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,o=e.slice(1),l;this.options.extensions.startBlock.forEach(u=>{l=u.call({lexer:this},o),typeof l=="number"&&l>=0&&(s=Math.min(s,l))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type==="paragraph"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+r.raw,s.text+=` +`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+r.raw,s.text+=` +`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)n=n.slice(0,r.index)+"["+"a".repeat(r[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let i=!1,s="";for(;e;){i||(s=""),i=!1;let o;if(this.options.extensions?.inline?.some(u=>(o=u.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let u=t.at(-1);o.type==="text"&&u?.type==="text"?(u.raw+=o.raw,u.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,s)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let u=1/0,p=e.slice(1),c;this.options.extensions.startInline.forEach(f=>{c=f.call({lexer:this},p),typeof c=="number"&&c>=0&&(u=Math.min(u,c))}),u<1/0&&u>=0&&(l=e.substring(0,u+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!=="_"&&(s=o.raw.slice(-1)),i=!0;let u=t.at(-1);u?.type==="text"?(u.raw+=o.raw,u.text+=o.text):t.push(o);continue}if(e){let u="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(u);break}else throw new Error(u)}}return t}};var P=class{options;parser;constructor(e){this.options=e||O}space(e){return""}code({text:e,lang:t,escaped:n}){let r=(t||"").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,"")+` +`;return r?'
'+(n?i:w(i,!0))+`
+`:"
"+(n?i:w(i,!0))+`
+`}blockquote({tokens:e}){return`
+${this.parser.parse(e)}
+`}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`${this.parser.parseInline(e)} +`}hr(e){return`
+`}list(e){let t=e.ordered,n=e.start,r="";for(let o=0;o +`+r+" +`}listitem(e){let t="";if(e.task){let n=this.checkbox({checked:!!e.checked});e.loose?e.tokens[0]?.type==="paragraph"?(e.tokens[0].text=n+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=n+" "+w(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:"text",raw:n+" ",text:n+" ",escaped:!0}):t+=n+" "}return t+=this.parser.parse(e.tokens,!!e.loose),`
  • ${t}
  • +`}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    +`}table(e){let t="",n="";for(let i=0;i${r}`),` + +`+t+` +`+r+`
    +`}tablerow({text:e}){return` +${e} +`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+` +`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${w(e,!0)}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=V(e);if(i===null)return r;e=i;let s='
    ",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=V(e);if(i===null)return w(n);e=i;let s=`${n}{let o=i[s].flat(1/0);n=n.concat(this.walkTokens(o,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...o){let l=i.renderer.apply(this,o);return l===!1&&(l=s.apply(this,o)),l}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new P(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if(["options","parser"].includes(s))continue;let o=s,l=n.renderer[o],u=i[o];i[o]=(...p)=>{let c=l.apply(i,p);return c===!1&&(c=u.apply(i,p)),c||""}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new y(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if(["options","rules","lexer"].includes(s))continue;let o=s,l=n.tokenizer[o],u=i[o];i[o]=(...p)=>{let c=l.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new $;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if(["options","block"].includes(s))continue;let o=s,l=n.hooks[o],u=i[o];$.passThroughHooks.has(s)?i[o]=p=>{if(this.defaults.async)return Promise.resolve(l.call(i,p)).then(f=>u.call(i,f));let c=l.call(i,p);return u.call(i,c)}:i[o]=(...p)=>{let c=l.apply(i,p);return c===!1&&(c=u.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(o){let l=[];return l.push(s.call(this,o)),i&&(l=l.concat(i.call(this,o))),l}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},o=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof n>"u"||n===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));s.hooks&&(s.hooks.options=s,s.hooks.block=e);let l=s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline,u=s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline;if(s.async)return Promise.resolve(s.hooks?s.hooks.preprocess(n):n).then(p=>l(p,s)).then(p=>s.hooks?s.hooks.processAllTokens(p):p).then(p=>s.walkTokens?Promise.all(this.walkTokens(p,s.walkTokens)).then(()=>p):p).then(p=>u(p,s)).then(p=>s.hooks?s.hooks.postprocess(p):p).catch(o);try{s.hooks&&(n=s.hooks.preprocess(n));let p=l(n,s);s.hooks&&(p=s.hooks.processAllTokens(p)),s.walkTokens&&this.walkTokens(p,s.walkTokens);let c=u(p,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(p){return o(p)}}}onError(e,t){return n=>{if(n.message+=` +Please report this to https://github.com/markedjs/marked.`,e){let r="

    An error occurred:

    "+w(n.message+"",!0)+"
    ";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var L=new A;function d(a,e){return L.parse(a,e)}d.options=d.setOptions=function(a){return L.setOptions(a),d.defaults=L.defaults,N(d.defaults),d};d.getDefaults=_;d.defaults=O;d.use=function(...a){return L.use(...a),d.defaults=L.defaults,N(d.defaults),d};d.walkTokens=function(a,e){return L.walkTokens(a,e)};d.parseInline=L.parseInline;d.Parser=b;d.parser=b.parse;d.Renderer=P;d.TextRenderer=S;d.Lexer=x;d.lexer=x.lex;d.Tokenizer=y;d.Hooks=$;d.parse=d;var it=d.options,ot=d.setOptions,at=d.use,lt=d.walkTokens,ut=d.parseInline,pt=d,ct=b.parse,ht=x.lex; + +if(__exports != exports)module.exports = exports;return module.exports})); +//# sourceMappingURL=marked.umd.js.map diff --git a/public/assets/js/twikoo.all.min.js b/public/assets/js/twikoo.all.min.js new file mode 100644 index 0000000..7735d98 --- /dev/null +++ b/public/assets/js/twikoo.all.min.js @@ -0,0 +1,33593 @@ +/*! Extracted from https://cdn.staticfile.org/twikoo/1.6.44/twikoo.all.min.js */ +/*! For license information please see twikoo.all.min.js.LICENSE.txt */ +var e, t; +((e = this), + (t = function () { + return (function () { + var e = { + 6885: function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", { value: !0 }); + var r = n(3692); + Object.keys(r).forEach(function (e) { + "default" !== e && + "__esModule" !== e && + ((e in t && t[e] === r[e]) || + Object.defineProperty(t, e, { + enumerable: !0, + get: function () { + return r[e]; + }, + })); + }); + var i = n(2912); + Object.keys(i).forEach(function (e) { + "default" !== e && + "__esModule" !== e && + ((e in t && t[e] === i[e]) || + Object.defineProperty(t, e, { + enumerable: !0, + get: function () { + return i[e]; + }, + })); + }); + }, + 3692: function (e, t) { + "use strict"; + var n; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.StorageType = + t.AbstractStorage = + t.AbstractSDKRequest = + void 0), + (function (e) { + ((e.local = "local"), + (e.none = "none"), + (e.session = "session")); + })(n || (t.StorageType = n = {})), + (t.AbstractSDKRequest = function () {}), + (t.AbstractStorage = function () {})); + }, + 2912: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.formatUrl = function (e, t, n) { + void 0 === n && (n = {}); + var r = /\?/.test(t), + i = ""; + for (var o in n) + ("" === i ? !r && (t += "?") : (i += "&"), + (i += o + "=" + encodeURIComponent(n[o]))); + return /^http(s)?\:\/\//.test((t += i)) ? t : "" + e + t; + })); + }, + 3052: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.LOGINTYPE = t.DATA_VERSION = void 0), + (t.getEndPoint = function () { + return { BASE_URL: l, PROTOCOL: c }; + }), + (t.getSdkName = function () { + return s; + }), + (t.getSdkVersion = function () { + return a; + }), + (t.setEndPoint = d), + (t.setRegionLevelEndpoint = function (e, t, n) { + d( + t + ? "//" + e + "." + t + ".tcb-api.tencentcloudapi.com/web" + : "//" + e + ".ap-shanghai.tcb-api.tencentcloudapi.com/web", + n, + ); + }), + (t.setSdkName = function (e) { + ((s = e), i(e)); + }), + (t.setSdkVersion = function (e) { + a = e; + })); + var r = n(2566), + i = r.constants.setSdkName, + o = r.constants.setProtocol, + a = "", + s = "@cloudbase/js-sdk"; + t.DATA_VERSION = "2020-01-10"; + var u, + c = + "undefined" != typeof location && "http:" === location.protocol + ? "http:" + : "https:", + l = "//tcb-api.tencentcloudapi.com/web"; + function d(e, t) { + ((l = e), t && ((c = t), o(t))); + } + !(function (e) { + ((e.ANONYMOUS = "ANONYMOUS"), + (e.WECHAT = "WECHAT"), + (e.CUSTOM = "CUSTOM"), + (e.NULL = "NULL")); + })(u || (t.LOGINTYPE = u = {})); + }, + 7696: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.EVENTS = void 0), + (t.EVENTS = { + LOGIN_STATE_CHANGED: "loginStateChanged", + LOGIN_STATE_EXPIRED: "loginStateExpire", + LOGIN_TYPE_CHANGED: "loginTypeChanged", + ANONYMOUS_CONVERTED: "anonymousConverted", + ACCESS_TOKEN_REFRESHD: "refreshAccessToken", + })); + }, + 4283: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = t.cloudbase = void 0)); + var i = r(n(9367)), + o = n(2566), + a = r(n(2473)), + s = n(3219), + u = n(4319), + c = n(1706), + l = n(6153), + d = n(3052), + f = function () { + return ( + (f = + Object.assign || + function (e) { + for (var t, n = 1, r = arguments.length; n < r; n++) + for (var i in (t = arguments[n])) + Object.prototype.hasOwnProperty.call(t, i) && + (e[i] = t[i]); + return e; + }), + f.apply(this, arguments) + ); + }, + p = function (e, t, n, r) { + var o, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (o = e[u]) && + (s = (a < 3 ? o(s) : a > 3 ? o(t, n, s) : o(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + h = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + m = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + g = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + v = o.adapters.useAdapters, + _ = o.adapters.useDefaultAdapter, + y = o.adapters.RUNTIME, + b = o.constants.ERRORS, + k = o.constants.COMMUNITY_SITE_URL, + w = o.utils.printWarn, + E = o.helpers.catchErrorsDecorator, + A = { timeout: 15e3, persistence: "local" }, + C = 6e5, + x = {}, + I = (function () { + function e(e) { + ((this._config = e || this._config), + (this.authInstance = null)); + } + return ( + Object.defineProperty(e.prototype, "config", { + get: function () { + return this._config; + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "platform", { + get: function () { + return u.Platform; + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "cache", { + get: function () { + return (0, c.getCacheByEnvId)(this._config.env); + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "localCache", { + get: function () { + return (0, c.getLocalCache)(this._config.env); + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "request", { + get: function () { + return (0, l.getRequestByEnvId)(this._config.env); + }, + enumerable: !1, + configurable: !0, + }), + (e.prototype.init = function (t) { + if (!t.env) + throw new Error( + JSON.stringify({ + code: b.INVALID_PARAMS, + msg: "env must not be specified", + }), + ); + if ( + (u.Platform.adapter || this._useDefaultAdapter(), + (this.requestClient = new u.Platform.adapter.reqClass({ + timeout: t.timeout || 5e3, + timeoutMsg: + "[" + + (0, d.getSdkName)() + + "][REQUEST TIMEOUT] request had been abort since didn't finished within" + + t.timeout / 1e3 + + "s", + })), + u.Platform.runtime !== y.WEB) + ) { + if (!t.appSecret) + throw new Error( + JSON.stringify({ + code: b.INVALID_PARAMS, + msg: "invalid appSecret", + }), + ); + var n = u.Platform.adapter.getAppSign + ? u.Platform.adapter.getAppSign() + : ""; + if (t.appSign && n && t.appSign !== n) + throw new Error( + JSON.stringify({ + code: b.INVALID_PARAMS, + msg: "invalid appSign", + }), + ); + if ((n && (t.appSign = n), !t.appSign)) + throw new Error( + JSON.stringify({ + code: b.INVALID_PARAMS, + msg: "invalid appSign", + }), + ); + } + ((this._config = f(f({}, A), t)), + (this._config.timeout = this._formatTimeout( + this._config.timeout, + ))); + var r = this._config, + i = r.env, + o = r.persistence, + a = r.debug, + s = r.timeout, + p = r.appSecret, + h = r.appSign; + ((0, c.initCache)({ + env: i, + persistence: o, + debug: a, + platformInfo: this.platform, + }), + (0, l.initRequest)({ + env: i, + region: t.region || "", + timeout: s, + appSecret: p, + appSign: h, + }), + t.region && + (0, d.setRegionLevelEndpoint)(i, t.region || "")); + var m = new e(this._config); + return ((m.requestClient = this.requestClient), m); + }), + (e.prototype.updateConfig = function (e) { + var t = e.persistence, + n = e.debug; + ((this._config.persistence = t), + (this._config.debug = n), + (0, c.initCache)({ + env: this._config.env, + persistence: t, + debug: n, + platformInfo: this.platform, + })); + }), + (e.prototype.registerExtension = function (e) { + x[e.name] = e; + }), + (e.prototype.invokeExtension = function (e, t) { + return m(this, void 0, void 0, function () { + var n; + return g(this, function (r) { + switch (r.label) { + case 0: + if (!(n = x[e])) + throw new Error( + JSON.stringify({ + code: b.INVALID_PARAMS, + msg: + "extension:" + + e + + " must be registered before invoke", + }), + ); + return [4, n.invoke(t, this)]; + case 1: + return [2, r.sent()]; + } + }); + }); + }), + (e.prototype.useAdapters = function (e) { + var t = v(e) || {}, + n = t.adapter, + r = t.runtime; + (n && (u.Platform.adapter = n), + r && (u.Platform.runtime = r)); + }), + (e.prototype.registerHook = function (t) { + (0, s.registerHook)(e, t); + }), + (e.prototype.registerComponent = function (t) { + (0, s.registerComponent)(e, t); + }), + (e.prototype.registerVersion = function (e) { + (0, d.setSdkVersion)(e); + }), + (e.prototype.registerSdkName = function (e) { + (0, d.setSdkName)(e); + }), + (e.prototype.registerEndPoint = function (e, t) { + (0, d.setEndPoint)(e, t); + }), + (e.prototype._useDefaultAdapter = function () { + var e = _(), + t = e.adapter, + n = e.runtime; + ((u.Platform.adapter = t), (u.Platform.runtime = n)); + }), + (e.prototype._formatTimeout = function (e) { + switch (!0) { + case e > C: + return ( + w( + b.INVALID_PARAMS, + "timeout is greater than maximum value[10min]", + ), + C + ); + case e < 100: + return ( + w( + b.INVALID_PARAMS, + "timeout is less than maximum value[100ms]", + ), + 100 + ); + default: + return e; + } + }), + p( + [ + E({ + mode: "sync", + title: "Cloudbase 初始化失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 cloudbase.init() 的语法或参数是否正确", + " 2 - 如果是非浏览器环境,是否配置了安全应用来源(https://docs.cloudbase.net/api-reference/webv2/adapter.html#jie-ru-liu-cheng)", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + k, + ], + }), + h("design:type", Function), + h("design:paramtypes", [Object]), + h("design:returntype", e), + ], + e.prototype, + "init", + null, + ), + p( + [ + E({ + title: "调用扩展能力失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 invokeExtension() 的语法或参数是否正确", + " 2 - 被调用的扩展能力是否已经安装并通过 registerExtension() 注册", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + k, + ], + }), + h("design:type", Function), + h("design:paramtypes", [String, Object]), + h("design:returntype", Promise), + ], + e.prototype, + "invokeExtension", + null, + ), + e + ); + })(), + D = (t.cloudbase = new I()); + (D.useAdapters(a["default"]), (t["default"] = D)); + }, + 4319: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.Platform = void 0), + (t.Platform = {})); + }, + 1706: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.getCacheByEnvId = function (e) { + return f[e]; + }), + (t.getLocalCache = function (e) { + return p[e]; + }), + (t.initCache = function (e) { + var t = e.env, + n = e.persistence, + r = e.platformInfo, + h = { + accessTokenKey: o + "_" + t, + accessTokenExpireKey: a + "_" + t, + refreshTokenKey: s + "_" + t, + anonymousUuidKey: u + "_" + t, + loginTypeKey: c + "_" + t, + userInfoKey: l + "_" + t, + }; + (f[t] + ? f[t].updatePersistence(n) + : (f[t] = new d( + i(i({}, e), { + keys: h, + platformInfo: r, + alwaysLocalKeys: ["anonymousUuidKey"], + }), + )), + (p[t] = + p[t] || + new d( + i(i({}, e), { + keys: h, + platformInfo: r, + persistence: "local", + }), + ))); + })); + var r = n(2566), + i = function () { + return ( + (i = + Object.assign || + function (e) { + for (var t, n = 1, r = arguments.length; n < r; n++) + for (var i in (t = arguments[n])) + Object.prototype.hasOwnProperty.call(t, i) && + (e[i] = t[i]); + return e; + }), + i.apply(this, arguments) + ); + }, + o = "access_token", + a = "access_token_expire", + s = "refresh_token", + u = "anonymous_uuid", + c = "login_type", + l = "user_info", + d = r.cache.CloudbaseCache, + f = {}, + p = {}; + }, + 3219: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.registerComponent = function (e, t) { + var n = t.name, + r = t.namespace, + u = t.entity, + c = t.injectEvents, + l = t.IIFE, + d = void 0 !== l && l; + if (a[n] || (r && e[r])) + throw new Error( + JSON.stringify({ + code: o.INVALID_OPERATION, + msg: "Duplicate component " + n, + }), + ); + if (d) { + if (!u || "function" != typeof u) + throw new Error( + JSON.stringify({ + code: o.INVALID_PARAMS, + msg: "IIFE component's entity must be a function", + }), + ); + u.call(e); + } + if ( + ((a[n] = t), r ? (e.prototype[r] = u) : s(e.prototype, u), c) + ) { + var f = c.bus, + p = c.events; + if (!f || !p || 0 === p.length) return; + var h = e.prototype.fire || function () {}; + (e.prototype.events || (e.prototype.events = {}), + (e.prototype.events || {})[n] + ? (e.prototype.events[n].events = i( + e.prototype.events[n].events, + p, + )) + : (e.prototype.events[n] = { bus: f, events: p }), + (e.prototype.fire = function (e, t) { + for (var n in (h(e, t), this.events)) { + var r = this.events[n], + i = r.bus; + if (r.events.includes(e)) { + i.fire(e, t); + break; + } + } + })); + } + }), + (t.registerHook = function (e, t) { + var n = t.entity, + r = t.target; + if (!e.prototype.hasOwnProperty(r)) + throw new Error( + JSON.stringify({ + code: o.INVALID_OPERATION, + msg: "target:" + r + " is not exist", + }), + ); + var a = e.prototype[r]; + if ("function" != typeof a) + throw new Error( + JSON.stringify({ + code: o.INVALID_OPERATION, + msg: + "target:" + + r + + " is not a function which is the only type supports hook", + }), + ); + e.prototype[r] = function () { + for (var e = [], t = 0; t < arguments.length; t++) + e[t] = arguments[t]; + return ( + n.call.apply(n, i([this], e)), + a.call.apply(a, i([this], e)) + ); + }; + })); + var r = n(2566), + i = function () { + for (var e = 0, t = 0, n = arguments.length; t < n; t++) + e += arguments[t].length; + var r = Array(e), + i = 0; + for (t = 0; t < n; t++) + for ( + var o = arguments[t], a = 0, s = o.length; + a < s; + a++, i++ + ) + r[i] = o[a]; + return r; + }, + o = r.constants.ERRORS, + a = {}; + function s(e, t) { + if (!(t instanceof Object)) return t; + switch (t.constructor) { + case Date: + return new Date(t.getTime()); + case Object: + e === undefined && (e = {}); + break; + case Array: + e = []; + break; + default: + return t; + } + for (var n in t) t.hasOwnProperty(n) && (e[n] = s(e[n], t[n])); + return e; + } + }, + 6153: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.CloudbaseRequest = void 0), + (t.getRequestByEnvId = function (e) { + return w[e]; + }), + (t.initRequest = function (e) { + w[e.env] = new k(c(c({}, e), { throw: !0 })); + })); + var r = n(3052), + i = n(2566), + o = n(4283), + a = n(1706), + s = n(7696), + u = n(4319), + c = function () { + return ( + (c = + Object.assign || + function (e) { + for (var t, n = 1, r = arguments.length; n < r; n++) + for (var i in (t = arguments[n])) + Object.prototype.hasOwnProperty.call(t, i) && + (e[i] = t[i]); + return e; + }), + c.apply(this, arguments) + ); + }, + l = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + d = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + f = i.constants.ERRORS, + p = i.utils.genSeqId, + h = i.utils.isFormData, + m = i.utils.formatUrl, + g = i.utils.createSign, + v = i.adapters.RUNTIME, + _ = [ + "auth.getJwt", + "auth.logout", + "auth.signInWithTicket", + "auth.signInAnonymously", + "auth.signIn", + "auth.fetchAccessTokenWithRefreshToken", + "auth.signUpWithEmailAndPassword", + "auth.activateEndUserMail", + "auth.sendPasswordResetEmail", + "auth.resetPasswordWithToken", + "auth.isUsernameRegistered", + ]; + function y(e, t, n) { + var r = e[t]; + e[t] = function (t) { + var i = {}, + o = {}; + n.forEach(function (n) { + var r = n.call(e, t), + a = r.data, + s = r.headers; + (Object.assign(i, a), Object.assign(o, s)); + }); + var a = t.data; + return ( + a && + (function () { + if (h(a)) for (var e in i) a.append(e, i[e]); + else t.data = c(c({}, a), i); + })(), + (t.headers = c(c({}, t.headers || {}), o)), + r.call(e, t) + ); + }; + } + function b() { + var e = p(); + return { + data: { seqId: e }, + headers: { + "X-SDK-Version": + "@cloudbase/js-sdk/" + (0, r.getSdkVersion)(), + "x-seqid": e, + }, + }; + } + var k = (t.CloudbaseRequest = (function () { + function e(e) { + ((this._throwWhenRequestFail = !1), + (this.config = e), + (this._reqClass = new u.Platform.adapter.reqClass({ + timeout: this.config.timeout, + timeoutMsg: + "[@cloudbase/js-sdk] 请求在" + + this.config.timeout / 1e3 + + "s内未完成,已中断", + restrictedMethods: ["post"], + })), + (this._throwWhenRequestFail = e["throw"] || !1), + (this._cache = (0, a.getCacheByEnvId)(this.config.env)), + (this._localCache = (0, a.getLocalCache)(this.config.env)), + y(this._reqClass, "post", [b]), + y(this._reqClass, "upload", [b]), + y(this._reqClass, "download", [b])); + } + return ( + (e.prototype.post = function (e) { + return l(this, void 0, void 0, function () { + return d(this, function (t) { + switch (t.label) { + case 0: + return [4, this._reqClass.post(e)]; + case 1: + return [2, t.sent()]; + } + }); + }); + }), + (e.prototype.upload = function (e) { + return l(this, void 0, void 0, function () { + return d(this, function (t) { + switch (t.label) { + case 0: + return [4, this._reqClass.upload(e)]; + case 1: + return [2, t.sent()]; + } + }); + }); + }), + (e.prototype.download = function (e) { + return l(this, void 0, void 0, function () { + return d(this, function (t) { + switch (t.label) { + case 0: + return [4, this._reqClass.download(e)]; + case 1: + return [2, t.sent()]; + } + }); + }); + }), + (e.prototype.refreshAccessToken = function () { + return l(this, void 0, void 0, function () { + var e, t, n; + return d(this, function (r) { + switch (r.label) { + case 0: + (this._refreshAccessTokenPromise || + (this._refreshAccessTokenPromise = + this._refreshAccessToken()), + (r.label = 1)); + case 1: + return ( + r.trys.push([1, 3, , 4]), + [4, this._refreshAccessTokenPromise] + ); + case 2: + return ((e = r.sent()), [3, 4]); + case 3: + return ((n = r.sent()), (t = n), [3, 4]); + case 4: + if ( + ((this._refreshAccessTokenPromise = null), + (this._shouldRefreshAccessTokenHook = null), + t) + ) + throw t; + return [2, e]; + } + }); + }); + }), + (e.prototype.getAccessToken = function () { + return l(this, void 0, void 0, function () { + var e, t, n, r, i, o, a, s, u; + return d(this, function (c) { + switch (c.label) { + case 0: + return ( + (e = this._cache.keys), + (t = e.accessTokenKey), + (n = e.accessTokenExpireKey), + (r = e.refreshTokenKey), + [4, this._cache.getStoreAsync(r)] + ); + case 1: + if (!c.sent()) + throw new Error( + JSON.stringify({ + code: f.OPERATION_FAIL, + msg: "refresh token is not exist, your local data might be messed up, please retry after clear localStorage or sessionStorage", + }), + ); + return [4, this._cache.getStoreAsync(t)]; + case 2: + return ( + (i = c.sent()), + (a = Number), + [4, this._cache.getStoreAsync(n)] + ); + case 3: + return ( + (o = a.apply(void 0, [c.sent()])), + (s = !0), + (u = this._shouldRefreshAccessTokenHook) + ? [4, this._shouldRefreshAccessTokenHook(i, o)] + : [3, 5] + ); + case 4: + ((u = !c.sent()), (c.label = 5)); + case 5: + return ( + u && (s = !1), + (i && o && !(o < Date.now())) || !s + ? [3, 7] + : [4, this.refreshAccessToken()] + ); + case 6: + return [2, c.sent()]; + case 7: + return [ + 2, + { accessToken: i, accessTokenExpire: o }, + ]; + } + }); + }); + }), + (e.prototype.request = function (e, t, n) { + return l(this, void 0, void 0, function () { + var i, + o, + a, + s, + l, + f, + p, + h, + y, + b, + k, + w, + E, + A, + C, + x, + I, + D, + S, + O, + T, + M, + N, + P, + F, + L; + return d(this, function (d) { + switch (d.label) { + case 0: + return ( + (i = "x-tcb-trace_" + this.config.env), + (o = "application/x-www-form-urlencoded"), + (a = c( + { + action: e, + dataVersion: r.DATA_VERSION, + env: this.config.env, + }, + t, + )), + -1 !== _.indexOf(e) + ? [3, 3] + : ((s = this._cache.keys.refreshTokenKey), + [4, this._cache.getStoreAsync(s)]) + ); + case 1: + return d.sent() + ? ((l = a), [4, this.getAccessToken()]) + : [3, 3]; + case 2: + ((l.access_token = d.sent().accessToken), + (d.label = 3)); + case 3: + if ("storage.uploadFile" === e) { + for (p in (f = new FormData())) + f.hasOwnProperty(p) && + f[p] !== undefined && + f.append(p, a[p]); + o = "multipart/form-data"; + } else + for (p in ((o = "application/json;charset=UTF-8"), + (f = {}), + a)) + a[p] !== undefined && (f[p] = a[p]); + return ( + (h = { headers: { "content-type": o } }), + (null == n ? void 0 : n.onUploadProgress) && + (h.onUploadProgress = n.onUploadProgress), + this.config.region && + (h.headers["X-TCB-Region"] = + this.config.region), + (y = this._localCache.getStore(i)) && + (h.headers["X-TCB-Trace"] = y), + u.Platform.runtime !== v.WEB && + ((b = this.config), + (k = b.appSign), + (w = b.appSecret), + (E = Date.now()), + (A = w.appAccessKey), + (C = w.appAccessKeyId), + (x = g( + { + data: {}, + timestamp: E, + appAccessKeyId: C, + appSign: k, + }, + A, + )), + (h.headers["X-TCB-App-Source"] = + "timestamp=" + + E + + ";appAccessKeyId=" + + C + + ";appSign=" + + k + + ";sign=" + + x)), + (I = t.parse), + (D = t.inQuery), + (S = t.search), + (O = { env: this.config.env }), + I && (O.parse = !0), + D && (O = c(c({}, D), O)), + (T = (0, r.getEndPoint)()), + (M = T.BASE_URL), + (N = T.PROTOCOL), + (P = m(N, M, O)), + S && (P += S), + [4, this.post(c({ url: P, data: f }, h))] + ); + case 4: + if ( + ((F = d.sent()), + (L = F.header && F.header["x-tcb-trace"]) && + this._localCache.setStore(i, L), + (200 !== Number(F.status) && + 200 !== Number(F.statusCode)) || + !F.data) + ) + throw new Error("network request error"); + return [2, F]; + } + }); + }); + }), + (e.prototype.send = function (e, t) { + return ( + void 0 === t && (t = {}), + l(this, void 0, void 0, function () { + var n; + return d(this, function (r) { + switch (r.label) { + case 0: + return [ + 4, + this.request(e, t, { + onUploadProgress: t.onUploadProgress, + }), + ]; + case 1: + return "ACCESS_TOKEN_EXPIRED" !== + (n = r.sent()).data.code || -1 !== _.indexOf(e) + ? [3, 4] + : [4, this.refreshAccessToken()]; + case 2: + return ( + r.sent(), + [ + 4, + this.request(e, t, { + onUploadProgress: t.onUploadProgress, + }), + ] + ); + case 3: + ((n = r.sent()), (r.label = 4)); + case 4: + if (n.data.code && this._throwWhenRequestFail) + throw new Error( + JSON.stringify({ + code: f.OPERATION_FAIL, + msg: + "[" + n.data.code + "] " + n.data.message, + }), + ); + return [2, n.data]; + } + }); + }) + ); + }), + (e.prototype._refreshAccessToken = function (e) { + return ( + void 0 === e && (e = 1), + l(this, void 0, void 0, function () { + var t, n, i, a, u, c, l, p, h, m, g, v, _; + return d(this, function (d) { + switch (d.label) { + case 0: + return ( + (t = this._cache.keys), + (n = t.accessTokenKey), + (i = t.accessTokenExpireKey), + (a = t.refreshTokenKey), + (u = t.loginTypeKey), + (c = t.anonymousUuidKey), + [4, this._cache.removeStoreAsync(n)] + ); + case 1: + return ( + d.sent(), + [4, this._cache.removeStoreAsync(i)] + ); + case 2: + return ( + d.sent(), + [4, this._cache.getStoreAsync(a)] + ); + case 3: + if (!(l = d.sent())) + throw new Error( + JSON.stringify({ + code: f.INVALID_OPERATION, + msg: "not login", + }), + ); + return ( + (p = { refresh_token: l }), + [ + 4, + this.request( + "auth.fetchAccessTokenWithRefreshToken", + p, + ), + ] + ); + case 4: + return (h = d.sent()).data.code + ? "SIGN_PARAM_INVALID" !== (m = h.data.code) && + "REFRESH_TOKEN_EXPIRED" !== m && + "INVALID_REFRESH_TOKEN" !== m + ? [3, 11] + : [4, this._cache.getStoreAsync(u)] + : [3, 12]; + case 5: + return d.sent() === r.LOGINTYPE.ANONYMOUS && + "INVALID_REFRESH_TOKEN" === m + ? [4, this._cache.getStoreAsync(c)] + : [3, 9]; + case 6: + return ( + (g = d.sent()), + [4, this._cache.getStoreAsync(a)] + ); + case 7: + return ( + (v = d.sent()), + [ + 4, + this.send("auth.signInAnonymously", { + anonymous_uuid: g, + refresh_token: v, + }), + ] + ); + case 8: + if ( + ((_ = d.sent()), + this._setRefreshToken(_.refresh_token), + e >= 1) + ) + return [2, this._refreshAccessToken(--e)]; + throw new Error( + JSON.stringify({ + code: f.OPERATION_FAIL, + message: "重试获取 refresh token 失败", + }), + ); + case 9: + return ( + o.cloudbase.fire(s.EVENTS.LOGIN_STATE_EXPIRED), + [4, this._cache.removeStoreAsync(a)] + ); + case 10: + (d.sent(), (d.label = 11)); + case 11: + throw new Error( + JSON.stringify({ + code: f.NETWORK_ERROR, + msg: + "refresh access_token failed:" + + h.data.code, + }), + ); + case 12: + return h.data.access_token + ? (o.cloudbase.fire( + s.EVENTS.ACCESS_TOKEN_REFRESHD, + ), + [ + 4, + this._cache.setStoreAsync( + n, + h.data.access_token, + ), + ]) + : [3, 15]; + case 13: + return ( + d.sent(), + [ + 4, + this._cache.setStoreAsync( + i, + h.data.access_token_expire + Date.now(), + ), + ] + ); + case 14: + return ( + d.sent(), + [ + 2, + { + accessToken: h.data.access_token, + accessTokenExpire: + h.data.access_token_expire, + }, + ] + ); + case 15: + return h.data.refresh_token + ? [4, this._cache.removeStoreAsync(a)] + : [3, 19]; + case 16: + return ( + d.sent(), + [ + 4, + this._cache.setStoreAsync( + a, + h.data.refresh_token, + ), + ] + ); + case 17: + return ( + d.sent(), + [4, this._refreshAccessToken()] + ); + case 18: + (d.sent(), (d.label = 19)); + case 19: + return [2]; + } + }); + }) + ); + }), + (e.prototype._setRefreshToken = function (e) { + return l(this, void 0, void 0, function () { + var t, n, r, i; + return d(this, function (o) { + switch (o.label) { + case 0: + return ( + (t = this._cache.keys), + (n = t.accessTokenKey), + (r = t.accessTokenExpireKey), + (i = t.refreshTokenKey), + [4, this._cache.removeStoreAsync(n)] + ); + case 1: + return ( + o.sent(), + [4, this._cache.removeStoreAsync(r)] + ); + case 2: + return ( + o.sent(), + [4, this._cache.setStoreAsync(i, e)] + ); + case 3: + return (o.sent(), [2]); + } + }); + }); + }), + e + ); + })()), + w = {}; + }, + 1235: function (e, t) { + "use strict"; + var n; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.LOGINTYPE = void 0), + (function (e) { + ((e.ANONYMOUS = "ANONYMOUS"), + (e.WECHAT = "WECHAT"), + (e.WECHAT_PUBLIC = "WECHAT-PUBLIC"), + (e.WECHAT_OPEN = "WECHAT-OPEN"), + (e.CUSTOM = "CUSTOM"), + (e.EMAIL = "EMAIL"), + (e.USERNAME = "USERNAME"), + (e.NULL = "NULL"), + (e.PHONE = "PHONE")); + })(n || (t.LOGINTYPE = n = {}))); + }, + 3442: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.Auth = void 0), + Object.defineProperty(t, "AuthProvider", { + enumerable: !0, + get: function () { + return l.AuthProvider; + }, + }), + (t.eventBus = t.LoginState = t.EVENTS = void 0), + (t.registerAuth = function (e) { + try { + e.registerComponent(M); + } catch (t) { + console.warn(t); + } + }), + (t.registerProvider = function (e, t) { + O.prototype[e] = function (n) { + var r = "_" + e; + return ( + this[r] || (this[r] = new t(h(h({}, n), this._config))), + this[r] + ); + }; + })); + var i = r(n(9367)), + o = n(2566), + a = n(9250), + s = n(4325), + u = n(2007), + c = n(1235), + l = n(4522), + d = n(7036), + f = n(9676), + p = n(2424), + h = function () { + return ( + (h = + Object.assign || + function (e) { + for (var t, n = 1, r = arguments.length; n < r; n++) + for (var i in (t = arguments[n])) + Object.prototype.hasOwnProperty.call(t, i) && + (e[i] = t[i]); + return e; + }), + h.apply(this, arguments) + ); + }, + m = function (e, t, n, r) { + var o, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (o = e[u]) && + (s = (a < 3 ? o(s) : a > 3 ? o(t, n, s) : o(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + g = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + v = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + _ = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + y = o.events.CloudbaseEventEmitter, + b = o.adapters.RUNTIME, + k = o.utils.printWarn, + w = o.utils.throwError, + E = o.utils.transformPhone, + A = o.constants.ERRORS, + C = o.constants.COMMUNITY_SITE_URL, + x = o.helpers.catchErrorsDecorator, + I = (t.eventBus = new y()), + D = (function () { + function e(e) { + var t = e.cache, + n = e.request; + ((this._cache = t), (this._request = n), this._setUserInfo()); + } + return ( + (e.prototype.checkLocalInfo = function () { + return v(this, void 0, void 0, function () { + return _(this, function (e) { + return ( + (this.uid = this._getLocalUserInfo("uid")), + (this.loginType = + this._getLocalUserInfo("loginType")), + (this.openid = this._getLocalUserInfo("wxOpenId")), + (this.wxOpenId = this._getLocalUserInfo("wxOpenId")), + (this.wxPublicId = + this._getLocalUserInfo("wxPublicId")), + (this.unionId = this._getLocalUserInfo("wxUnionId")), + (this.qqMiniOpenId = + this._getLocalUserInfo("qqMiniOpenId")), + (this.customUserId = + this._getLocalUserInfo("customUserId")), + (this.nickName = this._getLocalUserInfo("nickName")), + (this.gender = this._getLocalUserInfo("gender")), + (this.avatarUrl = + this._getLocalUserInfo("avatarUrl")), + (this.email = this._getLocalUserInfo("email")), + (this.hasPassword = Boolean( + this._getLocalUserInfo("hasPassword"), + )), + (this.phone = this._getLocalUserInfo("phone")), + (this.username = this._getLocalUserInfo("username")), + (this.location = { + country: this._getLocalUserInfo("country"), + province: this._getLocalUserInfo("province"), + city: this._getLocalUserInfo("city"), + }), + [2] + ); + }); + }); + }), + (e.prototype.checkLocalInfoAsync = function () { + return v(this, void 0, void 0, function () { + var e, t, n, r, i, o, a, s, u, c, l, d, f, p, h, m, g, v; + return _(this, function (_) { + switch (_.label) { + case 0: + return ( + (e = this), + [4, this._getLocalUserInfoAsync("uid")] + ); + case 1: + return ( + (e.uid = _.sent()), + (t = this), + [4, this._getLocalUserInfoAsync("loginType")] + ); + case 2: + return ( + (t.loginType = _.sent()), + (n = this), + [4, this._getLocalUserInfoAsync("wxOpenId")] + ); + case 3: + return ( + (n.openid = _.sent()), + (r = this), + [4, this._getLocalUserInfoAsync("wxOpenId")] + ); + case 4: + return ( + (r.wxOpenId = _.sent()), + (i = this), + [4, this._getLocalUserInfoAsync("wxPublicId")] + ); + case 5: + return ( + (i.wxPublicId = _.sent()), + (o = this), + [4, this._getLocalUserInfoAsync("wxUnionId")] + ); + case 6: + return ( + (o.unionId = _.sent()), + (a = this), + [4, this._getLocalUserInfoAsync("qqMiniOpenId")] + ); + case 7: + return ( + (a.qqMiniOpenId = _.sent()), + (s = this), + [4, this._getLocalUserInfoAsync("customUserId")] + ); + case 8: + return ( + (s.customUserId = _.sent()), + (u = this), + [4, this._getLocalUserInfoAsync("nickName")] + ); + case 9: + return ( + (u.nickName = _.sent()), + (c = this), + [4, this._getLocalUserInfoAsync("gender")] + ); + case 10: + return ( + (c.gender = _.sent()), + (l = this), + [4, this._getLocalUserInfoAsync("avatarUrl")] + ); + case 11: + return ( + (l.avatarUrl = _.sent()), + (d = this), + [4, this._getLocalUserInfoAsync("email")] + ); + case 12: + return ( + (d.email = _.sent()), + (f = this), + (p = Boolean), + [4, this._getLocalUserInfoAsync("hasPassword")] + ); + case 13: + return ( + (f.hasPassword = p.apply(void 0, [_.sent()])), + (h = this), + [4, this._getLocalUserInfoAsync("phone")] + ); + case 14: + return ( + (h.phone = _.sent()), + (m = this), + [4, this._getLocalUserInfoAsync("username")] + ); + case 15: + return ( + (m.username = _.sent()), + (g = this), + (v = {}), + [4, this._getLocalUserInfoAsync("country")] + ); + case 16: + return ( + (v.country = _.sent()), + [4, this._getLocalUserInfoAsync("province")] + ); + case 17: + return ( + (v.province = _.sent()), + [4, this._getLocalUserInfoAsync("city")] + ); + case 18: + return ( + (g.location = ((v.city = _.sent()), v)), + [2] + ); + } + }); + }); + }), + (e.prototype.linkWithTicket = function (e) { + if ("string" != typeof e) + throw new Error("ticket must be string"); + return this._request.send("auth.linkWithTicket", { + ticket: e, + }); + }), + (e.prototype.linkWithRedirect = function (e) { + e.signInWithRedirect(); + }), + (e.prototype.getLinkedUidList = function () { + return v(this, void 0, void 0, function () { + var e, t, n, r, i, o; + return _(this, function (a) { + switch (a.label) { + case 0: + return [ + 4, + this._request.send("auth.getLinkedUidList", {}), + ]; + case 1: + for ( + e = a.sent().data, + t = !1, + n = e.users, + r = 0, + i = n; + r < i.length; + r++ + ) + if ((o = i[r]).wxOpenId && o.wxPublicId) { + t = !0; + break; + } + return [2, { users: n, hasPrimaryUid: t }]; + } + }); + }); + }), + (e.prototype.setPrimaryUid = function (e) { + return this._request.send("auth.setPrimaryUid", { uid: e }); + }), + (e.prototype.unlink = function (e) { + return this._request.send("auth.unlink", { platform: e }); + }), + (e.prototype.update = function (e) { + return v(this, void 0, void 0, function () { + var t, n, r, i, o, a, s; + return _(this, function (u) { + switch (u.label) { + case 0: + return ( + (t = e.nickName), + (n = e.gender), + (r = e.avatarUrl), + (i = e.province), + (o = e.country), + (a = e.city), + [ + 4, + this._request.send("auth.updateUserInfo", { + nickName: t, + gender: n, + avatarUrl: r, + province: i, + country: o, + city: a, + }), + ] + ); + case 1: + return ( + (s = u.sent().data), + this._setLocalUserInfo(s), + [2] + ); + } + }); + }); + }), + (e.prototype.updatePassword = function (e, t) { + return this._request.send("auth.updatePassword", { + oldPassword: t, + newPassword: e, + }); + }), + (e.prototype.updateEmail = function (e, t) { + return this._request.send("auth.updateEmail", { + newEmail: e, + password: t, + }); + }), + (e.prototype.updateUsername = function (e) { + return ( + "string" != typeof e && + w(A.INVALID_PARAMS, "username must be a string"), + this._request.send("auth.updateUsername", { username: e }) + ); + }), + (e.prototype.refresh = function () { + return v(this, void 0, void 0, function () { + var e; + return _(this, function (t) { + switch (t.label) { + case 0: + return [ + 4, + this._request.send("auth.getUserInfo", {}), + ]; + case 1: + return ( + (e = t.sent().data), + this._setLocalUserInfo(e), + [2, e] + ); + } + }); + }); + }), + (e.prototype.linkWithPhoneNumber = function (e, t) { + return v(this, void 0, void 0, function () { + return _(this, function (n) { + return [ + 2, + this._request.send("auth.linkOrUpdatePhoneNumber", { + phoneNumber: E(e), + phoneCode: t, + }), + ]; + }); + }); + }), + (e.prototype.updatePhoneNumber = function (e, t) { + return v(this, void 0, void 0, function () { + return _(this, function (n) { + return [ + 2, + this._request.send("auth.linkOrUpdatePhoneNumber", { + phoneNumber: E(e), + phoneCode: t, + }), + ]; + }); + }); + }), + (e.prototype._getLocalUserInfo = function (e) { + var t = this._cache.keys.userInfoKey; + return this._cache.getStore(t)[e]; + }), + (e.prototype._getLocalUserInfoAsync = function (e) { + return v(this, void 0, void 0, function () { + var t; + return _(this, function (n) { + switch (n.label) { + case 0: + return ( + (t = this._cache.keys.userInfoKey), + [4, this._cache.getStoreAsync(t)] + ); + case 1: + return [2, n.sent()[e]]; + } + }); + }); + }), + (e.prototype._setUserInfo = function () { + var e = this, + t = this._cache.keys.userInfoKey, + n = this._cache.getStore(t); + ([ + "uid", + "loginType", + "openid", + "wxOpenId", + "wxPublicId", + "unionId", + "qqMiniOpenId", + "email", + "hasPassword", + "customUserId", + "nickName", + "gender", + "avatarUrl", + "phone", + "username", + ].forEach(function (t) { + e[t] = n[t]; + }), + (this.location = { + country: n.country, + province: n.province, + city: n.city, + })); + }), + (e.prototype._setLocalUserInfo = function (e) { + var t = this._cache.keys.userInfoKey; + (this._cache.setStore(t, e), this._setUserInfo()); + }), + m( + [ + x({ + title: "绑定自定义登录失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.linkWithTicket() 的语法或参数是否正确", + " 2 - 此账户是否已经绑定自定义登录", + " 3 - ticket 参数是否归属当前环境", + " 4 - 创建 ticket 的自定义登录私钥是否过期", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String]), + g("design:returntype", Promise), + ], + e.prototype, + "linkWithTicket", + null, + ), + m( + [ + x({ + title: "绑定第三方登录方式失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.linkWithRedirect() 的语法或参数是否正确", + " 2 - 此账户是否已经绑定此第三方", + " 3 - 此第三方是否已经授权", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [Object]), + g("design:returntype", void 0), + ], + e.prototype, + "linkWithRedirect", + null, + ), + m( + [ + x({ + title: "获取账户列表失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.getLinkedUidList() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", []), + g("design:returntype", Promise), + ], + e.prototype, + "getLinkedUidList", + null, + ), + m( + [ + x({ + title: "设置微信主账号失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.setPrimaryUid() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String]), + g("design:returntype", void 0), + ], + e.prototype, + "setPrimaryUid", + null, + ), + m( + [ + x({ + title: "接触绑定失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.unlink() 的语法或参数是否正确", + " 2 - 当前账户是否已经与此登录方式解绑", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String]), + g("design:returntype", void 0), + ], + e.prototype, + "unlink", + null, + ), + m( + [ + x({ + title: "更新用户信息失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.update() 的语法或参数是否正确", + " 2 - 用户信息中是否包含非法值", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [Object]), + g("design:returntype", Promise), + ], + e.prototype, + "update", + null, + ), + m( + [ + x({ + title: "更新密码失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.updatePassword() 的语法或参数是否正确", + " 3 - 新密码中是否包含非法字符", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String, String]), + g("design:returntype", void 0), + ], + e.prototype, + "updatePassword", + null, + ), + m( + [ + x({ + title: "更新邮箱地址失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.updateEmail() 的语法或参数是否正确", + " 2 - 当前环境是否开通了邮箱密码登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String, String]), + g("design:returntype", void 0), + ], + e.prototype, + "updateEmail", + null, + ), + m( + [ + x({ + title: "更新用户名失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.updateUsername() 的语法或参数是否正确", + " 2 - 当前环境是否开通了用户名密码登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String]), + g("design:returntype", void 0), + ], + e.prototype, + "updateUsername", + null, + ), + m( + [ + x({ + title: "刷新本地用户信息失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 User.refresh() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", []), + g("design:returntype", Promise), + ], + e.prototype, + "refresh", + null, + ), + m( + [ + x({ + title: "绑定手机号失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().linkWithPhoneNumber() 的语法或参数是否正确", + " 2 - 当前环境是否开通了短信验证码登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String, String]), + g("design:returntype", Promise), + ], + e.prototype, + "linkWithPhoneNumber", + null, + ), + m( + [ + x({ + title: "更新手机号失败", + messages: [ + "请确认以下各项:", + " 1 - 调用语法或参数是否正确", + " 2 - 当前环境是否开通了短信验证码登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String, String]), + g("design:returntype", Promise), + ], + e.prototype, + "updatePhoneNumber", + null, + ), + e + ); + })(), + S = (t.LoginState = (function () { + function e(e) { + var t = e.envId, + n = e.cache, + r = e.request; + (t || w(A.INVALID_PARAMS, "envId is not defined"), + (this._cache = n), + (this.user = new D({ cache: n, request: r }))); + } + return ( + (e.prototype.checkLocalState = function () { + return v(this, void 0, void 0, function () { + var e, t, n, r, i, o, a; + return _(this, function (s) { + return ( + (e = this._cache.keys), + (t = e.refreshTokenKey), + (n = e.accessTokenKey), + (r = e.accessTokenExpireKey), + (i = this._cache.getStore(t)), + (o = this._cache.getStore(n)), + (a = this._cache.getStore(r)), + (this.credential = { + refreshToken: i, + accessToken: o, + accessTokenExpire: a, + }), + (this._loginType = this._cache.getStore( + this._cache.keys.loginTypeKey, + )), + this.user.checkLocalInfo(), + [2] + ); + }); + }); + }), + (e.prototype.checkLocalStateAsync = function () { + return v(this, void 0, void 0, function () { + var e, t, n, r, i, o, a, s; + return _(this, function (u) { + switch (u.label) { + case 0: + return ( + (e = this._cache.keys), + (t = e.refreshTokenKey), + (n = e.accessTokenKey), + (r = e.accessTokenExpireKey), + [4, this._cache.getStoreAsync(t)] + ); + case 1: + return ( + (i = u.sent()), + [4, this._cache.getStoreAsync(n)] + ); + case 2: + return ( + (o = u.sent()), + [4, this._cache.getStoreAsync(r)] + ); + case 3: + return ( + (a = u.sent()), + (this.credential = { + refreshToken: i, + accessToken: o, + accessTokenExpire: a, + }), + (s = this), + [ + 4, + this._cache.getStoreAsync( + this._cache.keys.loginTypeKey, + ), + ] + ); + case 4: + return ( + (s._loginType = u.sent()), + [4, this.user.checkLocalInfoAsync()] + ); + case 5: + return (u.sent(), [2]); + } + }); + }); + }), + Object.defineProperty(e.prototype, "isAnonymousAuth", { + get: function () { + return this.loginType === c.LOGINTYPE.ANONYMOUS; + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "isCustomAuth", { + get: function () { + return this.loginType === c.LOGINTYPE.CUSTOM; + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "isWeixinAuth", { + get: function () { + return ( + this.loginType === c.LOGINTYPE.WECHAT || + this.loginType === c.LOGINTYPE.WECHAT_OPEN || + this.loginType === c.LOGINTYPE.WECHAT_PUBLIC + ); + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "isUsernameAuth", { + get: function () { + return this.loginType === c.LOGINTYPE.USERNAME; + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "loginType", { + get: function () { + return this._loginType; + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "isPhoneAuth", { + get: function () { + return this.loginType === c.LOGINTYPE.PHONE; + }, + enumerable: !1, + configurable: !0, + }), + e + ); + })()), + O = (t.Auth = (function () { + function e(e) { + ((this._config = e), + (this._cache = e.cache), + (this._request = e.request), + (this._runtime = e.runtime || b.WEB), + I.on( + T.LOGIN_TYPE_CHANGED, + this._onLoginTypeChanged.bind(this), + )); + } + return ( + Object.defineProperty(e.prototype, "currentUser", { + get: function () { + if ("async" !== this._cache.mode) { + var e = this.hasLoginState(); + return (e && e.user) || null; + } + k( + A.INVALID_OPERATION, + "current platform's storage is asynchronous, please use getCurrenUser insteed", + ); + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "loginType", { + get: function () { + return this._cache.getStore( + this._cache.keys.loginTypeKey, + ); + }, + enumerable: !1, + configurable: !0, + }), + (e.prototype.getCurrenUser = function () { + return v(this, void 0, void 0, function () { + var e; + return _(this, function (t) { + switch (t.label) { + case 0: + return [4, this.getLoginState()]; + case 1: + return (e = t.sent()) + ? [4, e.user.checkLocalInfoAsync()] + : [3, 3]; + case 2: + return (t.sent(), [2, e.user || null]); + case 3: + return [2, null]; + } + }); + }); + }), + (e.prototype.getLoginType = function () { + return v(this, void 0, void 0, function () { + return _(this, function (e) { + switch (e.label) { + case 0: + return [ + 4, + this._cache.getStoreAsync( + this._cache.keys.loginTypeKey, + ), + ]; + case 1: + return [2, e.sent()]; + } + }); + }); + }), + (e.prototype.getAccessToken = function () { + return v(this, void 0, void 0, function () { + var e; + return _(this, function (t) { + switch (t.label) { + case 0: + return ( + (e = {}), + [4, this._request.getAccessToken()] + ); + case 1: + return [ + 2, + ((e.accessToken = t.sent().accessToken), + (e.env = this._config.env), + e), + ]; + } + }); + }); + }), + (e.prototype.weixinAuthProvider = function (e) { + var t = e.appid, + n = e.scope, + r = e.state; + return ( + this._weixinAuthProvider || + (this._weixinAuthProvider = new a.WeixinAuthProvider( + h(h({}, this._config), { + cache: this._cache, + request: this._request, + runtime: this._runtime, + }), + t, + n, + r, + )), + this._weixinAuthProvider + ); + }), + (e.prototype.anonymousAuthProvider = function () { + return ( + this._anonymousAuthProvider || + (this._anonymousAuthProvider = + new s.AnonymousAuthProvider( + h(h({}, this._config), { + cache: this._cache, + request: this._request, + }), + )), + this._anonymousAuthProvider + ); + }), + (e.prototype.customAuthProvider = function () { + return ( + this._customAuthProvider || + (this._customAuthProvider = new u.CustomAuthProvider( + h(h({}, this._config), { + cache: this._cache, + request: this._request, + }), + )), + this._customAuthProvider + ); + }), + (e.prototype.emailAuthProvider = function () { + return ( + this._emailAuthProvider || + (this._emailAuthProvider = new d.EmailAuthProvider( + h(h({}, this._config), { + cache: this._cache, + request: this._request, + }), + )), + this._emailAuthProvider + ); + }), + (e.prototype.usernameAuthProvider = function () { + return ( + this._usernameAuthProvider || + (this._usernameAuthProvider = + new f.UsernameAuthProvider( + h(h({}, this._config), { + cache: this._cache, + request: this._request, + }), + )), + this._usernameAuthProvider + ); + }), + (e.prototype.phoneAuthProvider = function () { + return ( + this._phoneAuthProvider || + (this._phoneAuthProvider = new p.PhoneAuthProvider( + h(h({}, this._config), { + cache: this._cache, + request: this._request, + }), + )), + this._phoneAuthProvider + ); + }), + (e.prototype.signInWithUsernameAndPassword = function (e, t) { + return v(this, void 0, void 0, function () { + return _(this, function (n) { + return [2, this.usernameAuthProvider().signIn(e, t)]; + }); + }); + }), + (e.prototype.isUsernameRegistered = function (e) { + return v(this, void 0, void 0, function () { + var t; + return _(this, function (n) { + switch (n.label) { + case 0: + return ( + "string" != typeof e && + w( + A.INVALID_PARAMS, + "username must be a string", + ), + [ + 4, + this._request.send( + "auth.isUsernameRegistered", + { username: e }, + ), + ] + ); + case 1: + return [ + 2, + null == (t = n.sent().data) + ? void 0 + : t.isRegistered, + ]; + } + }); + }); + }), + (e.prototype.signInWithEmailAndPassword = function (e, t) { + return v(this, void 0, void 0, function () { + return _(this, function (n) { + return [2, this.emailAuthProvider().signIn(e, t)]; + }); + }); + }), + (e.prototype.signUpWithEmailAndPassword = function (e, t) { + return v(this, void 0, void 0, function () { + return _(this, function (n) { + return [2, this.emailAuthProvider().signUp(e, t)]; + }); + }); + }), + (e.prototype.sendPasswordResetEmail = function (e) { + return v(this, void 0, void 0, function () { + return _(this, function (t) { + return [2, this.emailAuthProvider().resetPassword(e)]; + }); + }); + }), + (e.prototype.signOut = function () { + return v(this, void 0, void 0, function () { + var e, t, n, r, i, o, a; + return _(this, function (s) { + switch (s.label) { + case 0: + return ( + (e = this._cache.keys), + (t = e.refreshTokenKey), + (n = e.accessTokenKey), + (r = e.accessTokenExpireKey), + (i = "auth.logout"), + [4, this._cache.getStoreAsync(t)] + ); + case 1: + return (o = s.sent()) + ? [4, this._request.send(i, { refresh_token: o })] + : [2]; + case 2: + return ( + (a = s.sent()), + this._cache.removeStoreAsync(t), + this._cache.removeStoreAsync(n), + this._cache.removeStoreAsync(r), + I.fire(T.LOGIN_STATE_CHANGED), + I.fire(T.LOGIN_TYPE_CHANGED, { + env: this._config.env, + loginType: c.LOGINTYPE.NULL, + persistence: this._config.persistence, + }), + [2, a] + ); + } + }); + }); + }), + (e.prototype.onLoginStateChanged = function (e) { + return v(this, void 0, void 0, function () { + var t, + n = this; + return _(this, function (r) { + switch (r.label) { + case 0: + return ( + I.on(T.LOGIN_STATE_CHANGED, function () { + return v(n, void 0, void 0, function () { + var t; + return _(this, function (n) { + switch (n.label) { + case 0: + return [4, this.getLoginState()]; + case 1: + return ( + (t = n.sent()), + e.call(this, t), + [2] + ); + } + }); + }); + }), + [4, this.getLoginState()] + ); + case 1: + return ((t = r.sent()), e.call(this, t), [2]); + } + }); + }); + }), + (e.prototype.onLoginStateExpired = function (e) { + I.on(T.LOGIN_STATE_EXPIRED, e.bind(this)); + }), + (e.prototype.onAccessTokenRefreshed = function (e) { + I.on(T.ACCESS_TOKEN_REFRESHD, e.bind(this)); + }), + (e.prototype.onAnonymousConverted = function (e) { + I.on(T.ANONYMOUS_CONVERTED, e.bind(this)); + }), + (e.prototype.onLoginTypeChanged = function (e) { + var t = this; + I.on(T.LOGIN_TYPE_CHANGED, function () { + return v(t, void 0, void 0, function () { + var t; + return _(this, function (n) { + switch (n.label) { + case 0: + return [4, this.getLoginState()]; + case 1: + return ((t = n.sent()), e.call(this, t), [2]); + } + }); + }); + }); + }), + (e.prototype.hasLoginState = function () { + if ("async" !== this._cache.mode) { + var e = this._cache.keys.refreshTokenKey; + if (this._cache.getStore(e)) { + var t = new S({ + envId: this._config.env, + cache: this._cache, + request: this._request, + }); + return (t.checkLocalState(), t); + } + return null; + } + k( + A.INVALID_OPERATION, + "current platform's storage is asynchronous, please use getLoginState insteed", + ); + }), + (e.prototype.getLoginState = function () { + return v(this, void 0, void 0, function () { + var e, t; + return _(this, function (n) { + switch (n.label) { + case 0: + return ( + (e = this._cache.keys.refreshTokenKey), + [4, this._cache.getStoreAsync(e)] + ); + case 1: + return n.sent() + ? [ + 4, + (t = new S({ + envId: this._config.env, + cache: this._cache, + request: this._request, + })).checkLocalStateAsync(), + ] + : [3, 3]; + case 2: + return (n.sent(), [2, t]); + case 3: + return [2, null]; + } + }); + }); + }), + (e.prototype.shouldRefreshAccessToken = function (e) { + this._request._shouldRefreshAccessTokenHook = e.bind(this); + }), + (e.prototype.getUserInfo = function () { + return v(this, void 0, void 0, function () { + var e; + return _(this, function (t) { + switch (t.label) { + case 0: + return [ + 4, + this._request.send("auth.getUserInfo", {}), + ]; + case 1: + return (e = t.sent()).code + ? [2, e] + : [2, h(h({}, e.data), { requestId: e.seqId })]; + } + }); + }); + }), + (e.prototype.getAuthHeader = function () { + var e = this._cache.keys, + t = e.refreshTokenKey, + n = e.accessTokenKey, + r = this._cache.getStore(t); + return { + "x-cloudbase-credentials": + this._cache.getStore(n) + "/@@/" + r, + }; + }), + (e.prototype.getAuthHeaderAsync = function () { + return v(this, void 0, void 0, function () { + var e, t, n, r; + return _(this, function (i) { + switch (i.label) { + case 0: + return [4, this._request.refreshAccessToken()]; + case 1: + return ( + i.sent(), + (e = this._cache.keys), + (t = e.refreshTokenKey), + (n = e.accessTokenKey), + [4, this._cache.getStoreAsync(t)] + ); + case 2: + return ( + (r = i.sent()), + [4, this._cache.getStoreAsync(n)] + ); + case 3: + return [ + 2, + { + "x-cloudbase-credentials": + i.sent() + "/@@/" + r, + }, + ]; + } + }); + }); + }), + (e.prototype.sendPhoneCode = function (e) { + return v(this, void 0, void 0, function () { + return _(this, function (t) { + switch (t.label) { + case 0: + return [ + 4, + this._request.send("auth.sendPhoneCode", { + phoneNumber: E(e), + }), + ]; + case 1: + return [2, "Ok" === t.sent().data.SendStatus]; + } + }); + }); + }), + (e.prototype.signUpWithPhoneCode = function (e, t, n) { + return v(this, void 0, void 0, function () { + return _(this, function (r) { + return [2, this.phoneAuthProvider().signUp(e, t, n)]; + }); + }); + }), + (e.prototype.signInWithPhoneCodeOrPassword = function (e) { + return v(this, void 0, void 0, function () { + return _(this, function (t) { + return [2, this.phoneAuthProvider().signIn(e)]; + }); + }); + }), + (e.prototype.forceResetPwdByPhoneCode = function (e) { + return v(this, void 0, void 0, function () { + return _(this, function (t) { + return [ + 2, + this.phoneAuthProvider().signIn( + h(h({}, e), { + signMethod: p.SIGN_METHOD.FORCERESETPWD, + }), + ), + ]; + }); + }); + }), + (e.prototype._onLoginTypeChanged = function (e) { + return v(this, void 0, void 0, function () { + var t, n, r; + return _(this, function (i) { + switch (i.label) { + case 0: + return ( + (t = e.data), + (n = t.loginType), + (r = t.persistence), + t.env !== this._config.env + ? [2] + : [4, this._cache.updatePersistenceAsync(r)] + ); + case 1: + return ( + i.sent(), + [ + 4, + this._cache.setStoreAsync( + this._cache.keys.loginTypeKey, + n, + ), + ] + ); + case 2: + return (i.sent(), [2]); + } + }); + }); + }), + m( + [ + x({ + title: "获取用户信息失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().getCurrenUser() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", []), + g("design:returntype", Promise), + ], + e.prototype, + "getCurrenUser", + null, + ), + m( + [ + x({ + title: "获取用户是否被占用失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().isUsernameRegistered() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String]), + g("design:returntype", Promise), + ], + e.prototype, + "isUsernameRegistered", + null, + ), + m( + [ + x({ + title: "用户登出失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().signOut() 的语法或参数是否正确", + " 2 - 当前用户是否为匿名登录(匿名登录不支持signOut)", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", []), + g("design:returntype", Promise), + ], + e.prototype, + "signOut", + null, + ), + m( + [ + x({ + title: "获取本地登录态失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().getLoginState() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", []), + g("design:returntype", Promise), + ], + e.prototype, + "getLoginState", + null, + ), + m( + [ + x({ + title: "获取用户信息失败", + messages: [ + "请确认以下各项:", + " 1 - 是否已登录", + " 2 - 调用 auth().getUserInfo() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", []), + g("design:returntype", Promise), + ], + e.prototype, + "getUserInfo", + null, + ), + m( + [ + x({ + title: "发送短信验证码失败", + messages: [ + "请确认以下各项:", + " 1 - 调用语法或参数是否正确", + " 2 - 当前环境是否开通了短信验证码登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + C, + ], + }), + g("design:type", Function), + g("design:paramtypes", [String]), + g("design:returntype", Promise), + ], + e.prototype, + "sendPhoneCode", + null, + ), + e + ); + })()), + T = (t.EVENTS = { + LOGIN_STATE_CHANGED: "loginStateChanged", + LOGIN_STATE_EXPIRED: "loginStateExpire", + LOGIN_TYPE_CHANGED: "loginTypeChanged", + ANONYMOUS_CONVERTED: "anonymousConverted", + ACCESS_TOKEN_REFRESHD: "refreshAccessToken", + }), + M = { + name: "auth", + namespace: "auth", + injectEvents: { + bus: I, + events: [ + T.LOGIN_TYPE_CHANGED, + T.LOGIN_STATE_EXPIRED, + T.LOGIN_STATE_CHANGED, + T.ACCESS_TOKEN_REFRESHD, + T.ANONYMOUS_CONVERTED, + ], + }, + entity: function (e) { + if ( + (void 0 === e && (e = { region: "", persistence: "local" }), + this.authInstance) + ) + return ( + k( + A.INVALID_OPERATION, + "every cloudbase instance should has only one auth object", + ), + this.authInstance + ); + var t = this.platform, + n = t.adapter, + r = t.runtime, + i = e.persistence || n.primaryStorage; + i && + i !== this.config.persistence && + this.updateConfig({ persistence: i }); + var o = this.config, + a = o.env, + s = o.persistence, + u = o.debug; + return ( + (this.authInstance = new O({ + env: a, + region: e.region, + persistence: s, + debug: u, + cache: this.cache, + request: this.request, + runtime: r, + })), + this.authInstance + ); + }, + }; + try { + cloudbase.registerComponent(M); + } catch (N) {} + }, + 4325: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.AnonymousAuthProvider = void 0)); + var i, + o = r(n(9367)), + a = n(4522), + s = n(2566), + u = n(1235), + c = n(3442), + l = + ((i = function (e, t) { + return ( + (i = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + i(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (i(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + d = function (e, t, n, r) { + var i, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (i = e[u]) && + (s = (a < 3 ? i(s) : a > 3 ? i(t, n, s) : i(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + f = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + p = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + h = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + m = s.constants.ERRORS, + g = s.constants.COMMUNITY_SITE_URL, + v = s.utils.throwError, + _ = s.utils.isString, + y = s.events.addEventListener, + b = s.helpers.catchErrorsDecorator; + t.AnonymousAuthProvider = (function (e) { + function t(t) { + var n = e.call(this, t) || this; + return ( + (n._onConverted = n._onConverted.bind(n)), + y(c.EVENTS.ANONYMOUS_CONVERTED, n._onConverted), + n + ); + } + return ( + l(t, e), + (t.prototype.signIn = function () { + return p(this, void 0, void 0, function () { + var e, t, n, r, i, o, a; + return h(this, function (s) { + switch (s.label) { + case 0: + return [ + 4, + this._cache.updatePersistenceAsync("local"), + ]; + case 1: + return ( + s.sent(), + (e = this._cache.keys), + (t = e.anonymousUuidKey), + (n = e.refreshTokenKey), + [4, this._cache.getStoreAsync(t)] + ); + case 2: + return ( + (r = s.sent()), + [4, this._cache.getStoreAsync(n)] + ); + case 3: + return ( + (i = s.sent()), + [ + 4, + this._request.send("auth.signInAnonymously", { + anonymous_uuid: r, + refresh_token: i, + }), + ] + ); + case 4: + return (o = s.sent()).uuid && o.refresh_token + ? [4, this._setAnonymousUUID(o.uuid)] + : [3, 10]; + case 5: + return ( + s.sent(), + [4, this.setRefreshToken(o.refresh_token)] + ); + case 6: + return ( + s.sent(), + [4, this._request.refreshAccessToken()] + ); + case 7: + return ( + s.sent(), + c.eventBus.fire(c.EVENTS.LOGIN_TYPE_CHANGED, { + env: this._config.env, + loginType: u.LOGINTYPE.ANONYMOUS, + persistence: "local", + }), + c.eventBus.fire(c.EVENTS.LOGIN_STATE_CHANGED), + [ + 4, + (a = new c.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + })).checkLocalStateAsync(), + ] + ); + case 8: + return (s.sent(), [4, a.user.refresh()]); + case 9: + return (s.sent(), [2, a]); + case 10: + throw new Error( + JSON.stringify({ + code: m.OPERATION_FAIL, + msg: + JSON.stringify(o) || "anonymous signIn failed", + }), + ); + } + }); + }); + }), + (t.prototype.linkAndRetrieveDataWithTicket = function (e) { + return p(this, void 0, void 0, function () { + var t, n, r, i, o, a, s; + return h(this, function (l) { + switch (l.label) { + case 0: + return ( + _(e) || + v(m.INVALID_PARAMS, "ticket must be a string"), + (t = this._cache.keys), + (n = t.anonymousUuidKey), + (r = t.refreshTokenKey), + [4, this._cache.getStoreAsync(n)] + ); + case 1: + return ( + (i = l.sent()), + [4, this._cache.getStoreAsync(r)] + ); + case 2: + return ( + (o = l.sent()), + [ + 4, + this._request.send( + "auth.linkAndRetrieveDataWithTicket", + { + anonymous_uuid: i, + refresh_token: o, + ticket: e, + }, + ), + ] + ); + case 3: + return (a = l.sent()).refresh_token + ? [4, this._clearAnonymousUUID()] + : [3, 8]; + case 4: + return ( + l.sent(), + [4, this.setRefreshToken(a.refresh_token)] + ); + case 5: + return ( + l.sent(), + [4, this._request.refreshAccessToken()] + ); + case 6: + return ( + l.sent(), + c.eventBus.fire(c.EVENTS.ANONYMOUS_CONVERTED, { + env: this._config.env, + }), + c.eventBus.fire(c.EVENTS.LOGIN_TYPE_CHANGED, { + loginType: u.LOGINTYPE.CUSTOM, + persistence: "local", + }), + [ + 4, + (s = new c.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + })).checkLocalStateAsync(), + ] + ); + case 7: + return (l.sent(), [2, s]); + case 8: + (v( + m.OPERATION_FAIL, + JSON.stringify(a) || + "linkAndRetrieveDataWithTicket failed", + ), + (l.label = 9)); + case 9: + return [2]; + } + }); + }); + }), + (t.prototype._setAnonymousUUID = function (e) { + return p(this, void 0, void 0, function () { + var t, n, r; + return h(this, function (i) { + switch (i.label) { + case 0: + return ( + (t = this._cache.keys), + (n = t.anonymousUuidKey), + (r = t.loginTypeKey), + [4, this._cache.removeStoreAsync(n)] + ); + case 1: + return ( + i.sent(), + [4, this._cache.setStoreAsync(n, e)] + ); + case 2: + return ( + i.sent(), + [ + 4, + this._cache.setStoreAsync( + r, + u.LOGINTYPE.ANONYMOUS, + ), + ] + ); + case 3: + return (i.sent(), [2]); + } + }); + }); + }), + (t.prototype._clearAnonymousUUID = function () { + return p(this, void 0, void 0, function () { + return h(this, function (e) { + switch (e.label) { + case 0: + return [ + 4, + this._cache.removeStoreAsync( + this._cache.keys.anonymousUuidKey, + ), + ]; + case 1: + return (e.sent(), [2]); + } + }); + }); + }), + (t.prototype._onConverted = function (e) { + return p(this, void 0, void 0, function () { + return h(this, function (t) { + switch (t.label) { + case 0: + return e.data.env !== this._config.env + ? [2] + : [ + 4, + this._cache.updatePersistenceAsync( + this._config.persistence, + ), + ]; + case 1: + return (t.sent(), [2]); + } + }); + }); + }), + d( + [ + b({ + title: "匿名登录失败", + messages: [ + "请确认以下各项:", + " 1 - 当前环境是否开启了匿名登录", + " 2 - 调用 auth().anonymouseProvider().signIn() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + g, + ], + }), + f("design:type", Function), + f("design:paramtypes", []), + f("design:returntype", Promise), + ], + t.prototype, + "signIn", + null, + ), + t + ); + })(a.AuthProvider); + }, + 4522: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.AuthProvider = void 0)); + var r = n(3442), + i = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + o = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }; + t.AuthProvider = (function () { + function e(e) { + ((this._config = e), + (this._cache = e.cache), + (this._request = e.request)); + } + return ( + (e.prototype.checkLocalLoginState = function () { + return i(this, void 0, void 0, function () { + var e, t, n, i, a, s; + return o(this, function (o) { + switch (o.label) { + case 0: + return ( + (e = this._cache.keys), + (t = e.accessTokenKey), + (n = e.accessTokenExpireKey), + [4, this._cache.getStoreAsync(t)] + ); + case 1: + return ( + (i = o.sent()), + [4, this._cache.getStoreAsync(n)] + ); + case 2: + return ( + (a = o.sent()), + i + ? a && a > Date.now() + ? [ + 4, + (s = new r.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + })).checkLocalStateAsync(), + ] + : [3, 4] + : [3, 7] + ); + case 3: + return (o.sent(), [2, s]); + case 4: + return [4, this._cache.removeStoreAsync(t)]; + case 5: + return ( + o.sent(), + [4, this._cache.removeStoreAsync(n)] + ); + case 6: + (o.sent(), (o.label = 7)); + case 7: + return [2]; + } + }); + }); + }), + (e.prototype.setRefreshToken = function (e) { + return i(this, void 0, void 0, function () { + var t, n, r, i; + return o(this, function (o) { + switch (o.label) { + case 0: + return ( + (t = this._cache.keys), + (n = t.accessTokenKey), + (r = t.accessTokenExpireKey), + (i = t.refreshTokenKey), + [4, this._cache.removeStoreAsync(n)] + ); + case 1: + return ( + o.sent(), + [4, this._cache.removeStoreAsync(r)] + ); + case 2: + return ( + o.sent(), + [4, this._cache.setStoreAsync(i, e)] + ); + case 3: + return (o.sent(), [2]); + } + }); + }); + }), + (e.prototype.setAccessToken = function (e, t) { + return i(this, void 0, void 0, function () { + var n, r, i; + return o(this, function (o) { + switch (o.label) { + case 0: + return ( + (n = this._cache.keys), + (r = n.accessTokenKey), + (i = n.accessTokenExpireKey), + [4, this._cache.setStoreAsync(r, e)] + ); + case 1: + return ( + o.sent(), + [4, this._cache.setStoreAsync(i, t)] + ); + case 2: + return (o.sent(), [2]); + } + }); + }); + }), + (e.prototype.refreshUserInfo = function () { + return i(this, void 0, void 0, function () { + var e; + return o(this, function (t) { + switch (t.label) { + case 0: + return [ + 4, + this._request.send("auth.getUserInfo", {}), + ]; + case 1: + return ( + (e = t.sent().data), + [4, this.setLocalUserInfo(e)] + ); + case 2: + return (t.sent(), [2, e]); + } + }); + }); + }), + (e.prototype.setLocalUserInfo = function (e) { + return i(this, void 0, void 0, function () { + var t; + return o(this, function (n) { + switch (n.label) { + case 0: + return ( + (t = this._cache.keys.userInfoKey), + [4, this._cache.setStoreAsync(t, e)] + ); + case 1: + return (n.sent(), [2]); + } + }); + }); + }), + e + ); + })(); + }, + 2007: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.CustomAuthProvider = void 0)); + var i, + o = r(n(9367)), + a = n(2566), + s = n(4522), + u = n(1235), + c = n(3442), + l = + ((i = function (e, t) { + return ( + (i = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + i(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (i(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + d = function (e, t, n, r) { + var i, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (i = e[u]) && + (s = (a < 3 ? i(s) : a > 3 ? i(t, n, s) : i(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + f = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + p = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + h = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + m = a.constants.ERRORS, + g = a.constants.COMMUNITY_SITE_URL, + v = a.utils.isString, + _ = a.helpers.catchErrorsDecorator; + t.CustomAuthProvider = (function (e) { + function t() { + return (null !== e && e.apply(this, arguments)) || this; + } + return ( + l(t, e), + (t.prototype.signIn = function (e) { + return p(this, void 0, void 0, function () { + var t, n, r, i, o, a, s; + return h(this, function (l) { + switch (l.label) { + case 0: + if (!v(e)) + throw new Error( + JSON.stringify({ + code: m.INVALID_PARAMS, + msg: "ticket must be a string", + }), + ); + return ( + (t = this._cache.keys.refreshTokenKey), + (i = (r = this._request).send), + (o = ["auth.signInWithTicket"]), + (a = { ticket: e }), + [4, this._cache.getStoreAsync(t)] + ); + case 1: + return [ + 4, + i.apply( + r, + o.concat([ + ((a.refresh_token = l.sent() || ""), a), + ]), + ), + ]; + case 2: + return (n = l.sent()).refresh_token + ? [4, this.setRefreshToken(n.refresh_token)] + : [3, 7]; + case 3: + return ( + l.sent(), + [4, this._request.refreshAccessToken()] + ); + case 4: + return ( + l.sent(), + c.eventBus.fire(c.EVENTS.LOGIN_TYPE_CHANGED, { + env: this._config.env, + loginType: u.LOGINTYPE.CUSTOM, + persistence: this._config.persistence, + }), + c.eventBus.fire(c.EVENTS.LOGIN_STATE_CHANGED), + [4, this.refreshUserInfo()] + ); + case 5: + return ( + l.sent(), + [ + 4, + (s = new c.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + })).checkLocalStateAsync(), + ] + ); + case 6: + return (l.sent(), [2, s]); + case 7: + throw new Error( + JSON.stringify({ + code: m.OPERATION_FAIL, + msg: "custom signIn failed", + }), + ); + } + }); + }); + }), + d( + [ + _({ + title: "自定义登录失败", + messages: [ + "请确认以下各项:", + " 1 - 当前环境是否开启了自定义登录", + " 2 - 调用 auth().customAuthProvider().signIn() 的语法或参数是否正确", + " 3 - ticket 是否归属于当前环境", + " 4 - 创建 ticket 的自定义登录私钥是否过期", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + g, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String]), + f("design:returntype", Promise), + ], + t.prototype, + "signIn", + null, + ), + t + ); + })(s.AuthProvider); + }, + 7036: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.EmailAuthProvider = void 0)); + var i, + o = r(n(9367)), + a = n(2566), + s = n(4522), + u = n(1235), + c = n(3442), + l = + ((i = function (e, t) { + return ( + (i = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + i(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (i(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + d = function (e, t, n, r) { + var i, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (i = e[u]) && + (s = (a < 3 ? i(s) : a > 3 ? i(t, n, s) : i(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + f = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + p = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + h = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + m = a.utils.throwError, + g = a.utils.isString, + v = a.constants.ERRORS, + _ = a.constants.COMMUNITY_SITE_URL, + y = a.helpers.catchErrorsDecorator; + t.EmailAuthProvider = (function (e) { + function t() { + return (null !== e && e.apply(this, arguments)) || this; + } + return ( + l(t, e), + (t.prototype.signIn = function (e, t) { + return p(this, void 0, void 0, function () { + var n, r, i, o, a; + return h(this, function (s) { + switch (s.label) { + case 0: + return ( + g(e) || + m(v.INVALID_PARAMS, "email must be a string"), + (n = this._cache.keys.refreshTokenKey), + [ + 4, + this._request.send("auth.signIn", { + loginType: "EMAIL", + email: e, + password: t, + refresh_token: this._cache.getStore(n) || "", + }), + ] + ); + case 1: + return ( + (r = s.sent()), + (i = r.refresh_token), + (o = r.access_token), + (a = r.access_token_expire), + i ? [4, this.setRefreshToken(i)] : [3, 8] + ); + case 2: + return ( + s.sent(), + o && a ? [4, this.setAccessToken(o, a)] : [3, 4] + ); + case 3: + return (s.sent(), [3, 6]); + case 4: + return [4, this._request.refreshAccessToken()]; + case 5: + (s.sent(), (s.label = 6)); + case 6: + return [4, this.refreshUserInfo()]; + case 7: + return ( + s.sent(), + c.eventBus.fire(c.EVENTS.LOGIN_STATE_CHANGED), + c.eventBus.fire(c.EVENTS.LOGIN_TYPE_CHANGED, { + env: this._config.env, + loginType: u.LOGINTYPE.EMAIL, + persistence: this._config.persistence, + }), + [ + 2, + new c.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + }), + ] + ); + case 8: + (r.code + ? m( + v.OPERATION_FAIL, + "Email login fail[" + r.code + "] " + r.message, + ) + : m(v.OPERATION_FAIL, "Email login fail"), + (s.label = 9)); + case 9: + return [2]; + } + }); + }); + }), + (t.prototype.signUp = function (e, t) { + return p(this, void 0, void 0, function () { + return h(this, function (n) { + return [ + 2, + this._request.send("auth.signUpWithEmailAndPassword", { + email: e, + password: t, + }), + ]; + }); + }); + }), + (t.prototype.resetPassword = function (e) { + return p(this, void 0, void 0, function () { + return h(this, function (t) { + return [ + 2, + this._request.send("auth.sendPasswordResetEmail", { + email: e, + }), + ]; + }); + }); + }), + (t.prototype.resetPasswordWithToken = function (e, t) { + return p(this, void 0, void 0, function () { + return h(this, function (n) { + return [ + 2, + this._request.send("auth.resetPasswordWithToken", { + token: e, + newPassword: t, + }), + ]; + }); + }); + }), + (t.prototype.activate = function (e) { + return p(this, void 0, void 0, function () { + return h(this, function (t) { + return [ + 2, + this._request.send("auth.activateEndUserMail", { + token: e, + }), + ]; + }); + }); + }), + d( + [ + y({ + title: "邮箱密码登录失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().emailAuthProvider() 的语法或参数是否正确", + " 2 - 当前环境是否开通了邮箱登录", + " 3 - 邮箱地址与密码是否匹配", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + _, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String, String]), + f("design:returntype", Promise), + ], + t.prototype, + "signIn", + null, + ), + d( + [ + y({ + title: "邮箱注册失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().signUpWithEmailAndPassword() 的语法或参数是否正确", + " 2 - 当前环境是否开通了邮箱登录", + " 3 - 此邮箱地址是否已经被其他用户占用", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + _, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String, String]), + f("design:returntype", Promise), + ], + t.prototype, + "signUp", + null, + ), + d( + [ + y({ + title: "重置密码失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().sendPasswordResetEmail() 的语法或参数是否正确", + " 2 - 当前环境是否开通了邮箱登录", + " 3 - 此邮箱地址是否已经与当前用户绑定", + " 4 - 此邮箱地址是否已经被其他用户占用", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + _, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String]), + f("design:returntype", Promise), + ], + t.prototype, + "resetPassword", + null, + ), + d( + [ + y({ + title: "重置密码失败", + messages: [ + "请确认以下各项:", + " 1 - 调用语法或参数是否正确", + " 2 - 当前环境是否开通了邮箱登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + _, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String, String]), + f("design:returntype", Promise), + ], + t.prototype, + "resetPasswordWithToken", + null, + ), + d( + [ + y({ + title: "邮箱激活失败", + messages: [ + "请确认以下各项:", + " 1 - 调用语法或参数是否正确", + " 2 - 当前环境是否开通了邮箱登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + _, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String]), + f("design:returntype", Promise), + ], + t.prototype, + "activate", + null, + ), + t + ); + })(s.AuthProvider); + }, + 2424: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.SIGN_METHOD = t.PhoneAuthProvider = void 0)); + var i, + o = r(n(9367)), + a = n(2566), + s = n(4522), + u = n(1235), + c = n(3442), + l = + ((i = function (e, t) { + return ( + (i = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + i(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (i(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + d = function (e, t, n, r) { + var i, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (i = e[u]) && + (s = (a < 3 ? i(s) : a > 3 ? i(t, n, s) : i(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + f = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + p = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + h = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + m = a.utils.throwError, + g = a.utils.isString, + v = a.utils.transformPhone, + _ = a.constants.ERRORS, + y = a.constants.COMMUNITY_SITE_URL, + b = a.helpers.catchErrorsDecorator, + k = (t.SIGN_METHOD = { + SIGNIN: "SIGNIN", + SIGNUP: "SIGNUP", + FORCERESETPWD: "FORCERESETPWD", + }); + t.PhoneAuthProvider = (function (e) { + function t() { + return (null !== e && e.apply(this, arguments)) || this; + } + return ( + l(t, e), + (t.prototype.signIn = function (e) { + return p(this, void 0, void 0, function () { + var t, n, r, i, o, a, s, l, d; + return h(this, function (f) { + switch (f.label) { + case 0: + return ( + (t = e.phoneNumber), + (n = e.phoneCode), + (r = e.password), + (i = e.signMethod), + g(t) || + m( + _.INVALID_PARAMS, + "phoneNumber must be a string", + ), + g(n) || + g(r) || + m( + _.INVALID_PARAMS, + "phoneCode or password must be a string", + ), + i || (i = k.SIGNIN), + (o = this._cache.keys.refreshTokenKey), + [ + 4, + this._request.send("auth.signIn", { + loginType: u.LOGINTYPE.PHONE, + phoneNumber: v(t), + phoneCode: n, + password: r, + refresh_token: this._cache.getStore(o) || "", + signMethod: i, + }), + ] + ); + case 1: + return ( + (a = f.sent()), + (s = a.refresh_token), + (l = a.access_token), + (d = a.access_token_expire), + s ? [4, this.setRefreshToken(s)] : [3, 8] + ); + case 2: + return ( + f.sent(), + l && d ? [4, this.setAccessToken(l, d)] : [3, 4] + ); + case 3: + return (f.sent(), [3, 6]); + case 4: + return [4, this._request.refreshAccessToken()]; + case 5: + (f.sent(), (f.label = 6)); + case 6: + return [4, this.refreshUserInfo()]; + case 7: + return ( + f.sent(), + c.eventBus.fire(c.EVENTS.LOGIN_STATE_CHANGED), + c.eventBus.fire(c.EVENTS.LOGIN_TYPE_CHANGED, { + env: this._config.env, + loginType: u.LOGINTYPE.PHONE, + persistence: this._config.persistence, + }), + [ + 2, + new c.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + }), + ] + ); + case 8: + (a.code + ? m( + _.OPERATION_FAIL, + "Phone login fail[" + a.code + "] " + a.message, + ) + : m(_.OPERATION_FAIL, "Phone login fail"), + (f.label = 9)); + case 9: + return [2]; + } + }); + }); + }), + (t.prototype.signUp = function (e, t, n) { + return p(this, void 0, void 0, function () { + return h(this, function (r) { + return [ + 2, + this.signIn({ + phoneNumber: e, + phoneCode: t, + password: n, + signMethod: k.SIGNUP, + }), + ]; + }); + }); + }), + (t.prototype.forceResetPwd = function (e, t, n) { + return p(this, void 0, void 0, function () { + return h(this, function (r) { + return [ + 2, + this.signIn({ + phoneNumber: e, + phoneCode: t, + password: n, + signMethod: k.FORCERESETPWD, + }), + ]; + }); + }); + }), + d( + [ + b({ + title: "手机号登录失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().SmsAuthProvider() 的语法或参数是否正确", + " 2 - 当前环境是否开通了短信验证码登录", + " 3 - 短信验证码/密码是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + y, + ], + }), + f("design:type", Function), + f("design:paramtypes", [Object]), + f("design:returntype", Promise), + ], + t.prototype, + "signIn", + null, + ), + d( + [ + b({ + title: "手机短信注册失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().signUpWithPhoneCode() 的语法或参数是否正确", + " 2 - 当前环境是否开通了短信验证码登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + y, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String, String, String]), + f("design:returntype", Promise), + ], + t.prototype, + "signUp", + null, + ), + d( + [ + b({ + title: "手机密码重置失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().forceResetPwd() 的语法或参数是否正确", + " 2 - 当前环境是否开通了短信验证码登录", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + y, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String, String, String]), + f("design:returntype", Promise), + ], + t.prototype, + "forceResetPwd", + null, + ), + t + ); + })(s.AuthProvider); + }, + 9676: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.UsernameAuthProvider = void 0)); + var i, + o = r(n(9367)), + a = n(4522), + s = n(3442), + u = n(1235), + c = n(2566), + l = + ((i = function (e, t) { + return ( + (i = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + i(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (i(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + d = function (e, t, n, r) { + var i, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (i = e[u]) && + (s = (a < 3 ? i(s) : a > 3 ? i(t, n, s) : i(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + f = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + p = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + h = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + m = c.utils.printWarn, + g = c.constants.ERRORS, + v = c.constants.COMMUNITY_SITE_URL, + _ = c.helpers.catchErrorsDecorator; + t.UsernameAuthProvider = (function (e) { + function t() { + return (null !== e && e.apply(this, arguments)) || this; + } + return ( + l(t, e), + (t.prototype.signIn = function (e, t) { + return p(this, void 0, void 0, function () { + var n, r, i, o, a, c, l, d, f; + return h(this, function (p) { + switch (p.label) { + case 0: + if ("string" != typeof e) + throw new Error( + JSON.stringify({ + code: g.INVALID_PARAMS, + msg: "username must be a string", + }), + ); + return ( + "string" != typeof t && + ((t = ""), + m(g.INVALID_PARAMS, "password is empty")), + (n = this._cache.keys.refreshTokenKey), + (o = (i = this._request).send), + (a = ["auth.signIn"]), + (c = { + loginType: u.LOGINTYPE.USERNAME, + username: e, + password: t, + }), + [4, this._cache.getStoreAsync(n)] + ); + case 1: + return [ + 4, + o.apply( + i, + a.concat([ + ((c.refresh_token = p.sent() || ""), c), + ]), + ), + ]; + case 2: + return ( + (r = p.sent()), + (l = r.refresh_token), + (d = r.access_token_expire), + (f = r.access_token), + l ? [4, this.setRefreshToken(l)] : [3, 9] + ); + case 3: + return ( + p.sent(), + f && d ? [4, this.setAccessToken(f, d)] : [3, 5] + ); + case 4: + return (p.sent(), [3, 7]); + case 5: + return [4, this._request.refreshAccessToken()]; + case 6: + (p.sent(), (p.label = 7)); + case 7: + return [4, this.refreshUserInfo()]; + case 8: + return ( + p.sent(), + s.eventBus.fire(s.EVENTS.LOGIN_STATE_CHANGED), + s.eventBus.fire(s.EVENTS.LOGIN_TYPE_CHANGED, { + env: this._config.env, + loginType: u.LOGINTYPE.USERNAME, + persistence: this._config.persistence, + }), + [ + 2, + new s.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + }), + ] + ); + case 9: + throw r.code + ? new Error( + JSON.stringify({ + code: g.OPERATION_FAIL, + msg: + "login by username failed:[" + + r.code + + "] " + + r.message, + }), + ) + : new Error( + JSON.stringify({ + code: g.OPERATION_FAIL, + msg: "login by username failed", + }), + ); + case 10: + return [2]; + } + }); + }); + }), + d( + [ + _({ + title: "用户名密码登录失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().signInWithUsernameAndPassword() 的语法或参数是否正确", + " 2 - 当前环境是否开通了用户名密码登录", + " 3 - 用户名密码是否匹配", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + v, + ], + }), + f("design:type", Function), + f("design:paramtypes", [String, String]), + f("design:returntype", Promise), + ], + t.prototype, + "signIn", + null, + ), + t + ); + })(a.AuthProvider); + }, + 9250: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.WeixinAuthProvider = void 0)); + var i, + o = r(n(9367)), + a = n(4522), + s = n(2566), + u = n(3442), + c = n(1235), + l = + ((i = function (e, t) { + return ( + (i = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + i(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (i(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + d = function (e, t, n, r) { + var i, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (i = e[u]) && + (s = (a < 3 ? i(s) : a > 3 ? i(t, n, s) : i(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + f = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, o["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + p = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + h = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + m = s.constants.getSdkName, + g = s.constants.ERRORS, + v = s.constants.COMMUNITY_SITE_URL, + _ = s.adapters.RUNTIME, + y = s.utils.getQuery, + b = s.utils.getHash, + k = s.utils.removeParam, + w = s.utils.printWarn, + E = s.helpers.catchErrorsDecorator; + function A() { + return y("code") || b("code"); + } + t.WeixinAuthProvider = (function (e) { + function t(t, n, r, i) { + var o = e.call(this, t) || this; + return ( + (o._runtime = t.runtime), + (o._appid = n), + (o._scope = r), + (o._state = i || "weixin"), + o + ); + } + return ( + l(t, e), + (t.prototype.signIn = function () { + return p(this, void 0, void 0, function () { + return h(this, function (e) { + return [ + 2, + w( + g.OPERATION_FAIL, + "API signIn has been deprecated, please use signInWithRedirect insteed", + ), + ]; + }); + }); + }), + (t.prototype.signInWithRedirect = function () { + return p(this, void 0, void 0, function () { + return h(this, function (e) { + return [2, this._redirect()]; + }); + }); + }), + (t.prototype.getRedirectResult = function (e) { + return p(this, void 0, void 0, function () { + var t; + return h(this, function (n) { + return (t = A()) + ? [2, this._signInWithCode(t, e)] + : [2, null]; + }); + }); + }), + (t.prototype.getLinkRedirectResult = function (e) { + return ( + void 0 === e && (e = {}), + p(this, void 0, void 0, function () { + var t, n, r, i, o, a; + return h(this, function (s) { + return ( + (t = e.withUnionId), + (n = void 0 !== t && t), + (r = A()) + ? ((i = this._appid), + (u = this._scope), + (o = + "snsapi_login" === u + ? "WECHAT-OPEN" + : "WECHAT-PUBLIC"), + (a = this._runtime === _.WX_MP ? "1" : "0"), + [ + 2, + this._request.send("auth.linkWithWeixinCode", { + payload: { + appid: i, + loginType: o, + code: r, + hybridMiniapp: a, + withUnionId: n, + }, + }), + ]) + : [2, null] + ); + var u; + }); + }) + ); + }), + (t.prototype._redirect = function () { + var e = k("code", location.href); + ((e = k("state", e)), (e = encodeURIComponent(e))); + var t = "//open.weixin.qq.com/connect/oauth2/authorize"; + "snsapi_login" === this._scope && + (t = "//open.weixin.qq.com/connect/qrconnect"); + try { + location.href = + t + + "?appid=" + + this._appid + + "&redirect_uri=" + + e + + "&response_type=code&scope=" + + this._scope + + "&state=" + + this._state + + "#wechat_redirect"; + } catch (n) { + throw new Error( + "[" + m() + "][" + g.UNKOWN_ERROR + "]" + n, + ); + } + }), + (t.prototype._signInWithCode = function (e, t) { + return p(this, void 0, void 0, function () { + var n, r, i, o, a, s, l, d; + return h(this, function (f) { + switch (f.label) { + case 0: + return ( + (n = this._cache.keys), + (r = n.accessTokenKey), + (i = n.accessTokenExpireKey), + (o = n.refreshTokenKey), + (p = this._scope), + (a = + "snsapi_login" === p + ? "WECHAT-OPEN" + : "WECHAT-PUBLIC"), + [ + 4, + this._getRefreshTokenByWXCode( + this._appid, + a, + e, + t, + ), + ] + ); + case 1: + return ( + (s = f.sent()), + (l = s.refreshToken), + [4, this._cache.setStoreAsync(o, l)] + ); + case 2: + return ( + f.sent(), + s.accessToken + ? [4, this._cache.setStoreAsync(r, s.accessToken)] + : [3, 4] + ); + case 3: + (f.sent(), (f.label = 4)); + case 4: + return s.accessTokenExpire + ? [ + 4, + this._cache.setStoreAsync( + i, + String(s.accessTokenExpire + Date.now()), + ), + ] + : [3, 6]; + case 5: + (f.sent(), (f.label = 6)); + case 6: + return ( + u.eventBus.fire(u.EVENTS.LOGIN_STATE_CHANGED), + u.eventBus.fire(u.EVENTS.LOGIN_TYPE_CHANGED, { + env: this._config.env, + loginType: c.LOGINTYPE.WECHAT, + persistence: this._config.persistence, + }), + [4, this.refreshUserInfo()] + ); + case 7: + return ( + f.sent(), + [ + 4, + (d = new u.LoginState({ + envId: this._config.env, + cache: this._cache, + request: this._request, + })).checkLocalStateAsync(), + ] + ); + case 8: + return (f.sent(), [2, d]); + } + var p; + }); + }); + }), + (t.prototype._getRefreshTokenByWXCode = function (e, t, n, r) { + return ( + void 0 === r && (r = {}), + p(this, void 0, void 0, function () { + var i, o, a, s, u, c; + return h(this, function (l) { + return ( + (i = r.withUnionId), + (o = void 0 !== i && i), + (a = r.createUser), + (s = void 0 === a || a), + (u = + "snsapi_base" !== this._scope && + (r.syncUserInfo || !1)), + (c = this._runtime === _.WX_MP ? "1" : "0"), + [ + 2, + this._request + .send("auth.signIn", { + appid: e, + loginType: t, + hybridMiniapp: c, + syncUserInfo: u, + loginCredential: n, + withUnionId: o, + createUser: s, + }) + .then(function (e) { + if (e.code) + throw new Error( + "[" + + m() + + "][" + + g.OPERATION_FAIL + + "] failed login via wechat: " + + e.code, + ); + if (e.refresh_token) + return { + refreshToken: e.refresh_token, + accessToken: e.access_token, + accessTokenExpire: e.access_token_expire, + }; + throw new Error( + "[" + + m() + + "][" + + g.OPERATION_FAIL + + "] action:getJwt not return refreshToken", + ); + }), + ] + ); + }); + }) + ); + }), + d( + [ + E({ + title: "跳转微信公众号授权失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().weixinAuthProvider().signInWithRedirect() 的语法或参数是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + v, + ], + }), + f("design:type", Function), + f("design:paramtypes", []), + f("design:returntype", Promise), + ], + t.prototype, + "signInWithRedirect", + null, + ), + d( + [ + E({ + title: "微信公众号登录失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().weixinAuthProvider().getRedirectResult() 的语法或参数是否正确", + " 2 - 当前环境是否开通了微信公众号登录授权", + " 3 - 微信公众号的 AppId 与 AppSecret 配置是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + v, + ], + }), + f("design:type", Function), + f("design:paramtypes", [Object]), + f("design:returntype", Promise), + ], + t.prototype, + "getRedirectResult", + null, + ), + d( + [ + E({ + title: "获取微信重定向绑定结果", + messages: [ + "请确认以下各项:", + " 1 - 调用 auth().weixinAuthProvider().getLinkRedirectResult() 的语法或参数是否正确", + " 2 - 当前环境是否开通了微信公众号登录授权", + " 3 - 微信公众号的 AppId 与 AppSecret 配置是否正确", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + v, + ], + }), + f("design:type", Function), + f("design:paramtypes", [Object]), + f("design:returntype", Promise), + ], + t.prototype, + "getLinkRedirectResult", + null, + ), + t + ); + })(a.AuthProvider); + }, + 5293: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.registerFunctions = function (e) { + try { + e.registerComponent(v); + } catch (t) { + console.warn(t); + } + })); + var i = r(n(9367)), + o = n(2566), + a = function (e, t, n, r) { + var o, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (o = e[u]) && + (s = (a < 3 ? o(s) : a > 3 ? o(t, n, s) : o(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + s = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + u = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + c = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + l = o.constants.getSdkName, + d = o.constants.ERRORS, + f = o.constants.COMMUNITY_SITE_URL, + p = o.utils.execCallback, + h = o.helpers.catchErrorsDecorator, + m = "functions", + g = new ((function () { + function e() {} + return ( + (e.prototype.callFunction = function (e, t) { + return u(this, void 0, void 0, function () { + var n, r, i, o, a, s, u, f, h, g, v, _; + return c(this, function (c) { + switch (c.label) { + case 0: + if ( + ((n = e.name), + (r = e.data), + (i = e.query), + (o = e.parse), + (a = e.search), + !n) + ) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + m + + ".callFunction] invalid function name", + }), + ); + try { + s = r ? JSON.stringify(r) : ""; + } catch (y) { + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: "[" + m + ".callFunction] invalid data", + }), + ); + } + ((u = "functions.invokeFunction"), + (f = { + inQuery: i, + parse: o, + search: a, + function_name: n, + request_data: s, + }), + (h = this.request), + (c.label = 1)); + case 1: + return ( + c.trys.push([1, 3, , 4]), + [4, h.send(u, f)] + ); + case 2: + if ((g = c.sent()).code) return [2, p(t, null, g)]; + if (((v = g.data.response_data), o)) + return [ + 2, + p(t, null, { + result: v, + requestId: g.requestId, + }), + ]; + try { + return ( + (v = JSON.parse(g.data.response_data)), + [ + 2, + p(t, null, { + result: v, + requestId: g.requestId, + }), + ] + ); + } catch (y) { + p( + t, + new Error( + "[" + + l() + + "][" + + d.INVALID_PARAMS + + "][" + + m + + ".callFunction] response data must be json", + ), + ); + } + return [3, 4]; + case 3: + return ((_ = c.sent()), p(t, _), [3, 4]); + case 4: + return [2]; + } + }); + }); + }), + a( + [ + h({ + customInfo: { + className: "Cloudbase", + methodName: "callFunction", + }, + title: "函数调用失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 callFunction() 的语法或参数是否正确", + " 2 - 当前环境下是否存在此函数", + " 3 - 函数安全规则是否限制了当前登录状态访问", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + f, + ], + }), + s("design:type", Function), + s("design:paramtypes", [Object, Function]), + s("design:returntype", Promise), + ], + e.prototype, + "callFunction", + null, + ), + e + ); + })())(), + v = { name: m, entity: { callFunction: g.callFunction } }; + try { + cloudbase.registerComponent(v); + } catch (_) {} + }, + 9459: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = void 0)); + var i = r(n(4283)), + o = r(n(5707))["default"].version; + i["default"].registerVersion(o); + try { + window.cloudbase = i["default"]; + } catch (a) {} + t["default"] = i["default"]; + }, + 9744: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.registerProvider = t.registerAuth = void 0)); + var r = n(3442); + ((t.registerAuth = r.registerAuth), + (t.registerProvider = r.registerProvider)); + }, + 7441: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.registerFunctions = void 0)); + var r = n(5293); + t.registerFunctions = r.registerFunctions; + }, + 5417: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.registerStorage = void 0)); + var r = n(9549); + t.registerStorage = r.registerStorage; + }, + 9549: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.registerStorage = function (e) { + try { + e.registerComponent(b); + } catch (t) { + console.warn(t); + } + })); + var i = r(n(9367)), + o = n(2566), + a = function (e, t, n, r) { + var o, + a = arguments.length, + s = + a < 3 + ? t + : null === r + ? (r = Object.getOwnPropertyDescriptor(t, n)) + : r; + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.decorate + ) + s = Reflect.decorate(e, t, n, r); + else + for (var u = e.length - 1; u >= 0; u--) + (o = e[u]) && + (s = (a < 3 ? o(s) : a > 3 ? o(t, n, s) : o(t, n)) || s); + return (a > 3 && s && Object.defineProperty(t, n, s), s); + }, + s = function (e, t) { + if ( + "object" === + ("undefined" == typeof Reflect + ? "undefined" + : (0, i["default"])(Reflect)) && + "function" == typeof Reflect.metadata + ) + return Reflect.metadata(e, t); + }, + u = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + c = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + l = o.constants.getSdkName, + d = o.constants.ERRORS, + f = o.constants.COMMUNITY_SITE_URL, + p = o.utils.isArray, + h = o.utils.isString, + m = o.utils.isPalinObject, + g = o.utils.execCallback, + v = o.helpers.catchErrorsDecorator, + _ = "storage", + y = new ((function () { + function e() {} + return ( + (e.prototype.uploadFile = function (e, t) { + return u(this, void 0, void 0, function () { + var n, r, i, o, a, s, u, f, p, m, v, y, b, k, w; + return c(this, function (c) { + switch (c.label) { + case 0: + if ( + ((n = e.cloudPath), + (r = e.filePath), + (i = e.onUploadProgress), + !h(n) || !r) + ) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: "[" + _ + ".uploadFile] invalid params", + }), + ); + return [ + 4, + (o = this.request).send( + "storage.getUploadMetadata", + { path: n }, + ), + ]; + case 1: + return ( + (a = c.sent()), + (s = a.data), + (u = s.url), + (f = s.authorization), + (p = s.token), + (m = s.fileId), + (v = s.cosFileId), + (y = s.download_url), + (b = a.requestId), + (k = { + key: n, + signature: f, + "x-cos-meta-fileid": v, + success_action_status: "201", + "x-cos-security-token": p, + }), + [ + 4, + o.upload({ + url: u, + data: k, + file: r, + name: n, + onUploadProgress: i, + }), + ] + ); + case 2: + return 201 === (w = c.sent()).statusCode + ? [ + 2, + g(t, null, { + fileID: m, + download_url: y, + requestId: b, + }), + ] + : [ + 2, + g( + t, + new Error( + "[" + + l() + + "][" + + d.OPERATION_FAIL + + "][" + + _ + + "]:" + + w.data, + ), + ), + ]; + } + }); + }); + }), + (e.prototype.getUploadMetadata = function (e, t) { + return u(this, void 0, void 0, function () { + var n, r, i, o, a; + return c(this, function (s) { + switch (s.label) { + case 0: + if (((n = e.cloudPath), !h(n))) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + _ + + ".getUploadMetadata] invalid cloudPath", + }), + ); + ((r = this.request), + (i = "storage.getUploadMetadata"), + (s.label = 1)); + case 1: + return ( + s.trys.push([1, 3, , 4]), + [4, r.send(i, { path: n })] + ); + case 2: + return ((o = s.sent()), [2, g(t, null, o)]); + case 3: + return ((a = s.sent()), [2, g(t, a)]); + case 4: + return [2]; + } + }); + }); + }), + (e.prototype.deleteFile = function (e, t) { + return u(this, void 0, void 0, function () { + var n, r, i, o, a, s; + return c(this, function (u) { + switch (u.label) { + case 0: + if (!(n = e.fileList) || !p(n) || 0 === n.length) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + _ + + ".deleteFile] fileList must not be empty", + }), + ); + for (r = 0, i = n; r < i.length; r++) + if (!(o = i[r]) || !h(o)) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + _ + + ".deleteFile] fileID must be string", + }), + ); + return [ + 4, + this.request.send("storage.batchDeleteFile", { + fileid_list: n, + }), + ]; + case 1: + return (a = u.sent()).code + ? [2, g(t, null, a)] + : ((s = { + fileList: a.data.delete_list, + requestId: a.requestId, + }), + [2, g(t, null, s)]); + } + }); + }); + }), + (e.prototype.getTempFileURL = function (e, t) { + return u(this, void 0, void 0, function () { + var n, r, i, o, a, s; + return c(this, function (u) { + switch (u.label) { + case 0: + if (!(n = e.fileList) || !p(n) || 0 === n.length) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + _ + + ".getTempFileURL] fileList must not be empty", + }), + ); + for (r = [], i = 0, o = n; i < o.length; i++) + if (((a = o[i]), m(a))) { + if ( + !a.hasOwnProperty("fileID") || + !a.hasOwnProperty("maxAge") + ) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + _ + + ".getTempFileURL] file info must include fileID and maxAge", + }), + ); + r.push({ fileid: a.fileID, max_age: a.maxAge }); + } else { + if (!h(a)) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + _ + + ".getTempFileURL] invalid fileList", + }), + ); + r.push({ fileid: a }); + } + return [ + 4, + this.request.send("storage.batchGetDownloadUrl", { + file_list: r, + }), + ]; + case 1: + return (s = u.sent()).code + ? [2, g(t, null, s)] + : [ + 2, + g(t, null, { + fileList: s.data.download_list, + requestId: s.requestId, + }), + ]; + } + }); + }); + }), + (e.prototype.downloadFile = function (e, t) { + return u(this, void 0, void 0, function () { + var n, r, i, o, a, s; + return c(this, function (u) { + switch (u.label) { + case 0: + if (((n = e.fileID), !h(n))) + throw new Error( + JSON.stringify({ + code: d.INVALID_PARAMS, + msg: + "[" + + _ + + ".getTempFileURL] fileID must be string", + }), + ); + return [ + 4, + this.getTempFileURL.call(this, { + fileList: [{ fileID: n, maxAge: 600 }], + }), + ]; + case 1: + return ( + (r = u.sent()), + "SUCCESS" !== (i = r.fileList[0]).code + ? [2, g(t, i)] + : ((o = this.request), + (a = encodeURI(i.download_url)), + [4, o.download({ url: a })]) + ); + case 2: + return ((s = u.sent()), [2, g(t, null, s)]); + } + }); + }); + }), + a( + [ + v({ + customInfo: { + className: "Cloudbase", + methodName: "uploadFile", + }, + title: "上传文件失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 uploadFile() 的语法或参数是否正确", + " 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety", + " 3 - 云存储安全规则是否限制了当前登录状态访问", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + f, + ], + }), + s("design:type", Function), + s("design:paramtypes", [Object, Function]), + s("design:returntype", Promise), + ], + e.prototype, + "uploadFile", + null, + ), + a( + [ + v({ + customInfo: { + className: "Cloudbase", + methodName: "getUploadMetadata", + }, + title: "获取上传元信息失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 getUploadMetadata() 的语法或参数是否正确", + " 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety", + " 3 - 云存储安全规则是否限制了当前登录状态访问", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + f, + ], + }), + s("design:type", Function), + s("design:paramtypes", [Object, Function]), + s("design:returntype", Promise), + ], + e.prototype, + "getUploadMetadata", + null, + ), + a( + [ + v({ + customInfo: { + className: "Cloudbase", + methodName: "deleteFile", + }, + title: "删除文件失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 deleteFile() 的语法或参数是否正确", + " 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety", + " 3 - 云存储安全规则是否限制了当前登录状态访问", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + f, + ], + }), + s("design:type", Function), + s("design:paramtypes", [Object, Function]), + s("design:returntype", Promise), + ], + e.prototype, + "deleteFile", + null, + ), + a( + [ + v({ + customInfo: { + className: "Cloudbase", + methodName: "getTempFileURL", + }, + title: "获取文件下载链接", + messages: [ + "请确认以下各项:", + " 1 - 调用 getTempFileURL() 的语法或参数是否正确", + " 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety", + " 3 - 云存储安全规则是否限制了当前登录状态访问", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + f, + ], + }), + s("design:type", Function), + s("design:paramtypes", [Object, Function]), + s("design:returntype", Promise), + ], + e.prototype, + "getTempFileURL", + null, + ), + a( + [ + v({ + customInfo: { + className: "Cloudbase", + methodName: "downloadFile", + }, + title: "下载文件失败", + messages: [ + "请确认以下各项:", + " 1 - 调用 downloadFile() 的语法或参数是否正确", + " 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety", + " 3 - 云存储安全规则是否限制了当前登录状态访问", + "如果问题依然存在,建议到官方问答社区提问或寻找帮助:" + + f, + ], + }), + s("design:type", Function), + s("design:paramtypes", [Object, Function]), + s("design:returntype", Promise), + ], + e.prototype, + "downloadFile", + null, + ), + e + ); + })())(), + b = { + name: _, + entity: { + uploadFile: y.uploadFile, + deleteFile: y.deleteFile, + getTempFileURL: y.getTempFileURL, + downloadFile: y.downloadFile, + getUploadMetadata: y.getUploadMetadata, + }, + }; + try { + cloudbase.registerComponent(b); + } catch (k) {} + }, + 1259: function (e, t, n) { + "use strict"; + var r = Object.create + ? function (e, t, n, r) { + (r === undefined && (r = n), + Object.defineProperty(e, r, { + enumerable: !0, + get: function () { + return t[n]; + }, + })); + } + : function (e, t, n, r) { + (r === undefined && (r = n), (e[r] = t[n])); + }, + i = Object.create + ? function (e, t) { + Object.defineProperty(e, "default", { + enumerable: !0, + value: t, + }); + } + : function (e, t) { + e["default"] = t; + }, + o = function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) + for (var n in e) + "default" !== n && + Object.hasOwnProperty.call(e, n) && + r(t, e, n); + return (i(t, e), t); + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.useDefaultAdapter = t.useAdapters = t.RUNTIME = void 0)); + var a, + s = o(n(9882)), + u = n(5939); + (!(function (e) { + ((e.WEB = "web"), (e.WX_MP = "wx_mp")); + })((a = t.RUNTIME || (t.RUNTIME = {}))), + (t.useAdapters = function (e) { + for (var t = 0, n = u.isArray(e) ? e : [e]; t < n.length; t++) { + var r = n[t], + i = r.isMatch, + o = r.genAdapter, + a = r.runtime; + if (i()) return { adapter: o(), runtime: a }; + } + }), + (t.useDefaultAdapter = function () { + return { adapter: s.genAdapter(), runtime: a.WEB }; + })); + }, + 9882: function (e, t, n) { + "use strict"; + var r, + i = + ((r = function (e, t) { + return ( + (r = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + r(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (r(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + o = function () { + return ( + (o = + Object.assign || + function (e) { + for (var t, n = 1, r = arguments.length; n < r; n++) + for (var i in (t = arguments[n])) + Object.prototype.hasOwnProperty.call(t, i) && + (e[i] = t[i]); + return e; + }), + o.apply(this, arguments) + ); + }, + a = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + s = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.WebRequest = t.genAdapter = void 0)); + var u = n(6885), + c = n(5939), + l = n(6531), + d = (function (e) { + function t(t) { + var n = e.call(this) || this, + r = t.timeout, + i = t.timeoutMsg, + o = t.restrictedMethods; + return ( + (n._timeout = r || 0), + (n._timeoutMsg = i || "请求超时"), + (n._restrictedMethods = o || [ + "get", + "post", + "upload", + "download", + ]), + n + ); + } + return ( + i(t, e), + (t.prototype.get = function (e) { + return this._request( + o(o({}, e), { method: "get" }), + this._restrictedMethods.includes("get"), + ); + }), + (t.prototype.post = function (e) { + return this._request( + o(o({}, e), { method: "post" }), + this._restrictedMethods.includes("post"), + ); + }), + (t.prototype.put = function (e) { + return this._request(o(o({}, e), { method: "put" })); + }), + (t.prototype.upload = function (e) { + var t = e.data, + n = e.file, + r = e.name, + i = new FormData(); + for (var a in t) i.append(a, t[a]); + return ( + i.append("key", r), + i.append("file", n), + this._request( + o(o({}, e), { data: i, method: "post" }), + this._restrictedMethods.includes("upload"), + ) + ); + }), + (t.prototype.download = function (e) { + return a(this, void 0, void 0, function () { + var t, n, r, i; + return s(this, function (a) { + switch (a.label) { + case 0: + return ( + a.trys.push([0, 2, , 3]), + [ + 4, + this.get( + o(o({}, e), { + headers: {}, + responseType: "blob", + }), + ), + ] + ); + case 1: + return ( + (t = a.sent().data), + (n = window.URL.createObjectURL(new Blob([t]))), + (r = decodeURIComponent( + new URL(e.url).pathname.split("/").pop() || "", + )), + ((i = document.createElement("a")).href = n), + i.setAttribute("download", r), + (i.style.display = "none"), + document.body.appendChild(i), + i.click(), + window.URL.revokeObjectURL(n), + document.body.removeChild(i), + [3, 3] + ); + case 2: + return (a.sent(), [3, 3]); + case 3: + return [ + 2, + new Promise(function (t) { + t({ statusCode: 200, tempFilePath: e.url }); + }), + ]; + } + }); + }); + }), + (t.prototype._request = function (e, t) { + var n = this; + void 0 === t && (t = !1); + var r = String(e.method).toLowerCase() || "get"; + return new Promise(function (i) { + var o, + a, + s = e.url, + u = e.headers, + d = void 0 === u ? {} : u, + f = e.data, + p = e.responseType, + h = e.withCredentials, + m = e.body, + g = e.onUploadProgress, + v = c.formatUrl( + l.getProtocol(), + s, + "get" === r ? f : {}, + ), + _ = new XMLHttpRequest(); + for (var y in (_.open(r, v), + p && (_.responseType = p), + d)) + _.setRequestHeader(y, d[y]); + (g && _.upload.addEventListener("progress", g), + (_.onreadystatechange = function () { + var e = {}; + if (4 === _.readyState) { + var t = _.getAllResponseHeaders() + .trim() + .split(/[\r\n]+/), + n = {}; + (t.forEach(function (e) { + var t = e.split(": "), + r = t.shift().toLowerCase(), + i = t.join(": "); + n[r] = i; + }), + (e.header = n), + (e.statusCode = _.status)); + try { + e.data = + "blob" === p + ? _.response + : JSON.parse(_.responseText); + } catch (r) { + e.data = + "blob" === p ? _.response : _.responseText; + } + (clearTimeout(o), i(e)); + } + }), + t && + n._timeout && + (o = setTimeout(function () { + (console.warn(n._timeoutMsg), _.abort()); + }, n._timeout)), + (a = c.isFormData(f) + ? f + : "application/x-www-form-urlencoded" === + d["content-type"] + ? c.toQueryString(f) + : m || (f ? JSON.stringify(f) : undefined)), + h && (_.withCredentials = !0), + _.send(a)); + }); + }), + t + ); + })(u.AbstractSDKRequest); + ((t.WebRequest = d), + (t.genAdapter = function () { + return { + root: window, + reqClass: d, + wsClass: WebSocket, + localStorage: localStorage, + sessionStorage: sessionStorage, + }; + })); + }, + 6531: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.COMMUNITY_SITE_URL = + t.IS_DEBUG_MODE = + t.getProtocol = + t.setProtocol = + t.getSdkName = + t.setSdkName = + void 0)); + var n = "@cloudbase/js-sdk"; + ((t.setSdkName = function (e) { + n = e; + }), + (t.getSdkName = function () { + return n; + })); + var r = + "undefined" != typeof location && "http:" === location.protocol + ? "http:" + : "https:"; + ((t.setProtocol = function (e) { + r = e; + }), + (t.getProtocol = function () { + return r; + }), + (t.IS_DEBUG_MODE = !1), + (t.COMMUNITY_SITE_URL = + "https://support.qq.com/products/148793")); + }, + 4769: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.ERRORS = void 0), + (t.ERRORS = { + INVALID_PARAMS: "INVALID_PARAMS", + INVALID_SYNTAX: "INVALID_SYNTAX", + INVALID_OPERATION: "INVALID_OPERATION", + OPERATION_FAIL: "OPERATION_FAIL", + NETWORK_ERROR: "NETWORK_ERROR", + UNKOWN_ERROR: "UNKOWN_ERROR", + })); + }, + 3440: function (e, t, n) { + "use strict"; + var r = Object.create + ? function (e, t, n, r) { + (r === undefined && (r = n), + Object.defineProperty(e, r, { + enumerable: !0, + get: function () { + return t[n]; + }, + })); + } + : function (e, t, n, r) { + (r === undefined && (r = n), (e[r] = t[n])); + }, + i = function (e, t) { + for (var n in e) + "default" === n || t.hasOwnProperty(n) || r(t, e, n); + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + i(n(6531), t), + i(n(4769), t)); + }, + 8220: function (e, t, n) { + "use strict"; + var r = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + i = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.catchErrorsDecorator = void 0)); + var o = n(5939), + a = n(3440), + s = !1; + "undefined" != typeof navigator && + navigator.userAgent && + (s = -1 !== navigator.userAgent.indexOf("Firefox")); + var u = s + ? /(\.js\/)?__decorate(\$\d+)?<@.*\d$/ + : /(\/\w+\.js\.)?__decorate(\$\d+)?\s*\(.*\)$/, + c = /https?\:\/\/.+\:\d*\/.*\.js\:\d+\:\d+/; + function l(e) { + var t = e.err, + n = e.className, + r = e.methodName, + i = e.sourceLink; + if (!i) return null; + var o, + a = t.stack.split("\n"), + u = s + ? /^catchErrorsDecorator\/<\/descriptor.value@.*\d$/ + : new RegExp( + n + + "\\.descriptor.value\\s*\\[as\\s" + + r + + "\\]\\s*\\(.*\\)$", + ), + l = s + ? /^catchErrorsDecorator\/<\/descriptor.value/ + : new RegExp( + n + "\\.descriptor.value\\s*\\[as\\s" + r + "\\]", + ), + d = a.findIndex(function (e) { + return u.test(e); + }); + if (-1 !== d) { + var f = a.filter(function (e, t) { + return t > d; + }); + (f.unshift(a[d].replace(l, n + "." + r).replace(c, i)), + ((o = new Error()).stack = + (s ? "@debugger" : "Error") + "\n" + f.join("\n"))); + } + return o; + } + t.catchErrorsDecorator = function (e) { + var t = e.mode, + n = void 0 === t ? "async" : t, + s = e.customInfo, + d = void 0 === s ? {} : s, + f = e.title, + p = e.messages, + h = void 0 === p ? [] : p; + return function (e, t, s) { + if (a.IS_DEBUG_MODE) { + var p = d.className || e.constructor.name, + m = d.methodName || t, + g = s.value, + v = (function (e) { + var t = "", + n = e.stack.split("\n"), + r = n.findIndex(function (e) { + return u.test(e); + }); + if (-1 !== r) { + var i = c.exec(n[r + 1] || ""); + t = i ? i[0] : ""; + } + return t; + })(new Error()); + s.value = + "sync" === n + ? function () { + for (var e = [], t = 0; t < arguments.length; t++) + e[t] = arguments[t]; + var n = l({ + err: new Error(), + className: p, + methodName: m, + sourceLink: v, + }); + try { + return g.apply(this, e); + } catch (u) { + var r = u, + i = u.message, + a = { + title: f || p + "." + m + " failed", + content: [{ type: "error", body: u }], + }; + if (i && /^\{.*\}$/.test(i)) { + var s = JSON.parse(i); + ((a.subtitle = i), + s.code && + (n + ? ((n.code = s.code), (n.msg = s.msg)) + : ((u.code = s.code), (u.message = s.msg)), + (r = n || u), + (a.content = h.map(function (e) { + return { type: "info", body: e }; + })))); + } + throw (o.printGroupLog(a), r); + } + } + : function () { + for (var e = [], t = 0; t < arguments.length; t++) + e[t] = arguments[t]; + return r(this, void 0, void 0, function () { + var t, n, r, a, s, u; + return i(this, function (i) { + switch (i.label) { + case 0: + ((t = l({ + err: new Error(), + className: p, + methodName: m, + sourceLink: v, + })), + (i.label = 1)); + case 1: + return ( + i.trys.push([1, 3, , 4]), + [4, g.apply(this, e)] + ); + case 2: + return [2, i.sent()]; + case 3: + throw ( + (n = i.sent()), + (r = n), + (a = n.message), + (s = { + title: f || p + "." + m + " failed", + content: [{ type: "error", body: n }], + }), + a && + /^\{.*\}$/.test(a) && + ((u = JSON.parse(a)), + (s.subtitle = u), + u.code && + (t + ? ((t.code = u.code), + (t.message = u.msg)) + : ((n.code = u.code), + (n.message = u.msg)), + (r = t || n), + (s.content = h.map(function (e) { + return { type: "info", body: e }; + })))), + o.printGroupLog(s), + r + ); + case 4: + return [2]; + } + }); + }); + }; + } + }; + }; + }, + 1008: function (e, t, n) { + "use strict"; + var r = Object.create + ? function (e, t, n, r) { + (r === undefined && (r = n), + Object.defineProperty(e, r, { + enumerable: !0, + get: function () { + return t[n]; + }, + })); + } + : function (e, t, n, r) { + (r === undefined && (r = n), (e[r] = t[n])); + }, + i = function (e, t) { + for (var n in e) + "default" === n || t.hasOwnProperty(n) || r(t, e, n); + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + i(n(8220), t)); + }, + 2566: function (e, t, n) { + "use strict"; + var r = Object.create + ? function (e, t, n, r) { + (r === undefined && (r = n), + Object.defineProperty(e, r, { + enumerable: !0, + get: function () { + return t[n]; + }, + })); + } + : function (e, t, n, r) { + (r === undefined && (r = n), (e[r] = t[n])); + }, + i = Object.create + ? function (e, t) { + Object.defineProperty(e, "default", { + enumerable: !0, + value: t, + }); + } + : function (e, t) { + e["default"] = t; + }, + o = function (e) { + if (e && e.__esModule) return e; + var t = {}; + if (null != e) + for (var n in e) + "default" !== n && + Object.hasOwnProperty.call(e, n) && + r(t, e, n); + return (i(t, e), t); + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.helpers = + t.utils = + t.events = + t.cache = + t.adapters = + t.constants = + void 0)); + var a = o(n(3440)); + t.constants = a; + var s = o(n(1259)); + t.adapters = s; + var u = o(n(5861)); + t.cache = u; + var c = o(n(9978)); + t.events = c; + var l = o(n(5939)); + t.utils = l; + var d = o(n(1008)); + t.helpers = d; + }, + 5861: function (e, t, n) { + "use strict"; + var r, + i = + ((r = function (e, t) { + return ( + (r = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + r(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (r(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + o = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + a = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.CloudbaseCache = void 0)); + var s = n(6885), + u = n(5939), + c = n(3440), + l = (function (e) { + function t(t) { + var n = e.call(this) || this; + return ( + (n._root = t), + t.tcbCacheObject || (t.tcbCacheObject = {}), + n + ); + } + return ( + i(t, e), + (t.prototype.setItem = function (e, t) { + this._root.tcbCacheObject[e] = t; + }), + (t.prototype.getItem = function (e) { + return this._root.tcbCacheObject[e]; + }), + (t.prototype.removeItem = function (e) { + delete this._root.tcbCacheObject[e]; + }), + (t.prototype.clear = function () { + delete this._root.tcbCacheObject; + }), + t + ); + })(s.AbstractStorage); + function d(e, t) { + switch (e) { + case "local": + default: + return t.localStorage + ? t.localStorage + : (u.printWarn( + c.ERRORS.INVALID_PARAMS, + "localStorage is not supported on current platform", + ), + new l(t.root)); + case "none": + return new l(t.root); + case "session": + return t.sessionStorage + ? t.sessionStorage + : (u.printWarn( + c.ERRORS.INVALID_PARAMS, + "sessionStorage is not supported on current platform", + ), + new l(t.root)); + } + } + var f = (function () { + function e(e) { + this.keys = {}; + var t = e.persistence, + n = e.platformInfo, + r = void 0 === n ? {} : n, + i = e.keys, + o = void 0 === i ? {} : i, + a = e.alwaysLocalKeys, + s = void 0 === a ? [] : a; + ((this._platformInfo = r), + (this._alwaysLocalKeys = s), + this._storage || + ((this._persistence = r.adapter.primaryStorage || t), + (this._storage = d(this._persistence, r.adapter)), + (this.keys = o))); + } + return ( + Object.defineProperty(e.prototype, "mode", { + get: function () { + return this._storage.mode || "sync"; + }, + enumerable: !1, + configurable: !0, + }), + Object.defineProperty(e.prototype, "persistence", { + get: function () { + return this._persistence; + }, + enumerable: !1, + configurable: !0, + }), + (e.prototype.updatePersistence = function (e) { + if ("async" !== this.mode) { + if (e !== this._persistence) { + var t = "local" === this._persistence; + this._persistence = e; + var n = d(e, this._platformInfo.adapter); + for (var r in this.keys) { + var i = this.keys[r]; + if (!t || !this._alwaysLocalKeys.includes(r)) { + var o = this._storage.getItem(i); + u.isUndefined(o) || + u.isNull(o) || + (n.setItem(i, o), this._storage.removeItem(i)); + } + } + this._storage = n; + } + } else + u.printWarn( + c.ERRORS.INVALID_OPERATION, + "current platform's storage is asynchronous, please use updatePersistenceAsync insteed", + ); + }), + (e.prototype.updatePersistenceAsync = function (e) { + return o(this, void 0, void 0, function () { + var t, n, r, i, o, s, c, l; + return a(this, function (a) { + switch (a.label) { + case 0: + if (e === this._persistence) return [2]; + for (i in ((t = "local" === this._persistence), + (this._persistence = e), + (n = d(e, this._platformInfo.adapter)), + (r = []), + this.keys)) + r.push(i); + ((o = 0), (a.label = 1)); + case 1: + return o < r.length + ? ((s = r[o]), + (c = this.keys[s]), + t && this._alwaysLocalKeys.includes(s) + ? [3, 4] + : [4, this._storage.getItem(c)]) + : [3, 5]; + case 2: + return ( + (l = a.sent()), + u.isUndefined(l) || u.isNull(l) + ? [3, 4] + : (n.setItem(c, l), + [4, this._storage.removeItem(c)]) + ); + case 3: + (a.sent(), (a.label = 4)); + case 4: + return (o++, [3, 1]); + case 5: + return ((this._storage = n), [2]); + } + }); + }); + }), + (e.prototype.setStore = function (e, t, n) { + if ("async" !== this.mode) { + if (this._storage) + try { + var r = { version: n || "localCachev1", content: t }; + this._storage.setItem(e, JSON.stringify(r)); + } catch (i) { + throw new Error( + JSON.stringify({ + code: c.ERRORS.OPERATION_FAIL, + msg: + "[" + + c.getSdkName() + + "][" + + c.ERRORS.OPERATION_FAIL + + "]setStore failed", + info: i, + }), + ); + } + } else + u.printWarn( + c.ERRORS.INVALID_OPERATION, + "current platform's storage is asynchronous, please use setStoreAsync insteed", + ); + }), + (e.prototype.setStoreAsync = function (e, t, n) { + return o(this, void 0, void 0, function () { + var r; + return a(this, function (i) { + switch (i.label) { + case 0: + if (!this._storage) return [2]; + i.label = 1; + case 1: + return ( + i.trys.push([1, 3, , 4]), + (r = { version: n || "localCachev1", content: t }), + [4, this._storage.setItem(e, JSON.stringify(r))] + ); + case 2: + return (i.sent(), [3, 4]); + case 3: + return (i.sent(), [2]); + case 4: + return [2]; + } + }); + }); + }), + (e.prototype.getStore = function (e, t) { + var n; + if ("async" !== this.mode) { + try { + if ( + "undefined" != typeof process && + (null === (n = process.env) || void 0 === n + ? void 0 + : n.tcb_token) + ) + return process.env.tcb_token; + if (!this._storage) return ""; + } catch (i) { + return ""; + } + t = t || "localCachev1"; + var r = this._storage.getItem(e); + return r && r.indexOf(t) >= 0 ? JSON.parse(r).content : ""; + } + u.printWarn( + c.ERRORS.INVALID_OPERATION, + "current platform's storage is asynchronous, please use getStoreAsync insteed", + ); + }), + (e.prototype.getStoreAsync = function (e, t) { + var n; + return o(this, void 0, void 0, function () { + var r; + return a(this, function (i) { + switch (i.label) { + case 0: + try { + if ( + "undefined" != typeof process && + (null === (n = process.env) || void 0 === n + ? void 0 + : n.tcb_token) + ) + return [2, process.env.tcb_token]; + if (!this._storage) return [2, ""]; + } catch (o) { + return [2, ""]; + } + return ( + (t = t || "localCachev1"), + [4, this._storage.getItem(e)] + ); + case 1: + return (r = i.sent()) && r.indexOf(t) >= 0 + ? [2, JSON.parse(r).content] + : [2, ""]; + } + }); + }); + }), + (e.prototype.removeStore = function (e) { + "async" !== this.mode + ? this._storage.removeItem(e) + : u.printWarn( + c.ERRORS.INVALID_OPERATION, + "current platform's storage is asynchronous, please use removeStoreAsync insteed", + ); + }), + (e.prototype.removeStoreAsync = function (e) { + return o(this, void 0, void 0, function () { + return a(this, function (t) { + switch (t.label) { + case 0: + return [4, this._storage.removeItem(e)]; + case 1: + return (t.sent(), [2]); + } + }); + }); + }), + e + ); + })(); + t.CloudbaseCache = f; + }, + 9978: function (e, t, n) { + "use strict"; + var r, + i = + ((r = function (e, t) { + return ( + (r = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + r(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (r(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + o = function () { + for (var e = 0, t = 0, n = arguments.length; t < n; t++) + e += arguments[t].length; + var r = Array(e), + i = 0; + for (t = 0; t < n; t++) + for ( + var o = arguments[t], a = 0, s = o.length; + a < s; + a++, i++ + ) + r[i] = o[a]; + return r; + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.removeEventListener = + t.activateEvent = + t.addEventListener = + t.CloudbaseEventEmitter = + t.IErrorEvent = + t.CloudbaseEvent = + void 0)); + var a = n(5939), + s = function (e, t) { + ((this.data = t || null), (this.name = e)); + }; + t.CloudbaseEvent = s; + var u = (function (e) { + function t(t, n) { + var r = e.call(this, "error", { error: t, data: n }) || this; + return ((r.error = t), r); + } + return (i(t, e), t); + })(s); + t.IErrorEvent = u; + var c = (function () { + function e() { + this._listeners = {}; + } + return ( + (e.prototype.on = function (e, t) { + return ( + (function (e, t, n) { + ((n[e] = n[e] || []), n[e].push(t)); + })(e, t, this._listeners), + this + ); + }), + (e.prototype.off = function (e, t) { + return ( + (function (e, t, n) { + if (null == n ? void 0 : n[e]) { + var r = n[e].indexOf(t); + -1 !== r && n[e].splice(r, 1); + } + })(e, t, this._listeners), + this + ); + }), + (e.prototype.fire = function (e, t) { + if (a.isInstanceOf(e, u)) + return (console.error(e.error), this); + var n = a.isString(e) ? new s(e, t || {}) : e, + r = n.name; + if (this._listens(r)) { + n.target = this; + for ( + var i = 0, + c = this._listeners[r] ? o(this._listeners[r]) : []; + i < c.length; + i++ + ) + c[i].call(this, n); + } + return this; + }), + (e.prototype._listens = function (e) { + return this._listeners[e] && this._listeners[e].length > 0; + }), + e + ); + })(); + t.CloudbaseEventEmitter = c; + var l = new c(); + ((t.addEventListener = function (e, t) { + l.on(e, t); + }), + (t.activateEvent = function (e, t) { + (void 0 === t && (t = {}), l.fire(e, t)); + }), + (t.removeEventListener = function (e, t) { + l.off(e, t); + })); + }, + 5939: function (e, t, n) { + "use strict"; + var r = function (e) { + return e && e.__esModule ? e : { default: e }; + }; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.transformPhone = + t.sleep = + t.printGroupLog = + t.throwError = + t.printInfo = + t.printError = + t.printWarn = + t.execCallback = + t.createPromiseCallback = + t.removeParam = + t.getHash = + t.getQuery = + t.toQueryString = + t.createSign = + t.formatUrl = + t.genSeqId = + t.isFormData = + t.isInstanceOf = + t.isNull = + t.isPalinObject = + t.isUndefined = + t.isString = + t.isArray = + void 0)); + var i = r(n(4180)), + o = r(n(6253)), + a = r(n(1717)), + s = n(3440); + function u(e) { + var t = o["default"].stringify(e); + return (t = (t = (t = t.replace(/=+$/, "")).replace( + /\+/g, + "-", + )).replace(/\//g, "_")); + } + ((t.isArray = function (e) { + return "[object Array]" === Object.prototype.toString.call(e); + }), + (t.isString = function (e) { + return "string" == typeof e; + }), + (t.isUndefined = function (e) { + return void 0 === e; + }), + (t.isPalinObject = function (e) { + return "[object Object]" === Object.prototype.toString.call(e); + }), + (t.isNull = function (e) { + return "[object Null]" === Object.prototype.toString.call(e); + }), + (t.isInstanceOf = function (e, t) { + return e instanceof t; + }), + (t.isFormData = function (e) { + return ( + "[object FormData]" === Object.prototype.toString.call(e) + ); + }), + (t.genSeqId = function () { + return Math.random().toString(16).slice(2); + }), + (t.formatUrl = function (e, t, n) { + void 0 === n && (n = {}); + var r = /\?/.test(t), + i = ""; + for (var o in n) + ("" === i ? !r && (t += "?") : (i += "&"), + (i += o + "=" + encodeURIComponent(n[o]))); + return /^http(s)?\:\/\//.test((t += i)) ? t : "" + e + t; + }), + (t.createSign = function (e, t) { + var n = + u( + a["default"].parse( + JSON.stringify({ alg: "HS256", typ: "JWT" }), + ), + ) + + "." + + u(a["default"].parse(JSON.stringify(e))); + return n + "." + u(i["default"](n, t)); + }), + (t.toQueryString = function (e) { + void 0 === e && (e = {}); + var t = []; + for (var n in e) t.push(n + "=" + encodeURIComponent(e[n])); + return t.join("&"); + }), + (t.getQuery = function (e, t) { + if ("undefined" == typeof window) return !1; + var n = t || window.location.search, + r = new RegExp("(^|&)" + e + "=([^&]*)(&|$)"), + i = n.substr(n.indexOf("?") + 1).match(r); + return null != i ? i[2] : ""; + }), + (t.getHash = function (e) { + if ("undefined" == typeof window) return ""; + var t = window.location.hash.match( + new RegExp("[#?&/]" + e + "=([^&#]*)"), + ); + return t ? t[1] : ""; + }), + (t.removeParam = function (e, t) { + var n = t.split("?")[0], + r = [], + i = -1 !== t.indexOf("?") ? t.split("?")[1] : ""; + if ("" !== i) { + for (var o = (r = i.split("&")).length - 1; o >= 0; o -= 1) + r[o].split("=")[0] === e && r.splice(o, 1); + n = n + "?" + r.join("&"); + } + return n; + }), + (t.createPromiseCallback = function () { + var e; + if (!Promise) { + (e = function () {}).promise = {}; + var t = function () { + throw new Error( + 'Your Node runtime does support ES6 Promises. Set "global.Promise" to your preferred implementation of promises.', + ); + }; + return ( + Object.defineProperty(e.promise, "then", { get: t }), + Object.defineProperty(e.promise, "catch", { get: t }), + e + ); + } + var n = new Promise(function (t, n) { + e = function (e, r) { + return e ? n(e) : t(r); + }; + }); + return ((e.promise = n), e); + }), + (t.execCallback = function (e, t, n) { + if ((void 0 === n && (n = null), e && "function" == typeof e)) + return e(t, n); + if (t) throw t; + return n; + }), + (t.printWarn = function (e, t) { + console.warn("[" + s.getSdkName() + "][" + e + "]:" + t); + }), + (t.printError = function (e, t) { + console.error({ + code: e, + msg: "[" + s.getSdkName() + "][" + e + "]:" + t, + }); + }), + (t.printInfo = function (e, t) { + console.log("[" + s.getSdkName() + "][" + e + "]:" + t); + }), + (t.throwError = function (e, t) { + throw new Error( + JSON.stringify({ + code: e, + msg: "[" + s.getSdkName() + "][" + e + "]:" + t, + }), + ); + }), + (t.printGroupLog = function (e) { + var t = e.title, + n = e.subtitle, + r = void 0 === n ? "" : n, + i = e.content, + o = void 0 === i ? [] : i, + a = e.printTrace, + s = void 0 !== a && a, + u = e.collapsed; + void 0 !== u && u + ? console.groupCollapsed(t, r) + : console.group(t, r); + for (var c = 0, l = o; c < l.length; c++) { + var d = l[c], + f = d.type, + p = d.body; + switch (f) { + case "info": + console.log(p); + break; + case "warn": + console.warn(p); + break; + case "error": + console.error(p); + } + } + (s && console.trace("stack trace:"), console.groupEnd()); + }), + (t.sleep = function (e) { + return ( + void 0 === e && (e = 0), + new Promise(function (t) { + return setTimeout(t, e); + }) + ); + }), + (t.transformPhone = function (e) { + return "+86" + e; + })); + }, + 2889: function (e, t, n) { + "use strict"; + var r; + (n(477)(n(9367)), + (function (i) { + function o(e, t) { + var n = (65535 & e) + (65535 & t); + return ( + (((e >> 16) + (t >> 16) + (n >> 16)) << 16) | (65535 & n) + ); + } + function a(e, t, n, r, i, a) { + return o( + ((s = o(o(t, e), o(r, a))) << (u = i)) | (s >>> (32 - u)), + n, + ); + var s, u; + } + function s(e, t, n, r, i, o, s) { + return a((t & n) | (~t & r), e, t, i, o, s); + } + function u(e, t, n, r, i, o, s) { + return a((t & r) | (n & ~r), e, t, i, o, s); + } + function c(e, t, n, r, i, o, s) { + return a(t ^ n ^ r, e, t, i, o, s); + } + function l(e, t, n, r, i, o, s) { + return a(n ^ (t | ~r), e, t, i, o, s); + } + function d(e, t) { + var n, r, i, a, d; + ((e[t >> 5] |= 128 << (t % 32)), + (e[14 + (((t + 64) >>> 9) << 4)] = t)); + var f = 1732584193, + p = -271733879, + h = -1732584194, + m = 271733878; + for (n = 0; n < e.length; n += 16) + ((r = f), + (i = p), + (a = h), + (d = m), + (f = s(f, p, h, m, e[n], 7, -680876936)), + (m = s(m, f, p, h, e[n + 1], 12, -389564586)), + (h = s(h, m, f, p, e[n + 2], 17, 606105819)), + (p = s(p, h, m, f, e[n + 3], 22, -1044525330)), + (f = s(f, p, h, m, e[n + 4], 7, -176418897)), + (m = s(m, f, p, h, e[n + 5], 12, 1200080426)), + (h = s(h, m, f, p, e[n + 6], 17, -1473231341)), + (p = s(p, h, m, f, e[n + 7], 22, -45705983)), + (f = s(f, p, h, m, e[n + 8], 7, 1770035416)), + (m = s(m, f, p, h, e[n + 9], 12, -1958414417)), + (h = s(h, m, f, p, e[n + 10], 17, -42063)), + (p = s(p, h, m, f, e[n + 11], 22, -1990404162)), + (f = s(f, p, h, m, e[n + 12], 7, 1804603682)), + (m = s(m, f, p, h, e[n + 13], 12, -40341101)), + (h = s(h, m, f, p, e[n + 14], 17, -1502002290)), + (f = u( + f, + (p = s(p, h, m, f, e[n + 15], 22, 1236535329)), + h, + m, + e[n + 1], + 5, + -165796510, + )), + (m = u(m, f, p, h, e[n + 6], 9, -1069501632)), + (h = u(h, m, f, p, e[n + 11], 14, 643717713)), + (p = u(p, h, m, f, e[n], 20, -373897302)), + (f = u(f, p, h, m, e[n + 5], 5, -701558691)), + (m = u(m, f, p, h, e[n + 10], 9, 38016083)), + (h = u(h, m, f, p, e[n + 15], 14, -660478335)), + (p = u(p, h, m, f, e[n + 4], 20, -405537848)), + (f = u(f, p, h, m, e[n + 9], 5, 568446438)), + (m = u(m, f, p, h, e[n + 14], 9, -1019803690)), + (h = u(h, m, f, p, e[n + 3], 14, -187363961)), + (p = u(p, h, m, f, e[n + 8], 20, 1163531501)), + (f = u(f, p, h, m, e[n + 13], 5, -1444681467)), + (m = u(m, f, p, h, e[n + 2], 9, -51403784)), + (h = u(h, m, f, p, e[n + 7], 14, 1735328473)), + (f = c( + f, + (p = u(p, h, m, f, e[n + 12], 20, -1926607734)), + h, + m, + e[n + 5], + 4, + -378558, + )), + (m = c(m, f, p, h, e[n + 8], 11, -2022574463)), + (h = c(h, m, f, p, e[n + 11], 16, 1839030562)), + (p = c(p, h, m, f, e[n + 14], 23, -35309556)), + (f = c(f, p, h, m, e[n + 1], 4, -1530992060)), + (m = c(m, f, p, h, e[n + 4], 11, 1272893353)), + (h = c(h, m, f, p, e[n + 7], 16, -155497632)), + (p = c(p, h, m, f, e[n + 10], 23, -1094730640)), + (f = c(f, p, h, m, e[n + 13], 4, 681279174)), + (m = c(m, f, p, h, e[n], 11, -358537222)), + (h = c(h, m, f, p, e[n + 3], 16, -722521979)), + (p = c(p, h, m, f, e[n + 6], 23, 76029189)), + (f = c(f, p, h, m, e[n + 9], 4, -640364487)), + (m = c(m, f, p, h, e[n + 12], 11, -421815835)), + (h = c(h, m, f, p, e[n + 15], 16, 530742520)), + (f = l( + f, + (p = c(p, h, m, f, e[n + 2], 23, -995338651)), + h, + m, + e[n], + 6, + -198630844, + )), + (m = l(m, f, p, h, e[n + 7], 10, 1126891415)), + (h = l(h, m, f, p, e[n + 14], 15, -1416354905)), + (p = l(p, h, m, f, e[n + 5], 21, -57434055)), + (f = l(f, p, h, m, e[n + 12], 6, 1700485571)), + (m = l(m, f, p, h, e[n + 3], 10, -1894986606)), + (h = l(h, m, f, p, e[n + 10], 15, -1051523)), + (p = l(p, h, m, f, e[n + 1], 21, -2054922799)), + (f = l(f, p, h, m, e[n + 8], 6, 1873313359)), + (m = l(m, f, p, h, e[n + 15], 10, -30611744)), + (h = l(h, m, f, p, e[n + 6], 15, -1560198380)), + (p = l(p, h, m, f, e[n + 13], 21, 1309151649)), + (f = l(f, p, h, m, e[n + 4], 6, -145523070)), + (m = l(m, f, p, h, e[n + 11], 10, -1120210379)), + (h = l(h, m, f, p, e[n + 2], 15, 718787259)), + (p = l(p, h, m, f, e[n + 9], 21, -343485551)), + (f = o(f, r)), + (p = o(p, i)), + (h = o(h, a)), + (m = o(m, d))); + return [f, p, h, m]; + } + function f(e) { + var t, + n = "", + r = 32 * e.length; + for (t = 0; t < r; t += 8) + n += String.fromCharCode((e[t >> 5] >>> (t % 32)) & 255); + return n; + } + function p(e) { + var t, + n = []; + for ( + n[(e.length >> 2) - 1] = undefined, t = 0; + t < n.length; + t += 1 + ) + n[t] = 0; + var r = 8 * e.length; + for (t = 0; t < r; t += 8) + n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << (t % 32); + return n; + } + function h(e) { + var t, + n, + r = "0123456789abcdef", + i = ""; + for (n = 0; n < e.length; n += 1) + ((t = e.charCodeAt(n)), + (i += r.charAt((t >>> 4) & 15) + r.charAt(15 & t))); + return i; + } + function m(e) { + return unescape(encodeURIComponent(e)); + } + function g(e) { + return (function (e) { + return f(d(p(e), 8 * e.length)); + })(m(e)); + } + function v(e, t) { + return (function (e, t) { + var n, + r, + i = p(e), + o = [], + a = []; + for ( + o[15] = a[15] = undefined, + i.length > 16 && (i = d(i, 8 * e.length)), + n = 0; + n < 16; + n += 1 + ) + ((o[n] = 909522486 ^ i[n]), (a[n] = 1549556828 ^ i[n])); + return ( + (r = d(o.concat(p(t)), 512 + 8 * t.length)), + f(d(a.concat(r), 640)) + ); + })(m(e), m(t)); + } + function _(e, t, n) { + return t ? (n ? v(t, e) : h(v(t, e))) : n ? g(e) : h(g(e)); + } + (r = function () { + return _; + }.call(t, n, t, e)) === undefined || (e.exports = r); + })()); + }, + 2473: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.wxMpStorage = + t["default"] = + t.WxRequest = + t.WxMpWebSocket = + void 0)); + var r, + i = n(6885), + o = + ((r = function (e, t) { + return ( + (r = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + }), + r(e, t) + ); + }), + function (e, t) { + function n() { + this.constructor = e; + } + (r(e, t), + (e.prototype = + null === t + ? Object.create(t) + : ((n.prototype = t.prototype), new n()))); + }), + a = function () { + return ( + (a = + Object.assign || + function (e) { + for (var t, n = 1, r = arguments.length; n < r; n++) + for (var i in (t = arguments[n])) + Object.prototype.hasOwnProperty.call(t, i) && + (e[i] = t[i]); + return e; + }), + a.apply(this, arguments) + ); + }, + s = function (e, t, n, r) { + return new (n || (n = Promise))(function (i, o) { + function a(e) { + try { + u(r.next(e)); + } catch (t) { + o(t); + } + } + function s(e) { + try { + u(r["throw"](e)); + } catch (t) { + o(t); + } + } + function u(e) { + var t; + e.done + ? i(e.value) + : ((t = e.value), + t instanceof n + ? t + : new n(function (e) { + e(t); + })).then(a, s); + } + u((r = r.apply(e, t || [])).next()); + }); + }, + u = function (e, t) { + var n, + r, + i, + o, + a = { + label: 0, + sent: function () { + if (1 & i[0]) throw i[1]; + return i[1]; + }, + trys: [], + ops: [], + }; + return ( + (o = { next: s(0), throw: s(1), return: s(2) }), + "function" == typeof Symbol && + (o[Symbol.iterator] = function () { + return this; + }), + o + ); + function s(o) { + return function (s) { + return (function (o) { + if (n) + throw new TypeError("Generator is already executing."); + for (; a; ) + try { + if ( + ((n = 1), + r && + (i = + 2 & o[0] + ? r["return"] + : o[0] + ? r["throw"] || + ((i = r["return"]) && i.call(r), 0) + : r.next) && + !(i = i.call(r, o[1])).done) + ) + return i; + switch ( + ((r = 0), i && (o = [2 & o[0], i.value]), o[0]) + ) { + case 0: + case 1: + i = o; + break; + case 4: + return (a.label++, { value: o[1], done: !1 }); + case 5: + (a.label++, (r = o[1]), (o = [0])); + continue; + case 7: + ((o = a.ops.pop()), a.trys.pop()); + continue; + default: + if ( + !( + (i = + (i = a.trys).length > 0 && + i[i.length - 1]) || + (6 !== o[0] && 2 !== o[0]) + ) + ) { + a = 0; + continue; + } + if ( + 3 === o[0] && + (!i || (o[1] > i[0] && o[1] < i[3])) + ) { + a.label = o[1]; + break; + } + if (6 === o[0] && a.label < i[1]) { + ((a.label = i[1]), (i = o)); + break; + } + if (i && a.label < i[2]) { + ((a.label = i[2]), a.ops.push(o)); + break; + } + (i[2] && a.ops.pop(), a.trys.pop()); + continue; + } + o = t.call(e, a); + } catch (s) { + ((o = [6, s]), (r = 0)); + } finally { + n = i = 0; + } + if (5 & o[0]) throw o[1]; + return { value: o[0] ? o[1] : void 0, done: !0 }; + })([o, s]); + }; + } + }, + c = (t.WxRequest = (function (e) { + function t(t) { + void 0 === t && (t = {}); + var n = e.call(this) || this, + r = t.timeout, + i = t.timeoutMsg, + o = t.restrictedMethods; + return ( + (n._timeout = r || 0), + (n._timeoutMsg = i || "请求超时"), + (n._restrictedMethods = o || [ + "get", + "post", + "upload", + "download", + ]), + n + ); + } + return ( + o(t, e), + (t.prototype.post = function (e) { + var t = this; + return new Promise(function (n, r) { + var o = e.url, + a = e.data, + s = e.headers, + u = wx.request({ + url: (0, i.formatUrl)("https:", o), + data: a, + timeout: t._timeout, + method: "POST", + header: s, + success: function (e) { + n(e); + }, + fail: function (e) { + r(e); + }, + complete: function (e) { + if ( + e && + e.errMsg && + t._timeout && + -1 !== t._restrictedMethods.indexOf("post") && + "request:fail timeout" === e.errMsg + ) { + console.warn(t._timeoutMsg); + try { + u.abort(); + } catch (n) {} + } + }, + }); + }); + }), + (t.prototype.upload = function (e) { + var t = this, + n = this; + return new Promise(function (r) { + return s(t, void 0, void 0, function () { + var t, i, o, s, c, l; + return u(this, function (u) { + return ( + (t = e.url), + (i = e.file), + (o = e.data), + (s = e.headers), + (c = e.onUploadProgress), + (l = wx.uploadFile({ + url: t, + filePath: i, + name: "file", + formData: a({}, o), + header: s, + timeout: this._timeout, + success: function (e) { + var t = { + statusCode: e.statusCode, + data: e.data || {}, + }; + (200 === e.statusCode && + o.success_action_status && + (t.statusCode = parseInt( + o.success_action_status, + 10, + )), + r(t)); + }, + fail: function (e) { + r(e); + }, + complete: function (e) { + if ( + e && + e.errMsg && + n._timeout && + -1 !== + n._restrictedMethods.indexOf("upload") && + "request:fail timeout" === e.errMsg + ) { + console.warn(n._timeoutMsg); + try { + l.abort(); + } catch (t) {} + } + }, + })), + c && + l.onProgressUpdate(function (e) { + c(e); + }), + [2] + ); + }); + }); + }); + }), + (t.prototype.download = function (e) { + var t = this, + n = this; + return new Promise(function (r, o) { + var a = e.url, + s = e.headers, + u = wx.downloadFile({ + url: (0, i.formatUrl)("https:", a), + header: s, + timeout: t._timeout, + success: function (e) { + 200 === e.statusCode && e.tempFilePath + ? r({ + statusCode: 200, + tempFilePath: e.tempFilePath, + }) + : r(e); + }, + fail: function (e) { + o(e); + }, + complete: function (e) { + if ( + e && + e.errMsg && + n._timeout && + -1 !== n._restrictedMethods.indexOf("download") && + "request:fail timeout" === e.errMsg + ) { + console.warn(n._timeoutMsg); + try { + u.abort(); + } catch (t) {} + } + }, + }); + }); + }), + t + ); + })(i.AbstractSDKRequest)), + l = (t.wxMpStorage = { + setItem: function (e, t) { + wx.setStorageSync(e, t); + }, + getItem: function (e) { + return wx.getStorageSync(e); + }, + removeItem: function (e) { + wx.removeStorageSync(e); + }, + clear: function () { + wx.clearStorageSync(); + }, + }), + d = (t.WxMpWebSocket = function (e, t) { + void 0 === t && (t = {}); + var n = wx.connectSocket(a({ url: e }, t)); + return { + set onopen(e) { + n.onOpen(e); + }, + set onmessage(e) { + n.onMessage(e); + }, + set onclose(e) { + n.onClose(e); + }, + set onerror(e) { + n.onError(e); + }, + send: function (e) { + return n.send({ data: e }); + }, + close: function (e, t) { + return n.close({ code: e, reason: t }); + }, + get readyState() { + return n.readyState; + }, + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3, + }; + }), + f = { + genAdapter: function () { + return { + root: {}, + reqClass: c, + wsClass: d, + localStorage: l, + primaryStorage: i.StorageType.local, + getAppSign: function () { + var e = wx.getAccountInfoSync(); + return "undefined" != typeof App || + "undefined" != typeof getApp || + wx.onAppHide || + wx.offAppHide || + wx.onAppShow || + wx.offAppShow + ? e && e.miniProgram + ? e.miniProgram.appId + : "" + : e && e.plugin + ? e.plugin.appId + : ""; + }, + }; + }, + isMatch: function () { + if ("undefined" == typeof wx) return !1; + if ("undefined" == typeof Page) return !1; + if (!wx.getSystemInfoSync) return !1; + if (!wx.getStorageSync) return !1; + if (!wx.setStorageSync) return !1; + if (!wx.connectSocket) return !1; + if (!wx.request) return !1; + try { + if (!wx.getSystemInfoSync()) return !1; + if ("qq" === wx.getSystemInfoSync().AppPlatform) return !1; + } catch (e) { + return !1; + } + return !0; + }, + runtime: "wx_mp", + }; + t["default"] = f; + }, + 4794: function (e, t, n) { + "use strict"; + var r, + i, + o, + a, + s = n(477)(n(9367)); + ((a = function () { + var e = + e || + (function (e, t) { + var n = + Object.create || + (function () { + function e() {} + return function (t) { + var n; + return ( + (e.prototype = t), + (n = new e()), + (e.prototype = null), + n + ); + }; + })(), + r = {}, + i = (r.lib = {}), + o = (i.Base = { + extend: function (e) { + var t = n(this); + return ( + e && t.mixIn(e), + (t.hasOwnProperty("init") && this.init !== t.init) || + (t.init = function () { + t.$super.init.apply(this, arguments); + }), + (t.init.prototype = t), + (t.$super = this), + t + ); + }, + create: function () { + var e = this.extend(); + return (e.init.apply(e, arguments), e); + }, + init: function () {}, + mixIn: function (e) { + for (var t in e) + e.hasOwnProperty(t) && (this[t] = e[t]); + e.hasOwnProperty("toString") && + (this.toString = e.toString); + }, + clone: function () { + return this.init.prototype.extend(this); + }, + }), + a = (i.WordArray = o.extend({ + init: function (e, t) { + ((e = this.words = e || []), + (this.sigBytes = null != t ? t : 4 * e.length)); + }, + toString: function (e) { + return (e || u).stringify(this); + }, + concat: function (e) { + var t = this.words, + n = e.words, + r = this.sigBytes, + i = e.sigBytes; + if ((this.clamp(), r % 4)) + for (var o = 0; o < i; o++) { + var a = (n[o >>> 2] >>> (24 - (o % 4) * 8)) & 255; + t[(r + o) >>> 2] |= a << (24 - ((r + o) % 4) * 8); + } + else + for (o = 0; o < i; o += 4) + t[(r + o) >>> 2] = n[o >>> 2]; + return ((this.sigBytes += i), this); + }, + clamp: function () { + var t = this.words, + n = this.sigBytes; + ((t[n >>> 2] &= 4294967295 << (32 - (n % 4) * 8)), + (t.length = e.ceil(n / 4))); + }, + clone: function () { + var e = o.clone.call(this); + return ((e.words = this.words.slice(0)), e); + }, + random: function (t) { + for ( + var n, + r = [], + i = function (t) { + var n = 987654321, + r = 4294967295; + return function () { + var i = + (((n = + (36969 * (65535 & n) + (n >> 16)) & r) << + 16) + + (t = + (18e3 * (65535 & t) + (t >> 16)) & r)) & + r; + return ( + (i /= 4294967296), + (i += 0.5) * (e.random() > 0.5 ? 1 : -1) + ); + }; + }, + o = 0; + o < t; + o += 4 + ) { + var s = i(4294967296 * (n || e.random())); + ((n = 987654071 * s()), + r.push((4294967296 * s()) | 0)); + } + return new a.init(r, t); + }, + })), + s = (r.enc = {}), + u = (s.Hex = { + stringify: function (e) { + for ( + var t = e.words, n = e.sigBytes, r = [], i = 0; + i < n; + i++ + ) { + var o = (t[i >>> 2] >>> (24 - (i % 4) * 8)) & 255; + (r.push((o >>> 4).toString(16)), + r.push((15 & o).toString(16))); + } + return r.join(""); + }, + parse: function (e) { + for (var t = e.length, n = [], r = 0; r < t; r += 2) + n[r >>> 3] |= + parseInt(e.substr(r, 2), 16) << (24 - (r % 8) * 4); + return new a.init(n, t / 2); + }, + }), + c = (s.Latin1 = { + stringify: function (e) { + for ( + var t = e.words, n = e.sigBytes, r = [], i = 0; + i < n; + i++ + ) { + var o = (t[i >>> 2] >>> (24 - (i % 4) * 8)) & 255; + r.push(String.fromCharCode(o)); + } + return r.join(""); + }, + parse: function (e) { + for (var t = e.length, n = [], r = 0; r < t; r++) + n[r >>> 2] |= + (255 & e.charCodeAt(r)) << (24 - (r % 4) * 8); + return new a.init(n, t); + }, + }), + l = (s.Utf8 = { + stringify: function (e) { + try { + return decodeURIComponent(escape(c.stringify(e))); + } catch (t) { + throw new Error("Malformed UTF-8 data"); + } + }, + parse: function (e) { + return c.parse(unescape(encodeURIComponent(e))); + }, + }), + d = (i.BufferedBlockAlgorithm = o.extend({ + reset: function () { + ((this._data = new a.init()), (this._nDataBytes = 0)); + }, + _append: function (e) { + ("string" == typeof e && (e = l.parse(e)), + this._data.concat(e), + (this._nDataBytes += e.sigBytes)); + }, + _process: function (t) { + var n = this._data, + r = n.words, + i = n.sigBytes, + o = this.blockSize, + s = i / (4 * o), + u = + (s = t + ? e.ceil(s) + : e.max((0 | s) - this._minBufferSize, 0)) * o, + c = e.min(4 * u, i); + if (u) { + for (var l = 0; l < u; l += o) + this._doProcessBlock(r, l); + var d = r.splice(0, u); + n.sigBytes -= c; + } + return new a.init(d, c); + }, + clone: function () { + var e = o.clone.call(this); + return ((e._data = this._data.clone()), e); + }, + _minBufferSize: 0, + })), + f = + ((i.Hasher = d.extend({ + cfg: o.extend(), + init: function (e) { + ((this.cfg = this.cfg.extend(e)), this.reset()); + }, + reset: function () { + (d.reset.call(this), this._doReset()); + }, + update: function (e) { + return (this._append(e), this._process(), this); + }, + finalize: function (e) { + return (e && this._append(e), this._doFinalize()); + }, + blockSize: 16, + _createHelper: function (e) { + return function (t, n) { + return new e.init(n).finalize(t); + }; + }, + _createHmacHelper: function (e) { + return function (t, n) { + return new f.HMAC.init(e, n).finalize(t); + }; + }, + })), + (r.algo = {})); + return r; + })(Math); + return e; + }), + "object" === (0, s["default"])(t) + ? (e.exports = t = a()) + : ((i = []), + (o = "function" == typeof (r = a) ? r.apply(t, i) : r) === + undefined || (e.exports = o))); + }, + 6253: function (e, t, n) { + "use strict"; + var r, + i, + o, + a, + s = n(477)(n(9367)); + ((a = function (e) { + var t, n; + return ( + (n = (t = e).lib.WordArray), + (t.enc.Base64 = { + stringify: function (e) { + var t = e.words, + n = e.sigBytes, + r = this._map; + e.clamp(); + for (var i = [], o = 0; o < n; o += 3) + for ( + var a = + (((t[o >>> 2] >>> (24 - (o % 4) * 8)) & 255) << + 16) | + (((t[(o + 1) >>> 2] >>> (24 - ((o + 1) % 4) * 8)) & + 255) << + 8) | + ((t[(o + 2) >>> 2] >>> (24 - ((o + 2) % 4) * 8)) & + 255), + s = 0; + s < 4 && o + 0.75 * s < n; + s++ + ) + i.push(r.charAt((a >>> (6 * (3 - s))) & 63)); + var u = r.charAt(64); + if (u) for (; i.length % 4; ) i.push(u); + return i.join(""); + }, + parse: function (e) { + var t = e.length, + r = this._map, + i = this._reverseMap; + if (!i) { + i = this._reverseMap = []; + for (var o = 0; o < r.length; o++) i[r.charCodeAt(o)] = o; + } + var a = r.charAt(64); + if (a) { + var s = e.indexOf(a); + -1 !== s && (t = s); + } + return (function (e, t, r) { + for (var i = [], o = 0, a = 0; a < t; a++) + if (a % 4) { + var s = r[e.charCodeAt(a - 1)] << ((a % 4) * 2), + u = r[e.charCodeAt(a)] >>> (6 - (a % 4) * 2); + ((i[o >>> 2] |= (s | u) << (24 - (o % 4) * 8)), o++); + } + return n.create(i, o); + })(e, t, i); + }, + _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + }), + e.enc.Base64 + ); + }), + "object" === (0, s["default"])(t) + ? (e.exports = t = a(n(4794))) + : ((i = [n(4794)]), + (o = "function" == typeof (r = a) ? r.apply(t, i) : r) === + undefined || (e.exports = o))); + }, + 1717: function (e, t, n) { + "use strict"; + var r, + i, + o, + a, + s = n(477)(n(9367)); + ((a = function (e) { + return e.enc.Utf8; + }), + "object" === (0, s["default"])(t) + ? (e.exports = t = a(n(4794))) + : ((i = [n(4794)]), + (o = "function" == typeof (r = a) ? r.apply(t, i) : r) === + undefined || (e.exports = o))); + }, + 4180: function (e, t, n) { + "use strict"; + var r, + i, + o, + a, + s = n(477)(n(9367)); + ((a = function (e) { + return e.HmacSHA256; + }), + "object" === (0, s["default"])(t) + ? (e.exports = t = a(n(4794), n(5794), n(2910))) + : ((i = [n(4794), n(5794), n(2910)]), + (o = "function" == typeof (r = a) ? r.apply(t, i) : r) === + undefined || (e.exports = o))); + }, + 2910: function (e, t, n) { + "use strict"; + var r, + i, + o, + a, + s = n(477)(n(9367)); + ((a = function (e) { + var t, n, r; + ((n = (t = e).lib.Base), + (r = t.enc.Utf8), + (t.algo.HMAC = n.extend({ + init: function (e, t) { + ((e = this._hasher = new e.init()), + "string" == typeof t && (t = r.parse(t))); + var n = e.blockSize, + i = 4 * n; + (t.sigBytes > i && (t = e.finalize(t)), t.clamp()); + for ( + var o = (this._oKey = t.clone()), + a = (this._iKey = t.clone()), + s = o.words, + u = a.words, + c = 0; + c < n; + c++ + ) + ((s[c] ^= 1549556828), (u[c] ^= 909522486)); + ((o.sigBytes = a.sigBytes = i), this.reset()); + }, + reset: function () { + var e = this._hasher; + (e.reset(), e.update(this._iKey)); + }, + update: function (e) { + return (this._hasher.update(e), this); + }, + finalize: function (e) { + var t = this._hasher, + n = t.finalize(e); + return ( + t.reset(), + t.finalize(this._oKey.clone().concat(n)) + ); + }, + }))); + }), + "object" === (0, s["default"])(t) + ? (e.exports = t = a(n(4794))) + : ((i = [n(4794)]), + (o = "function" == typeof (r = a) ? r.apply(t, i) : r) === + undefined || (e.exports = o))); + }, + 5794: function (e, t, n) { + "use strict"; + var r, + i, + o, + a, + s = n(477)(n(9367)); + ((a = function (e) { + return ( + (function (t) { + var n = e, + r = n.lib, + i = r.WordArray, + o = r.Hasher, + a = n.algo, + s = [], + u = []; + !(function () { + function e(e) { + for (var n = t.sqrt(e), r = 2; r <= n; r++) + if (!(e % r)) return !1; + return !0; + } + function n(e) { + return (4294967296 * (e - (0 | e))) | 0; + } + for (var r = 2, i = 0; i < 64; ) + (e(r) && + (i < 8 && (s[i] = n(t.pow(r, 0.5))), + (u[i] = n(t.pow(r, 1 / 3))), + i++), + r++); + })(); + var c = [], + l = (a.SHA256 = o.extend({ + _doReset: function () { + this._hash = new i.init(s.slice(0)); + }, + _doProcessBlock: function (e, t) { + for ( + var n = this._hash.words, + r = n[0], + i = n[1], + o = n[2], + a = n[3], + s = n[4], + l = n[5], + d = n[6], + f = n[7], + p = 0; + p < 64; + p++ + ) { + if (p < 16) c[p] = 0 | e[t + p]; + else { + var h = c[p - 15], + m = + ((h << 25) | (h >>> 7)) ^ + ((h << 14) | (h >>> 18)) ^ + (h >>> 3), + g = c[p - 2], + v = + ((g << 15) | (g >>> 17)) ^ + ((g << 13) | (g >>> 19)) ^ + (g >>> 10); + c[p] = m + c[p - 7] + v + c[p - 16]; + } + var _ = (r & i) ^ (r & o) ^ (i & o), + y = + ((r << 30) | (r >>> 2)) ^ + ((r << 19) | (r >>> 13)) ^ + ((r << 10) | (r >>> 22)), + b = + f + + (((s << 26) | (s >>> 6)) ^ + ((s << 21) | (s >>> 11)) ^ + ((s << 7) | (s >>> 25))) + + ((s & l) ^ (~s & d)) + + u[p] + + c[p]; + ((f = d), + (d = l), + (l = s), + (s = (a + b) | 0), + (a = o), + (o = i), + (i = r), + (r = (b + (y + _)) | 0)); + } + ((n[0] = (n[0] + r) | 0), + (n[1] = (n[1] + i) | 0), + (n[2] = (n[2] + o) | 0), + (n[3] = (n[3] + a) | 0), + (n[4] = (n[4] + s) | 0), + (n[5] = (n[5] + l) | 0), + (n[6] = (n[6] + d) | 0), + (n[7] = (n[7] + f) | 0)); + }, + _doFinalize: function () { + var e = this._data, + n = e.words, + r = 8 * this._nDataBytes, + i = 8 * e.sigBytes; + return ( + (n[i >>> 5] |= 128 << (24 - (i % 32))), + (n[14 + (((i + 64) >>> 9) << 4)] = t.floor( + r / 4294967296, + )), + (n[15 + (((i + 64) >>> 9) << 4)] = r), + (e.sigBytes = 4 * n.length), + this._process(), + this._hash + ); + }, + clone: function () { + var e = o.clone.call(this); + return ((e._hash = this._hash.clone()), e); + }, + })); + ((n.SHA256 = o._createHelper(l)), + (n.HmacSHA256 = o._createHmacHelper(l))); + })(Math), + e.SHA256 + ); + }), + "object" === (0, s["default"])(t) + ? (e.exports = t = a(n(4794))) + : ((i = [n(4794)]), + (o = "function" == typeof (r = a) ? r.apply(t, i) : r) === + undefined || (e.exports = o))); + }, + 9067: function (e) { + "use strict"; + e.exports = function (e) { + var t = []; + return ( + (t.toString = function () { + return this.map(function (t) { + var n = "", + r = "undefined" != typeof t[5]; + return ( + t[4] && (n += "@supports (".concat(t[4], ") {")), + t[2] && (n += "@media ".concat(t[2], " {")), + r && + (n += "@layer".concat( + t[5].length > 0 ? " ".concat(t[5]) : "", + " {", + )), + (n += e(t)), + r && (n += "}"), + t[2] && (n += "}"), + t[4] && (n += "}"), + n + ); + }).join(""); + }), + (t.i = function (e, n, r, i, o) { + "string" == typeof e && (e = [[null, e, undefined]]); + var a = {}; + if (r) + for (var s = 0; s < this.length; s++) { + var u = this[s][0]; + null != u && (a[u] = !0); + } + for (var c = 0; c < e.length; c++) { + var l = [].concat(e[c]); + (r && a[l[0]]) || + (void 0 !== o && + ("undefined" == typeof l[5] || + (l[1] = "@layer" + .concat( + l[5].length > 0 ? " ".concat(l[5]) : "", + " {", + ) + .concat(l[1], "}")), + (l[5] = o)), + n && + (l[2] + ? ((l[1] = "@media " + .concat(l[2], " {") + .concat(l[1], "}")), + (l[2] = n)) + : (l[2] = n)), + i && + (l[4] + ? ((l[1] = "@supports (" + .concat(l[4], ") {") + .concat(l[1], "}")), + (l[4] = i)) + : (l[4] = "".concat(i))), + t.push(l)); + } + }), + t + ); + }; + }, + 5346: function (e) { + "use strict"; + e.exports = function (e) { + return e[1]; + }; + }, + 1463: function (e, t, n) { + "use strict"; + var r = n(477)(n(9367)); + e.exports = (function (e) { + var t = {}; + function n(r) { + if (t[r]) return t[r].exports; + var i = (t[r] = { i: r, l: !1, exports: {} }); + return ( + e[r].call(i.exports, i, i.exports, n), + (i.l = !0), + i.exports + ); + } + return ( + (n.m = e), + (n.c = t), + (n.d = function (e, t, r) { + n.o(e, t) || + Object.defineProperty(e, t, { enumerable: !0, get: r }); + }), + (n.r = function (e) { + ("undefined" != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(e, Symbol.toStringTag, { + value: "Module", + }), + Object.defineProperty(e, "__esModule", { value: !0 })); + }), + (n.t = function (e, t) { + if ((1 & t && (e = n(e)), 8 & t)) return e; + if ( + 4 & t && + "object" === (0, r["default"])(e) && + e && + e.__esModule + ) + return e; + var i = Object.create(null); + if ( + (n.r(i), + Object.defineProperty(i, "default", { + enumerable: !0, + value: e, + }), + 2 & t && "string" != typeof e) + ) + for (var o in e) + n.d( + i, + o, + function (t) { + return e[t]; + }.bind(null, o), + ); + return i; + }), + (n.n = function (e) { + var t = + e && e.__esModule + ? function () { + return e["default"]; + } + : function () { + return e; + }; + return (n.d(t, "a", t), t); + }), + (n.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }), + (n.p = "/dist/"), + n((n.s = 96)) + ); + })({ + 0: function (e, t, n) { + function r(e, t, n, r, i, o, a, s) { + var u, + c = "function" == typeof e ? e.options : e; + if ( + (t && + ((c.render = t), + (c.staticRenderFns = n), + (c._compiled = !0)), + r && (c.functional = !0), + o && (c._scopeId = "data-v-" + o), + a + ? ((u = function (e) { + ((e = + e || + (this.$vnode && this.$vnode.ssrContext) || + (this.parent && + this.parent.$vnode && + this.parent.$vnode.ssrContext)) || + "undefined" == typeof __VUE_SSR_CONTEXT__ || + (e = __VUE_SSR_CONTEXT__), + i && i.call(this, e), + e && + e._registeredComponents && + e._registeredComponents.add(a)); + }), + (c._ssrRegister = u)) + : i && + (u = s + ? function () { + i.call(this, this.$root.$options.shadowRoot); + } + : i), + u) + ) + if (c.functional) { + c._injectStyles = u; + var l = c.render; + c.render = function (e, t) { + return (u.call(t), l(e, t)); + }; + } else { + var d = c.beforeCreate; + c.beforeCreate = d ? [].concat(d, u) : [u]; + } + return { exports: e, options: c }; + } + n.d(t, "a", function () { + return r; + }); + }, + 96: function (e, t, n) { + n.r(t); + var r = function () { + var e = this, + t = e.$createElement, + n = e._self._c || t; + return n( + "button", + { + staticClass: "el-button", + class: [ + e.type ? "el-button--" + e.type : "", + e.buttonSize ? "el-button--" + e.buttonSize : "", + { + "is-disabled": e.buttonDisabled, + "is-loading": e.loading, + "is-plain": e.plain, + "is-round": e.round, + "is-circle": e.circle, + }, + ], + attrs: { + disabled: e.buttonDisabled || e.loading, + autofocus: e.autofocus, + type: e.nativeType, + }, + on: { click: e.handleClick }, + }, + [ + e.loading + ? n("i", { staticClass: "el-icon-loading" }) + : e._e(), + e.icon && !e.loading ? n("i", { class: e.icon }) : e._e(), + e.$slots["default"] + ? n("span", [e._t("default")], 2) + : e._e(), + ], + ); + }; + r._withStripped = !0; + var i = { + name: "ElButton", + inject: { + elForm: { default: "" }, + elFormItem: { default: "" }, + }, + props: { + type: { type: String, default: "default" }, + size: String, + icon: { type: String, default: "" }, + nativeType: { type: String, default: "button" }, + loading: Boolean, + disabled: Boolean, + plain: Boolean, + autofocus: Boolean, + round: Boolean, + circle: Boolean, + }, + computed: { + _elFormItemSize: function () { + return (this.elFormItem || {}).elFormItemSize; + }, + buttonSize: function () { + return ( + this.size || + this._elFormItemSize || + (this.$ELEMENT || {}).size + ); + }, + buttonDisabled: function () { + return this.$options.propsData.hasOwnProperty( + "disabled", + ) + ? this.disabled + : (this.elForm || {}).disabled; + }, + }, + methods: { + handleClick: function (e) { + this.$emit("click", e); + }, + }, + }, + o = n(0), + a = Object(o.a)(i, r, [], !1, null, null, null); + a.options.__file = "packages/button/src/button.vue"; + var s = a.exports; + ((s.install = function (e) { + e.component(s.name, s); + }), + (t["default"] = s)); + }, + }); + }, + 5735: function (e, t, n) { + "use strict"; + var r = n(477)(n(9367)); + e.exports = (function (e) { + var t = {}; + function n(r) { + if (t[r]) return t[r].exports; + var i = (t[r] = { i: r, l: !1, exports: {} }); + return ( + e[r].call(i.exports, i, i.exports, n), + (i.l = !0), + i.exports + ); + } + return ( + (n.m = e), + (n.c = t), + (n.d = function (e, t, r) { + n.o(e, t) || + Object.defineProperty(e, t, { enumerable: !0, get: r }); + }), + (n.r = function (e) { + ("undefined" != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(e, Symbol.toStringTag, { + value: "Module", + }), + Object.defineProperty(e, "__esModule", { value: !0 })); + }), + (n.t = function (e, t) { + if ((1 & t && (e = n(e)), 8 & t)) return e; + if ( + 4 & t && + "object" === (0, r["default"])(e) && + e && + e.__esModule + ) + return e; + var i = Object.create(null); + if ( + (n.r(i), + Object.defineProperty(i, "default", { + enumerable: !0, + value: e, + }), + 2 & t && "string" != typeof e) + ) + for (var o in e) + n.d( + i, + o, + function (t) { + return e[t]; + }.bind(null, o), + ); + return i; + }), + (n.n = function (e) { + var t = + e && e.__esModule + ? function () { + return e["default"]; + } + : function () { + return e; + }; + return (n.d(t, "a", t), t); + }), + (n.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }), + (n.p = "/dist/"), + n((n.s = 75)) + ); + })({ + 0: function (e, t, n) { + function r(e, t, n, r, i, o, a, s) { + var u, + c = "function" == typeof e ? e.options : e; + if ( + (t && + ((c.render = t), + (c.staticRenderFns = n), + (c._compiled = !0)), + r && (c.functional = !0), + o && (c._scopeId = "data-v-" + o), + a + ? ((u = function (e) { + ((e = + e || + (this.$vnode && this.$vnode.ssrContext) || + (this.parent && + this.parent.$vnode && + this.parent.$vnode.ssrContext)) || + "undefined" == typeof __VUE_SSR_CONTEXT__ || + (e = __VUE_SSR_CONTEXT__), + i && i.call(this, e), + e && + e._registeredComponents && + e._registeredComponents.add(a)); + }), + (c._ssrRegister = u)) + : i && + (u = s + ? function () { + i.call(this, this.$root.$options.shadowRoot); + } + : i), + u) + ) + if (c.functional) { + c._injectStyles = u; + var l = c.render; + c.render = function (e, t) { + return (u.call(t), l(e, t)); + }; + } else { + var d = c.beforeCreate; + c.beforeCreate = d ? [].concat(d, u) : [u]; + } + return { exports: e, options: c }; + } + n.d(t, "a", function () { + return r; + }); + }, + 11: function (e, t) { + e.exports = n(2036); + }, + 21: function (e, t) { + e.exports = n(4524); + }, + 4: function (e, t) { + e.exports = n(5956); + }, + 75: function (e, t, n) { + n.r(t); + var r = function () { + var e = this, + t = e.$createElement, + n = e._self._c || t; + return n( + "div", + { + class: [ + "textarea" === e.type ? "el-textarea" : "el-input", + e.inputSize ? "el-input--" + e.inputSize : "", + { + "is-disabled": e.inputDisabled, + "is-exceed": e.inputExceed, + "el-input-group": e.$slots.prepend || e.$slots.append, + "el-input-group--append": e.$slots.append, + "el-input-group--prepend": e.$slots.prepend, + "el-input--prefix": e.$slots.prefix || e.prefixIcon, + "el-input--suffix": + e.$slots.suffix || + e.suffixIcon || + e.clearable || + e.showPassword, + }, + ], + on: { + mouseenter: function (t) { + e.hovering = !0; + }, + mouseleave: function (t) { + e.hovering = !1; + }, + }, + }, + [ + "textarea" !== e.type + ? [ + e.$slots.prepend + ? n( + "div", + { staticClass: "el-input-group__prepend" }, + [e._t("prepend")], + 2, + ) + : e._e(), + "textarea" !== e.type + ? n( + "input", + e._b( + { + ref: "input", + staticClass: "el-input__inner", + attrs: { + tabindex: e.tabindex, + type: e.showPassword + ? e.passwordVisible + ? "text" + : "password" + : e.type, + disabled: e.inputDisabled, + readonly: e.readonly, + autocomplete: + e.autoComplete || e.autocomplete, + "aria-label": e.label, + }, + on: { + compositionstart: + e.handleCompositionStart, + compositionupdate: + e.handleCompositionUpdate, + compositionend: e.handleCompositionEnd, + input: e.handleInput, + focus: e.handleFocus, + blur: e.handleBlur, + change: e.handleChange, + }, + }, + "input", + e.$attrs, + !1, + ), + ) + : e._e(), + e.$slots.prefix || e.prefixIcon + ? n( + "span", + { staticClass: "el-input__prefix" }, + [ + e._t("prefix"), + e.prefixIcon + ? n("i", { + staticClass: "el-input__icon", + class: e.prefixIcon, + }) + : e._e(), + ], + 2, + ) + : e._e(), + e.getSuffixVisible() + ? n("span", { staticClass: "el-input__suffix" }, [ + n( + "span", + { staticClass: "el-input__suffix-inner" }, + [ + e.showClear && + e.showPwdVisible && + e.isWordLimitVisible + ? e._e() + : [ + e._t("suffix"), + e.suffixIcon + ? n("i", { + staticClass: "el-input__icon", + class: e.suffixIcon, + }) + : e._e(), + ], + e.showClear + ? n("i", { + staticClass: + "el-input__icon el-icon-circle-close el-input__clear", + on: { + mousedown: function (e) { + e.preventDefault(); + }, + click: e.clear, + }, + }) + : e._e(), + e.showPwdVisible + ? n("i", { + staticClass: + "el-input__icon el-icon-view el-input__clear", + on: { + click: e.handlePasswordVisible, + }, + }) + : e._e(), + e.isWordLimitVisible + ? n( + "span", + { staticClass: "el-input__count" }, + [ + n( + "span", + { + staticClass: + "el-input__count-inner", + }, + [ + e._v( + "\n " + + e._s(e.textLength) + + "/" + + e._s(e.upperLimit) + + "\n ", + ), + ], + ), + ], + ) + : e._e(), + ], + 2, + ), + e.validateState + ? n("i", { + staticClass: "el-input__icon", + class: [ + "el-input__validateIcon", + e.validateIcon, + ], + }) + : e._e(), + ]) + : e._e(), + e.$slots.append + ? n( + "div", + { staticClass: "el-input-group__append" }, + [e._t("append")], + 2, + ) + : e._e(), + ] + : n( + "textarea", + e._b( + { + ref: "textarea", + staticClass: "el-textarea__inner", + style: e.textareaStyle, + attrs: { + tabindex: e.tabindex, + disabled: e.inputDisabled, + readonly: e.readonly, + autocomplete: + e.autoComplete || e.autocomplete, + "aria-label": e.label, + }, + on: { + compositionstart: e.handleCompositionStart, + compositionupdate: e.handleCompositionUpdate, + compositionend: e.handleCompositionEnd, + input: e.handleInput, + focus: e.handleFocus, + blur: e.handleBlur, + change: e.handleChange, + }, + }, + "textarea", + e.$attrs, + !1, + ), + ), + e.isWordLimitVisible && "textarea" === e.type + ? n("span", { staticClass: "el-input__count" }, [ + e._v(e._s(e.textLength) + "/" + e._s(e.upperLimit)), + ]) + : e._e(), + ], + 2, + ); + }; + r._withStripped = !0; + var i = n(4), + o = n.n(i), + a = n(11), + s = n.n(a), + u = void 0, + c = [ + "letter-spacing", + "line-height", + "padding-top", + "padding-bottom", + "font-family", + "font-weight", + "font-size", + "text-rendering", + "text-transform", + "width", + "text-indent", + "padding-left", + "padding-right", + "border-width", + "box-sizing", + ]; + function l(e) { + var t = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : 1, + n = + arguments.length > 2 && arguments[2] !== undefined + ? arguments[2] + : null; + u || + ((u = document.createElement("textarea")), + document.body.appendChild(u)); + var r = (function (e) { + var t = window.getComputedStyle(e), + n = t.getPropertyValue("box-sizing"), + r = + parseFloat(t.getPropertyValue("padding-bottom")) + + parseFloat(t.getPropertyValue("padding-top")), + i = + parseFloat( + t.getPropertyValue("border-bottom-width"), + ) + + parseFloat(t.getPropertyValue("border-top-width")); + return { + contextStyle: c + .map(function (e) { + return e + ":" + t.getPropertyValue(e); + }) + .join(";"), + paddingSize: r, + borderSize: i, + boxSizing: n, + }; + })(e), + i = r.paddingSize, + o = r.borderSize, + a = r.boxSizing, + s = r.contextStyle; + (u.setAttribute( + "style", + s + + ";\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important\n", + ), + (u.value = e.value || e.placeholder || "")); + var l = u.scrollHeight, + d = {}; + ("border-box" === a + ? (l += o) + : "content-box" === a && (l -= i), + (u.value = "")); + var f = u.scrollHeight - i; + if (null !== t) { + var p = f * t; + ("border-box" === a && (p = p + i + o), + (l = Math.max(p, l)), + (d.minHeight = p + "px")); + } + if (null !== n) { + var h = f * n; + ("border-box" === a && (h = h + i + o), + (l = Math.min(h, l))); + } + return ( + (d.height = l + "px"), + u.parentNode && u.parentNode.removeChild(u), + (u = null), + d + ); + } + var d = n(9), + f = n.n(d), + p = n(21), + h = { + name: "ElInput", + componentName: "ElInput", + mixins: [o.a, s.a], + inheritAttrs: !1, + inject: { + elForm: { default: "" }, + elFormItem: { default: "" }, + }, + data: function () { + return { + textareaCalcStyle: {}, + hovering: !1, + focused: !1, + isComposing: !1, + passwordVisible: !1, + }; + }, + props: { + value: [String, Number], + size: String, + resize: String, + form: String, + disabled: Boolean, + readonly: Boolean, + type: { type: String, default: "text" }, + autosize: { type: [Boolean, Object], default: !1 }, + autocomplete: { type: String, default: "off" }, + autoComplete: { + type: String, + validator: function (e) { + return !0; + }, + }, + validateEvent: { type: Boolean, default: !0 }, + suffixIcon: String, + prefixIcon: String, + label: String, + clearable: { type: Boolean, default: !1 }, + showPassword: { type: Boolean, default: !1 }, + showWordLimit: { type: Boolean, default: !1 }, + tabindex: String, + }, + computed: { + _elFormItemSize: function () { + return (this.elFormItem || {}).elFormItemSize; + }, + validateState: function () { + return this.elFormItem + ? this.elFormItem.validateState + : ""; + }, + needStatusIcon: function () { + return !!this.elForm && this.elForm.statusIcon; + }, + validateIcon: function () { + return { + validating: "el-icon-loading", + success: "el-icon-circle-check", + error: "el-icon-circle-close", + }[this.validateState]; + }, + textareaStyle: function () { + return f()({}, this.textareaCalcStyle, { + resize: this.resize, + }); + }, + inputSize: function () { + return ( + this.size || + this._elFormItemSize || + (this.$ELEMENT || {}).size + ); + }, + inputDisabled: function () { + return this.disabled || (this.elForm || {}).disabled; + }, + nativeInputValue: function () { + return null === this.value || this.value === undefined + ? "" + : String(this.value); + }, + showClear: function () { + return ( + this.clearable && + !this.inputDisabled && + !this.readonly && + this.nativeInputValue && + (this.focused || this.hovering) + ); + }, + showPwdVisible: function () { + return ( + this.showPassword && + !this.inputDisabled && + !this.readonly && + (!!this.nativeInputValue || this.focused) + ); + }, + isWordLimitVisible: function () { + return ( + this.showWordLimit && + this.$attrs.maxlength && + ("text" === this.type || "textarea" === this.type) && + !this.inputDisabled && + !this.readonly && + !this.showPassword + ); + }, + upperLimit: function () { + return this.$attrs.maxlength; + }, + textLength: function () { + return "number" == typeof this.value + ? String(this.value).length + : (this.value || "").length; + }, + inputExceed: function () { + return ( + this.isWordLimitVisible && + this.textLength > this.upperLimit + ); + }, + }, + watch: { + value: function (e) { + (this.$nextTick(this.resizeTextarea), + this.validateEvent && + this.dispatch("ElFormItem", "el.form.change", [e])); + }, + nativeInputValue: function () { + this.setNativeInputValue(); + }, + type: function () { + var e = this; + this.$nextTick(function () { + (e.setNativeInputValue(), + e.resizeTextarea(), + e.updateIconOffset()); + }); + }, + }, + methods: { + focus: function () { + this.getInput().focus(); + }, + blur: function () { + this.getInput().blur(); + }, + getMigratingConfig: function () { + return { + props: { + icon: "icon is removed, use suffix-icon / prefix-icon instead.", + "on-icon-click": "on-icon-click is removed.", + }, + events: { click: "click is removed." }, + }; + }, + handleBlur: function (e) { + ((this.focused = !1), + this.$emit("blur", e), + this.validateEvent && + this.dispatch("ElFormItem", "el.form.blur", [ + this.value, + ])); + }, + select: function () { + this.getInput().select(); + }, + resizeTextarea: function () { + if (!this.$isServer) { + var e = this.autosize; + if ("textarea" === this.type) + if (e) { + var t = e.minRows, + n = e.maxRows; + this.textareaCalcStyle = l( + this.$refs.textarea, + t, + n, + ); + } else + this.textareaCalcStyle = { + minHeight: l(this.$refs.textarea).minHeight, + }; + } + }, + setNativeInputValue: function () { + var e = this.getInput(); + e && + e.value !== this.nativeInputValue && + (e.value = this.nativeInputValue); + }, + handleFocus: function (e) { + ((this.focused = !0), this.$emit("focus", e)); + }, + handleCompositionStart: function (e) { + (this.$emit("compositionstart", e), + (this.isComposing = !0)); + }, + handleCompositionUpdate: function (e) { + this.$emit("compositionupdate", e); + var t = e.target.value, + n = t[t.length - 1] || ""; + this.isComposing = !Object(p.isKorean)(n); + }, + handleCompositionEnd: function (e) { + (this.$emit("compositionend", e), + this.isComposing && + ((this.isComposing = !1), this.handleInput(e))); + }, + handleInput: function (e) { + this.isComposing || + (e.target.value !== this.nativeInputValue && + (this.$emit("input", e.target.value), + this.$nextTick(this.setNativeInputValue))); + }, + handleChange: function (e) { + this.$emit("change", e.target.value); + }, + calcIconOffset: function (e) { + var t = [].slice.call( + this.$el.querySelectorAll(".el-input__" + e) || [], + ); + if (t.length) { + for (var n = null, r = 0; r < t.length; r++) + if (t[r].parentNode === this.$el) { + n = t[r]; + break; + } + if (n) { + var i = { suffix: "append", prefix: "prepend" }[e]; + this.$slots[i] + ? (n.style.transform = + "translateX(" + + ("suffix" === e ? "-" : "") + + this.$el.querySelector( + ".el-input-group__" + i, + ).offsetWidth + + "px)") + : n.removeAttribute("style"); + } + } + }, + updateIconOffset: function () { + (this.calcIconOffset("prefix"), + this.calcIconOffset("suffix")); + }, + clear: function () { + (this.$emit("input", ""), + this.$emit("change", ""), + this.$emit("clear")); + }, + handlePasswordVisible: function () { + var e = this; + ((this.passwordVisible = !this.passwordVisible), + this.$nextTick(function () { + e.focus(); + })); + }, + getInput: function () { + return this.$refs.input || this.$refs.textarea; + }, + getSuffixVisible: function () { + return ( + this.$slots.suffix || + this.suffixIcon || + this.showClear || + this.showPassword || + this.isWordLimitVisible || + (this.validateState && this.needStatusIcon) + ); + }, + }, + created: function () { + this.$on("inputSelect", this.select); + }, + mounted: function () { + (this.setNativeInputValue(), + this.resizeTextarea(), + this.updateIconOffset()); + }, + updated: function () { + this.$nextTick(this.updateIconOffset); + }, + }, + m = h, + g = n(0), + v = Object(g.a)(m, r, [], !1, null, null, null); + v.options.__file = "packages/input/src/input.vue"; + var _ = v.exports; + ((_.install = function (e) { + e.component(_.name, _); + }), + (t["default"] = _)); + }, + 9: function (e, t) { + e.exports = n(8589); + }, + }); + }, + 4511: function (e, t, n) { + "use strict"; + var r = n(477)(n(9367)); + e.exports = (function (e) { + var t = {}; + function n(r) { + if (t[r]) return t[r].exports; + var i = (t[r] = { i: r, l: !1, exports: {} }); + return ( + e[r].call(i.exports, i, i.exports, n), + (i.l = !0), + i.exports + ); + } + return ( + (n.m = e), + (n.c = t), + (n.d = function (e, t, r) { + n.o(e, t) || + Object.defineProperty(e, t, { enumerable: !0, get: r }); + }), + (n.r = function (e) { + ("undefined" != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(e, Symbol.toStringTag, { + value: "Module", + }), + Object.defineProperty(e, "__esModule", { value: !0 })); + }), + (n.t = function (e, t) { + if ((1 & t && (e = n(e)), 8 & t)) return e; + if ( + 4 & t && + "object" === (0, r["default"])(e) && + e && + e.__esModule + ) + return e; + var i = Object.create(null); + if ( + (n.r(i), + Object.defineProperty(i, "default", { + enumerable: !0, + value: e, + }), + 2 & t && "string" != typeof e) + ) + for (var o in e) + n.d( + i, + o, + function (t) { + return e[t]; + }.bind(null, o), + ); + return i; + }), + (n.n = function (e) { + var t = + e && e.__esModule + ? function () { + return e["default"]; + } + : function () { + return e; + }; + return (n.d(t, "a", t), t); + }), + (n.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }), + (n.p = "/dist/"), + n((n.s = 73)) + ); + })({ + 0: function (e, t, n) { + function r(e, t, n, r, i, o, a, s) { + var u, + c = "function" == typeof e ? e.options : e; + if ( + (t && + ((c.render = t), + (c.staticRenderFns = n), + (c._compiled = !0)), + r && (c.functional = !0), + o && (c._scopeId = "data-v-" + o), + a + ? ((u = function (e) { + ((e = + e || + (this.$vnode && this.$vnode.ssrContext) || + (this.parent && + this.parent.$vnode && + this.parent.$vnode.ssrContext)) || + "undefined" == typeof __VUE_SSR_CONTEXT__ || + (e = __VUE_SSR_CONTEXT__), + i && i.call(this, e), + e && + e._registeredComponents && + e._registeredComponents.add(a)); + }), + (c._ssrRegister = u)) + : i && + (u = s + ? function () { + i.call(this, this.$root.$options.shadowRoot); + } + : i), + u) + ) + if (c.functional) { + c._injectStyles = u; + var l = c.render; + c.render = function (e, t) { + return (u.call(t), l(e, t)); + }; + } else { + var d = c.beforeCreate; + c.beforeCreate = d ? [].concat(d, u) : [u]; + } + return { exports: e, options: c }; + } + n.d(t, "a", function () { + return r; + }); + }, + 13: function (e, t) { + e.exports = n(9668); + }, + 2: function (e, t) { + e.exports = n(2865); + }, + 42: function (e, t) { + e.exports = n(3725); + }, + 7: function (e, t) { + e.exports = n(4478); + }, + 73: function (e, t, n) { + n.r(t); + var r = n(7), + i = n.n(r), + o = function () { + var e = this, + t = e.$createElement, + n = e._self._c || t; + return n( + "transition", + { + attrs: { name: "el-loading-fade" }, + on: { "after-leave": e.handleAfterLeave }, + }, + [ + n( + "div", + { + directives: [ + { + name: "show", + rawName: "v-show", + value: e.visible, + expression: "visible", + }, + ], + staticClass: "el-loading-mask", + class: [ + e.customClass, + { "is-fullscreen": e.fullscreen }, + ], + style: { backgroundColor: e.background || "" }, + }, + [ + n("div", { staticClass: "el-loading-spinner" }, [ + e.spinner + ? n("i", { class: e.spinner }) + : n( + "svg", + { + staticClass: "circular", + attrs: { viewBox: "25 25 50 50" }, + }, + [ + n("circle", { + staticClass: "path", + attrs: { + cx: "50", + cy: "50", + r: "20", + fill: "none", + }, + }), + ], + ), + e.text + ? n("p", { staticClass: "el-loading-text" }, [ + e._v(e._s(e.text)), + ]) + : e._e(), + ]), + ], + ), + ], + ); + }; + o._withStripped = !0; + var a = { + data: function () { + return { + text: null, + spinner: null, + background: null, + fullscreen: !0, + visible: !1, + customClass: "", + }; + }, + methods: { + handleAfterLeave: function () { + this.$emit("after-leave"); + }, + setText: function (e) { + this.text = e; + }, + }, + }, + s = n(0), + u = Object(s.a)(a, o, [], !1, null, null, null); + u.options.__file = "packages/loading/src/loading.vue"; + var c = u.exports, + l = n(2), + d = n(13), + f = n(42), + p = n.n(f), + h = i.a.extend(c), + m = { + install: function (e) { + if (!e.prototype.$isServer) { + var t = function (t, r) { + r.value + ? e.nextTick(function () { + r.modifiers.fullscreen + ? ((t.originalPosition = Object(l.getStyle)( + document.body, + "position", + )), + (t.originalOverflow = Object(l.getStyle)( + document.body, + "overflow", + )), + (t.maskStyle.zIndex = + d.PopupManager.nextZIndex()), + Object(l.addClass)( + t.mask, + "is-fullscreen", + ), + n(document.body, t, r)) + : (Object(l.removeClass)( + t.mask, + "is-fullscreen", + ), + r.modifiers.body + ? ((t.originalPosition = Object( + l.getStyle, + )(document.body, "position")), + ["top", "left"].forEach(function (e) { + var n = + "top" === e + ? "scrollTop" + : "scrollLeft"; + t.maskStyle[e] = + t.getBoundingClientRect()[e] + + document.body[n] + + document.documentElement[n] - + parseInt( + Object(l.getStyle)( + document.body, + "margin-" + e, + ), + 10, + ) + + "px"; + }), + ["height", "width"].forEach( + function (e) { + t.maskStyle[e] = + t.getBoundingClientRect()[e] + + "px"; + }, + ), + n(document.body, t, r)) + : ((t.originalPosition = Object( + l.getStyle, + )(t, "position")), + n(t, t, r))); + }) + : (p()( + t.instance, + function (e) { + if (t.instance.hiding) { + t.domVisible = !1; + var n = + r.modifiers.fullscreen || + r.modifiers.body + ? document.body + : t; + (Object(l.removeClass)( + n, + "el-loading-parent--relative", + ), + Object(l.removeClass)( + n, + "el-loading-parent--hidden", + ), + (t.instance.hiding = !1)); + } + }, + 300, + !0, + ), + (t.instance.visible = !1), + (t.instance.hiding = !0)); + }, + n = function (t, n, r) { + n.domVisible || + "none" === Object(l.getStyle)(n, "display") || + "hidden" === Object(l.getStyle)(n, "visibility") + ? n.domVisible && + !0 === n.instance.hiding && + ((n.instance.visible = !0), + (n.instance.hiding = !1)) + : (Object.keys(n.maskStyle).forEach(function (e) { + n.mask.style[e] = n.maskStyle[e]; + }), + "absolute" !== n.originalPosition && + "fixed" !== n.originalPosition && + "sticky" !== n.originalPosition && + Object(l.addClass)( + t, + "el-loading-parent--relative", + ), + r.modifiers.fullscreen && + r.modifiers.lock && + Object(l.addClass)( + t, + "el-loading-parent--hidden", + ), + (n.domVisible = !0), + t.appendChild(n.mask), + e.nextTick(function () { + n.instance.hiding + ? n.instance.$emit("after-leave") + : (n.instance.visible = !0); + }), + (n.domInserted = !0)); + }; + e.directive("loading", { + bind: function (e, n, r) { + var i = e.getAttribute("element-loading-text"), + o = e.getAttribute("element-loading-spinner"), + a = e.getAttribute("element-loading-background"), + s = e.getAttribute( + "element-loading-custom-class", + ), + u = r.context, + c = new h({ + el: document.createElement("div"), + data: { + text: (u && u[i]) || i, + spinner: (u && u[o]) || o, + background: (u && u[a]) || a, + customClass: (u && u[s]) || s, + fullscreen: !!n.modifiers.fullscreen, + }, + }); + ((e.instance = c), + (e.mask = c.$el), + (e.maskStyle = {}), + n.value && t(e, n)); + }, + update: function (e, n) { + (e.instance.setText( + e.getAttribute("element-loading-text"), + ), + n.oldValue !== n.value && t(e, n)); + }, + unbind: function (e, n) { + (e.domInserted && + (e.mask && + e.mask.parentNode && + e.mask.parentNode.removeChild(e.mask), + t(e, { value: !1, modifiers: n.modifiers })), + e.instance && e.instance.$destroy()); + }, + }); + } + }, + }, + g = m, + v = n(9), + _ = n.n(v), + y = i.a.extend(c), + b = { + text: null, + fullscreen: !0, + body: !1, + lock: !1, + customClass: "", + }, + k = void 0; + ((y.prototype.originalPosition = ""), + (y.prototype.originalOverflow = ""), + (y.prototype.close = function () { + var e = this; + (this.fullscreen && (k = undefined), + p()( + this, + function (t) { + var n = + e.fullscreen || e.body ? document.body : e.target; + (Object(l.removeClass)( + n, + "el-loading-parent--relative", + ), + Object(l.removeClass)( + n, + "el-loading-parent--hidden", + ), + e.$el && + e.$el.parentNode && + e.$el.parentNode.removeChild(e.$el), + e.$destroy()); + }, + 300, + ), + (this.visible = !1)); + })); + var w = function () { + var e = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : {}; + if (!i.a.prototype.$isServer) { + if ( + ("string" == typeof (e = _()({}, b, e)).target && + (e.target = document.querySelector(e.target)), + (e.target = e.target || document.body), + e.target !== document.body + ? (e.fullscreen = !1) + : (e.body = !0), + e.fullscreen && k) + ) + return k; + var t = e.body ? document.body : e.target, + n = new y({ el: document.createElement("div"), data: e }); + return ( + (function (e, t, n) { + var r = {}; + (e.fullscreen + ? ((n.originalPosition = Object(l.getStyle)( + document.body, + "position", + )), + (n.originalOverflow = Object(l.getStyle)( + document.body, + "overflow", + )), + (r.zIndex = d.PopupManager.nextZIndex())) + : e.body + ? ((n.originalPosition = Object(l.getStyle)( + document.body, + "position", + )), + ["top", "left"].forEach(function (t) { + var n = + "top" === t ? "scrollTop" : "scrollLeft"; + r[t] = + e.target.getBoundingClientRect()[t] + + document.body[n] + + document.documentElement[n] + + "px"; + }), + ["height", "width"].forEach(function (t) { + r[t] = + e.target.getBoundingClientRect()[t] + "px"; + })) + : (n.originalPosition = Object(l.getStyle)( + t, + "position", + )), + Object.keys(r).forEach(function (e) { + n.$el.style[e] = r[e]; + })); + })(e, t, n), + "absolute" !== n.originalPosition && + "fixed" !== n.originalPosition && + "sticky" !== n.originalPosition && + Object(l.addClass)(t, "el-loading-parent--relative"), + e.fullscreen && + e.lock && + Object(l.addClass)(t, "el-loading-parent--hidden"), + t.appendChild(n.$el), + i.a.nextTick(function () { + n.visible = !0; + }), + e.fullscreen && (k = n), + n + ); + } + }; + t["default"] = { + install: function (e) { + (e.use(g), (e.prototype.$loading = w)); + }, + directive: g, + service: w, + }; + }, + 9: function (e, t) { + e.exports = n(8589); + }, + }); + }, + 5956: function (e, t) { + "use strict"; + function n(e, t, r) { + this.$children.forEach(function (i) { + i.$options.componentName === e + ? i.$emit.apply(i, [t].concat(r)) + : n.apply(i, [e, t].concat([r])); + }); + } + ((t.__esModule = !0), + (t["default"] = { + methods: { + dispatch: function (e, t, n) { + for ( + var r = this.$parent || this.$root, + i = r.$options.componentName; + r && (!i || i !== e); + ) + (r = r.$parent) && (i = r.$options.componentName); + r && r.$emit.apply(r, [t].concat(n)); + }, + broadcast: function (e, t, r) { + n.call(this, e, t, r); + }, + }, + })); + }, + 2036: function (e, t, n) { + "use strict"; + ((t.__esModule = !0), + n(2417), + (t["default"] = { + mounted: function () {}, + methods: { + getMigratingConfig: function () { + return { props: {}, events: {} }; + }, + }, + })); + }, + 3725: function (e, t) { + "use strict"; + ((t.__esModule = !0), + (t["default"] = function (e, t) { + var n = + arguments.length > 2 && arguments[2] !== undefined + ? arguments[2] + : 300, + r = + arguments.length > 3 && + arguments[3] !== undefined && + arguments[3]; + if (!e || !t) + throw new Error("instance & callback is required"); + var i = !1, + o = function () { + i || ((i = !0), t && t.apply(null, arguments)); + }; + (r ? e.$once("after-leave", o) : e.$on("after-leave", o), + setTimeout(function () { + o(); + }, n + 100)); + })); + }, + 2865: function (e, t, n) { + "use strict"; + var r = n(477)(n(9367)); + ((t.__esModule = !0), + (t.isInContainer = + t.getScrollContainer = + t.isScroll = + t.getStyle = + t.once = + t.off = + t.on = + undefined)); + var i = + "function" == typeof Symbol && + "symbol" === (0, r["default"])(Symbol.iterator) + ? function (e) { + return (0, r["default"])(e); + } + : function (e) { + return e && + "function" == typeof Symbol && + e.constructor === Symbol && + e !== Symbol.prototype + ? "symbol" + : (0, r["default"])(e); + }; + ((t.hasClass = m), + (t.addClass = function (e, t) { + if (e) { + for ( + var n = e.className, + r = (t || "").split(" "), + i = 0, + o = r.length; + i < o; + i++ + ) { + var a = r[i]; + a && + (e.classList + ? e.classList.add(a) + : m(e, a) || (n += " " + a)); + } + e.classList || e.setAttribute("class", n); + } + }), + (t.removeClass = function (e, t) { + if (e && t) { + for ( + var n = t.split(" "), + r = " " + e.className + " ", + i = 0, + o = n.length; + i < o; + i++ + ) { + var a = n[i]; + a && + (e.classList + ? e.classList.remove(a) + : m(e, a) && (r = r.replace(" " + a + " ", " "))); + } + e.classList || e.setAttribute("class", d(r)); + } + }), + (t.setStyle = function _(e, t, n) { + if (e && t) + if ("object" === (void 0 === t ? "undefined" : i(t))) + for (var r in t) t.hasOwnProperty(r) && _(e, r, t[r]); + else + "opacity" === (t = f(t)) && l < 9 + ? (e.style.filter = isNaN(n) + ? "" + : "alpha(opacity=" + 100 * n + ")") + : (e.style[t] = n); + })); + var o, + a = n(4478), + s = ((o = a) && o.__esModule ? o : { default: o })["default"] + .prototype.$isServer, + u = /([\:\-\_]+(.))/g, + c = /^moz([A-Z])/, + l = s ? 0 : Number(document.documentMode), + d = function (e) { + return (e || "").replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, ""); + }, + f = function (e) { + return e + .replace(u, function (e, t, n, r) { + return r ? n.toUpperCase() : n; + }) + .replace(c, "Moz$1"); + }, + p = (t.on = + !s && document.addEventListener + ? function (e, t, n) { + e && t && n && e.addEventListener(t, n, !1); + } + : function (e, t, n) { + e && t && n && e.attachEvent("on" + t, n); + }), + h = (t.off = + !s && document.removeEventListener + ? function (e, t, n) { + e && t && e.removeEventListener(t, n, !1); + } + : function (e, t, n) { + e && t && e.detachEvent("on" + t, n); + }); + function m(e, t) { + if (!e || !t) return !1; + if (-1 !== t.indexOf(" ")) + throw new Error("className should not contain space."); + return e.classList + ? e.classList.contains(t) + : (" " + e.className + " ").indexOf(" " + t + " ") > -1; + } + t.once = function (e, t, n) { + p(e, t, function r() { + (n && n.apply(this, arguments), h(e, t, r)); + }); + }; + var g = (t.getStyle = + l < 9 + ? function (e, t) { + if (!s) { + if (!e || !t) return null; + "float" === (t = f(t)) && (t = "styleFloat"); + try { + if ("opacity" === t) + try { + return e.filters.item("alpha").opacity / 100; + } catch (n) { + return 1; + } + return e.style[t] || e.currentStyle + ? e.currentStyle[t] + : null; + } catch (n) { + return e.style[t]; + } + } + } + : function (e, t) { + if (!s) { + if (!e || !t) return null; + "float" === (t = f(t)) && (t = "cssFloat"); + try { + var n = document.defaultView.getComputedStyle(e, ""); + return e.style[t] || n ? n[t] : null; + } catch (r) { + return e.style[t]; + } + } + }), + v = (t.isScroll = function (e, t) { + if (!s) { + var n = null !== t && t !== undefined; + return g( + e, + n ? (t ? "overflow-y" : "overflow-x") : "overflow", + ).match(/(scroll|auto|overlay)/); + } + }); + ((t.getScrollContainer = function (e, t) { + if (!s) { + for (var n = e; n; ) { + if ([window, document, document.documentElement].includes(n)) + return window; + if (v(n, t)) return n; + n = n.parentNode; + } + return n; + } + }), + (t.isInContainer = function (e, t) { + if (s || !e || !t) return !1; + var n = e.getBoundingClientRect(), + r = void 0; + return ( + (r = [ + window, + document, + document.documentElement, + null, + undefined, + ].includes(t) + ? { + top: 0, + right: window.innerWidth, + bottom: window.innerHeight, + left: 0, + } + : t.getBoundingClientRect()), + n.top < r.bottom && + n.bottom > r.top && + n.right > r.left && + n.left < r.right + ); + })); + }, + 8589: function (e, t) { + "use strict"; + ((t.__esModule = !0), + (t["default"] = function (e) { + for (var t = 1, n = arguments.length; t < n; t++) { + var r = arguments[t] || {}; + for (var i in r) + if (r.hasOwnProperty(i)) { + var o = r[i]; + o !== undefined && (e[i] = o); + } + } + return e; + })); + }, + 9668: function (e, t, n) { + "use strict"; + ((t.__esModule = !0), (t.PopupManager = undefined)); + var r = u(n(4478)), + i = u(n(8589)), + o = u(n(8432)), + a = u(n(9686)), + s = n(2865); + function u(e) { + return e && e.__esModule ? e : { default: e }; + } + var c = 1, + l = void 0; + ((t["default"] = { + props: { + visible: { type: Boolean, default: !1 }, + openDelay: {}, + closeDelay: {}, + zIndex: {}, + modal: { type: Boolean, default: !1 }, + modalFade: { type: Boolean, default: !0 }, + modalClass: {}, + modalAppendToBody: { type: Boolean, default: !1 }, + lockScroll: { type: Boolean, default: !0 }, + closeOnPressEscape: { type: Boolean, default: !1 }, + closeOnClickModal: { type: Boolean, default: !1 }, + }, + beforeMount: function () { + ((this._popupId = "popup-" + c++), + o["default"].register(this._popupId, this)); + }, + beforeDestroy: function () { + (o["default"].deregister(this._popupId), + o["default"].closeModal(this._popupId), + this.restoreBodyStyle()); + }, + data: function () { + return { + opened: !1, + bodyPaddingRight: null, + computedBodyPaddingRight: 0, + withoutHiddenClass: !0, + rendered: !1, + }; + }, + watch: { + visible: function (e) { + var t = this; + if (e) { + if (this._opening) return; + this.rendered + ? this.open() + : ((this.rendered = !0), + r["default"].nextTick(function () { + t.open(); + })); + } else this.close(); + }, + }, + methods: { + open: function (e) { + var t = this; + this.rendered || (this.rendered = !0); + var n = (0, i["default"])({}, this.$props || this, e); + (this._closeTimer && + (clearTimeout(this._closeTimer), (this._closeTimer = null)), + clearTimeout(this._openTimer)); + var r = Number(n.openDelay); + r > 0 + ? (this._openTimer = setTimeout(function () { + ((t._openTimer = null), t.doOpen(n)); + }, r)) + : this.doOpen(n); + }, + doOpen: function (e) { + if ( + !this.$isServer && + (!this.willOpen || this.willOpen()) && + !this.opened + ) { + this._opening = !0; + var t = this.$el, + n = e.modal, + r = e.zIndex; + if ( + (r && (o["default"].zIndex = r), + n && + (this._closing && + (o["default"].closeModal(this._popupId), + (this._closing = !1)), + o["default"].openModal( + this._popupId, + o["default"].nextZIndex(), + this.modalAppendToBody ? undefined : t, + e.modalClass, + e.modalFade, + ), + e.lockScroll)) + ) { + ((this.withoutHiddenClass = !(0, s.hasClass)( + document.body, + "el-popup-parent--hidden", + )), + this.withoutHiddenClass && + ((this.bodyPaddingRight = + document.body.style.paddingRight), + (this.computedBodyPaddingRight = parseInt( + (0, s.getStyle)(document.body, "paddingRight"), + 10, + ))), + (l = (0, a["default"])())); + var i = + document.documentElement.clientHeight < + document.body.scrollHeight, + u = (0, s.getStyle)(document.body, "overflowY"); + (l > 0 && + (i || "scroll" === u) && + this.withoutHiddenClass && + (document.body.style.paddingRight = + this.computedBodyPaddingRight + l + "px"), + (0, s.addClass)( + document.body, + "el-popup-parent--hidden", + )); + } + ("static" === getComputedStyle(t).position && + (t.style.position = "absolute"), + (t.style.zIndex = o["default"].nextZIndex()), + (this.opened = !0), + this.onOpen && this.onOpen(), + this.doAfterOpen()); + } + }, + doAfterOpen: function () { + this._opening = !1; + }, + close: function () { + var e = this; + if (!this.willClose || this.willClose()) { + (null !== this._openTimer && + (clearTimeout(this._openTimer), (this._openTimer = null)), + clearTimeout(this._closeTimer)); + var t = Number(this.closeDelay); + t > 0 + ? (this._closeTimer = setTimeout(function () { + ((e._closeTimer = null), e.doClose()); + }, t)) + : this.doClose(); + } + }, + doClose: function () { + ((this._closing = !0), + this.onClose && this.onClose(), + this.lockScroll && setTimeout(this.restoreBodyStyle, 200), + (this.opened = !1), + this.doAfterClose()); + }, + doAfterClose: function () { + (o["default"].closeModal(this._popupId), + (this._closing = !1)); + }, + restoreBodyStyle: function () { + (this.modal && + this.withoutHiddenClass && + ((document.body.style.paddingRight = this.bodyPaddingRight), + (0, s.removeClass)( + document.body, + "el-popup-parent--hidden", + )), + (this.withoutHiddenClass = !0)); + }, + }, + }), + (t.PopupManager = o["default"])); + }, + 8432: function (e, t, n) { + "use strict"; + t.__esModule = !0; + var r, + i = n(4478), + o = (r = i) && r.__esModule ? r : { default: r }, + a = n(2865), + s = !1, + u = !1, + c = void 0, + l = function () { + if (!o["default"].prototype.$isServer) { + var e = f.modalDom; + return ( + e + ? (s = !0) + : ((s = !1), + (e = document.createElement("div")), + (f.modalDom = e), + e.addEventListener("touchmove", function (e) { + (e.preventDefault(), e.stopPropagation()); + }), + e.addEventListener("click", function () { + f.doOnModalClick && f.doOnModalClick(); + })), + e + ); + } + }, + d = {}, + f = { + modalFade: !0, + getInstance: function (e) { + return d[e]; + }, + register: function (e, t) { + e && t && (d[e] = t); + }, + deregister: function (e) { + e && ((d[e] = null), delete d[e]); + }, + nextZIndex: function () { + return f.zIndex++; + }, + modalStack: [], + doOnModalClick: function () { + var e = f.modalStack[f.modalStack.length - 1]; + if (e) { + var t = f.getInstance(e.id); + t && t.closeOnClickModal && t.close(); + } + }, + openModal: function (e, t, n, r, i) { + if ( + !o["default"].prototype.$isServer && + e && + t !== undefined + ) { + this.modalFade = i; + for ( + var u = this.modalStack, c = 0, d = u.length; + c < d; + c++ + ) + if (u[c].id === e) return; + var f = l(); + ((0, a.addClass)(f, "v-modal"), + this.modalFade && + !s && + (0, a.addClass)(f, "v-modal-enter"), + r && + r + .trim() + .split(/\s+/) + .forEach(function (e) { + return (0, a.addClass)(f, e); + }), + setTimeout(function () { + (0, a.removeClass)(f, "v-modal-enter"); + }, 200), + n && n.parentNode && 11 !== n.parentNode.nodeType + ? n.parentNode.appendChild(f) + : document.body.appendChild(f), + t && (f.style.zIndex = t), + (f.tabIndex = 0), + (f.style.display = ""), + this.modalStack.push({ + id: e, + zIndex: t, + modalClass: r, + })); + } + }, + closeModal: function (e) { + var t = this.modalStack, + n = l(); + if (t.length > 0) { + var r = t[t.length - 1]; + if (r.id === e) + (r.modalClass && + r.modalClass + .trim() + .split(/\s+/) + .forEach(function (e) { + return (0, a.removeClass)(n, e); + }), + t.pop(), + t.length > 0 && + (n.style.zIndex = t[t.length - 1].zIndex)); + else + for (var i = t.length - 1; i >= 0; i--) + if (t[i].id === e) { + t.splice(i, 1); + break; + } + } + 0 === t.length && + (this.modalFade && (0, a.addClass)(n, "v-modal-leave"), + setTimeout(function () { + (0 === t.length && + (n.parentNode && n.parentNode.removeChild(n), + (n.style.display = "none"), + (f.modalDom = undefined)), + (0, a.removeClass)(n, "v-modal-leave")); + }, 200)); + }, + }; + (Object.defineProperty(f, "zIndex", { + configurable: !0, + get: function () { + return ( + u || + ((c = + c || + (o["default"].prototype.$ELEMENT || {}).zIndex || + 2e3), + (u = !0)), + c + ); + }, + set: function (e) { + c = e; + }, + }), + o["default"].prototype.$isServer || + window.addEventListener("keydown", function (e) { + if (27 === e.keyCode) { + var t = (function () { + if ( + !o["default"].prototype.$isServer && + f.modalStack.length > 0 + ) { + var e = f.modalStack[f.modalStack.length - 1]; + if (!e) return; + return f.getInstance(e.id); + } + })(); + t && + t.closeOnPressEscape && + (t.handleClose + ? t.handleClose() + : t.handleAction + ? t.handleAction("cancel") + : t.close()); + } + }), + (t["default"] = f)); + }, + 9686: function (e, t, n) { + "use strict"; + ((t.__esModule = !0), + (t["default"] = function () { + if (o["default"].prototype.$isServer) return 0; + if (a !== undefined) return a; + var e = document.createElement("div"); + ((e.className = "el-scrollbar__wrap"), + (e.style.visibility = "hidden"), + (e.style.width = "100px"), + (e.style.position = "absolute"), + (e.style.top = "-9999px"), + document.body.appendChild(e)); + var t = e.offsetWidth; + e.style.overflow = "scroll"; + var n = document.createElement("div"); + ((n.style.width = "100%"), e.appendChild(n)); + var r = n.offsetWidth; + return (e.parentNode.removeChild(e), (a = t - r)); + })); + var r, + i = n(4478), + o = (r = i) && r.__esModule ? r : { default: r }, + a = void 0; + }, + 4524: function (e, t) { + "use strict"; + ((t.__esModule = !0), + (t.isDef = function (e) { + return e !== undefined && null !== e; + }), + (t.isKorean = function (e) { + return /([(\uAC00-\uD7AF)|(\u3130-\u318F)])+/gi.test(e); + })); + }, + 6200: function (e, t, n) { + "use strict"; + var r = n(477)(n(9367)); + ((t.__esModule = !0), + (t.isDefined = t.isUndefined = t.isFunction = undefined)); + var i = + "function" == typeof Symbol && + "symbol" === (0, r["default"])(Symbol.iterator) + ? function (e) { + return (0, r["default"])(e); + } + : function (e) { + return e && + "function" == typeof Symbol && + e.constructor === Symbol && + e !== Symbol.prototype + ? "symbol" + : (0, r["default"])(e); + }; + ((t.isString = function (e) { + return "[object String]" === Object.prototype.toString.call(e); + }), + (t.isObject = function (e) { + return "[object Object]" === Object.prototype.toString.call(e); + }), + (t.isHtmlElement = function (e) { + return e && e.nodeType === Node.ELEMENT_NODE; + })); + var o, + a = n(4478), + s = (o = a) && o.__esModule ? o : { default: o }, + u = function (e) { + return e && "[object Function]" === {}.toString.call(e); + }; + ("object" === + ("undefined" == typeof Int8Array ? "undefined" : i(Int8Array)) || + (!s["default"].prototype.$isServer && + "function" == typeof document.childNodes) || + (t.isFunction = u = + function (e) { + return "function" == typeof e || !1; + }), + (t.isFunction = u), + (t.isUndefined = function (e) { + return void 0 === e; + }), + (t.isDefined = function (e) { + return e !== undefined && null !== e; + })); + }, + 2417: function (e, t, n) { + "use strict"; + var r = n(477)(n(9367)); + ((t.__esModule = !0), + (t.isMac = + t.isEmpty = + t.isEqual = + t.arrayEquals = + t.looseEqual = + t.capitalize = + t.kebabCase = + t.autoprefixer = + t.isFirefox = + t.isEdge = + t.isIE = + t.coerceTruthyValueToArray = + t.arrayFind = + t.arrayFindIndex = + t.escapeRegexpString = + t.valueEquals = + t.generateId = + t.getValueByPath = + undefined)); + var i = + "function" == typeof Symbol && + "symbol" === (0, r["default"])(Symbol.iterator) + ? function (e) { + return (0, r["default"])(e); + } + : function (e) { + return e && + "function" == typeof Symbol && + e.constructor === Symbol && + e !== Symbol.prototype + ? "symbol" + : (0, r["default"])(e); + }; + ((t.noop = function () {}), + (t.hasOwn = function (e, t) { + return c.call(e, t); + }), + (t.toObject = function (e) { + for (var t = {}, n = 0; n < e.length; n++) e[n] && l(t, e[n]); + return t; + }), + (t.getPropByPath = function (e, t, n) { + for ( + var r = e, + i = (t = (t = t.replace(/\[(\w+)\]/g, ".$1")).replace( + /^\./, + "", + )).split("."), + o = 0, + a = i.length; + o < a - 1 && (r || n); + ++o + ) { + var s = i[o]; + if (!(s in r)) { + if (n) + throw new Error( + "please transfer a valid prop path to form item!", + ); + break; + } + r = r[s]; + } + return { o: r, k: i[o], v: r ? r[i[o]] : null }; + }), + (t.rafThrottle = function (e) { + var t = !1; + return function () { + for ( + var n = this, r = arguments.length, i = Array(r), o = 0; + o < r; + o++ + ) + i[o] = arguments[o]; + t || + ((t = !0), + window.requestAnimationFrame(function (r) { + (e.apply(n, i), (t = !1)); + })); + }; + }), + (t.objToArray = function (e) { + return Array.isArray(e) ? e : h(e) ? [] : [e]; + })); + var o, + a = n(4478), + s = (o = a) && o.__esModule ? o : { default: o }, + u = n(6200), + c = Object.prototype.hasOwnProperty; + function l(e, t) { + for (var n in t) e[n] = t[n]; + return e; + } + ((t.getValueByPath = function (e, t) { + for ( + var n = (t = t || "").split("."), + r = e, + i = null, + o = 0, + a = n.length; + o < a; + o++ + ) { + var s = n[o]; + if (!r) break; + if (o === a - 1) { + i = r[s]; + break; + } + r = r[s]; + } + return i; + }), + (t.generateId = function () { + return Math.floor(1e4 * Math.random()); + }), + (t.valueEquals = function (e, t) { + if (e === t) return !0; + if (!(e instanceof Array)) return !1; + if (!(t instanceof Array)) return !1; + if (e.length !== t.length) return !1; + for (var n = 0; n !== e.length; ++n) + if (e[n] !== t[n]) return !1; + return !0; + }), + (t.escapeRegexpString = function () { + var e = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : ""; + return String(e).replace(/[|\\{}()[\]^$+*?.]/g, "\\$&"); + })); + var d = (t.arrayFindIndex = function (e, t) { + for (var n = 0; n !== e.length; ++n) if (t(e[n])) return n; + return -1; + }), + f = + ((t.arrayFind = function (e, t) { + var n = d(e, t); + return -1 !== n ? e[n] : undefined; + }), + (t.coerceTruthyValueToArray = function (e) { + return Array.isArray(e) ? e : e ? [e] : []; + }), + (t.isIE = function () { + return ( + !s["default"].prototype.$isServer && + !isNaN(Number(document.documentMode)) + ); + }), + (t.isEdge = function () { + return ( + !s["default"].prototype.$isServer && + navigator.userAgent.indexOf("Edge") > -1 + ); + }), + (t.isFirefox = function () { + return ( + !s["default"].prototype.$isServer && + !!window.navigator.userAgent.match(/firefox/i) + ); + }), + (t.autoprefixer = function (e) { + if ("object" !== (void 0 === e ? "undefined" : i(e))) + return e; + var t = ["ms-", "webkit-"]; + return ( + ["transform", "transition", "animation"].forEach( + function (n) { + var r = e[n]; + n && + r && + t.forEach(function (t) { + e[t + n] = r; + }); + }, + ), + e + ); + }), + (t.kebabCase = function (e) { + var t = /([^-])([A-Z])/g; + return e + .replace(t, "$1-$2") + .replace(t, "$1-$2") + .toLowerCase(); + }), + (t.capitalize = function (e) { + return (0, u.isString)(e) + ? e.charAt(0).toUpperCase() + e.slice(1) + : e; + }), + (t.looseEqual = function (e, t) { + var n = (0, u.isObject)(e), + r = (0, u.isObject)(t); + return n && r + ? JSON.stringify(e) === JSON.stringify(t) + : !n && !r && String(e) === String(t); + })), + p = (t.arrayEquals = function (e, t) { + if (((t = t || []), (e = e || []).length !== t.length)) + return !1; + for (var n = 0; n < e.length; n++) + if (!f(e[n], t[n])) return !1; + return !0; + }), + h = + ((t.isEqual = function (e, t) { + return Array.isArray(e) && Array.isArray(t) + ? p(e, t) + : f(e, t); + }), + (t.isEmpty = function (e) { + if (null == e) return !0; + if ("boolean" == typeof e) return !1; + if ("number" == typeof e) return !e; + if (e instanceof Error) return "" === e.message; + switch (Object.prototype.toString.call(e)) { + case "[object String]": + case "[object Array]": + return !e.length; + case "[object File]": + case "[object Map]": + case "[object Set]": + return !e.size; + case "[object Object]": + return !Object.keys(e).length; + } + return !1; + })); + t.isMac = function () { + return ( + !s["default"].prototype.$isServer && + /macintosh|mac os x/i.test(navigator.userAgent) + ); + }; + }, + 2573: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = void 0)); + var i, + o = r(n(4478)), + a = n(8784), + s = [], + u = "@@clickoutsideContext", + c = 0; + function l(e, t, n) { + return function () { + var r = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : {}, + i = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : {}; + !(n && n.context && r.target && i.target) || + e.contains(r.target) || + e.contains(i.target) || + e === r.target || + (n.context.popperElm && + (n.context.popperElm.contains(r.target) || + n.context.popperElm.contains(i.target))) || + (t.expression && e[u].methodName && n.context[e[u].methodName] + ? n.context[e[u].methodName]() + : e[u].bindingFn && e[u].bindingFn()); + }; + } + (!o["default"].prototype.$isServer && + (0, a.on)(document, "mousedown", function (e) { + return (i = e); + }), + !o["default"].prototype.$isServer && + (0, a.on)(document, "mouseup", function (e) { + s.forEach(function (t) { + return t[u].documentHandler(e, i); + }); + }), + (t["default"] = { + bind: function (e, t, n) { + s.push(e); + var r = c++; + e[u] = { + id: r, + documentHandler: l(e, t, n), + methodName: t.expression, + bindingFn: t.value, + }; + }, + update: function (e, t, n) { + ((e[u].documentHandler = l(e, t, n)), + (e[u].methodName = t.expression), + (e[u].bindingFn = t.value)); + }, + unbind: function (e) { + for (var t = s.length, n = 0; n < t; n++) + if (s[n][u].id === e[u].id) { + s.splice(n, 1); + break; + } + delete e[u]; + }, + })); + }, + 8784: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.addClass = function (e, t) { + if (e) { + for ( + var n = e.className, + r = (t || "").split(" "), + i = 0, + o = r.length; + i < o; + i++ + ) { + var a = r[i]; + a && + (e.classList + ? e.classList.add(a) + : p(e, a) || (n += " " + a)); + } + e.classList || e.setAttribute("class", n); + } + }), + (t.getStyle = t.getScrollContainer = void 0), + (t.hasClass = p), + (t.once = t.on = t.off = t.isScroll = t.isInContainer = void 0), + (t.removeClass = function (e, t) { + if (e && t) { + for ( + var n = t.split(" "), + r = " " + e.className + " ", + i = 0, + o = n.length; + i < o; + i++ + ) { + var a = n[i]; + a && + (e.classList + ? e.classList.remove(a) + : p(e, a) && (r = r.replace(" " + a + " ", " "))); + } + e.classList || e.setAttribute("class", c(r)); + } + }), + (t.setStyle = function g(e, t, n) { + if (e && t) + if ("object" === (0, i["default"])(t)) + for (var r in t) t.hasOwnProperty(r) && g(e, r, t[r]); + else + "opacity" === (t = l(t)) && u < 9 + ? (e.style.filter = isNaN(n) + ? "" + : "alpha(opacity=" + 100 * n + ")") + : (e.style[t] = n); + })); + var i = r(n(9367)), + o = r(n(4478))["default"].prototype.$isServer, + a = /([\:\-\_]+(.))/g, + s = /^moz([A-Z])/, + u = o ? 0 : Number(document.documentMode), + c = function (e) { + return (e || "").replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, ""); + }, + l = function (e) { + return e + .replace(a, function (e, t, n, r) { + return r ? n.toUpperCase() : n; + }) + .replace(s, "Moz$1"); + }, + d = (t.on = + !o && document.addEventListener + ? function (e, t, n) { + e && t && n && e.addEventListener(t, n, !1); + } + : function (e, t, n) { + e && t && n && e.attachEvent("on" + t, n); + }), + f = (t.off = + !o && document.removeEventListener + ? function (e, t, n) { + e && t && e.removeEventListener(t, n, !1); + } + : function (e, t, n) { + e && t && e.detachEvent("on" + t, n); + }); + function p(e, t) { + if (!e || !t) return !1; + if (-1 !== t.indexOf(" ")) + throw new Error("className should not contain space."); + return e.classList + ? e.classList.contains(t) + : (" " + e.className + " ").indexOf(" " + t + " ") > -1; + } + t.once = function (e, t, n) { + d(e, t, function r() { + (n && n.apply(this, arguments), f(e, t, r)); + }); + }; + var h = (t.getStyle = + u < 9 + ? function (e, t) { + if (!o) { + if (!e || !t) return null; + "float" === (t = l(t)) && (t = "styleFloat"); + try { + if ("opacity" === t) + try { + return e.filters.item("alpha").opacity / 100; + } catch (n) { + return 1; + } + return e.style[t] || e.currentStyle + ? e.currentStyle[t] + : null; + } catch (n) { + return e.style[t]; + } + } + } + : function (e, t) { + if (!o) { + if (!e || !t) return null; + "float" === (t = l(t)) && (t = "cssFloat"); + try { + var n = document.defaultView.getComputedStyle(e, ""); + return e.style[t] || n ? n[t] : null; + } catch (r) { + return e.style[t]; + } + } + }), + m = (t.isScroll = function (e, t) { + if (!o) { + var n = null !== t && t !== undefined; + return h( + e, + n ? (t ? "overflow-y" : "overflow-x") : "overflow", + ).match(/(scroll|auto|overlay)/); + } + }); + ((t.getScrollContainer = function (e, t) { + if (!o) { + for (var n = e; n; ) { + if ([window, document, document.documentElement].includes(n)) + return window; + if (m(n, t)) return n; + n = n.parentNode; + } + return n; + } + }), + (t.isInContainer = function (e, t) { + if (o || !e || !t) return !1; + var n, + r = e.getBoundingClientRect(); + return ( + (n = [ + window, + document, + document.documentElement, + null, + undefined, + ].includes(t) + ? { + top: 0, + right: window.innerWidth, + bottom: window.innerHeight, + left: 0, + } + : t.getBoundingClientRect()), + r.top < n.bottom && + r.bottom > n.top && + r.right > n.left && + r.left < n.right + ); + })); + }, + 823: function (e, t, n) { + "use strict"; + var r; + e = n.nmd(e); + var i = n(477)(n(9367)); + !(function () { + var t = "input is invalid type", + o = + "object" === + ("undefined" == typeof window + ? "undefined" + : (0, i["default"])(window)), + a = o ? window : {}; + a.JS_SHA256_NO_WINDOW && (o = !1); + var s = + !o && + "object" === + ("undefined" == typeof self + ? "undefined" + : (0, i["default"])(self)), + u = + !a.JS_SHA256_NO_NODE_JS && + "object" === + ("undefined" == typeof process + ? "undefined" + : (0, i["default"])(process)) && + process.versions && + process.versions.node; + u ? (a = n.g) : s && (a = self); + var c = + !a.JS_SHA256_NO_COMMON_JS && + "object" === (0, i["default"])(e) && + e.exports, + l = n.amdO, + d = + !a.JS_SHA256_NO_ARRAY_BUFFER && + "undefined" != typeof ArrayBuffer, + f = "0123456789abcdef".split(""), + p = [-2147483648, 8388608, 32768, 128], + h = [24, 16, 8, 0], + m = [ + 1116352408, 1899447441, 3049323471, 3921009573, 961987163, + 1508970993, 2453635748, 2870763221, 3624381080, 310598401, + 607225278, 1426881987, 1925078388, 2162078206, 2614888103, + 3248222580, 3835390401, 4022224774, 264347078, 604807628, + 770255983, 1249150122, 1555081692, 1996064986, 2554220882, + 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, + 113926993, 338241895, 666307205, 773529912, 1294757372, + 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, + 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, + 3600352804, 4094571909, 275423344, 430227734, 506948616, + 659060556, 883997877, 958139571, 1322822218, 1537002063, + 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, + 2428436474, 2756734187, 3204031479, 3329325298, + ], + g = ["hex", "array", "digest", "arrayBuffer"], + v = []; + ((!a.JS_SHA256_NO_NODE_JS && Array.isArray) || + (Array.isArray = function (e) { + return "[object Array]" === Object.prototype.toString.call(e); + }), + !d || + (!a.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW && + ArrayBuffer.isView) || + (ArrayBuffer.isView = function (e) { + return ( + "object" === (0, i["default"])(e) && + e.buffer && + e.buffer.constructor === ArrayBuffer + ); + })); + var _ = function (e, t) { + return function (n) { + return new E(t, !0).update(n)[e](); + }; + }, + y = function (e) { + var t = _("hex", e); + (u && (t = b(t, e)), + (t.create = function () { + return new E(e); + }), + (t.update = function (e) { + return t.create().update(e); + })); + for (var n = 0; n < g.length; ++n) { + var r = g[n]; + t[r] = _(r, e); + } + return t; + }, + b = function (e, r) { + var i, + o = n(4394), + s = n(1903).Buffer, + u = r ? "sha224" : "sha256"; + return ( + (i = + s.from && !a.JS_SHA256_NO_BUFFER_FROM + ? s.from + : function (e) { + return new s(e); + }), + function (n) { + if ("string" == typeof n) + return o.createHash(u).update(n, "utf8").digest("hex"); + if (null === n || n === undefined) throw new Error(t); + return ( + n.constructor === ArrayBuffer && + (n = new Uint8Array(n)), + Array.isArray(n) || + ArrayBuffer.isView(n) || + n.constructor === s + ? o.createHash(u).update(i(n)).digest("hex") + : e(n) + ); + } + ); + }, + k = function (e, t) { + return function (n, r) { + return new A(n, t, !0).update(r)[e](); + }; + }, + w = function (e) { + var t = k("hex", e); + ((t.create = function (t) { + return new A(t, e); + }), + (t.update = function (e, n) { + return t.create(e).update(n); + })); + for (var n = 0; n < g.length; ++n) { + var r = g[n]; + t[r] = k(r, e); + } + return t; + }; + function E(e, t) { + (t + ? ((v[0] = + v[16] = + v[1] = + v[2] = + v[3] = + v[4] = + v[5] = + v[6] = + v[7] = + v[8] = + v[9] = + v[10] = + v[11] = + v[12] = + v[13] = + v[14] = + v[15] = + 0), + (this.blocks = v)) + : (this.blocks = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]), + e + ? ((this.h0 = 3238371032), + (this.h1 = 914150663), + (this.h2 = 812702999), + (this.h3 = 4144912697), + (this.h4 = 4290775857), + (this.h5 = 1750603025), + (this.h6 = 1694076839), + (this.h7 = 3204075428)) + : ((this.h0 = 1779033703), + (this.h1 = 3144134277), + (this.h2 = 1013904242), + (this.h3 = 2773480762), + (this.h4 = 1359893119), + (this.h5 = 2600822924), + (this.h6 = 528734635), + (this.h7 = 1541459225)), + (this.block = this.start = this.bytes = this.hBytes = 0), + (this.finalized = this.hashed = !1), + (this.first = !0), + (this.is224 = e)); + } + function A(e, n, r) { + var o, + a = (0, i["default"])(e); + if ("string" === a) { + var s, + u = [], + c = e.length, + l = 0; + for (o = 0; o < c; ++o) + (s = e.charCodeAt(o)) < 128 + ? (u[l++] = s) + : s < 2048 + ? ((u[l++] = 192 | (s >>> 6)), + (u[l++] = 128 | (63 & s))) + : s < 55296 || s >= 57344 + ? ((u[l++] = 224 | (s >>> 12)), + (u[l++] = 128 | ((s >>> 6) & 63)), + (u[l++] = 128 | (63 & s))) + : ((s = + 65536 + + (((1023 & s) << 10) | + (1023 & e.charCodeAt(++o)))), + (u[l++] = 240 | (s >>> 18)), + (u[l++] = 128 | ((s >>> 12) & 63)), + (u[l++] = 128 | ((s >>> 6) & 63)), + (u[l++] = 128 | (63 & s))); + e = u; + } else { + if ("object" !== a) throw new Error(t); + if (null === e) throw new Error(t); + if (d && e.constructor === ArrayBuffer) e = new Uint8Array(e); + else if (!(Array.isArray(e) || (d && ArrayBuffer.isView(e)))) + throw new Error(t); + } + e.length > 64 && (e = new E(n, !0).update(e).array()); + var f = [], + p = []; + for (o = 0; o < 64; ++o) { + var h = e[o] || 0; + ((f[o] = 92 ^ h), (p[o] = 54 ^ h)); + } + (E.call(this, n, r), + this.update(p), + (this.oKeyPad = f), + (this.inner = !0), + (this.sharedMemory = r)); + } + ((E.prototype.update = function (e) { + if (!this.finalized) { + var n, + r = (0, i["default"])(e); + if ("string" !== r) { + if ("object" !== r) throw new Error(t); + if (null === e) throw new Error(t); + if (d && e.constructor === ArrayBuffer) + e = new Uint8Array(e); + else if ( + !(Array.isArray(e) || (d && ArrayBuffer.isView(e))) + ) + throw new Error(t); + n = !0; + } + for ( + var o, a, s = 0, u = e.length, c = this.blocks; + s < u; + ) { + if ( + (this.hashed && + ((this.hashed = !1), + (c[0] = this.block), + (this.block = + c[16] = + c[1] = + c[2] = + c[3] = + c[4] = + c[5] = + c[6] = + c[7] = + c[8] = + c[9] = + c[10] = + c[11] = + c[12] = + c[13] = + c[14] = + c[15] = + 0)), + n) + ) + for (a = this.start; s < u && a < 64; ++s) + c[a >>> 2] |= e[s] << h[3 & a++]; + else + for (a = this.start; s < u && a < 64; ++s) + (o = e.charCodeAt(s)) < 128 + ? (c[a >>> 2] |= o << h[3 & a++]) + : o < 2048 + ? ((c[a >>> 2] |= (192 | (o >>> 6)) << h[3 & a++]), + (c[a >>> 2] |= (128 | (63 & o)) << h[3 & a++])) + : o < 55296 || o >= 57344 + ? ((c[a >>> 2] |= + (224 | (o >>> 12)) << h[3 & a++]), + (c[a >>> 2] |= + (128 | ((o >>> 6) & 63)) << h[3 & a++]), + (c[a >>> 2] |= (128 | (63 & o)) << h[3 & a++])) + : ((o = + 65536 + + (((1023 & o) << 10) | + (1023 & e.charCodeAt(++s)))), + (c[a >>> 2] |= + (240 | (o >>> 18)) << h[3 & a++]), + (c[a >>> 2] |= + (128 | ((o >>> 12) & 63)) << h[3 & a++]), + (c[a >>> 2] |= + (128 | ((o >>> 6) & 63)) << h[3 & a++]), + (c[a >>> 2] |= (128 | (63 & o)) << h[3 & a++])); + ((this.lastByteIndex = a), + (this.bytes += a - this.start), + a >= 64 + ? ((this.block = c[16]), + (this.start = a - 64), + this.hash(), + (this.hashed = !0)) + : (this.start = a)); + } + return ( + this.bytes > 4294967295 && + ((this.hBytes += (this.bytes / 4294967296) | 0), + (this.bytes = this.bytes % 4294967296)), + this + ); + } + }), + (E.prototype.finalize = function () { + if (!this.finalized) { + this.finalized = !0; + var e = this.blocks, + t = this.lastByteIndex; + ((e[16] = this.block), + (e[t >>> 2] |= p[3 & t]), + (this.block = e[16]), + t >= 56 && + (this.hashed || this.hash(), + (e[0] = this.block), + (e[16] = + e[1] = + e[2] = + e[3] = + e[4] = + e[5] = + e[6] = + e[7] = + e[8] = + e[9] = + e[10] = + e[11] = + e[12] = + e[13] = + e[14] = + e[15] = + 0)), + (e[14] = (this.hBytes << 3) | (this.bytes >>> 29)), + (e[15] = this.bytes << 3), + this.hash()); + } + }), + (E.prototype.hash = function () { + var e, + t, + n, + r, + i, + o, + a, + s, + u, + c = this.h0, + l = this.h1, + d = this.h2, + f = this.h3, + p = this.h4, + h = this.h5, + g = this.h6, + v = this.h7, + _ = this.blocks; + for (e = 16; e < 64; ++e) + ((t = + (((i = _[e - 15]) >>> 7) | (i << 25)) ^ + ((i >>> 18) | (i << 14)) ^ + (i >>> 3)), + (n = + (((i = _[e - 2]) >>> 17) | (i << 15)) ^ + ((i >>> 19) | (i << 13)) ^ + (i >>> 10)), + (_[e] = (_[e - 16] + t + _[e - 7] + n) | 0)); + for (u = l & d, e = 0; e < 64; e += 4) + (this.first + ? (this.is224 + ? ((o = 300032), + (v = ((i = _[0] - 1413257819) - 150054599) | 0), + (f = (i + 24177077) | 0)) + : ((o = 704751109), + (v = ((i = _[0] - 210244248) - 1521486534) | 0), + (f = (i + 143694565) | 0)), + (this.first = !1)) + : ((t = + ((c >>> 2) | (c << 30)) ^ + ((c >>> 13) | (c << 19)) ^ + ((c >>> 22) | (c << 10))), + (r = (o = c & l) ^ (c & d) ^ u), + (v = + (f + + (i = + v + + (n = + ((p >>> 6) | (p << 26)) ^ + ((p >>> 11) | (p << 21)) ^ + ((p >>> 25) | (p << 7))) + + ((p & h) ^ (~p & g)) + + m[e] + + _[e])) | + 0), + (f = (i + (t + r)) | 0)), + (t = + ((f >>> 2) | (f << 30)) ^ + ((f >>> 13) | (f << 19)) ^ + ((f >>> 22) | (f << 10))), + (r = (a = f & c) ^ (f & l) ^ o), + (g = + (d + + (i = + g + + (n = + ((v >>> 6) | (v << 26)) ^ + ((v >>> 11) | (v << 21)) ^ + ((v >>> 25) | (v << 7))) + + ((v & p) ^ (~v & h)) + + m[e + 1] + + _[e + 1])) | + 0), + (t = + (((d = (i + (t + r)) | 0) >>> 2) | (d << 30)) ^ + ((d >>> 13) | (d << 19)) ^ + ((d >>> 22) | (d << 10))), + (r = (s = d & f) ^ (d & c) ^ a), + (h = + (l + + (i = + h + + (n = + ((g >>> 6) | (g << 26)) ^ + ((g >>> 11) | (g << 21)) ^ + ((g >>> 25) | (g << 7))) + + ((g & v) ^ (~g & p)) + + m[e + 2] + + _[e + 2])) | + 0), + (t = + (((l = (i + (t + r)) | 0) >>> 2) | (l << 30)) ^ + ((l >>> 13) | (l << 19)) ^ + ((l >>> 22) | (l << 10))), + (r = (u = l & d) ^ (l & f) ^ s), + (p = + (c + + (i = + p + + (n = + ((h >>> 6) | (h << 26)) ^ + ((h >>> 11) | (h << 21)) ^ + ((h >>> 25) | (h << 7))) + + ((h & g) ^ (~h & v)) + + m[e + 3] + + _[e + 3])) | + 0), + (c = (i + (t + r)) | 0), + (this.chromeBugWorkAround = !0)); + ((this.h0 = (this.h0 + c) | 0), + (this.h1 = (this.h1 + l) | 0), + (this.h2 = (this.h2 + d) | 0), + (this.h3 = (this.h3 + f) | 0), + (this.h4 = (this.h4 + p) | 0), + (this.h5 = (this.h5 + h) | 0), + (this.h6 = (this.h6 + g) | 0), + (this.h7 = (this.h7 + v) | 0)); + }), + (E.prototype.hex = function () { + this.finalize(); + var e = this.h0, + t = this.h1, + n = this.h2, + r = this.h3, + i = this.h4, + o = this.h5, + a = this.h6, + s = this.h7, + u = + f[(e >>> 28) & 15] + + f[(e >>> 24) & 15] + + f[(e >>> 20) & 15] + + f[(e >>> 16) & 15] + + f[(e >>> 12) & 15] + + f[(e >>> 8) & 15] + + f[(e >>> 4) & 15] + + f[15 & e] + + f[(t >>> 28) & 15] + + f[(t >>> 24) & 15] + + f[(t >>> 20) & 15] + + f[(t >>> 16) & 15] + + f[(t >>> 12) & 15] + + f[(t >>> 8) & 15] + + f[(t >>> 4) & 15] + + f[15 & t] + + f[(n >>> 28) & 15] + + f[(n >>> 24) & 15] + + f[(n >>> 20) & 15] + + f[(n >>> 16) & 15] + + f[(n >>> 12) & 15] + + f[(n >>> 8) & 15] + + f[(n >>> 4) & 15] + + f[15 & n] + + f[(r >>> 28) & 15] + + f[(r >>> 24) & 15] + + f[(r >>> 20) & 15] + + f[(r >>> 16) & 15] + + f[(r >>> 12) & 15] + + f[(r >>> 8) & 15] + + f[(r >>> 4) & 15] + + f[15 & r] + + f[(i >>> 28) & 15] + + f[(i >>> 24) & 15] + + f[(i >>> 20) & 15] + + f[(i >>> 16) & 15] + + f[(i >>> 12) & 15] + + f[(i >>> 8) & 15] + + f[(i >>> 4) & 15] + + f[15 & i] + + f[(o >>> 28) & 15] + + f[(o >>> 24) & 15] + + f[(o >>> 20) & 15] + + f[(o >>> 16) & 15] + + f[(o >>> 12) & 15] + + f[(o >>> 8) & 15] + + f[(o >>> 4) & 15] + + f[15 & o] + + f[(a >>> 28) & 15] + + f[(a >>> 24) & 15] + + f[(a >>> 20) & 15] + + f[(a >>> 16) & 15] + + f[(a >>> 12) & 15] + + f[(a >>> 8) & 15] + + f[(a >>> 4) & 15] + + f[15 & a]; + return ( + this.is224 || + (u += + f[(s >>> 28) & 15] + + f[(s >>> 24) & 15] + + f[(s >>> 20) & 15] + + f[(s >>> 16) & 15] + + f[(s >>> 12) & 15] + + f[(s >>> 8) & 15] + + f[(s >>> 4) & 15] + + f[15 & s]), + u + ); + }), + (E.prototype.toString = E.prototype.hex), + (E.prototype.digest = function () { + this.finalize(); + var e = this.h0, + t = this.h1, + n = this.h2, + r = this.h3, + i = this.h4, + o = this.h5, + a = this.h6, + s = this.h7, + u = [ + (e >>> 24) & 255, + (e >>> 16) & 255, + (e >>> 8) & 255, + 255 & e, + (t >>> 24) & 255, + (t >>> 16) & 255, + (t >>> 8) & 255, + 255 & t, + (n >>> 24) & 255, + (n >>> 16) & 255, + (n >>> 8) & 255, + 255 & n, + (r >>> 24) & 255, + (r >>> 16) & 255, + (r >>> 8) & 255, + 255 & r, + (i >>> 24) & 255, + (i >>> 16) & 255, + (i >>> 8) & 255, + 255 & i, + (o >>> 24) & 255, + (o >>> 16) & 255, + (o >>> 8) & 255, + 255 & o, + (a >>> 24) & 255, + (a >>> 16) & 255, + (a >>> 8) & 255, + 255 & a, + ]; + return ( + this.is224 || + u.push( + (s >>> 24) & 255, + (s >>> 16) & 255, + (s >>> 8) & 255, + 255 & s, + ), + u + ); + }), + (E.prototype.array = E.prototype.digest), + (E.prototype.arrayBuffer = function () { + this.finalize(); + var e = new ArrayBuffer(this.is224 ? 28 : 32), + t = new DataView(e); + return ( + t.setUint32(0, this.h0), + t.setUint32(4, this.h1), + t.setUint32(8, this.h2), + t.setUint32(12, this.h3), + t.setUint32(16, this.h4), + t.setUint32(20, this.h5), + t.setUint32(24, this.h6), + this.is224 || t.setUint32(28, this.h7), + e + ); + }), + (A.prototype = new E()), + (A.prototype.finalize = function () { + if ((E.prototype.finalize.call(this), this.inner)) { + this.inner = !1; + var e = this.array(); + (E.call(this, this.is224, this.sharedMemory), + this.update(this.oKeyPad), + this.update(e), + E.prototype.finalize.call(this)); + } + })); + var C = y(); + ((C.sha256 = C), + (C.sha224 = y(!0)), + (C.sha256.hmac = w()), + (C.sha224.hmac = w(!0)), + c + ? (e.exports = C) + : ((a.sha256 = C.sha256), + (a.sha224 = C.sha224), + l && + ((r = function () { + return C; + }.call(C, n, C, e)) === undefined || + (e.exports = r)))); + })(); + }, + 210: function () { + "use strict"; + !(function () { + if ( + "undefined" != typeof Prism && + "undefined" != typeof document + ) { + var e = { + javascript: "clike", + actionscript: "javascript", + apex: ["clike", "sql"], + arduino: "cpp", + aspnet: ["markup", "csharp"], + birb: "clike", + bison: "c", + c: "clike", + csharp: "clike", + cpp: "c", + cfscript: "clike", + chaiscript: ["clike", "cpp"], + cilkc: "c", + cilkcpp: "cpp", + coffeescript: "javascript", + crystal: "ruby", + "css-extras": "css", + d: "clike", + dart: "clike", + django: "markup-templating", + ejs: ["javascript", "markup-templating"], + etlua: ["lua", "markup-templating"], + erb: ["ruby", "markup-templating"], + fsharp: "clike", + "firestore-security-rules": "clike", + flow: "javascript", + ftl: "markup-templating", + gml: "clike", + glsl: "c", + go: "clike", + gradle: "clike", + groovy: "clike", + haml: "ruby", + handlebars: "markup-templating", + haxe: "clike", + hlsl: "c", + idris: "haskell", + java: "clike", + javadoc: ["markup", "java", "javadoclike"], + jolie: "clike", + jsdoc: ["javascript", "javadoclike", "typescript"], + "js-extras": "javascript", + json5: "json", + jsonp: "json", + "js-templates": "javascript", + kotlin: "clike", + latte: ["clike", "markup-templating", "php"], + less: "css", + lilypond: "scheme", + liquid: "markup-templating", + markdown: "markup", + "markup-templating": "markup", + mongodb: "javascript", + n4js: "javascript", + objectivec: "c", + opencl: "c", + parser: "markup", + php: "markup-templating", + phpdoc: ["php", "javadoclike"], + "php-extras": "php", + plsql: "sql", + processing: "clike", + protobuf: "clike", + pug: ["markup", "javascript"], + purebasic: "clike", + purescript: "haskell", + qsharp: "clike", + qml: "javascript", + qore: "clike", + racket: "scheme", + cshtml: ["markup", "csharp"], + jsx: ["markup", "javascript"], + tsx: ["jsx", "typescript"], + reason: "clike", + ruby: "clike", + sass: "css", + scss: "css", + scala: "java", + "shell-session": "bash", + smarty: "markup-templating", + solidity: "clike", + soy: "markup-templating", + sparql: "turtle", + sqf: "clike", + squirrel: "clike", + stata: ["mata", "java", "python"], + "t4-cs": ["t4-templating", "csharp"], + "t4-vb": ["t4-templating", "vbnet"], + tap: "yaml", + tt2: ["clike", "markup-templating"], + textile: "markup", + twig: "markup-templating", + typescript: "javascript", + v: "clike", + vala: "clike", + vbnet: "basic", + velocity: "markup", + wiki: "markup", + xeora: "markup", + "xml-doc": "markup", + xquery: "markup", + }, + t = { + html: "markup", + xml: "markup", + svg: "markup", + mathml: "markup", + ssml: "markup", + atom: "markup", + rss: "markup", + js: "javascript", + g4: "antlr4", + ino: "arduino", + "arm-asm": "armasm", + art: "arturo", + adoc: "asciidoc", + avs: "avisynth", + avdl: "avro-idl", + gawk: "awk", + sh: "bash", + shell: "bash", + shortcode: "bbcode", + rbnf: "bnf", + oscript: "bsl", + cs: "csharp", + dotnet: "csharp", + cfc: "cfscript", + "cilk-c": "cilkc", + "cilk-cpp": "cilkcpp", + cilk: "cilkcpp", + coffee: "coffeescript", + conc: "concurnas", + jinja2: "django", + "dns-zone": "dns-zone-file", + dockerfile: "docker", + gv: "dot", + eta: "ejs", + xlsx: "excel-formula", + xls: "excel-formula", + gamemakerlanguage: "gml", + po: "gettext", + gni: "gn", + ld: "linker-script", + "go-mod": "go-module", + hbs: "handlebars", + mustache: "handlebars", + hs: "haskell", + idr: "idris", + gitignore: "ignore", + hgignore: "ignore", + npmignore: "ignore", + webmanifest: "json", + kt: "kotlin", + kts: "kotlin", + kum: "kumir", + tex: "latex", + context: "latex", + ly: "lilypond", + emacs: "lisp", + elisp: "lisp", + "emacs-lisp": "lisp", + md: "markdown", + moon: "moonscript", + n4jsd: "n4js", + nani: "naniscript", + objc: "objectivec", + qasm: "openqasm", + objectpascal: "pascal", + px: "pcaxis", + pcode: "peoplecode", + plantuml: "plant-uml", + pq: "powerquery", + mscript: "powerquery", + pbfasm: "purebasic", + purs: "purescript", + py: "python", + qs: "qsharp", + rkt: "racket", + razor: "cshtml", + rpy: "renpy", + res: "rescript", + robot: "robotframework", + rb: "ruby", + "sh-session": "shell-session", + shellsession: "shell-session", + smlnj: "sml", + sol: "solidity", + sln: "solution-file", + rq: "sparql", + sclang: "supercollider", + t4: "t4-cs", + trickle: "tremor", + troy: "tremor", + trig: "turtle", + ts: "typescript", + tsconfig: "typoscript", + uscript: "unrealscript", + uc: "unrealscript", + url: "uri", + vb: "visual-basic", + vba: "visual-basic", + webidl: "web-idl", + mathematica: "wolfram", + nb: "wolfram", + wl: "wolfram", + xeoracube: "xeora", + yml: "yaml", + }, + n = {}, + r = "components/", + i = Prism.util.currentScript(); + if (i) { + var o = + /\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i, + a = /(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i, + s = i.getAttribute("data-autoloader-path"); + if (null != s) r = s.trim().replace(/\/?$/, "/"); + else { + var u = i.src; + o.test(u) + ? (r = u.replace(o, "components/")) + : a.test(u) && (r = u.replace(a, "$1components/")); + } + } + var c = (Prism.plugins.autoloader = { + languages_path: r, + use_minified: !0, + loadLanguages: d, + }); + Prism.hooks.add("complete", function (e) { + var t = e.element, + n = e.language; + if (t && n && "none" !== n) { + var r = (function (e) { + var t = ( + e.getAttribute("data-dependencies") || "" + ).trim(); + if (!t) { + var n = e.parentElement; + n && + "pre" === n.tagName.toLowerCase() && + (t = ( + n.getAttribute("data-dependencies") || "" + ).trim()); + } + return t ? t.split(/\s*,\s*/g) : []; + })(t); + (/^diff-./i.test(n) + ? (r.push("diff"), r.push(n.substr(5))) + : r.push(n), + r.every(l) || + d(r, function () { + Prism.highlightElement(t); + })); + } + }); + } + function l(e) { + if (e.indexOf("!") >= 0) return !1; + if ((e = t[e] || e) in Prism.languages) return !0; + var r = n[e]; + return r && !r.error && !1 === r.loading; + } + function d(r, i, o) { + "string" == typeof r && (r = [r]); + var a = r.length, + s = 0, + u = !1; + function p() { + u || (++s === a && i && i(r)); + } + 0 !== a + ? r.forEach(function (r) { + !(function (r, i, o) { + var a = r.indexOf("!") >= 0; + function s() { + var e = n[r]; + (e || (e = n[r] = { callbacks: [] }), + e.callbacks.push({ success: i, error: o }), + !a && l(r) + ? f(r, "success") + : !a && e.error + ? f(r, "error") + : (!a && e.loading) || + ((e.loading = !0), + (e.error = !1), + (function (e, t, n) { + var r = document.createElement("script"); + ((r.src = e), + (r.async = !0), + (r.onload = function () { + (document.body.removeChild(r), + t && t()); + }), + (r.onerror = function () { + (document.body.removeChild(r), + n && n()); + }), + document.body.appendChild(r)); + })( + (function (e) { + return ( + c.languages_path + + "prism-" + + e + + (c.use_minified ? ".min" : "") + + ".js" + ); + })(r), + function () { + ((e.loading = !1), f(r, "success")); + }, + function () { + ((e.loading = !1), + (e.error = !0), + f(r, "error")); + }, + ))); + } + ((r = r.replace("!", "")), (r = t[r] || r)); + var u = e[r]; + u && u.length ? d(u, s, o) : s(); + })(r, p, function () { + u || ((u = !0), o && o(r)); + }); + }) + : i && setTimeout(i, 0); + } + function f(e, t) { + if (n[e]) { + for ( + var r = n[e].callbacks, i = 0, o = r.length; + i < o; + i++ + ) { + var a = r[i][t]; + a && setTimeout(a, 0); + } + r.length = 0; + } + } + })(); + }, + 5472: function () { + "use strict"; + !(function () { + function e(e, n) { + e.addEventListener("click", function () { + !(function (e) { + navigator.clipboard + ? navigator.clipboard + .writeText(e.getText()) + .then(e.success, function () { + t(e); + }) + : t(e); + })(n); + }); + } + function t(e) { + var t = document.createElement("textarea"); + ((t.value = e.getText()), + (t.style.top = "0"), + (t.style.left = "0"), + (t.style.position = "fixed"), + document.body.appendChild(t), + t.focus(), + t.select()); + try { + var n = document.execCommand("copy"); + setTimeout(function () { + n ? e.success() : e.error(); + }, 1); + } catch (r) { + setTimeout(function () { + e.error(r); + }, 1); + } + document.body.removeChild(t); + } + "undefined" != typeof Prism && + "undefined" != typeof document && + (Prism.plugins.toolbar + ? Prism.plugins.toolbar.registerButton( + "copy-to-clipboard", + function (t) { + var n = t.element, + r = (function (e) { + var t = { + copy: "Copy", + "copy-error": "Press Ctrl+C to copy", + "copy-success": "Copied!", + "copy-timeout": 5e3, + }; + for (var n in t) { + for ( + var r = "data-prismjs-" + n, i = e; + i && !i.hasAttribute(r); + ) + i = i.parentElement; + i && (t[n] = i.getAttribute(r)); + } + return t; + })(n), + i = document.createElement("button"); + ((i.className = "copy-to-clipboard-button"), + i.setAttribute("type", "button")); + var o = document.createElement("span"); + return ( + i.appendChild(o), + s("copy"), + e(i, { + getText: function () { + return n.textContent; + }, + success: function () { + (s("copy-success"), a()); + }, + error: function () { + (s("copy-error"), + setTimeout(function () { + !(function (e) { + window.getSelection().selectAllChildren(e); + })(n); + }, 1), + a()); + }, + }), + i + ); + function a() { + setTimeout(function () { + s("copy"); + }, r["copy-timeout"]); + } + function s(e) { + ((o.textContent = r[e]), + i.setAttribute("data-copy-state", e)); + } + }, + ) + : console.warn( + "Copy to Clipboard plugin loaded before Toolbar plugin.", + )); + })(); + }, + 4296: function () { + "use strict"; + !(function () { + if ("undefined" != typeof Prism && "undefined" != typeof document) + if (Prism.plugins.toolbar) { + var e = { + none: "Plain text", + plain: "Plain text", + plaintext: "Plain text", + text: "Plain text", + txt: "Plain text", + html: "HTML", + xml: "XML", + svg: "SVG", + mathml: "MathML", + ssml: "SSML", + rss: "RSS", + css: "CSS", + clike: "C-like", + js: "JavaScript", + abap: "ABAP", + abnf: "ABNF", + al: "AL", + antlr4: "ANTLR4", + g4: "ANTLR4", + apacheconf: "Apache Configuration", + apl: "APL", + aql: "AQL", + ino: "Arduino", + arff: "ARFF", + armasm: "ARM Assembly", + "arm-asm": "ARM Assembly", + art: "Arturo", + asciidoc: "AsciiDoc", + adoc: "AsciiDoc", + aspnet: "ASP.NET (C#)", + asm6502: "6502 Assembly", + asmatmel: "Atmel AVR Assembly", + autohotkey: "AutoHotkey", + autoit: "AutoIt", + avisynth: "AviSynth", + avs: "AviSynth", + "avro-idl": "Avro IDL", + avdl: "Avro IDL", + awk: "AWK", + gawk: "GAWK", + sh: "Shell", + basic: "BASIC", + bbcode: "BBcode", + bbj: "BBj", + bnf: "BNF", + rbnf: "RBNF", + bqn: "BQN", + bsl: "BSL (1C:Enterprise)", + oscript: "OneScript", + csharp: "C#", + cs: "C#", + dotnet: "C#", + cpp: "C++", + cfscript: "CFScript", + cfc: "CFScript", + cil: "CIL", + cilkc: "Cilk/C", + "cilk-c": "Cilk/C", + cilkcpp: "Cilk/C++", + "cilk-cpp": "Cilk/C++", + cilk: "Cilk/C++", + cmake: "CMake", + cobol: "COBOL", + coffee: "CoffeeScript", + conc: "Concurnas", + csp: "Content-Security-Policy", + "css-extras": "CSS Extras", + csv: "CSV", + cue: "CUE", + dataweave: "DataWeave", + dax: "DAX", + django: "Django/Jinja2", + jinja2: "Django/Jinja2", + "dns-zone-file": "DNS zone file", + "dns-zone": "DNS zone file", + dockerfile: "Docker", + dot: "DOT (Graphviz)", + gv: "DOT (Graphviz)", + ebnf: "EBNF", + editorconfig: "EditorConfig", + ejs: "EJS", + etlua: "Embedded Lua templating", + erb: "ERB", + "excel-formula": "Excel Formula", + xlsx: "Excel Formula", + xls: "Excel Formula", + fsharp: "F#", + "firestore-security-rules": "Firestore security rules", + ftl: "FreeMarker Template Language", + gml: "GameMaker Language", + gamemakerlanguage: "GameMaker Language", + gap: "GAP (CAS)", + gcode: "G-code", + gdscript: "GDScript", + gedcom: "GEDCOM", + gettext: "gettext", + po: "gettext", + glsl: "GLSL", + gn: "GN", + gni: "GN", + "linker-script": "GNU Linker Script", + ld: "GNU Linker Script", + "go-module": "Go module", + "go-mod": "Go module", + graphql: "GraphQL", + hbs: "Handlebars", + hs: "Haskell", + hcl: "HCL", + hlsl: "HLSL", + http: "HTTP", + hpkp: "HTTP Public-Key-Pins", + hsts: "HTTP Strict-Transport-Security", + ichigojam: "IchigoJam", + "icu-message-format": "ICU Message Format", + idr: "Idris", + ignore: ".ignore", + gitignore: ".gitignore", + hgignore: ".hgignore", + npmignore: ".npmignore", + inform7: "Inform 7", + javadoc: "JavaDoc", + javadoclike: "JavaDoc-like", + javastacktrace: "Java stack trace", + jq: "JQ", + jsdoc: "JSDoc", + "js-extras": "JS Extras", + json: "JSON", + webmanifest: "Web App Manifest", + json5: "JSON5", + jsonp: "JSONP", + jsstacktrace: "JS stack trace", + "js-templates": "JS Templates", + keepalived: "Keepalived Configure", + kts: "Kotlin Script", + kt: "Kotlin", + kumir: "KuMir (КуМир)", + kum: "KuMir (КуМир)", + latex: "LaTeX", + tex: "TeX", + context: "ConTeXt", + lilypond: "LilyPond", + ly: "LilyPond", + emacs: "Lisp", + elisp: "Lisp", + "emacs-lisp": "Lisp", + llvm: "LLVM IR", + log: "Log file", + lolcode: "LOLCODE", + magma: "Magma (CAS)", + md: "Markdown", + "markup-templating": "Markup templating", + matlab: "MATLAB", + maxscript: "MAXScript", + mel: "MEL", + metafont: "METAFONT", + mongodb: "MongoDB", + moon: "MoonScript", + n1ql: "N1QL", + n4js: "N4JS", + n4jsd: "N4JS", + "nand2tetris-hdl": "Nand To Tetris HDL", + naniscript: "Naninovel Script", + nani: "Naninovel Script", + nasm: "NASM", + neon: "NEON", + nginx: "nginx", + nsis: "NSIS", + objectivec: "Objective-C", + objc: "Objective-C", + ocaml: "OCaml", + opencl: "OpenCL", + openqasm: "OpenQasm", + qasm: "OpenQasm", + parigp: "PARI/GP", + objectpascal: "Object Pascal", + psl: "PATROL Scripting Language", + pcaxis: "PC-Axis", + px: "PC-Axis", + peoplecode: "PeopleCode", + pcode: "PeopleCode", + php: "PHP", + phpdoc: "PHPDoc", + "php-extras": "PHP Extras", + "plant-uml": "PlantUML", + plantuml: "PlantUML", + plsql: "PL/SQL", + powerquery: "PowerQuery", + pq: "PowerQuery", + mscript: "PowerQuery", + powershell: "PowerShell", + promql: "PromQL", + properties: ".properties", + protobuf: "Protocol Buffers", + purebasic: "PureBasic", + pbfasm: "PureBasic", + purs: "PureScript", + py: "Python", + qsharp: "Q#", + qs: "Q#", + q: "Q (kdb+ database)", + qml: "QML", + rkt: "Racket", + cshtml: "Razor C#", + razor: "Razor C#", + jsx: "React JSX", + tsx: "React TSX", + renpy: "Ren'py", + rpy: "Ren'py", + res: "ReScript", + rest: "reST (reStructuredText)", + robotframework: "Robot Framework", + robot: "Robot Framework", + rb: "Ruby", + sas: "SAS", + sass: "Sass (Sass)", + scss: "Sass (SCSS)", + "shell-session": "Shell session", + "sh-session": "Shell session", + shellsession: "Shell session", + sml: "SML", + smlnj: "SML/NJ", + solidity: "Solidity (Ethereum)", + sol: "Solidity (Ethereum)", + "solution-file": "Solution file", + sln: "Solution file", + soy: "Soy (Closure Template)", + sparql: "SPARQL", + rq: "SPARQL", + "splunk-spl": "Splunk SPL", + sqf: "SQF: Status Quo Function (Arma 3)", + sql: "SQL", + stata: "Stata Ado", + iecst: "Structured Text (IEC 61131-3)", + supercollider: "SuperCollider", + sclang: "SuperCollider", + systemd: "Systemd configuration file", + "t4-templating": "T4 templating", + "t4-cs": "T4 Text Templates (C#)", + t4: "T4 Text Templates (C#)", + "t4-vb": "T4 Text Templates (VB)", + tap: "TAP", + tt2: "Template Toolkit 2", + toml: "TOML", + trickle: "trickle", + troy: "troy", + trig: "TriG", + ts: "TypeScript", + tsconfig: "TSConfig", + uscript: "UnrealScript", + uc: "UnrealScript", + uorazor: "UO Razor Script", + uri: "URI", + url: "URL", + vbnet: "VB.Net", + vhdl: "VHDL", + vim: "vim", + "visual-basic": "Visual Basic", + vba: "VBA", + vb: "Visual Basic", + wasm: "WebAssembly", + "web-idl": "Web IDL", + webidl: "Web IDL", + wgsl: "WGSL", + wiki: "Wiki markup", + wolfram: "Wolfram language", + nb: "Mathematica Notebook", + wl: "Wolfram language", + xeoracube: "XeoraCube", + "xml-doc": "XML doc (.net)", + xojo: "Xojo (REALbasic)", + xquery: "XQuery", + yaml: "YAML", + yml: "YAML", + yang: "YANG", + }; + Prism.plugins.toolbar.registerButton( + "show-language", + function (t) { + var n = t.element.parentNode; + if (n && /pre/i.test(n.nodeName)) { + var r, + i = + n.getAttribute("data-language") || + e[t.language] || + ((r = t.language) + ? ( + r.substring(0, 1).toUpperCase() + + r.substring(1) + ).replace(/s(?=cript)/, "S") + : r); + if (i) { + var o = document.createElement("span"); + return ((o.textContent = i), o); + } + } + }, + ); + } else + console.warn( + "Show Languages plugin loaded before Toolbar plugin.", + ); + })(); + }, + 8072: function () { + "use strict"; + !(function () { + if ( + "undefined" != typeof Prism && + "undefined" != typeof document + ) { + var e = [], + t = {}, + n = function () {}; + Prism.plugins.toolbar = {}; + var r = (Prism.plugins.toolbar.registerButton = function ( + n, + r, + ) { + var i; + ((i = + "function" == typeof r + ? r + : function (e) { + var t; + return ( + "function" == typeof r.onClick + ? (((t = + document.createElement("button")).type = + "button"), + t.addEventListener("click", function () { + r.onClick.call(this, e); + })) + : "string" == typeof r.url + ? ((t = document.createElement("a")).href = + r.url) + : (t = document.createElement("span")), + r.className && t.classList.add(r.className), + (t.textContent = r.text), + t + ); + }), + n in t + ? console.warn( + 'There is a button with the key "' + + n + + '" registered already.', + ) + : e.push((t[n] = i))); + }), + i = (Prism.plugins.toolbar.hook = function (r) { + var i = r.element.parentNode; + if ( + i && + /pre/i.test(i.nodeName) && + !i.parentNode.classList.contains("code-toolbar") + ) { + var o = document.createElement("div"); + (o.classList.add("code-toolbar"), + i.parentNode.insertBefore(o, i), + o.appendChild(i)); + var a = document.createElement("div"); + a.classList.add("toolbar"); + var s = e, + u = (function (e) { + for (; e; ) { + var t = e.getAttribute("data-toolbar-order"); + if (null != t) + return (t = t.trim()).length + ? t.split(/\s*,\s*/g) + : []; + e = e.parentElement; + } + })(r.element); + (u && + (s = u.map(function (e) { + return t[e] || n; + })), + s.forEach(function (e) { + var t = e(r); + if (t) { + var n = document.createElement("div"); + (n.classList.add("toolbar-item"), + n.appendChild(t), + a.appendChild(n)); + } + }), + o.appendChild(a)); + } + }); + (r("label", function (e) { + var t = e.element.parentNode; + if ( + t && + /pre/i.test(t.nodeName) && + t.hasAttribute("data-label") + ) { + var n, + r, + i = t.getAttribute("data-label"); + try { + r = document.querySelector("template#" + i); + } catch (o) {} + return ( + r + ? (n = r.content) + : (t.hasAttribute("data-url") + ? ((n = document.createElement("a")).href = + t.getAttribute("data-url")) + : (n = document.createElement("span")), + (n.textContent = i)), + n + ); + } + }), + Prism.hooks.add("complete", i)); + } + })(); + }, + 1965: function (e, t, n) { + "use strict"; + var r = (function (e) { + var t = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i, + n = 0, + r = {}, + i = { + manual: e.Prism && e.Prism.manual, + disableWorkerMessageHandler: + e.Prism && e.Prism.disableWorkerMessageHandler, + util: { + encode: function h(e) { + return e instanceof o + ? new o(e.type, h(e.content), e.alias) + : Array.isArray(e) + ? e.map(h) + : e + .replace(/&/g, "&") + .replace(/= d.reach); + E += w.value.length, w = w.next + ) { + var A = w.value; + if (t.length > e.length) return; + if (!(A instanceof o)) { + var C, + x = 1; + if (_) { + if (!(C = a(k, E, e, v)) || C.index >= e.length) + break; + var I = C.index, + D = C.index + C[0].length, + S = E; + for (S += w.value.length; I >= S; ) + S += (w = w.next).value.length; + if ( + ((E = S -= w.value.length), w.value instanceof o) + ) + continue; + for ( + var O = w; + O !== t.tail && + (S < D || "string" == typeof O.value); + O = O.next + ) + (x++, (S += O.value.length)); + (x--, (A = e.slice(E, S)), (C.index -= E)); + } else if (!(C = a(k, 0, A, v))) continue; + I = C.index; + var T = C[0], + M = A.slice(0, I), + N = A.slice(I + T.length), + P = E + A.length; + d && P > d.reach && (d.reach = P); + var F = w.prev; + if ( + (M && ((F = c(t, F, M)), (E += M.length)), + l(t, F, x), + (w = c( + t, + F, + new o(f, g ? i.tokenize(T, g) : T, y, T), + )), + N && c(t, w, N), + x > 1) + ) { + var L = { cause: f + "," + h, reach: P }; + (s(e, t, n, w.prev, E, L), + d && L.reach > d.reach && (d.reach = L.reach)); + } + } + } + } + } + } + function u() { + var e = { value: null, prev: null, next: null }, + t = { value: null, prev: e, next: null }; + ((e.next = t), + (this.head = e), + (this.tail = t), + (this.length = 0)); + } + function c(e, t, n) { + var r = t.next, + i = { value: n, prev: t, next: r }; + return ((t.next = i), (r.prev = i), e.length++, i); + } + function l(e, t, n) { + for (var r = t.next, i = 0; i < n && r !== e.tail; i++) + r = r.next; + ((t.next = r), (r.prev = t), (e.length -= i)); + } + if ( + ((e.Prism = i), + (o.stringify = function v(e, t) { + if ("string" == typeof e) return e; + if (Array.isArray(e)) { + var n = ""; + return ( + e.forEach(function (e) { + n += v(e, t); + }), + n + ); + } + var r = { + type: e.type, + content: v(e.content, t), + tag: "span", + classes: ["token", e.type], + attributes: {}, + language: t, + }, + o = e.alias; + (o && + (Array.isArray(o) + ? Array.prototype.push.apply(r.classes, o) + : r.classes.push(o)), + i.hooks.run("wrap", r)); + var a = ""; + for (var s in r.attributes) + a += + " " + + s + + '="' + + (r.attributes[s] || "").replace(/"/g, """) + + '"'; + return ( + "<" + + r.tag + + ' class="' + + r.classes.join(" ") + + '"' + + a + + ">" + + r.content + + "" + ); + }), + !e.document) + ) + return e.addEventListener + ? (i.disableWorkerMessageHandler || + e.addEventListener( + "message", + function (t) { + var n = JSON.parse(t.data), + r = n.language, + o = n.code, + a = n.immediateClose; + (e.postMessage(i.highlight(o, i.languages[r], r)), + a && e.close()); + }, + !1, + ), + i) + : i; + var d = i.util.currentScript(); + function f() { + i.manual || i.highlightAll(); + } + if ( + (d && + ((i.filename = d.src), + d.hasAttribute("data-manual") && (i.manual = !0)), + !i.manual) + ) { + var p = document.readyState; + "loading" === p || ("interactive" === p && d && d.defer) + ? document.addEventListener("DOMContentLoaded", f) + : window.requestAnimationFrame + ? window.requestAnimationFrame(f) + : window.setTimeout(f, 16); + } + return i; + })( + "undefined" != typeof window + ? window + : "undefined" != typeof WorkerGlobalScope && + self instanceof WorkerGlobalScope + ? self + : {}, + ); + (e.exports && (e.exports = r), + "undefined" != typeof n.g && (n.g.Prism = r), + (r.languages.markup = { + comment: { pattern: //, greedy: !0 }, + prolog: { pattern: /<\?[\s\S]+?\?>/, greedy: !0 }, + doctype: { + pattern: + /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i, + greedy: !0, + inside: { + "internal-subset": { + pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/, + lookbehind: !0, + greedy: !0, + inside: null, + }, + string: { pattern: /"[^"]*"|'[^']*'/, greedy: !0 }, + punctuation: /^$|[[\]]/, + "doctype-tag": /^DOCTYPE/i, + name: /[^\s<>'"]+/, + }, + }, + cdata: { pattern: //i, greedy: !0 }, + tag: { + pattern: + /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, + greedy: !0, + inside: { + tag: { + pattern: /^<\/?[^\s>\/]+/, + inside: { + punctuation: /^<\/?/, + namespace: /^[^\s>\/:]+:/, + }, + }, + "special-attr": [], + "attr-value": { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, + inside: { + punctuation: [ + { pattern: /^=/, alias: "attr-equals" }, + { pattern: /^(\s*)["']|["']$/, lookbehind: !0 }, + ], + }, + }, + punctuation: /\/?>/, + "attr-name": { + pattern: /[^\s>\/]+/, + inside: { namespace: /^[^\s>\/:]+:/ }, + }, + }, + }, + entity: [ + { pattern: /&[\da-z]{1,8};/i, alias: "named-entity" }, + /&#x?[\da-f]{1,8};/i, + ], + }), + (r.languages.markup.tag.inside["attr-value"].inside.entity = + r.languages.markup.entity), + (r.languages.markup.doctype.inside["internal-subset"].inside = + r.languages.markup), + r.hooks.add("wrap", function (e) { + "entity" === e.type && + (e.attributes.title = e.content.replace(/&/, "&")); + }), + Object.defineProperty(r.languages.markup.tag, "addInlined", { + value: function (e, t) { + var n = {}; + ((n["language-" + t] = { + pattern: /(^$)/i, + lookbehind: !0, + inside: r.languages[t], + }), + (n.cdata = /^$/i)); + var i = { + "included-cdata": { + pattern: //i, + inside: n, + }, + }; + i["language-" + t] = { + pattern: /[\s\S]+/, + inside: r.languages[t], + }; + var o = {}; + ((o[e] = { + pattern: RegExp( + /(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace( + /__/g, + function () { + return e; + }, + ), + "i", + ), + lookbehind: !0, + greedy: !0, + inside: i, + }), + r.languages.insertBefore("markup", "cdata", o)); + }, + }), + Object.defineProperty(r.languages.markup.tag, "addAttribute", { + value: function (e, t) { + r.languages.markup.tag.inside["special-attr"].push({ + pattern: RegExp( + /(^|["'\s])/.source + + "(?:" + + e + + ")" + + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source, + "i", + ), + lookbehind: !0, + inside: { + "attr-name": /^[^\s=]+/, + "attr-value": { + pattern: /=[\s\S]+/, + inside: { + value: { + pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/, + lookbehind: !0, + alias: [t, "language-" + t], + inside: r.languages[t], + }, + punctuation: [ + { pattern: /^=/, alias: "attr-equals" }, + /"|'/, + ], + }, + }, + }, + }); + }, + }), + (r.languages.html = r.languages.markup), + (r.languages.mathml = r.languages.markup), + (r.languages.svg = r.languages.markup), + (r.languages.xml = r.languages.extend("markup", {})), + (r.languages.ssml = r.languages.xml), + (r.languages.atom = r.languages.xml), + (r.languages.rss = r.languages.xml), + (function (e) { + var t = + /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/; + ((e.languages.css = { + comment: /\/\*[\s\S]*?\*\//, + atrule: { + pattern: RegExp( + "@[\\w-](?:" + + /[^;{\s"']|\s+(?!\s)/.source + + "|" + + t.source + + ")*?" + + /(?:;|(?=\s*\{))/.source, + ), + inside: { + rule: /^@[\w-]+/, + "selector-function-argument": { + pattern: + /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/, + lookbehind: !0, + alias: "selector", + }, + keyword: { + pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, + lookbehind: !0, + }, + }, + }, + url: { + pattern: RegExp( + "\\burl\\((?:" + + t.source + + "|" + + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + + ")\\)", + "i", + ), + greedy: !0, + inside: { + function: /^url/i, + punctuation: /^\(|\)$/, + string: { + pattern: RegExp("^" + t.source + "$"), + alias: "url", + }, + }, + }, + selector: { + pattern: RegExp( + "(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|" + + t.source + + ")*(?=\\s*\\{)", + ), + lookbehind: !0, + }, + string: { pattern: t, greedy: !0 }, + property: { + pattern: + /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i, + lookbehind: !0, + }, + important: /!important\b/i, + function: { + pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i, + lookbehind: !0, + }, + punctuation: /[(){};:,]/, + }), + (e.languages.css.atrule.inside.rest = e.languages.css)); + var n = e.languages.markup; + n && + (n.tag.addInlined("style", "css"), + n.tag.addAttribute("style", "css")); + })(r), + (r.languages.clike = { + comment: [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: !0, + greedy: !0, + }, + { pattern: /(^|[^\\:])\/\/.*/, lookbehind: !0, greedy: !0 }, + ], + string: { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: !0, + }, + "class-name": { + pattern: + /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: !0, + inside: { punctuation: /[.\\]/ }, + }, + keyword: + /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/, + boolean: /\b(?:false|true)\b/, + function: /\b\w+(?=\()/, + number: + /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i, + operator: /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + punctuation: /[{}[\];(),.:]/, + }), + (r.languages.javascript = r.languages.extend("clike", { + "class-name": [ + r.languages.clike["class-name"], + { + pattern: + /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/, + lookbehind: !0, + }, + ], + keyword: [ + { pattern: /((?:^|\})\s*)catch\b/, lookbehind: !0 }, + { + pattern: + /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: !0, + }, + ], + function: + /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + number: { + pattern: RegExp( + /(^|[^\w$])/.source + + "(?:" + + /NaN|Infinity/.source + + "|" + + /0[bB][01]+(?:_[01]+)*n?/.source + + "|" + + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + + "|" + + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + + "|" + + /\d+(?:_\d+)*n/.source + + "|" + + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/ + .source + + ")" + + /(?![\w$])/.source, + ), + lookbehind: !0, + }, + operator: + /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/, + })), + (r.languages.javascript["class-name"][0].pattern = + /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/), + r.languages.insertBefore("javascript", "keyword", { + regex: { + pattern: RegExp( + /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/ + .source + + /\//.source + + "(?:" + + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/ + .source + + "|" + + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/ + .source + + ")" + + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/ + .source, + ), + lookbehind: !0, + greedy: !0, + inside: { + "regex-source": { + pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, + lookbehind: !0, + alias: "language-regex", + inside: r.languages.regex, + }, + "regex-delimiter": /^\/|\/$/, + "regex-flags": /^[a-z]+$/, + }, + }, + "function-variable": { + pattern: + /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/, + alias: "function", + }, + parameter: [ + { + pattern: + /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/, + lookbehind: !0, + inside: r.languages.javascript, + }, + { + pattern: + /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i, + lookbehind: !0, + inside: r.languages.javascript, + }, + { + pattern: + /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/, + lookbehind: !0, + inside: r.languages.javascript, + }, + { + pattern: + /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/, + lookbehind: !0, + inside: r.languages.javascript, + }, + ], + constant: /\b[A-Z](?:[A-Z_]|\dx?)*\b/, + }), + r.languages.insertBefore("javascript", "string", { + hashbang: { pattern: /^#!.*/, greedy: !0, alias: "comment" }, + "template-string": { + pattern: + /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, + greedy: !0, + inside: { + "template-punctuation": { + pattern: /^`|`$/, + alias: "string", + }, + interpolation: { + pattern: + /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, + lookbehind: !0, + inside: { + "interpolation-punctuation": { + pattern: /^\$\{|\}$/, + alias: "punctuation", + }, + rest: r.languages.javascript, + }, + }, + string: /[\s\S]+/, + }, + }, + "string-property": { + pattern: + /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m, + lookbehind: !0, + greedy: !0, + alias: "property", + }, + }), + r.languages.insertBefore("javascript", "operator", { + "literal-property": { + pattern: + /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m, + lookbehind: !0, + alias: "property", + }, + }), + r.languages.markup && + (r.languages.markup.tag.addInlined("script", "javascript"), + r.languages.markup.tag.addAttribute( + /on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/ + .source, + "javascript", + )), + (r.languages.js = r.languages.javascript), + (function () { + if (void 0 !== r && "undefined" != typeof document) { + Element.prototype.matches || + (Element.prototype.matches = + Element.prototype.msMatchesSelector || + Element.prototype.webkitMatchesSelector); + var e = { + js: "javascript", + py: "python", + rb: "ruby", + ps1: "powershell", + psm1: "powershell", + sh: "bash", + bat: "batch", + h: "c", + tex: "latex", + }, + t = "data-src-status", + n = "loading", + i = "loaded", + o = + "pre[data-src]:not([" + + t + + '="' + + i + + '"]):not([' + + t + + '="' + + n + + '"])'; + (r.hooks.add("before-highlightall", function (e) { + e.selector += ", " + o; + }), + r.hooks.add("before-sanity-check", function (a) { + var s = a.element; + if (s.matches(o)) { + ((a.code = ""), s.setAttribute(t, n)); + var u = s.appendChild(document.createElement("CODE")); + u.textContent = "Loading…"; + var c = s.getAttribute("data-src"), + l = a.language; + if ("none" === l) { + var d = (/\.(\w+)$/.exec(c) || [, "none"])[1]; + l = e[d] || d; + } + (r.util.setLanguage(u, l), r.util.setLanguage(s, l)); + var f = r.plugins.autoloader; + (f && f.loadLanguages(l), + (function (e, t, n) { + var r = new XMLHttpRequest(); + (r.open("GET", e, !0), + (r.onreadystatechange = function () { + 4 == r.readyState && + (r.status < 400 && r.responseText + ? t(r.responseText) + : r.status >= 400 + ? n( + "✖ Error " + + r.status + + " while fetching file: " + + r.statusText, + ) + : n( + "✖ Error: File does not exist or is empty", + )); + }), + r.send(null)); + })( + c, + function (e) { + s.setAttribute(t, i); + var n = (function (e) { + var t = + /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec( + e || "", + ); + if (t) { + var n = Number(t[1]), + r = t[2], + i = t[3]; + return r + ? i + ? [n, Number(i)] + : [n, undefined] + : [n, n]; + } + return undefined; + })(s.getAttribute("data-range")); + if (n) { + var o = e.split(/\r\n?|\n/g), + a = n[0], + c = null == n[1] ? o.length : n[1]; + (a < 0 && (a += o.length), + (a = Math.max(0, Math.min(a - 1, o.length))), + c < 0 && (c += o.length), + (c = Math.max(0, Math.min(c, o.length))), + (e = o.slice(a, c).join("\n")), + s.hasAttribute("data-start") || + s.setAttribute( + "data-start", + String(a + 1), + )); + } + ((u.textContent = e), r.highlightElement(u)); + }, + function (e) { + (s.setAttribute(t, "failed"), + (u.textContent = e)); + }, + )); + } + }), + (r.plugins.fileHighlight = { + highlight: function (e) { + for ( + var t, n = (e || document).querySelectorAll(o), i = 0; + (t = n[i++]); + ) + r.highlightElement(t); + }, + })); + var a = !1; + r.fileHighlight = function () { + (a || + (console.warn( + "Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.", + ), + (a = !0)), + r.plugins.fileHighlight.highlight.apply(this, arguments)); + }; + } + })()); + }, + 8926: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(8323)), + o = r(n(1452)), + a = r(n(2053)); + t.A = { + components: { + TkComments: i["default"], + TkFooter: o["default"], + TkAdmin: a["default"], + }, + data: function () { + return { showAdmin: !1, showAdminEntry: !1 }; + }, + methods: { + onShowAdminEntry: function (e) { + this.showAdminEntry = e; + }, + }, + }; + }, + 3397: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(3491)), + o = r(n(6370)), + a = r(n(6359)), + s = r(n(5910)); + t.A = { + data: function () { + return { + iconComment: i["default"], + iconCommentSolid: o["default"], + iconLike: a["default"], + iconLikeSolid: s["default"], + }; + }, + props: { + liked: Boolean, + likeCount: Number, + repliesCount: Number, + }, + computed: { + likeCountStr: function () { + return this.likeCount > 0 ? "".concat(this.likeCount) : ""; + }, + repliesCountStr: function () { + return this.repliesCount > 0 + ? "".concat(this.repliesCount) + : ""; + }, + }, + methods: { + onLike: function (e) { + (e.preventDefault(), this.$emit("like")); + }, + onReply: function (e) { + (e.preventDefault(), this.$emit("reply")); + }, + }, + }; + }, + 4238: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = r(n(2889)), + s = r(n(8559)), + u = r(n(1140)), + c = r(n(9985)), + l = r(n(9097)), + d = n(8129), + f = r(n(9671)); + t.A = { + components: { + TkAdminComment: s["default"], + TkAdminConfig: u["default"], + TkAdminImport: c["default"], + TkAdminExport: l["default"], + }, + props: { show: Boolean }, + data: function () { + return { + iconClose: f["default"], + loading: !0, + version: "", + needUpdate: !1, + isLogin: !1, + isSetPassword: !0, + isSetCredentials: !1, + credentials: "", + password: "", + passwordConfirm: "", + loginErrorMessage: "", + activeTabName: "comment", + }; + }, + computed: { + canRegist: function () { + return ( + !this.isSetPassword && + !!this.password && + this.password === this.passwordConfirm && + (this.isSetCredentials || this.credentials) + ); + }, + }, + methods: { + t: d.t, + onLogin: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r; + return i["default"].wrap( + function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (e.password) { + t.next = 3; + break; + } + return ( + (e.loginErrorMessage = (0, d.t)( + "ADMIN_PASSWORD_REQUIRED", + )), + t.abrupt("return") + ); + case 3: + return ( + (e.loading = !0), + (e.loginErrorMessage = ""), + (n = (0, a["default"])(e.password)), + (t.next = 8), + (0, d.call)(e.$tcb, "LOGIN", { password: n }) + ); + case 8: + if (!(r = t.sent).result.message) { + t.next = 13; + break; + } + ((e.loginErrorMessage = r.result.message), + (t.next = 28)); + break; + case 13: + if (!r.result.ticket) { + t.next = 27; + break; + } + return ( + (t.prev = 14), + (t.next = 17), + e.$tcb.auth + .customAuthProvider() + .signIn(r.result.ticket) + ); + case 17: + (d.logger.log("登录成功"), + (e.password = ""), + e.checkAuth(), + (t.next = 25)); + break; + case 22: + ((t.prev = 22), + (t.t0 = t["catch"](14)), + d.logger.error("登录失败", t.t0)); + case 25: + t.next = 28; + break; + case 27: + 0 === r.result.code && + (d.logger.log("登录成功"), + localStorage.setItem( + "twikoo-access-token", + n, + ), + (e.password = ""), + e.checkAuth()); + case 28: + e.loading = !1; + case 29: + case "end": + return t.stop(); + } + }, + t, + null, + [[14, 22]], + ); + }), + )(); + }, + onLogout: function (e) { + var t = this; + return (0, o["default"])( + i["default"].mark(function n() { + return i["default"].wrap(function (n) { + for (;;) + switch ((n.prev = n.next)) { + case 0: + if ( + (e.preventDefault(), (t.loading = !0), !t.$tcb) + ) { + n.next = 9; + break; + } + return ((n.next = 5), t.$tcb.auth.signOut()); + case 5: + return ( + (n.next = 7), + t.$tcb.auth.anonymousAuthProvider().signIn() + ); + case 7: + n.next = 10; + break; + case 9: + localStorage.removeItem("twikoo-access-token"); + case 10: + ((t.isLogin = !1), (t.loading = !1)); + case 12: + case "end": + return n.stop(); + } + }, n); + }), + )(); + }, + onRegist: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (e.loading = !0), + (n = (0, a["default"])(e.password)), + (t.next = 4), + (0, d.call)(e.$tcb, "SET_PASSWORD", { + password: n, + credentials: e.credentials, + }) + ); + case 4: + ((r = t.sent).result.code + ? ((e.loginErrorMessage = (0, d.t)( + "ADMIN_REGIST_FAILED", + )), + r.result.message && + (e.loginErrorMessage += + "," + r.result.message), + d.logger.warn("Twikoo 注册失败", r)) + : ((e.passwordMd5 = ""), + (e.isSetPassword = !0), + e.onLogin()), + (e.loading = !1)); + case 7: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + onShow: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (e.loading = !0), + (t.next = 3), + e.checkAuth() + ); + case 3: + if (e.isLogin) { + t.next = 7; + break; + } + return ((t.next = 6), e.checkIfPasswordSet()); + case 6: + e.focusPassword(); + case 7: + e.loading = !1; + case 8: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + focusPassword: function () { + var e = this; + setTimeout(function () { + e.$refs.focusme && e.$refs.focusme.focus(); + }, 500); + }, + checkAuth: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (!e.$tcb) { + t.next = 7; + break; + } + return ( + (t.next = 3), + e.$tcb.auth.getCurrenUser() + ); + case 3: + ((n = t.sent), + (e.isLogin = "CUSTOM" === n.loginType), + (t.next = 11)); + break; + case 7: + return ( + (t.next = 9), + (0, d.call)(e.$tcb, "GET_CONFIG") + ); + case 9: + (r = t.sent) && + r.result && + r.result.config && + (e.isLogin = r.result.config.IS_ADMIN); + case 11: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + checkIfPasswordSet: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap( + function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (t.prev = 0), + (t.next = 3), + (0, d.call)(e.$tcb, "GET_PASSWORD_STATUS") + ); + case 3: + ((n = t.sent), + (e.version = n.result.version), + (e.isSetPassword = n.result.status), + (e.isSetCredentials = !e.$tcb), + (t.next = 14)); + break; + case 9: + throw ( + (t.prev = 9), + (t.t0 = t["catch"](0)), + (e.needUpdate = !0), + (e.loading = !1), + t.t0 + ); + case 14: + case "end": + return t.stop(); + } + }, + t, + null, + [[0, 9]], + ); + }), + )(); + }, + onClose: function (e) { + (e.preventDefault(), this.$emit("close")); + }, + }, + watch: { + show: function (e) { + e && this.onShow(); + }, + }, + }; + }, + 4555: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(1085), + s = n(8129), + u = n(2199), + c = r(n(4785)), + l = r(n(6431)); + t.A = { + components: { + TkAvatar: c["default"], + TkPagination: l["default"], + }, + data: function () { + return { + loading: !0, + comments: [], + serverConfig: {}, + serverVersion: this.$twikoo.serverConfig.VERSION, + clientVersion: u.version, + count: 0, + pageSize: 5, + currentPage: 1, + filter: { keyword: "", type: "" }, + }; + }, + methods: { + t: s.t, + displayCreated: function (e) { + return (0, s.timeago)(e.created); + }, + convertLink: function (e) { + return (0, s.convertLink)(e); + }, + getComments: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (e.loading = !0), + (t.next = 3), + (0, s.call)(e.$tcb, "COMMENT_GET_FOR_ADMIN", { + per: e.pageSize, + page: e.currentPage, + keyword: e.filter.keyword, + type: e.filter.type, + }) + ); + case 3: + ((n = t.sent).result && + !n.result.code && + ((e.count = n.result.count), + (e.comments = n.result.data)), + e.$nextTick(function () { + ((0, s.renderLinks)(e.$refs.comments), + (0, s.renderMath)( + e.$refs["comment-list"], + e.$twikoo.katex, + ), + e.highlightCode()); + }), + (e.loading = !1)); + case 7: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + getConfig: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (t.next = 2), + (0, s.call)(e.$tcb, "GET_CONFIG_FOR_ADMIN") + ); + case 2: + (n = t.sent).result && + !n.result.code && + ((e.serverConfig = n.result.config), + e.checkConfig()); + case 4: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + checkConfig: function () { + var e = this; + this.serverConfig.HIGHLIGHT || + (this.serverConfig.HIGHLIGHT = "true"); + var t = {}, + n = localStorage.getItem("twikoo"); + (n && (t = JSON.parse(n)), + ["nick", "mail", "avatar"].forEach(function (n) { + t[n] + ? (e.serverConfig[n] = t[n]) + : (e.serverConfig[n] = ""); + }), + !t.nick && + this.serverConfig.BLOGGER_NICK && + (t.nick = this.serverConfig.BLOGGER_NICK), + !t.mail && + this.serverConfig.BLOGGER_EMAIL && + (t.mail = this.serverConfig.BLOGGER_EMAIL), + !t.link && + this.serverConfig.SITE_URL && + (t.link = this.serverConfig.SITE_URL), + localStorage.setItem("twikoo", JSON.stringify(t)), + a.app.$emit("initMeta")); + }, + onPageSizeChange: function (e) { + ((this.pageSize = e), this.getComments()); + }, + switchPage: function (e) { + ((this.currentPage = e), this.getComments()); + }, + handleView: function (e) { + window.open("".concat(e.url, "#").concat(e._id)); + }, + handleDelete: function (e) { + var t = this; + return (0, o["default"])( + i["default"].mark(function n() { + return i["default"].wrap(function (n) { + for (;;) + switch ((n.prev = n.next)) { + case 0: + if ( + confirm( + (0, s.t)("ADMIN_COMMENT_DELETE_CONFIRM"), + ) + ) { + n.next = 2; + break; + } + return n.abrupt("return"); + case 2: + return ( + (t.loading = !0), + (n.next = 5), + (0, s.call)( + t.$tcb, + "COMMENT_DELETE_FOR_ADMIN", + { id: e._id }, + ) + ); + case 5: + return ((n.next = 7), t.getComments()); + case 7: + t.loading = !1; + case 8: + case "end": + return n.stop(); + } + }, n); + }), + )(); + }, + handleSpam: function (e, t) { + this.setComment(e, { isSpam: t }); + }, + handleTop: function (e, t) { + this.setComment(e, { top: t }); + }, + setComment: function (e, t) { + var n = this; + return (0, o["default"])( + i["default"].mark(function r() { + return i["default"].wrap(function (r) { + for (;;) + switch ((r.prev = r.next)) { + case 0: + return ( + (n.loading = !0), + (r.next = 3), + (0, s.call)(n.$tcb, "COMMENT_SET_FOR_ADMIN", { + id: e._id, + set: t, + }) + ); + case 3: + return ((r.next = 5), n.getComments()); + case 5: + n.loading = !1; + case 6: + case "end": + return r.stop(); + } + }, r); + }), + )(); + }, + highlightCode: function () { + "true" === this.serverConfig.HIGHLIGHT && + (0, s.renderCode)( + this.$refs["comment-list"], + this.serverConfig.HIGHLIGHT_THEME, + this.serverConfig.HIGHLIGHT_PLUGIN, + ); + }, + }, + mounted: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (t.next = 2), + Promise.all([e.getConfig(), e.getComments()]) + ); + case 2: + e.highlightCode(); + case 3: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + }; + }, + 4868: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(8129), + s = n(2199); + function u(e, t) { + var n = + ("undefined" != typeof Symbol && e[Symbol.iterator]) || + e["@@iterator"]; + if (!n) { + if ( + Array.isArray(e) || + (n = (function (e, t) { + if (e) { + if ("string" == typeof e) return c(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return ( + "Object" === n && + e.constructor && + (n = e.constructor.name), + "Map" === n || "Set" === n + ? Array.from(e) + : "Arguments" === n || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ? c(e, t) + : void 0 + ); + } + })(e)) || + (t && e && "number" == typeof e.length) + ) { + n && (e = n); + var r = 0, + i = function () {}; + return { + s: i, + n: function () { + return r >= e.length + ? { done: !0 } + : { done: !1, value: e[r++] }; + }, + e: function (e) { + throw e; + }, + f: i, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + } + var o, + a = !0, + s = !1; + return { + s: function () { + n = n.call(e); + }, + n: function () { + var e = n.next(); + return ((a = e.done), e); + }, + e: function (e) { + ((s = !0), (o = e)); + }, + f: function () { + try { + a || null == n["return"] || n["return"](); + } finally { + if (s) throw o; + } + }, + }; + } + function c(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r; + } + t.A = { + data: function () { + return { + loading: !0, + settings: [ + { + name: (0, a.t)("ADMIN_CONFIG_CATEGORY_COMMON"), + items: [ + { + key: "SITE_NAME", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SITE_NAME"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "虹墨空间站", + ), + value: "", + }, + { + key: "SITE_URL", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SITE_URL"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "https://www.imaegoo.com", + ), + value: "", + }, + { + key: "CORS_ALLOW_ORIGIN", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_CORS_ALLOW_ORIGIN"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "https://www.imaegoo.com", + ), + value: "", + }, + { + key: "BLOGGER_NICK", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_BLOGGER_NICK"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "iMaeGoo", + ), + value: "", + }, + { + key: "BLOGGER_EMAIL", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_BLOGGER_EMAIL"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "12345@qq.com", + ), + value: "", + }, + { + key: "COMMENT_PAGE_SIZE", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_COMMENT_PAGE_SIZE"), + ph: "".concat((0, a.t)("ADMIN_CONFIG_EXAMPLE"), "8"), + value: "", + }, + { + key: "MASTER_TAG", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_MASTER_TAG"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "站长", + ), + value: "", + }, + { + key: "COMMENT_BG_IMG", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_COMMENT_BG_IMG"), + ph: "", + value: "", + }, + { + key: "GRAVATAR_CDN", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_GRAVATAR_CDN"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "sdn.geekzu.org", + ), + value: "", + }, + { + key: "DEFAULT_GRAVATAR", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_DEFAULT_GRAVATAR"), + ph: "".concat((0, a.t)("ADMIN_CONFIG_EXAMPLE"), "mp"), + value: "", + }, + { + key: "COMMENT_PLACEHOLDER", + desc: (0, a.t)( + "ADMIN_CONFIG_ITEM_COMMENT_PLACEHOLDER", + ), + ph: "".concat((0, a.t)("ADMIN_CONFIG_EXAMPLE")), + value: "", + }, + { + key: "DISPLAYED_FIELDS", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_DISPLAYED_FIELDS"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "nick,mail,link", + ), + value: "", + }, + { + key: "REQUIRED_FIELDS", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_REQUIRED_FIELDS"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "nick,mail,link", + ), + value: "", + }, + { + key: "HIDE_ADMIN_CRYPT", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_HIDE_ADMIN_CRYPT"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "admin", + ), + value: "", + }, + ], + }, + { + name: (0, a.t)("ADMIN_CONFIG_CATEGORY_PLUGIN"), + items: [ + { + key: "SHOW_IMAGE", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SHOW_IMAGE"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "false", + ), + value: "", + }, + { + key: "IMAGE_CDN", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_IMAGE_CDN"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "qcloud", + ), + value: "", + }, + { + key: "IMAGE_CDN_URL", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_IMAGE_CDN_URL"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "https://piclist.example.com", + ), + value: "", + }, + { + key: "IMAGE_CDN_TOKEN", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_IMAGE_CDN_TOKEN"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "example", + ), + value: "", + }, + { + key: "SHOW_EMOTION", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SHOW_EMOTION"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "false", + ), + value: "", + }, + { + key: "EMOTION_CDN", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_EMOTION_CDN"), + ph: "", + value: "", + }, + { + key: "HIGHLIGHT", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_HIGHLIGHT"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "false", + ), + value: "", + }, + { + key: "HIGHLIGHT_THEME", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_HIGHLIGHT_THEME"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "tomorrow", + ), + value: "", + }, + { + key: "HIGHLIGHT_PLUGIN", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_HIGHLIGHT_PLUGIN"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "showLanguage", + ), + value: "", + }, + { + key: "LIGHTBOX", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_LIGHTBOX"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "true", + ), + value: "", + }, + ], + }, + { + name: (0, a.t)("ADMIN_CONFIG_CATEGORY_PRIVACY"), + items: [ + { + key: "SHOW_UA", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SHOW_UA"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "false", + ), + value: "", + }, + { + key: "SHOW_REGION", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SHOW_REGION"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "true", + ), + value: "", + }, + ], + }, + { + name: (0, a.t)("ADMIN_CONFIG_CATEGORY_SPAM"), + items: [ + { + key: "AKISMET_KEY", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_AKISMET_KEY"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "8651783edxxx", + ), + value: "", + }, + { + key: "QCLOUD_SECRET_ID", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_QCLOUD_SECRET_ID"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "AKI******************************IHw", + ), + value: "", + }, + { + key: "QCLOUD_SECRET_KEY", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_QCLOUD_SECRET_KEY"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "Xrk**************************3D7", + ), + value: "", + secret: !0, + }, + { + key: "QCLOUD_CMS_BIZTYPE", + desc: (0, a.t)( + "ADMIN_CONFIG_ITEM_QCLOUD_CMS_BIZTYPE", + ), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "1787728329856520192", + ), + value: "", + }, + { + key: "LIMIT_PER_MINUTE", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_LIMIT_PER_MINUTE"), + ph: "".concat((0, a.t)("ADMIN_CONFIG_EXAMPLE"), "5"), + value: "", + }, + { + key: "LIMIT_PER_MINUTE_ALL", + desc: (0, a.t)( + "ADMIN_CONFIG_ITEM_LIMIT_PER_MINUTE_ALL", + ), + ph: "".concat((0, a.t)("ADMIN_CONFIG_EXAMPLE"), "5"), + value: "", + }, + { + key: "LIMIT_LENGTH", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_LIMIT_LENGTH"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "100", + ), + value: "", + }, + { + key: "FORBIDDEN_WORDS", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_FORBIDDEN_WORDS"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "快递,空包", + ), + value: "", + }, + { + key: "BLOCKED_WORDS", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_BLOCKED_WORDS"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "快递,空包", + ), + value: "", + }, + { + key: "NOTIFY_SPAM", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_NOTIFY_SPAM"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "false", + ), + value: "", + }, + { + key: "TURNSTILE_SITE_KEY", + desc: (0, a.t)( + "ADMIN_CONFIG_ITEM_TURNSTILE_SITE_KEY", + ), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "0x4AAAAAAAPLTtpBr_T12345", + ), + value: "", + }, + { + key: "TURNSTILE_SECRET_KEY", + desc: (0, a.t)( + "ADMIN_CONFIG_ITEM_TURNSTILE_SECRET_KEY", + ), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "0x4AAAAAAAPLTmBm6gHmOnOqC1iwmU12345", + ), + value: "", + secret: !0, + }, + ], + }, + { + name: (0, a.t)("ADMIN_CONFIG_CATEGORY_IM"), + items: [ + { + key: "PUSHOO_CHANNEL", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_PUSHOO_CHANNEL"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "pushdeer", + ), + value: "", + }, + { + key: "PUSHOO_TOKEN", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_PUSHOO_TOKEN"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "PDU431TfFHZICvR6lJrFBswSRN1cJ*****zzFvR", + ), + value: "", + }, + { + key: "SC_MAIL_NOTIFY", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SC_MAIL_NOTIFY"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "true", + ), + value: "", + }, + ], + }, + { + name: (0, a.t)("ADMIN_CONFIG_CATEGORY_MAIL"), + items: [ + { + key: "SENDER_EMAIL", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SENDER_EMAIL"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "blog@imaegoo.com", + ), + value: "", + }, + { + key: "SENDER_NAME", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SENDER_NAME"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "虹墨空间站评论提醒", + ), + value: "", + }, + { + key: "SMTP_SERVICE", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SMTP_SERVICE"), + ph: "".concat((0, a.t)("ADMIN_CONFIG_EXAMPLE"), "QQ"), + value: "", + }, + { + key: "SMTP_HOST", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SMTP_HOST"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "smtp.qq.com", + ), + value: "", + }, + { + key: "SMTP_PORT", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SMTP_PORT"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "465", + ), + value: "", + }, + { + key: "SMTP_SECURE", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SMTP_SECURE"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "true", + ), + value: "", + }, + { + key: "SMTP_USER", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SMTP_USER"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "blog@imaegoo.com", + ), + value: "", + }, + { + key: "SMTP_PASS", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_SMTP_PASS"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "password", + ), + value: "", + secret: !0, + }, + { + key: "MAIL_SUBJECT", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_MAIL_SUBJECT"), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "您在虹墨空间站上的评论收到了回复", + ), + value: "", + }, + { + key: "MAIL_TEMPLATE", + desc: (0, a.t)("ADMIN_CONFIG_ITEM_MAIL_TEMPLATE"), + ph: "", + value: "", + }, + { + key: "MAIL_SUBJECT_ADMIN", + desc: (0, a.t)( + "ADMIN_CONFIG_ITEM_MAIL_SUBJECT_ADMIN", + ), + ph: "".concat( + (0, a.t)("ADMIN_CONFIG_EXAMPLE"), + "虹墨空间站上有新评论了", + ), + value: "", + }, + { + key: "MAIL_TEMPLATE_ADMIN", + desc: (0, a.t)( + "ADMIN_CONFIG_ITEM_MAIL_TEMPLATE_ADMIN", + ), + ph: "", + value: "", + }, + ], + }, + ], + serverConfig: {}, + serverVersion: this.$twikoo.serverConfig.VERSION, + clientVersion: s.version, + message: "", + emailTestAddress: "", + emailTestResult: "", + }; + }, + methods: { + t: a.t, + readConfig: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (e.loading = !0), + (t.next = 3), + (0, a.call)(e.$tcb, "GET_CONFIG_FOR_ADMIN") + ); + case 3: + ((n = t.sent).result && + !n.result.code && + ((e.serverConfig = n.result.config), + e.resetConfig()), + (e.loading = !1)); + case 6: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + resetConfig: function () { + var e, + t = u(this.settings); + try { + for (t.s(); !(e = t.n()).done; ) { + var n, + r = u(e.value.items); + try { + for (r.s(); !(n = r.n()).done; ) { + var i = n.value; + this.serverConfig[i.key] && + (i.value = this.serverConfig[i.key]); + } + } catch (o) { + r.e(o); + } finally { + r.f(); + } + } + } catch (o) { + t.e(o); + } finally { + t.f(); + } + }, + saveConfig: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r, o, s, c, l, d, f, p; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + ((e.loading = !0), + (e.message = "正在保存"), + (n = {}), + (r = u(e.settings))); + try { + for (r.s(); !(o = r.n()).done; ) { + ((s = o.value), (c = u(s.items))); + try { + for (c.s(); !(l = c.n()).done; ) + ((d = l.value), + (f = e.serverConfig[d.key]), + (p = d.value), + f !== p && (n[d.key] = d.value)); + } catch (i) { + c.e(i); + } finally { + c.f(); + } + } + } catch (i) { + r.e(i); + } finally { + r.f(); + } + return ( + a.logger.log("保存配置", n), + (t.next = 8), + (0, a.call)(e.$tcb, "SET_CONFIG", { config: n }) + ); + case 8: + return ((t.next = 10), e.readConfig()); + case 10: + ((e.message = "保存成功"), (e.loading = !1)); + case 12: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + testEmail: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (e.loading = !0), + (t.next = 3), + (0, a.call)(e.$tcb, "EMAIL_TEST", { + mail: e.emailTestAddress, + }) + ); + case 3: + ((n = t.sent), + a.logger.log("邮件测试", n), + (e.emailTestResult = JSON.stringify(n)), + (e.loading = !1)); + case 7: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + }, + mounted: function () { + this.readConfig(); + }, + }; + }, + 3396: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(8129); + t.A = { + data: function () { + return { loading: !1 }; + }, + methods: { + t: a.t, + doExport: function (e) { + var t = this; + return (0, o["default"])( + i["default"].mark(function n() { + var r; + return i["default"].wrap( + function (n) { + for (;;) + switch ((n.prev = n.next)) { + case 0: + return ( + (t.loading = !0), + (n.prev = 1), + (n.next = 4), + (0, a.call)( + t.$tcb, + "COMMENT_EXPORT_FOR_ADMIN", + { collection: e }, + ) + ); + case 4: + (r = n.sent).result.data && + t.downloadJson( + "twikoo-".concat(e, ".json"), + r.result.data, + ); + case 6: + return ( + (n.prev = 6), + (t.loading = !1), + n.finish(6) + ); + case 9: + case "end": + return n.stop(); + } + }, + n, + null, + [[1, , 6, 9]], + ); + }), + )(); + }, + downloadJson: function (e, t) { + var n = t instanceof Object ? JSON.stringify(t, null, 2) : t, + r = window.URL || window.webkitURL || window, + i = new Blob([n]), + o = document.createElementNS( + "http://www.w3.org/1999/xhtml", + "a", + ); + ((o.href = r.createObjectURL(i)), + (o.download = e), + o.click()); + }, + }, + }; + }, + 9865: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(8129); + t.A = { + data: function () { + return { + loading: !1, + source: "", + logText: "", + warnText: { + valine: (0, a.t)("ADMIN_IMPORT_TIP_VALINE"), + disqus: (0, a.t)("ADMIN_IMPORT_TIP_DISQUS"), + artalk: (0, a.t)("ADMIN_IMPORT_TIP_ARTALK"), + artalk2: "", + twikoo: "", + }, + }; + }, + methods: { + t: a.t, + uploadFile: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r; + return i["default"].wrap( + function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (e.source) { + t.next = 3; + break; + } + return ( + e.log( + (0, a.t)("ADMIN_IMPORT_SOURCE_REQUIRED"), + ), + t.abrupt("return") + ); + case 3: + if ((n = e.$refs.inputFile.files[0])) { + t.next = 7; + break; + } + return ( + e.log((0, a.t)("ADMIN_IMPORT_FILE_REQUIRED")), + t.abrupt("return") + ); + case 7: + if ( + (e.log((0, a.t)("ADMIN_IMPORT_START")), + (e.loading = !0), + (t.prev = 9), + !e.$tcb) + ) { + t.next = 19; + break; + } + return ( + (t.next = 13), + e.$tcb.app.uploadFile({ + cloudPath: "import/".concat(Date.now()), + filePath: n, + onUploadProgress: function (t) { + var n = Math.round( + (100 * t.loaded) / t.total, + ); + e.log( + "" + .concat( + (0, a.t)("ADMIN_IMPORT_UPLOADING"), + ) + .concat(n, "%"), + ); + }, + }) + ); + case 13: + return ( + (r = t.sent), + e.log( + "" + .concat((0, a.t)("ADMIN_IMPORT_UPLOADED")) + .concat(r.fileID), + ), + (t.next = 17), + e.importFile(r.fileID) + ); + case 17: + t.next = 21; + break; + case 19: + return ((t.next = 21), e.importFileToVercel(n)); + case 21: + t.next = 27; + break; + case 23: + ((t.prev = 23), + (t.t0 = t["catch"](9)), + console.error(t.t0), + e.log(t.t0.message)); + case 27: + e.loading = !1; + case 28: + case "end": + return t.stop(); + } + }, + t, + null, + [[9, 23]], + ); + }), + )(); + }, + importFile: function (e) { + var t = this; + return (0, o["default"])( + i["default"].mark(function n() { + var r; + return i["default"].wrap(function (n) { + for (;;) + switch ((n.prev = n.next)) { + case 0: + return ( + t.log( + "" + .concat((0, a.t)("ADMIN_IMPORT_IMPORTING")) + .concat(t.source), + ), + (n.next = 3), + (0, a.call)( + t.$tcb, + "COMMENT_IMPORT_FOR_ADMIN", + { fileId: e, source: t.source }, + ) + ); + case 3: + ((r = n.sent), + (t.logText += r.result.log), + t.log( + "" + .concat((0, a.t)("ADMIN_IMPORT_IMPORTED")) + .concat(t.source), + )); + case 6: + case "end": + return n.stop(); + } + }, n); + }), + )(); + }, + importFileToVercel: function (e) { + var t = this; + return (0, o["default"])( + i["default"].mark(function n() { + var r; + return i["default"].wrap(function (n) { + for (;;) + switch ((n.prev = n.next)) { + case 0: + return ( + t.log( + "" + .concat((0, a.t)("ADMIN_IMPORT_IMPORTING")) + .concat(t.source), + ), + (n.t0 = a.call), + (n.t1 = t.$tcb), + (n.next = 5), + (0, a.readAsText)(e) + ); + case 5: + return ( + (n.t2 = n.sent), + (n.t3 = t.source), + (n.t4 = { file: n.t2, source: n.t3 }), + (n.next = 10), + (0, n.t0)( + n.t1, + "COMMENT_IMPORT_FOR_ADMIN", + n.t4, + ) + ); + case 10: + ((r = n.sent), + (t.logText += r.result.log), + t.log( + "" + .concat((0, a.t)("ADMIN_IMPORT_IMPORTED")) + .concat(t.source), + )); + case 13: + case "end": + return n.stop(); + } + }, n); + }), + )(); + }, + log: function (e) { + ((this.logText += "" + .concat(new Date().toLocaleString(), " ") + .concat(e, "\n")), + this.$nextTick(this.scrollLogToBottom)); + }, + scrollLogToBottom: function () { + if (this.$refs.logTextArea) { + var e = this.$refs.logTextArea.$refs.textarea; + e.scrollTop = e.scrollHeight; + } + }, + }, + }; + }, + 4064: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(2889)), + o = n(823), + a = n(8129), + s = r(n(9587)); + t.A = { + props: { + config: Object, + avatar: String, + nick: String, + mail: String, + mailMd5: String, + link: String, + }, + data: function () { + return { iconUser: s["default"] }; + }, + computed: { + gravatarCdn: function () { + return this.config && this.config.GRAVATAR_CDN + ? this.config.GRAVATAR_CDN + : "weavatar.com"; + }, + defaultGravatar: function () { + return this.config && this.config.DEFAULT_GRAVATAR + ? this.config.DEFAULT_GRAVATAR + : "initials&name=".concat(this.nick); + }, + avatarInner: function () { + if (this.avatar) return this.avatar; + if (this.mailMd5) + return "https://" + .concat(this.gravatarCdn, "/avatar/") + .concat(this.mailMd5, "?d=") + .concat(this.defaultGravatar); + if (this.mail && (0, a.isQQ)(this.mail)) + return (0, a.getQQAvatar)(this.mail); + if (this.mail) { + var e = + "cravatar.cn" === this.gravatarCdn + ? i["default"] + : o.sha256; + return "https://" + .concat(this.gravatarCdn, "/avatar/") + .concat(e((0, a.normalizeMail)(this.mail)), "?d=") + .concat(this.defaultGravatar); + } + return ""; + }, + }, + methods: { + onClick: function () { + (this.$emit("click"), + this.link && + (window.open( + (0, a.convertLink)(this.link), + "_blank", + ).opener = null)); + }, + }, + }; + }, + 3572: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(8129), + s = r(n(7454)), + u = r(n(4785)), + c = r(n(5438)), + l = r(n(2531)), + d = r(n(9396)), + f = r(n(6937)), + p = r(n(8974)), + h = r(n(7397)), + m = r(n(58)), + g = r(n(8443)), + v = r(n(740)), + _ = r(n(3793)), + y = r(n(7051)), + b = r(n(9039)), + k = r(n(3982)), + w = { + win: l["default"], + mac: d["default"], + ipad: d["default"], + iphone: d["default"], + ios: d["default"], + android: f["default"], + ubuntu: h["default"], + linux: p["default"], + }, + E = { + edge: y["default"], + chrome: m["default"], + firefox: g["default"], + safari: v["default"], + explorer: _["default"], + ie: _["default"], + }; + t.A = { + name: "tk-comment", + components: { + TkAction: s["default"], + TkAvatar: u["default"], + TkSubmit: c["default"], + }, + data: function () { + return { + pid: "", + like: 0, + liked: !1, + likeLoading: !1, + isExpanded: !1, + hasExpand: !1, + isContentExpanded: !1, + hasContentExpand: !1, + isLogin: !1, + }; + }, + props: { + comment: Object, + replyId: String, + replying: Boolean, + config: Object, + }, + computed: { + displayCreated: function () { + return (0, a.timeago)(this.comment.created); + }, + jsonTimestamp: function () { + return new Date(this.comment.created).toJSON(); + }, + localeTime: function () { + return new Date(this.comment.created).toLocaleString(); + }, + iconOs: function () { + return this.getIconBy(this.comment.os, w); + }, + iconBrowser: function () { + return this.getIconBy(this.comment.browser, E); + }, + iconLocation: function () { + return k["default"]; + }, + showExpand: function () { + return this.hasExpand && !this.isExpanded; + }, + showCollapse: function () { + return this.hasExpand && this.isExpanded; + }, + showContentExpand: function () { + return this.hasContentExpand && !this.isContentExpanded; + }, + showContentCollapse: function () { + return this.hasContentExpand && this.isContentExpanded; + }, + convertedLink: function () { + return (0, a.convertLink)(this.comment.link); + }, + }, + methods: { + t: a.t, + getIconBy: function (e, t) { + var n = e.toLowerCase(); + for (var r in t) if (-1 !== n.indexOf(r)) return t[r]; + return b["default"]; + }, + showExpandIfNeed: function () { + this.comment.replies && + this.comment.replies.length > 0 && + this.$refs["tk-replies"] && + (this.hasExpand = + this.$refs["tk-replies"].scrollHeight > 236); + }, + showContentExpandIfNeed: function () { + this.hasContentExpand = + this.hasContentExpand || + this.$refs["tk-content"].scrollHeight > 500; + }, + showContentExpandIfNeedAfterImagesLoaded: function () { + var e = this; + this.$refs["tk-content"] + .querySelectorAll("img") + .forEach(function (t) { + t.onload = e.showContentExpandIfNeed; + }); + }, + scrollToComment: function () { + -1 !== window.location.hash.indexOf(this.comment.id) && + (this.$refs["tk-comment"].scrollIntoView({ + behavior: "smooth", + }), + this.$emit("expand")); + }, + onLike: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (!e.likeLoading) { + t.next = 2; + break; + } + return t.abrupt("return"); + case 2: + return ( + (e.likeLoading = !0), + (t.next = 5), + (0, a.call)(e.$tcb, "COMMENT_LIKE", { + id: e.comment.id, + }) + ); + case 5: + (e.liked ? e.like-- : e.like++, + (e.liked = !e.liked), + (e.likeLoading = !1)); + case 8: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + onReply: function (e) { + ((this.pid = e), this.$emit("reply", this.comment.id)); + }, + onReplyReply: function (e) { + ((this.pid = e), + e + ? this.$emit("reply", this.comment.id) + : this.$emit("reply", "")); + }, + onCancel: function () { + ((this.pid = ""), this.$emit("reply", "")); + }, + onLoad: function () { + (this.comment.replies.length > 0 && + this.$refs["tk-replies"].lastElementChild.scrollIntoView({ + behavior: "smooth", + block: "center", + }), + (this.pid = ""), + this.$emit("reply", ""), + this.$emit("load"), + this.onExpand()); + }, + onExpand: function () { + this.isExpanded = !0; + }, + onCollapse: function () { + this.isExpanded = !1; + }, + onContentExpand: function () { + this.isContentExpanded = !0; + }, + onContentCollapse: function () { + this.isContentExpanded = !1; + }, + checkAuth: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (!e.$tcb) { + t.next = 7; + break; + } + return ( + (t.next = 3), + e.$tcb.auth.getCurrenUser() + ); + case 3: + ((n = t.sent), + (e.isLogin = "CUSTOM" === n.loginType), + (t.next = 8)); + break; + case 7: + e.isLogin = + e.$twikoo.serverConfig && + e.$twikoo.serverConfig.IS_ADMIN; + case 8: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + handleSpam: function (e, t) { + (t.preventDefault(), this.setComment({ isSpam: e })); + }, + handleTop: function (e, t) { + (t.preventDefault(), this.setComment({ top: e })); + }, + popupLightbox: function (e) { + if ("true" === this.$twikoo.serverConfig.LIGHTBOX) { + var t = e.target; + if ( + "IMG" === t.tagName && + !t.classList.contains("tk-owo-emotion") + ) { + var n = document.createElement("div"); + n.className = "tk-lightbox"; + var r = document.createElement("img"); + ((r.className = "tk-lightbox-image"), + (r.src = t.src), + n.appendChild(r), + n.addEventListener("click", function () { + document.body.removeChild(n); + }), + document.body.appendChild(n)); + } + } + }, + setComment: function (e) { + var t = this; + return (0, o["default"])( + i["default"].mark(function n() { + return i["default"].wrap(function (n) { + for (;;) + switch ((n.prev = n.next)) { + case 0: + return ( + (t.loading = !0), + (n.next = 3), + (0, a.call)(t.$tcb, "COMMENT_SET_FOR_ADMIN", { + id: t.comment.id, + set: e, + }) + ); + case 3: + ((t.loading = !1), t.$emit("load")); + case 5: + case "end": + return n.stop(); + } + }, n); + }), + )(); + }, + }, + mounted: function () { + var e = this; + (this.$nextTick(this.showContentExpandIfNeed), + this.$nextTick(this.showContentExpandIfNeedAfterImagesLoaded), + this.$nextTick(this.showExpandIfNeed), + this.$nextTick(this.scrollToComment), + this.$nextTick(function () { + ((0, a.renderLinks)(e.$refs.comment), + (0, a.renderMath)(e.$refs.comment, e.$twikoo.katex)); + }), + this.checkAuth()); + }, + watch: { + "comment.like": { + handler: function (e) { + ((this.like = this.comment.like), + (this.liked = this.comment.liked)); + }, + immediate: !0, + }, + "config.HIGHLIGHT": { + handler: function (e) { + var t = this; + "true" === e && + this.$nextTick(function () { + (0, a.renderCode)( + t.$refs.comment, + t.config.HIGHLIGHT_THEME, + t.config.HIGHLIGHT_PLUGIN, + ); + }); + }, + immediate: !0, + }, + }, + }; + }, + 4333: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(8129), + s = r(n(5438)), + u = r(n(9078)), + c = r(n(504)), + l = r(n(9966)), + d = r(n(4478)); + t.A = { + components: { TkSubmit: s["default"], TkComment: u["default"] }, + props: { showAdminEntry: Boolean }, + data: function () { + return { + loading: !0, + loadingMore: !1, + errorMessage: "", + config: {}, + comments: [], + showExpand: !0, + count: 0, + replyId: "", + iconSetting: c["default"], + iconRefresh: l["default"], + }; + }, + methods: { + t: a.t, + initConfig: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (t.next = 2), + (0, a.call)(e.$tcb, "GET_CONFIG") + ); + case 2: + (n = t.sent) && + n.result && + n.result.config && + ((e.config = n.result.config), + (d["default"].prototype.$twikoo.serverConfig = + n.result.config)); + case 4: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + initComments: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (e.loading = !0), + (n = (0, a.getUrl)(e.$twikoo.path)), + (t.next = 4), + e.getComments({ url: n }) + ); + case 4: + e.loading = !1; + case 5: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + refresh: function () { + ((this.comments = []), this.initComments()); + }, + onExpand: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (!e.loadingMore) { + t.next = 2; + break; + } + return t.abrupt("return"); + case 2: + return ( + (e.loadingMore = !0), + (n = (0, a.getUrl)(e.$twikoo.path)), + (r = e.comments + .filter(function (e) { + return !e.top; + }) + .map(function (e) { + return e.created; + }) + .sort(function (e, t) { + return e - t; + })[0]), + (t.next = 7), + e.getComments({ url: n, before: r }) + ); + case 7: + e.loadingMore = !1; + case 8: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + onCommentLoaded: function () { + "function" == typeof this.$twikoo.onCommentLoaded && + this.$twikoo.onCommentLoaded(); + }, + getComments: function (e) { + var t = this; + return (0, o["default"])( + i["default"].mark(function n() { + var r; + return i["default"].wrap( + function (n) { + for (;;) + switch ((n.prev = n.next)) { + case 0: + return ( + (n.prev = 0), + (n.next = 3), + (0, a.call)(t.$tcb, "COMMENT_GET", e) + ); + case 3: + ((r = n.sent) && + r.result && + r.result.data && + ((t.comments = e.before + ? t.comments.concat(r.result.data) + : r.result.data), + (t.showExpand = r.result.more), + (t.count = + r.result.count || t.comments.length || 0), + t.$nextTick(t.onCommentLoaded)), + (n.next = 10)); + break; + case 7: + ((n.prev = 7), + (n.t0 = n["catch"](0)), + (t.errorMessage = n.t0.message)); + case 10: + case "end": + return n.stop(); + } + }, + n, + null, + [[0, 7]], + ); + }), + )(); + }, + onReply: function (e) { + this.replyId = e; + }, + openAdmin: function () { + this.$emit("admin"); + }, + }, + mounted: function () { + (this.initConfig(), this.initComments()); + }, + }; + }, + 418: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(2199), + s = n(8129); + t.A = { + data: function () { + return { version: a.version, counter: {} }; + }, + methods: { + getCounter: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r, o, a; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if ( + (n = document.getElementById("twikoo_visitors")) + ) { + t.next = 3; + break; + } + return t.abrupt("return"); + case 3: + if ( + -1 === + ["localhost", "127.0.0.1", "0.0.0.0"].indexOf( + window.location.hostname, + ) + ) { + t.next = 5; + break; + } + return t.abrupt("return"); + case 5: + return ( + (r = (0, s.getUrl)(e.$twikoo.path)), + (o = (0, s.getHref)(e.$twikoo.href)), + (t.next = 9), + (0, s.call)(e.$tcb, "COUNTER_GET", { + url: r, + href: o, + title: document.title, + }) + ); + case 9: + ((a = t.sent), + (e.counter = a.result), + (e.counter.time || 0 === e.counter.time) && + (n.innerHTML = e.counter.time)); + case 12: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + }, + mounted: function () { + this.getCounter(); + }, + }; + }, + 2362: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var r = n(1085), + i = n(8129), + o = + /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; + t.A = { + props: { + nick: String, + mail: String, + link: String, + config: Object, + }, + data: function () { + return { + metaInputs: [ + { + key: "nick", + locale: (0, i.t)("META_INPUT_NICK"), + name: "nick", + type: "text", + }, + { + key: "mail", + locale: (0, i.t)("META_INPUT_MAIL"), + name: "mail", + type: "email", + }, + { + key: "link", + locale: (0, i.t)("META_INPUT_LINK"), + name: "link", + type: "text", + }, + ], + metaData: { nick: "", mail: "", link: "" }, + }; + }, + computed: { + displayedFields: function () { + var e = this.config.DISPLAYED_FIELDS; + return { + nick: !e || -1 !== e.indexOf("nick"), + mail: !e || -1 !== e.indexOf("mail"), + link: !e || -1 !== e.indexOf("link"), + }; + }, + displayedInputs: function () { + var e = this; + return this.metaInputs.filter(function (t) { + return !!e.displayedFields[t.key]; + }); + }, + requiredFields: function () { + var e = this.config.REQUIRED_FIELDS; + return { + nick: !e || -1 !== e.indexOf("nick"), + mail: !e || -1 !== e.indexOf("mail"), + link: !!e && -1 !== e.indexOf("link"), + }; + }, + }, + methods: { + t: i.t, + initMeta: function () { + var e = localStorage.getItem("twikoo"); + if (e) { + var t = JSON.parse(e); + ((this.metaData.nick = t.nick), + (this.metaData.mail = t.mail), + (this.metaData.link = t.link)); + } + this.updateMeta(); + }, + updateMeta: function () { + (localStorage.setItem( + "twikoo", + JSON.stringify(this.metaData), + ), + this.$emit("update", { + meta: this.metaData, + valid: this.checkValid(), + })); + }, + checkValid: function () { + var e = o.test(this.metaData.mail); + return ( + (this.metaData.nick || !this.requiredFields.nick) && + (e || !this.requiredFields.mail) && + (this.metaData.link || !this.requiredFields.link) + ); + }, + checkQQ: function () { + if ((0, i.isQQ)(this.metaData.nick)) { + var e = this.metaData.nick.replace(/@qq.com/gi, ""), + t = "".concat(e, "@qq.com"); + ((this.metaData.mail = t), this.getQQNick(e)); + } + }, + getQQNick: function (e) { + var t = this, + n = "https://api.qjqq.cn/api/qqinfo?qq=".concat(e), + r = new XMLHttpRequest(); + ((r.onreadystatechange = function () { + if (4 === r.readyState && 200 === r.status) { + var e = JSON.parse(r.responseText); + ((t.metaData.nick = e.name), t.updateMeta()); + } + }), + r.open("GET", n), + r.send()); + }, + checkAdminCrypt: function () { + var e = this.$root.$children[0], + t = + !this.config.HIDE_ADMIN_CRYPT || + this.config.HIDE_ADMIN_CRYPT === this.metaData.nick; + e.onShowAdminEntry(t); + }, + onMetaChange: function () { + (this.checkQQ(), this.updateMeta(), this.checkAdminCrypt()); + }, + }, + watch: { + nick: function (e) { + this.metaData.nick = e; + }, + mail: function (e) { + this.metaData.mail = e; + }, + link: function (e) { + this.metaData.link = e; + }, + requiredFields: { + handler: function (e, t) { + this.$emit("update", { + meta: this.metaData, + valid: this.checkValid(), + }); + }, + deep: !0, + }, + "config.VERSION": function () { + this.checkAdminCrypt(); + }, + }, + mounted: function () { + (r.app.$on("initMeta", this.initMeta), this.initMeta()); + }, + }; + }, + 9171: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var r = n(8129); + t.A = { + props: { + pageSize: { type: Number, default: 10 }, + total: { type: Number, default: 0 }, + }, + data: function () { + return { + currentPage: 1, + userInput: 0, + userPageSize: 0, + pagers: [], + }; + }, + computed: { + pageCount: function () { + return Math.ceil(this.total / this.pageSize); + }, + }, + methods: { + t: r.t, + generatePager: function () { + for (var e = [], t = 1; t <= this.pageCount; t++) + Math.abs(this.currentPage - t) < 3 || + 1 === t || + t === this.pageCount + ? e.push({ title: "".concat(t), page: t }) + : Math.abs(this.currentPage - t) < 4 && + e.push({ title: "...", page: t }); + this.pagers = e; + }, + currentChange: function (e) { + ((this.currentPage = parseInt(e)), + this.currentPage > this.pageCount && + (this.currentPage = this.pageCount), + (this.userInput = 0), + this.$emit("current-change", this.currentPage), + this.generatePager()); + }, + pageSizeChamge: function (e) { + ((this.userPageSize = 0), + this.$emit("page-size-change", parseInt(e))); + }, + handleInput: function (e) { + this.userInput = parseInt(e); + }, + handleInputPageSize: function (e) { + this.userPageSize = parseInt(e); + }, + }, + watch: { + total: { + handler: function () { + this.generatePager(); + }, + immediate: !0, + }, + pageSize: { + handler: function () { + this.generatePager(); + }, + }, + }, + }; + }, + 147: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "B", { value: !0 }), (t.A = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = r(n(1423)), + s = r(n(6639)), + u = r(n(5171)), + c = r(n(2573)), + l = r(n(4785)), + d = r(n(3415)), + f = n(8129), + p = r(n(1628)), + h = [ + "apng", + "bmp", + "gif", + "jpeg", + "jpg", + "png", + "svg", + "tif", + "tiff", + "webp", + ]; + t.A = { + components: { TkAvatar: l["default"], TkMetaInput: d["default"] }, + directives: { Clickoutside: c["default"] }, + props: { replyId: String, pid: String, config: Object }, + data: function () { + return { + isSending: !1, + isPreviewing: !1, + isMetaValid: !1, + errorMessage: "", + owo: null, + comment: "", + commentHtml: "", + nick: "", + mail: "", + link: "", + turnstileLoad: null, + iconMarkdown: a["default"], + iconEmotion: s["default"], + iconImage: u["default"], + }; + }, + computed: { + canSend: function () { + return ( + !this.isSending && + !!this.isMetaValid && + !!this.comment.trim() + ); + }, + textarea: function () { + return this.$refs.textarea + ? this.$refs.textarea.$refs.textarea + : null; + }, + commentPlaceholder: function () { + var e = + this.$twikoo.placeholder || + this.config.COMMENT_PLACEHOLDER || + ""; + return (e = e.replace(/
    /g, "\n")); + }, + maxLength: function () { + var e = parseInt(this.config.LIMIT_LENGTH); + return (Number.isNaN(e) && (e = 500), e > 0 ? e : null); + }, + }, + methods: { + t: f.t, + initDraft: function () { + var e = localStorage.getItem("twikoo-draft"); + !this.comment && e && (this.comment = e); + }, + saveDraft: function () { + localStorage.setItem("twikoo-draft", this.comment); + }, + initOwo: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n; + return i["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if ("true" !== e.config.SHOW_EMOTION) { + t.next = 6; + break; + } + return ( + (t.next = 3), + (0, f.initOwoEmotions)( + e.config.EMOTION_CDN || + "https://owo.imaegoo.com/owo.json", + ) + ); + case 3: + ((n = t.sent), + (e.owo = new p["default"]({ + logo: s["default"], + container: e.$refs.owo, + target: e.textarea, + odata: n, + position: "down", + maxHeight: "250px", + })), + f.marked.setOptions({ + odata: (0, f.initMarkedOwo)(n), + })); + case 6: + case "end": + return t.stop(); + } + }, t); + }), + )(); + }, + initTurnstile: function () { + var e = this; + this.config.TURNSTILE_SITE_KEY && + (window.turnstile + ? (this.turnstileLoad = Promise.resolve()) + : (this.turnstileLoad = new Promise(function (t, n) { + var r = document.createElement("script"); + ((r.src = + "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"), + (r.onload = t), + (r.onerror = n), + e.$refs["turnstile-container"].appendChild(r)); + }))); + }, + getTurnstileToken: function () { + var e = this; + return new Promise(function (t, n) { + e.turnstileLoad.then(function () { + var r = window.turnstile.render(e.$refs.turnstile, { + sitekey: e.config.TURNSTILE_SITE_KEY, + callback: function (e) { + (t(e), + setTimeout(function () { + window.turnstile.remove(r); + }, 5e3)); + }, + "error-callback": n, + }); + }); + }); + }, + onMetaUpdate: function (e) { + ((this.nick = e.meta.nick), + (this.mail = e.meta.mail), + (this.link = e.meta.link), + (this.isMetaValid = e.valid)); + }, + cancel: function () { + this.$emit("cancel"); + }, + onCommentInput: function () { + (this.saveDraft(), this.updatePreview()); + }, + preview: function () { + ((this.isPreviewing = !this.isPreviewing), + this.updatePreview()); + }, + updatePreview: function () { + var e = this; + this.isPreviewing && + ((this.commentHtml = (0, f.marked)(this.comment)), + this.$nextTick(function () { + ((0, f.renderLinks)(e.$refs["comment-preview"]), + (0, f.renderMath)( + e.$refs["comment-preview"], + e.$twikoo.katex, + ), + "true" === e.config.HIGHLIGHT && + (0, f.renderCode)( + e.$refs["comment-preview"], + e.config.HIGHLIGHT_THEME, + e.config.HIGHLIGHT_PLUGIN, + )); + })); + }, + send: function () { + var e = this; + return (0, o["default"])( + i["default"].mark(function t() { + var n, r; + return i["default"].wrap( + function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if ( + ((e.isSending = !0), + (t.prev = 1), + !e.comment.match( + new RegExp( + "!\\[".concat( + (0, f.t)("IMAGE_UPLOAD_PLACEHOLDER"), + ".+\\]\\(\\)", + ), + ), + )) + ) { + t.next = 4; + break; + } + throw new Error( + (0, f.t)("IMAGE_UPLOAD_PLEASE_WAIT"), + ); + case 4: + return ( + (t.t0 = e.nick), + (t.t1 = e.mail), + (t.t2 = e.link), + (t.next = 9), + (0, f.getUserAgent)() + ); + case 9: + if ( + ((t.t3 = t.sent), + (t.t4 = (0, f.getUrl)(e.$twikoo.path)), + (t.t5 = (0, f.getHref)(e.$twikoo.href)), + (t.t6 = (0, f.marked)(e.comment)), + (t.t7 = e.pid ? e.pid : e.replyId), + (t.t8 = e.replyId), + (n = { + nick: t.t0, + mail: t.t1, + link: t.t2, + ua: t.t3, + url: t.t4, + href: t.t5, + comment: t.t6, + pid: t.t7, + rid: t.t8, + }), + !e.config.TURNSTILE_SITE_KEY) + ) { + t.next = 20; + break; + } + return ((t.next = 19), e.getTurnstileToken()); + case 19: + n.turnstileToken = t.sent; + case 20: + return ( + (t.next = 22), + (0, f.call)(e.$tcb, "COMMENT_SUBMIT", n) + ); + case 22: + if ( + !((r = t.sent) && r.result && r.result.id) + ) { + t.next = 30; + break; + } + ((e.comment = ""), + (e.errorMessage = ""), + e.$emit("load"), + e.saveDraft(), + (t.next = 31)); + break; + case 30: + throw new Error(r.result.message); + case 31: + t.next = 37; + break; + case 33: + ((t.prev = 33), + (t.t9 = t["catch"](1)), + f.logger.error("评论失败", t.t9), + (e.errorMessage = "" + .concat((0, f.t)("COMMENT_FAILED"), ": ") + .concat(t.t9 && t.t9.message))); + case 37: + return ( + (t.prev = 37), + (e.isSending = !1), + t.finish(37) + ); + case 40: + case "end": + return t.stop(); + } + }, + t, + null, + [[1, 33, 37, 40]], + ); + }), + )(); + }, + addEventListener: function () { + this.textarea && + this.textarea.addEventListener("paste", this.onPaste); + }, + onBgImgChange: function () { + this.config.COMMENT_BG_IMG && + this.textarea && + (this.textarea.style["background-image"] = 'url("'.concat( + this.config.COMMENT_BG_IMG, + '")', + )); + }, + onEnterKeyUp: function (e) { + (e.ctrlKey || e.metaKey) && + this.canSend && + (this.send(), e.preventDefault()); + }, + closeOwo: function () { + this.owo && + this.owo.container.classList.contains("OwO-open") && + this.owo.toggle(); + }, + openSelectImage: function () { + this.$refs.inputFile.click(); + }, + onSelectImage: function () { + var e = this.$refs.inputFile.files[0]; + this.parseAndUploadPhoto(e); + }, + onPaste: function (e) { + var t; + e.clipboardData && + (e.clipboardData.files[0] + ? (t = e.clipboardData.files[0]) + : e.clipboardData.items[0] && + e.clipboardData.items[0].getAsFile() && + (t = e.clipboardData.items[0].getAsFile()), + this.parseAndUploadPhoto(t)); + }, + parseAndUploadPhoto: function (e) { + if (e && "true" === this.config.SHOW_IMAGE) { + var t = e.name.split("."), + n = t.length > 1 ? t.pop() : ""; + if (-1 !== h.indexOf(n.toLowerCase())) { + var r = this.getUserId(), + i = "".concat(Date.now(), "-").concat(r), + o = t.join("."); + this.paste(this.getImagePlaceholder(i, n)); + var a = this.config.IMAGE_CDN; + !this.$tcb || (a && "qcloud" !== a) + ? a + ? this.uploadPhotoToThirdParty(i, o, n, e) + : this.uploadFailed( + i, + n, + (0, f.t)("IMAGE_UPLOAD_FAILED_NO_CONF"), + ) + : this.uploadPhotoToQcloud(i, o, n, e); + } + } + }, + getUserId: function () { + return this.$tcb + ? this.$tcb.auth.currentUser.uid + : localStorage.getItem("twikoo-access-token"); + }, + uploadPhotoToQcloud: function (e, t, n, r) { + var a = this; + return (0, o["default"])( + i["default"].mark(function s() { + var o, u, c; + return i["default"].wrap( + function (i) { + for (;;) + switch ((i.prev = i.next)) { + case 0: + return ( + (i.prev = 0), + (i.next = 3), + a.$tcb.app.uploadFile({ + cloudPath: "tk-img/" + .concat(e, ".") + .concat(n), + filePath: r, + }) + ); + case 3: + if (!(o = i.sent).fileID) { + i.next = 10; + break; + } + return ( + (i.next = 7), + a.$tcb.app.getTempFileURL({ + fileList: [o.fileID], + }) + ); + case 7: + ((u = i.sent), + (c = u.fileList[0].tempFileURL), + a.uploadCompleted(e, t, n, c)); + case 10: + i.next = 16; + break; + case 12: + ((i.prev = 12), + (i.t0 = i["catch"](0)), + console.error(i.t0), + a.uploadFailed(e, n, i.t0.message)); + case 16: + case "end": + return i.stop(); + } + }, + s, + null, + [[0, 12]], + ); + }), + )(); + }, + uploadPhotoToThirdParty: function (e, t, n, r) { + var a = this; + return (0, o["default"])( + i["default"].mark(function s() { + var o, u, c; + return i["default"].wrap( + function (i) { + for (;;) + switch ((i.prev = i.next)) { + case 0: + return ( + (i.prev = 0), + (i.t0 = f.call), + (i.t1 = a.$tcb), + (i.t2 = "".concat(e, ".").concat(n)), + (i.next = 6), + (0, f.blobToDataURL)(r) + ); + case 6: + return ( + (i.t3 = i.sent), + (i.t4 = { fileName: i.t2, photo: i.t3 }), + (i.next = 10), + (0, i.t0)(i.t1, "UPLOAD_IMAGE", i.t4) + ); + case 10: + ((u = i.sent), + (c = u.result).data + ? a.uploadCompleted(e, t, n, c.data.url) + : 1040 === c.code && + c.err && + (o = c.err.match( + /this image exists at: (http[^ ]+)/, + )) + ? (console.warn(c), + a.uploadCompleted(e, t, n, o[1])) + : (console.error(c), + a.uploadFailed(e, n, c.err)), + (i.next = 19)); + break; + case 15: + ((i.prev = 15), + (i.t5 = i["catch"](0)), + console.error(i.t5), + a.uploadFailed(e, n, i.t5.message)); + case 19: + case "end": + return i.stop(); + } + }, + s, + null, + [[0, 15]], + ); + }), + )(); + }, + uploadCompleted: function (e, t, n, r) { + ((t = t.replace(/[[\]]/g, "_")), + (this.comment = this.comment.replace( + this.getImagePlaceholder(e, n), + "![".concat(t, "](").concat(r, ")"), + )), + (this.$refs.inputFile.value = "")); + }, + uploadFailed: function (e, t, n) { + ((this.comment = this.comment.replace( + this.getImagePlaceholder(e, t), + "_" + .concat((0, f.t)("IMAGE_UPLOAD_FAILED"), ": ") + .concat(n, "_"), + )), + (this.$refs.inputFile.value = "")); + }, + paste: function (e) { + if (document.selection) + document.selection.createRange().text = e; + else if ( + this.textarea.selectionStart || + 0 === this.textarea.selectionStart + ) { + var t = this.textarea.selectionStart, + n = this.textarea.selectionEnd; + ((this.comment = + this.comment.substring(0, t) + + e + + this.comment.substring(n, this.comment.length)), + (this.textarea.selectionStart = t + e.length), + (this.textarea.selectionEnd = t + e.length)); + } else this.comment += e; + }, + getImagePlaceholder: function (e, t) { + return "![" + .concat((0, f.t)("IMAGE_UPLOAD_PLACEHOLDER"), " ") + .concat(e, ".") + .concat(t, "]()"); + }, + }, + mounted: function () { + (this.pid && + this.$refs["tk-submit"].scrollIntoView({ + behavior: "instant", + block: "center", + }), + this.initDraft(), + this.initOwo(), + this.addEventListener(), + this.onBgImgChange(), + this.initTurnstile()); + }, + watch: { + "config.SHOW_EMOTION": function () { + this.initOwo(); + }, + "config.COMMENT_BG_IMG": function () { + this.onBgImgChange(); + }, + "config.TURNSTILE_SITE_KEY": function () { + this.initTurnstile(); + }, + }, + }; + }, + 1573: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { staticClass: "twikoo", attrs: { id: "twikoo" } }, + [ + t("tk-comments", { + attrs: { "show-admin-entry": e.showAdminEntry }, + on: { + admin: function (t) { + e.showAdmin = !0; + }, + }, + }), + e._v(" "), + t("tk-footer"), + e._v(" "), + t("tk-admin", { + attrs: { show: e.showAdmin }, + on: { + close: function (t) { + e.showAdmin = !1; + }, + }, + }), + ], + 1, + ); + }), + (t.Yp = [])); + }, + 8114: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t("div", { staticClass: "tk-action" }, [ + t( + "a", + { + staticClass: "tk-action-link", + class: { "tk-liked": e.liked }, + attrs: { href: "#" }, + on: { click: e.onLike }, + }, + [ + t("span", { + staticClass: "tk-action-icon", + domProps: { innerHTML: e._s(e.iconLike) }, + }), + e._v(" "), + t("span", { + staticClass: "tk-action-icon tk-action-icon-solid", + domProps: { innerHTML: e._s(e.iconLikeSolid) }, + }), + e._v(" "), + t("span", { staticClass: "tk-action-count" }, [ + e._v(e._s(e.likeCountStr)), + ]), + ], + ), + e._v(" "), + t( + "a", + { + staticClass: "tk-action-link", + attrs: { href: "#" }, + on: { click: e.onReply }, + }, + [ + t("span", { + staticClass: "tk-action-icon", + domProps: { innerHTML: e._s(e.iconComment) }, + }), + e._v(" "), + t("span", { + staticClass: "tk-action-icon tk-action-icon-solid", + domProps: { innerHTML: e._s(e.iconCommentSolid) }, + }), + e._v(" "), + t("span", { staticClass: "tk-action-count" }, [ + e._v(e._s(e.repliesCountStr)), + ]), + ], + ), + ]); + }), + (t.Yp = [])); + }, + 4576: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t("div", { staticClass: "tk-admin-container" }, [ + t( + "div", + { + directives: [ + { + name: "loading", + rawName: "v-loading", + value: e.loading, + expression: "loading", + }, + ], + staticClass: "tk-admin", + class: { __show: e.show }, + }, + [ + t("a", { + staticClass: "tk-admin-close", + attrs: { href: "#" }, + domProps: { innerHTML: e._s(e.iconClose) }, + on: { click: e.onClose }, + }), + e._v(" "), + e.needUpdate + ? t("div", { staticClass: "tk-login-title" }, [ + t("div", [e._v(e._s(e.t("ADMIN_NEED_UPDATE")))]), + e._v(" "), + t( + "a", + { + attrs: { + href: "https://twikoo.js.org/update.html", + target: "_blank", + }, + }, + [e._v("https://twikoo.js.org/update.html")], + ), + ]) + : e._e(), + e._v(" "), + e.needUpdate + ? e._e() + : t("div", [ + !e.isLogin && e.isSetPassword + ? t("div", { staticClass: "tk-login" }, [ + t("div", { staticClass: "tk-login-title" }, [ + e._v(e._s(e.t("ADMIN_LOGIN_TITLE"))), + ]), + e._v(" "), + t( + "form", + [ + t("input", { attrs: { type: "hidden" } }), + e._v(" "), + t( + "el-input", + { + ref: "focusme", + staticClass: "tk-password", + attrs: { + placeholder: e.t( + "ADMIN_PASSWORD_PLACEHOLDER", + ), + "show-password": "", + }, + nativeOn: { + keyup: function (t) { + return !t.type.indexOf("key") && + e._k( + t.keyCode, + "enter", + 13, + t.key, + "Enter", + ) + ? null + : e.onLogin.apply( + null, + arguments, + ); + }, + }, + model: { + value: e.password, + callback: function (t) { + e.password = t; + }, + expression: "password", + }, + }, + [ + t("template", { slot: "prepend" }, [ + e._v(e._s(e.t("ADMIN_PASSWORD"))), + ]), + e._v(" "), + t( + "el-button", + { + attrs: { slot: "append" }, + on: { click: e.onLogin }, + slot: "append", + }, + [e._v(e._s(e.t("ADMIN_LOGIN")))], + ), + ], + 2, + ), + ], + 1, + ), + e._v(" "), + e.loginErrorMessage + ? t( + "div", + { staticClass: "tk-login-msg" }, + [ + e._v( + "\n " + + e._s(e.loginErrorMessage) + + "\n ", + ), + t( + "a", + { + attrs: { + href: "https://twikoo.js.org/faq.html", + rel: "noopener noreferrer", + target: "_blank", + }, + }, + [e._v(e._s(e.t("ADMIN_FORGOT")))], + ), + ], + ) + : e._e(), + ]) + : e._e(), + e._v(" "), + e.isLogin || e.isSetPassword + ? e._e() + : t( + "div", + { staticClass: "tk-regist" }, + [ + t( + "div", + { staticClass: "tk-login-title" }, + [e._v(e._s(e.t("ADMIN_LOGIN_TITLE")))], + ), + e._v(" "), + t( + "form", + [ + e.isSetCredentials + ? e._e() + : t( + "el-input", + { + ref: "focusme", + staticClass: "tk-password", + attrs: { + placeholder: e.t( + "ADMIN_CREDENTIALS_PLACEHOLDER", + ), + }, + model: { + value: e.credentials, + callback: function (t) { + e.credentials = t; + }, + expression: "credentials", + }, + }, + [ + t( + "template", + { slot: "prepend" }, + [ + e._v( + e._s( + e.t( + "ADMIN_CREDENTIALS", + ), + ), + ), + ], + ), + ], + 2, + ), + e._v(" "), + t( + "el-input", + { + staticClass: "tk-password", + attrs: { + placeholder: e.t( + "ADMIN_SET_PASSWORD_PLACEHOLDER", + ), + "show-password": "", + }, + model: { + value: e.password, + callback: function (t) { + e.password = t; + }, + expression: "password", + }, + }, + [ + t("template", { slot: "prepend" }, [ + e._v( + e._s(e.t("ADMIN_SET_PASSWORD")), + ), + ]), + ], + 2, + ), + e._v(" "), + t( + "el-input", + { + staticClass: "tk-password", + attrs: { + placeholder: e.t( + "ADMIN_SET_PASSWORD_CONFIRM_PLACEHOLDER", + ), + "show-password": "", + }, + model: { + value: e.passwordConfirm, + callback: function (t) { + e.passwordConfirm = t; + }, + expression: "passwordConfirm", + }, + }, + [ + t("template", { slot: "prepend" }, [ + e._v( + e._s( + e.t( + "ADMIN_SET_PASSWORD_CONFIRM", + ), + ), + ), + ]), + ], + 2, + ), + ], + 1, + ), + e._v(" "), + t( + "el-button", + { + staticClass: "tk-regist-button", + attrs: { disabled: !e.canRegist }, + on: { click: e.onRegist }, + }, + [e._v(e._s(e.t("ADMIN_REGIST")))], + ), + e._v(" "), + e.loginErrorMessage + ? t( + "div", + { staticClass: "tk-login-msg" }, + [e._v(e._s(e.loginErrorMessage))], + ) + : e._e(), + e._v(" "), + e.isSetCredentials + ? e._e() + : t( + "div", + { staticClass: "tk-login-msg" }, + [ + t( + "a", + { + attrs: { + href: "https://twikoo.js.org/faq.html", + rel: "noopener noreferrer", + target: "_blank", + }, + }, + [ + e._v( + e._s( + e.t( + "ADMIN_CREDENTIALS_FAQ", + ), + ), + ), + ], + ), + ], + ), + ], + 1, + ), + e._v(" "), + e.isLogin + ? t( + "div", + { staticClass: "tk-panel" }, + [ + t( + "div", + { staticClass: "tk-panel-title" }, + [ + t("div", [ + e._v(e._s(e.t("ADMIN_TITLE"))), + ]), + e._v(" "), + t( + "a", + { + staticClass: "tk-panel-logout", + attrs: { href: "#" }, + on: { click: e.onLogout }, + }, + [e._v(e._s(e.t("ADMIN_LOGOUT")))], + ), + ], + ), + e._v(" "), + t("div", { staticClass: "tk-tabs" }, [ + t( + "div", + { + staticClass: "tk-tab", + class: { + __active: + "comment" === e.activeTabName, + }, + on: { + click: function (t) { + e.activeTabName = "comment"; + }, + }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT")))], + ), + e._v(" "), + t( + "div", + { + staticClass: "tk-tab", + class: { + __active: + "config" === e.activeTabName, + }, + on: { + click: function (t) { + e.activeTabName = "config"; + }, + }, + }, + [e._v(e._s(e.t("ADMIN_CONFIG")))], + ), + e._v(" "), + t( + "div", + { + staticClass: "tk-tab", + class: { + __active: + "import" === e.activeTabName, + }, + on: { + click: function (t) { + e.activeTabName = "import"; + }, + }, + }, + [e._v(e._s(e.t("ADMIN_IMPORT")))], + ), + e._v(" "), + t( + "div", + { + staticClass: "tk-tab", + class: { + __active: + "export" === e.activeTabName, + }, + on: { + click: function (t) { + e.activeTabName = "export"; + }, + }, + }, + [e._v(e._s(e.t("ADMIN_EXPORT")))], + ), + ]), + e._v(" "), + t("tk-admin-comment", { + directives: [ + { + name: "show", + rawName: "v-show", + value: "comment" === e.activeTabName, + expression: + "activeTabName === 'comment'", + }, + ], + }), + e._v(" "), + t("tk-admin-config", { + directives: [ + { + name: "show", + rawName: "v-show", + value: "config" === e.activeTabName, + expression: + "activeTabName === 'config'", + }, + ], + }), + e._v(" "), + t("tk-admin-import", { + directives: [ + { + name: "show", + rawName: "v-show", + value: "import" === e.activeTabName, + expression: + "activeTabName === 'import'", + }, + ], + }), + e._v(" "), + t("tk-admin-export", { + directives: [ + { + name: "show", + rawName: "v-show", + value: "export" === e.activeTabName, + expression: + "activeTabName === 'export'", + }, + ], + }), + ], + 1, + ) + : e._e(), + ]), + ], + ), + ]); + }), + (t.Yp = [])); + }, + 3227: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { + directives: [ + { + name: "loading", + rawName: "v-loading", + value: e.loading, + expression: "loading", + }, + ], + staticClass: "tk-admin-comment", + }, + [ + e.clientVersion !== e.serverVersion + ? t("div", { staticClass: "tk-admin-warn" }, [ + t("span", [ + e._v( + e._s(e.t("ADMIN_CLIENT_VERSION")) + + e._s(e.clientVersion) + + ",", + ), + ]), + e._v(" "), + t("span", [ + e._v( + e._s(e.t("ADMIN_SERVER_VERSION")) + + e._s(e.serverVersion) + + ",", + ), + ]), + e._v(" "), + e._m(0), + ]) + : e._e(), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-comment-filter" }, + [ + t("el-input", { + staticClass: "tk-admin-comment-filter-keyword", + attrs: { + size: "small", + placeholder: e.t( + "ADMIN_COMMENT_SEARCH_PLACEHOLDER", + ), + }, + nativeOn: { + keyup: function (t) { + return !t.type.indexOf("key") && + e._k(t.keyCode, "enter", 13, t.key, "Enter") + ? null + : e.getComments.apply(null, arguments); + }, + }, + model: { + value: e.filter.keyword, + callback: function (t) { + e.$set(e.filter, "keyword", t); + }, + expression: "filter.keyword", + }, + }), + e._v(" "), + t( + "select", + { + directives: [ + { + name: "model", + rawName: "v-model", + value: e.filter.type, + expression: "filter.type", + }, + ], + staticClass: "tk-admin-comment-filter-type", + on: { + change: function (t) { + var n = Array.prototype.filter + .call(t.target.options, function (e) { + return e.selected; + }) + .map(function (e) { + return "_value" in e ? e._value : e.value; + }); + e.$set( + e.filter, + "type", + t.target.multiple ? n : n[0], + ); + }, + }, + }, + [ + t("option", { attrs: { value: "" } }, [ + e._v(e._s(e.t("ADMIN_COMMENT_FILTER_ALL"))), + ]), + e._v(" "), + t("option", { attrs: { value: "VISIBLE" } }, [ + e._v(e._s(e.t("ADMIN_COMMENT_FILTER_VISIBLE"))), + ]), + e._v(" "), + t("option", { attrs: { value: "HIDDEN" } }, [ + e._v(e._s(e.t("ADMIN_COMMENT_FILTER_HIDDEN"))), + ]), + ], + ), + e._v(" "), + t( + "el-button", + { + attrs: { size: "small", type: "primary" }, + on: { click: e.getComments }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT_SEARCH")))], + ), + ], + 1, + ), + e._v(" "), + t( + "div", + { + ref: "comment-list", + staticClass: "tk-admin-comment-list", + }, + e._l(e.comments, function (n) { + return t( + "div", + { key: n._id, staticClass: "tk-admin-comment-item" }, + [ + t( + "div", + { staticClass: "tk-admin-comment-meta" }, + [ + t("tk-avatar", { + attrs: { + config: e.serverConfig, + avatar: n.avatar, + nick: n.nick, + mail: n.mail, + link: n.link, + }, + }), + e._v(" "), + n.link + ? e._e() + : t("span", [e._v(e._s(n.nick) + " ")]), + e._v(" "), + n.link + ? t( + "a", + { + attrs: { + href: e.convertLink(n.link), + target: "_blank", + }, + }, + [e._v(e._s(n.nick) + " ")], + ) + : e._e(), + e._v(" "), + n.mail + ? t("span", [ + e._v("("), + t( + "a", + { + attrs: { + href: "mailto:".concat(n.mail), + }, + }, + [e._v(e._s(n.mail))], + ), + e._v(") "), + ]) + : e._e(), + e._v(" "), + n.isSpam + ? t("span", [ + e._v( + e._s( + e.t("ADMIN_COMMENT_IS_SPAM_SUFFIX"), + ) + " ", + ), + ]) + : e._e(), + e._v(" "), + t("span", { staticClass: "tk-time" }, [ + e._v(e._s(e.displayCreated(n)) + " "), + ]), + e._v(" "), + t("span", { attrs: { title: n.ua } }, [ + e._v(e._s(n.ipRegion)), + ]), + ], + 1, + ), + e._v(" "), + t("div", { + ref: "comments", + refInFor: !0, + staticClass: "tk-content", + domProps: { innerHTML: e._s(n.comment) }, + }), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-actions" }, + [ + t( + "el-button", + { + attrs: { size: "mini", type: "text" }, + on: { + click: function (t) { + return e.handleView(n); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT_VIEW")))], + ), + e._v(" "), + n.isSpam + ? t( + "el-button", + { + attrs: { size: "mini", type: "text" }, + on: { + click: function (t) { + return e.handleSpam(n, !1); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT_SHOW")))], + ) + : e._e(), + e._v(" "), + n.isSpam + ? e._e() + : t( + "el-button", + { + attrs: { size: "mini", type: "text" }, + on: { + click: function (t) { + return e.handleSpam(n, !0); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT_HIDE")))], + ), + e._v(" "), + !n.rid && n.top + ? t( + "el-button", + { + attrs: { size: "mini", type: "text" }, + on: { + click: function (t) { + return e.handleTop(n, !1); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT_UNTOP")))], + ) + : e._e(), + e._v(" "), + n.rid || n.top + ? e._e() + : t( + "el-button", + { + attrs: { size: "mini", type: "text" }, + on: { + click: function (t) { + return e.handleTop(n, !0); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT_TOP")))], + ), + e._v(" "), + t( + "el-button", + { + attrs: { size: "mini", type: "text" }, + on: { + click: function (t) { + return e.handleDelete(n); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_COMMENT_DELETE")))], + ), + ], + 1, + ), + ], + ); + }), + 0, + ), + e._v(" "), + t("tk-pagination", { + attrs: { "page-size": e.pageSize, total: e.count }, + on: { + "page-size-change": e.onPageSizeChange, + "current-change": e.switchPage, + }, + }), + ], + 1, + ); + }), + (t.Yp = [ + function () { + var e = this, + t = e._self._c; + return t("span", [ + e._v("请参考 "), + t( + "a", + { + attrs: { + href: "https://twikoo.js.org/update.html", + target: "_blank", + }, + }, + [e._v("版本更新")], + ), + e._v(" 进行升级"), + ]); + }, + ])); + }, + 74: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { + directives: [ + { + name: "loading", + rawName: "v-loading", + value: e.loading, + expression: "loading", + }, + ], + staticClass: "tk-admin-config", + }, + [ + e.clientVersion !== e.serverVersion + ? t("div", { staticClass: "tk-admin-warn" }, [ + t("span", [ + e._v( + e._s(e.t("ADMIN_CLIENT_VERSION")) + + e._s(e.clientVersion) + + ",", + ), + ]), + e._v(" "), + t("span", [ + e._v( + e._s(e.t("ADMIN_SERVER_VERSION")) + + e._s(e.serverVersion) + + ",", + ), + ]), + e._v(" "), + e._m(0), + ]) + : e._e(), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-config-groups" }, + [ + e._l(e.settings, function (n) { + return t( + "details", + { + key: n.name, + staticClass: "tk-admin-config-group", + }, + [ + t( + "summary", + { staticClass: "tk-admin-config-group-title" }, + [e._v(e._s(n.name))], + ), + e._v(" "), + e._l(n.items, function (n) { + return t( + "div", + { + key: n.key, + staticClass: "tk-admin-config-item", + }, + [ + t( + "div", + { + staticClass: "tk-admin-config-title", + attrs: { title: n.key }, + }, + [e._v(e._s(n.key))], + ), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-config-input" }, + [ + t("el-input", { + attrs: { + placeholder: n.ph, + size: "small", + "show-password": n.secret, + }, + model: { + value: n.value, + callback: function (t) { + e.$set(n, "value", t); + }, + expression: "setting.value", + }, + }), + ], + 1, + ), + e._v(" "), + t("div"), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-config-desc" }, + [e._v(e._s(n.desc))], + ), + ], + ); + }), + ], + 2, + ); + }), + e._v(" "), + t("details", { staticClass: "tk-admin-config-group" }, [ + t( + "summary", + { staticClass: "tk-admin-config-group-title" }, + [e._v(e._s(e.t("ADMIN_CONFIG_EMAIL_TEST")))], + ), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-config-email-test" }, + [ + t( + "div", + { + staticClass: + "tk-admin-config-email-test-desc", + }, + [ + e._v( + e._s(e.t("ADMIN_CONFIG_EMAIL_TEST_HELP")), + ), + ], + ), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-config-input" }, + [ + t( + "el-input", + { + attrs: { size: "small" }, + model: { + value: e.emailTestAddress, + callback: function (t) { + e.emailTestAddress = t; + }, + expression: "emailTestAddress", + }, + }, + [ + t( + "el-button", + { + attrs: { + slot: "append", + type: "info", + }, + on: { click: e.testEmail }, + slot: "append", + }, + [ + e._v( + e._s( + e.t( + "ADMIN_CONFIG_EMAIL_TEST_BTN", + ), + ), + ), + ], + ), + ], + 1, + ), + ], + 1, + ), + e._v(" "), + t( + "div", + { + staticClass: + "tk-admin-config-email-test-desc", + }, + [ + e._v( + e._s( + e.t("ADMIN_CONFIG_EMAIL_TEST_RESULT"), + ) + e._s(e.emailTestResult), + ), + ], + ), + ], + ), + ]), + ], + 2, + ), + e._v(" "), + t( + "div", + { staticClass: "tk-admin-config-actions" }, + [ + t( + "el-button", + { + attrs: { size: "small", type: "primary" }, + on: { click: e.saveConfig }, + }, + [e._v(e._s(e.t("ADMIN_CONFIG_SAVE")))], + ), + e._v(" "), + t( + "el-button", + { + attrs: { size: "small", type: "info" }, + on: { click: e.resetConfig }, + }, + [e._v(e._s(e.t("ADMIN_CONFIG_RESET")))], + ), + ], + 1, + ), + e._v(" "), + t("div", { staticClass: "tk-admin-config-message" }, [ + e._v(e._s(e.message)), + ]), + ], + ); + }), + (t.Yp = [ + function () { + var e = this, + t = e._self._c; + return t("span", [ + e._v("请参考 "), + t( + "a", + { + attrs: { + href: "https://twikoo.js.org/update.html", + target: "_blank", + }, + }, + [e._v("版本更新")], + ), + e._v(" 进行升级"), + ]); + }, + ])); + }, + 9976: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { staticClass: "tk-admin-export" }, + [ + t( + "div", + { staticClass: "tk-admin-warn tk-admin-import-warn" }, + [t("p", [e._v(e._s(e.t("ADMIN_EXPORT_WARN")))])], + ), + e._v(" "), + t( + "el-button", + { + attrs: { size: "small", disabled: e.loading }, + on: { + click: function (t) { + return e.doExport("comment"); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_EXPORT_COMMENT")))], + ), + e._v(" "), + t( + "el-button", + { + attrs: { size: "small", disabled: e.loading }, + on: { + click: function (t) { + return e.doExport("counter"); + }, + }, + }, + [e._v(e._s(e.t("ADMIN_EXPORT_COUNTER")))], + ), + ], + 1, + ); + }), + (t.Yp = [])); + }, + 872: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { staticClass: "tk-admin-import" }, + [ + t( + "div", + { staticClass: "tk-admin-warn tk-admin-import-warn" }, + [ + t("p", [e._v(e._s(e.t("ADMIN_IMPORT_WARN")))]), + e._v(" "), + t("p", [e._v(e._s(e.warnText[e.source]))]), + ], + ), + e._v(" "), + t("div", { staticClass: "tk-admin-import-label" }, [ + e._v(e._s(e.t("ADMIN_IMPORT_SELECT_SOURCE"))), + ]), + e._v(" "), + t( + "select", + { + directives: [ + { + name: "model", + rawName: "v-model", + value: e.source, + expression: "source", + }, + ], + on: { + change: function (t) { + var n = Array.prototype.filter + .call(t.target.options, function (e) { + return e.selected; + }) + .map(function (e) { + return "_value" in e ? e._value : e.value; + }); + e.source = t.target.multiple ? n : n[0]; + }, + }, + }, + [ + t("option", { attrs: { disabled: "", value: "" } }, [ + e._v(e._s(e.t("ADMIN_IMPORT_SELECT"))), + ]), + e._v(" "), + t("option", { attrs: { value: "valine" } }, [ + e._v("Valine (JSON)"), + ]), + e._v(" "), + t("option", { attrs: { value: "disqus" } }, [ + e._v("Disqus (XML)"), + ]), + e._v(" "), + t("option", { attrs: { value: "artalk" } }, [ + e._v("Artalk v1 (JSON)"), + ]), + e._v(" "), + t("option", { attrs: { value: "artalk2" } }, [ + e._v("Artalk v2 (Artrans)"), + ]), + e._v(" "), + t("option", { attrs: { value: "twikoo" } }, [ + e._v("Twikoo (JSON)"), + ]), + ], + ), + e._v(" "), + t("div", { staticClass: "tk-admin-import-label" }, [ + e._v(e._s(e.t("ADMIN_IMPORT_SELECT_FILE"))), + ]), + e._v(" "), + t("input", { + ref: "inputFile", + attrs: { type: "file", value: "" }, + }), + e._v(" "), + t( + "el-button", + { + attrs: { size: "small", disabled: e.loading }, + on: { click: e.uploadFile }, + }, + [e._v(e._s(e.t("ADMIN_IMPORT_START")))], + ), + e._v(" "), + t("el-input", { + ref: "logTextArea", + attrs: { + type: "textarea", + rows: 10, + placeholder: e.t("ADMIN_IMPORT_LOG"), + readonly: "", + }, + model: { + value: e.logText, + callback: function (t) { + e.logText = t; + }, + expression: "logText", + }, + }), + ], + 1, + ); + }), + (t.Yp = [])); + }, + 5897: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { + staticClass: "tk-avatar", + class: { + "tk-clickable": !!e.link, + "tk-has-avatar": !!e.avatarInner, + }, + on: { click: e.onClick }, + }, + [ + e.avatarInner + ? e._e() + : t("div", { + staticClass: "tk-avatar-img", + domProps: { innerHTML: e._s(e.iconUser) }, + }), + e._v(" "), + e.avatarInner + ? t("img", { + staticClass: "tk-avatar-img", + attrs: { src: e.avatarInner, alt: "" }, + }) + : e._e(), + ], + ); + }), + (t.Yp = [])); + }, + 3072: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { + ref: "tk-comment", + staticClass: "tk-comment", + class: { "tk-master": e.comment.master }, + attrs: { id: e.comment.id }, + }, + [ + t("tk-avatar", { + attrs: { + config: e.config, + nick: e.comment.nick, + avatar: e.comment.avatar, + "mail-md5": e.comment.mailMd5, + link: e.convertedLink, + }, + }), + e._v(" "), + t( + "div", + { staticClass: "tk-main" }, + [ + t( + "div", + { staticClass: "tk-row" }, + [ + t("div", { staticClass: "tk-meta" }, [ + e.convertedLink + ? e._e() + : t("strong", { staticClass: "tk-nick" }, [ + e._v(e._s(e.comment.nick)), + ]), + e._v(" "), + e.convertedLink + ? t( + "a", + { + staticClass: "tk-nick tk-nick-link", + attrs: { + href: e.convertedLink, + target: "_blank", + rel: "noopener noreferrer", + }, + }, + [t("strong", [e._v(e._s(e.comment.nick))])], + ) + : e._e(), + e._v(" "), + e.comment.master + ? t( + "span", + { staticClass: "tk-tag tk-tag-green" }, + [ + e._v( + e._s( + e.config.MASTER_TAG || + e.t("COMMENT_MASTER_TAG"), + ), + ), + ], + ) + : e._e(), + e._v(" "), + e.comment.top + ? t( + "span", + { staticClass: "tk-tag tk-tag-red" }, + [e._v(e._s(e.t("COMMENT_TOP_TAG")))], + ) + : e._e(), + e._v(" "), + e.comment.isSpam + ? t( + "span", + { staticClass: "tk-tag tk-tag-yellow" }, + [e._v(e._s(e.t("COMMENT_REVIEWING_TAG")))], + ) + : e._e(), + e._v(" "), + t("small", { staticClass: "tk-time" }, [ + t( + "time", + { + attrs: { + datetime: e.jsonTimestamp, + title: e.localeTime, + }, + }, + [e._v(e._s(e.displayCreated))], + ), + ]), + e._v(" "), + e.isLogin + ? t("small", { staticClass: "tk-actions" }, [ + e.comment.isSpam + ? t( + "a", + { + attrs: { href: "#" }, + on: { + click: function (t) { + return e.handleSpam(!1, t); + }, + }, + }, + [ + e._v( + e._s(e.t("ADMIN_COMMENT_SHOW")), + ), + ], + ) + : e._e(), + e._v(" "), + e.comment.isSpam + ? e._e() + : t( + "a", + { + attrs: { href: "#" }, + on: { + click: function (t) { + return e.handleSpam(!0, t); + }, + }, + }, + [ + e._v( + e._s(e.t("ADMIN_COMMENT_HIDE")), + ), + ], + ), + e._v(" "), + !e.comment.rid && e.comment.top + ? t( + "a", + { + attrs: { href: "#" }, + on: { + click: function (t) { + return e.handleTop(!1, t); + }, + }, + }, + [ + e._v( + e._s(e.t("ADMIN_COMMENT_UNTOP")), + ), + ], + ) + : e._e(), + e._v(" "), + e.comment.rid || e.comment.top + ? e._e() + : t( + "a", + { + attrs: { href: "#" }, + on: { + click: function (t) { + return e.handleTop(!0, t); + }, + }, + }, + [ + e._v( + e._s(e.t("ADMIN_COMMENT_TOP")), + ), + ], + ), + ]) + : e._e(), + ]), + e._v(" "), + t("tk-action", { + attrs: { + liked: e.liked, + "like-count": e.like, + "replies-count": e.comment.replies.length, + }, + on: { like: e.onLike, reply: e.onReply }, + }), + ], + 1, + ), + e._v(" "), + t( + "div", + { + ref: "tk-content", + staticClass: "tk-content", + class: { + "tk-content-expand": + e.isContentExpanded || !e.showContentExpand, + }, + }, + [ + e.comment.pid + ? t("span", [ + e._v(e._s(e.t("COMMENT_REPLIED")) + " "), + t( + "a", + { + staticClass: "tk-ruser", + attrs: { + href: "#".concat(e.comment.pid), + }, + }, + [e._v("@" + e._s(e.comment.ruser))], + ), + e._v(" :"), + ]) + : e._e(), + e._v(" "), + t("span", { + ref: "comment", + domProps: { innerHTML: e._s(e.comment.comment) }, + on: { click: e.popupLightbox }, + }), + ], + ), + e._v(" "), + e.showContentExpand + ? t("div", { staticClass: "tk-expand-wrap" }, [ + t( + "div", + { + staticClass: "tk-expand", + on: { click: e.onContentExpand }, + }, + [e._v(e._s(e.t("COMMENT_EXPAND")))], + ), + ]) + : e._e(), + e._v(" "), + e.showContentCollapse + ? t("div", { staticClass: "tk-collapse-wrap" }, [ + t( + "div", + { + staticClass: "tk-expand _collapse", + on: { click: e.onContentCollapse }, + }, + [e._v(e._s(e.t("COMMENT_COLLAPSE")))], + ), + ]) + : e._e(), + e._v(" "), + e.comment.ipRegion || e.comment.os || e.comment.browser + ? t("div", { staticClass: "tk-extras" }, [ + e.comment.ipRegion + ? t("div", { staticClass: "tk-extra" }, [ + t("span", { + staticClass: "tk-icon __comment", + domProps: { + innerHTML: e._s(e.iconLocation), + }, + }), + e._v(" "), + t( + "span", + { staticClass: "tk-extra-text" }, + [e._v(" " + e._s(e.comment.ipRegion))], + ), + ]) + : e._e(), + e._v(" "), + e.comment.os + ? t("div", { staticClass: "tk-extra" }, [ + t("span", { + staticClass: "tk-icon __comment", + domProps: { innerHTML: e._s(e.iconOs) }, + }), + e._v(" "), + t( + "span", + { staticClass: "tk-extra-text" }, + [e._v(" " + e._s(e.comment.os))], + ), + ]) + : e._e(), + e._v(" "), + e.comment.browser + ? t("div", { staticClass: "tk-extra" }, [ + t("span", { + staticClass: "tk-icon __comment", + domProps: { + innerHTML: e._s(e.iconBrowser), + }, + }), + e._v(" "), + t( + "span", + { staticClass: "tk-extra-text" }, + [e._v(" " + e._s(e.comment.browser))], + ), + ]) + : e._e(), + ]) + : e._e(), + e._v(" "), + e.replying && !e.pid + ? t("tk-submit", { + attrs: { + "reply-id": e.replyId + ? e.replyId + : e.comment.id, + pid: e.comment.id, + config: e.config, + }, + on: { load: e.onLoad, cancel: e.onCancel }, + }) + : e._e(), + e._v(" "), + t( + "div", + { + ref: "tk-replies", + staticClass: "tk-replies", + class: { + "tk-replies-expand": + e.isExpanded || !e.showExpand || e.replying, + }, + }, + e._l(e.comment.replies, function (n) { + return t("tk-comment", { + key: n.id, + attrs: { + comment: n, + replyId: e.comment.id, + replying: e.replying && e.pid === n.id, + config: e.config, + }, + on: { + expand: e.onExpand, + load: e.onLoad, + reply: e.onReplyReply, + }, + }); + }), + 1, + ), + e._v(" "), + e.showExpand && !e.replying + ? t("div", { staticClass: "tk-expand-wrap" }, [ + t( + "div", + { + staticClass: "tk-expand", + on: { click: e.onExpand }, + }, + [e._v(e._s(e.t("COMMENT_EXPAND")))], + ), + ]) + : e._e(), + e._v(" "), + e.showCollapse && !e.replying + ? t("div", { staticClass: "tk-collapse-wrap" }, [ + t( + "div", + { + staticClass: "tk-expand _collapse", + on: { click: e.onCollapse }, + }, + [e._v(e._s(e.t("COMMENT_COLLAPSE")))], + ), + ]) + : e._e(), + ], + 1, + ), + ], + 1, + ); + }), + (t.Yp = [])); + }, + 2048: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { staticClass: "tk-comments" }, + [ + t("tk-submit", { + attrs: { config: e.config }, + on: { load: e.initComments }, + }), + e._v(" "), + t( + "div", + { + directives: [ + { + name: "loading", + rawName: "v-loading", + value: e.loading, + expression: "loading", + }, + ], + staticClass: "tk-comments-container", + }, + [ + t("div", { staticClass: "tk-comments-title" }, [ + t( + "span", + { + staticClass: "tk-comments-count", + class: { __hidden: !e.comments.length }, + }, + [ + t("span", [e._v(e._s(e.count))]), + e._v(" "), + t("span", [ + e._v(e._s(e.t("COMMENTS_COUNT_SUFFIX"))), + ]), + ], + ), + e._v(" "), + t("span", [ + e.loading || e.loadingMore + ? e._e() + : t("span", { + staticClass: "tk-icon __comments", + domProps: { innerHTML: e._s(e.iconRefresh) }, + on: { click: e.refresh }, + }), + e.showAdminEntry + ? t("span", { + staticClass: "tk-icon __comments", + domProps: { innerHTML: e._s(e.iconSetting) }, + on: { click: e.openAdmin }, + }) + : e._e(), + ]), + ]), + e._v(" "), + e.loading || e.comments.length + ? e._e() + : t("div", { staticClass: "tk-comments-no" }, [ + e.errorMessage + ? e._e() + : t("span", [ + e._v(e._s(e.t("COMMENTS_NO_COMMENTS"))), + ]), + e._v(" "), + e.errorMessage + ? t( + "span", + { staticClass: "tk-comments-error" }, + [e._v(e._s(e.errorMessage))], + ) + : e._e(), + ]), + e._v(" "), + e._l(e.comments, function (n) { + return t("tk-comment", { + key: n.id, + attrs: { + comment: n, + replying: e.replyId === n.id, + config: e.config, + }, + on: { reply: e.onReply, load: e.initComments }, + }); + }), + e._v(" "), + e.showExpand && !e.loading + ? t("div", { staticClass: "tk-expand-wrap" }, [ + t( + "div", + { + directives: [ + { + name: "loading", + rawName: "v-loading", + value: e.loadingMore, + expression: "loadingMore", + }, + ], + staticClass: "tk-expand", + on: { click: e.onExpand }, + }, + [e._v(e._s(e.t("COMMENTS_EXPAND")))], + ), + ]) + : e._e(), + ], + 2, + ), + ], + 1, + ); + }), + (t.Yp = [])); + }, + 2080: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t("div", { staticClass: "tk-footer" }, [ + e._v("\n Powered by "), + t( + "a", + { + attrs: { + href: "https://twikoo.js.org", + target: "_blank", + }, + }, + [e._v("Twikoo")], + ), + e._v("\n v" + e._s(e.version) + "\n"), + ]); + }), + (t.Yp = [])); + }, + 1412: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { staticClass: "tk-meta-input" }, + e._l(e.displayedInputs, function (n) { + return t( + "el-input", + { + key: n.key, + attrs: { + name: n.name, + type: n.type, + placeholder: e.requiredFields[n.key] + ? e.t("META_INPUT_REQUIRED") + : e.t("META_INPUT_NOT_REQUIRED"), + size: "small", + }, + on: { change: e.onMetaChange }, + model: { + value: e.metaData[n.key], + callback: function (t) { + e.$set(e.metaData, n.key, t); + }, + expression: "metaData[metaInput.key]", + }, + }, + [ + t("template", { slot: "prepend" }, [ + e._v(e._s(n.locale)), + ]), + ], + 2, + ); + }), + 1, + ); + }), + (t.Yp = [])); + }, + 8675: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t("div", { staticClass: "tk-pagination" }, [ + e.pageCount + ? t( + "div", + { staticClass: "tk-pagination-options" }, + [ + t("div", [ + t("span", [ + e._v(e._s(e.t("PAGINATION_COUNT_PREFIX"))), + ]), + e._v(" "), + t("span", [e._v(e._s(e.total))]), + e._v(" "), + t("span", [ + e._v(e._s(e.t("PAGINATION_COUNT_SUFFIX"))), + ]), + ]), + e._v(" "), + t("el-input", { + attrs: { + type: "number", + min: "1", + max: "100", + value: e.userPageSize + ? e.userPageSize + : e.pageSize, + }, + on: { + input: e.handleInputPageSize, + change: e.pageSizeChamge, + }, + }), + e._v(" "), + t("span", [e._v(e._s(e.t("PAGINATION_PAGESIZE")))]), + ], + 1, + ) + : e._e(), + e._v(" "), + t( + "div", + { staticClass: "tk-pagination-pagers" }, + e._l(e.pagers, function (n) { + return t( + "div", + { + key: n.page, + staticClass: "tk-pagination-pager", + class: { __current: n.page === e.currentPage }, + on: { + click: function (t) { + return e.currentChange(n.page); + }, + }, + }, + [e._v(e._s(n.title))], + ); + }), + 0, + ), + e._v(" "), + e.pageCount + ? t( + "div", + { staticClass: "tk-pagination-options" }, + [ + t("span", [ + e._v(e._s(e.t("PAGINATION_GOTO_PREFIX"))), + ]), + e._v(" "), + t("el-input", { + attrs: { + type: "number", + min: "1", + max: e.pageCount, + value: e.userInput ? e.userInput : e.currentPage, + }, + on: { + input: e.handleInput, + change: e.currentChange, + }, + }), + e._v(" "), + t("span", [ + e._v(e._s(e.t("PAGINATION_GOTO_SUFFIX"))), + ]), + ], + 1, + ) + : e._e(), + ]); + }), + (t.Yp = [])); + }, + 9564: function (e, t) { + "use strict"; + ((t.Yp = t.XX = void 0), + (t.XX = function () { + var e = this, + t = e._self._c; + return t( + "div", + { ref: "tk-submit", staticClass: "tk-submit tk-fade-in" }, + [ + t( + "div", + { staticClass: "tk-row" }, + [ + t("tk-avatar", { + attrs: { + config: e.config, + mail: e.mail, + nick: e.nick, + }, + }), + e._v(" "), + t( + "div", + { staticClass: "tk-col" }, + [ + t("tk-meta-input", { + attrs: { + nick: e.nick, + mail: e.mail, + link: e.link, + config: e.config, + }, + on: { update: e.onMetaUpdate }, + }), + e._v(" "), + t("el-input", { + ref: "textarea", + staticClass: "tk-input", + attrs: { + type: "textarea", + "show-word-limit": "", + placeholder: e.commentPlaceholder, + autosize: { minRows: 3 }, + maxlength: e.maxLength, + }, + on: { input: e.onCommentInput }, + nativeOn: { + keyup: function (t) { + return !t.type.indexOf("key") && + e._k(t.keyCode, "enter", 13, t.key, "Enter") + ? null + : e.onEnterKeyUp(t); + }, + }, + model: { + value: e.comment, + callback: function (t) { + e.comment = t; + }, + expression: "comment", + }, + }), + ], + 1, + ), + ], + 1, + ), + e._v(" "), + t( + "div", + { staticClass: "tk-row actions" }, + [ + t("div", { staticClass: "tk-row-actions-start" }, [ + t("div", { + directives: [ + { + name: "show", + rawName: "v-show", + value: "true" === e.config.SHOW_EMOTION, + expression: "config.SHOW_EMOTION === 'true'", + }, + { + name: "clickoutside", + rawName: "v-clickoutside", + value: e.closeOwo, + expression: "closeOwo", + }, + ], + ref: "owo", + staticClass: "tk-submit-action-icon OwO", + domProps: { innerHTML: e._s(e.iconEmotion) }, + }), + e._v(" "), + t("div", { + directives: [ + { + name: "show", + rawName: "v-show", + value: "true" === e.config.SHOW_IMAGE, + expression: "config.SHOW_IMAGE === 'true'", + }, + ], + staticClass: "tk-submit-action-icon", + domProps: { innerHTML: e._s(e.iconImage) }, + on: { click: e.openSelectImage }, + }), + e._v(" "), + t("input", { + ref: "inputFile", + staticClass: "tk-input-image", + attrs: { + type: "file", + accept: "image/*", + value: "", + }, + on: { change: e.onSelectImage }, + }), + e._v(" "), + t("div", { staticClass: "tk-error-message" }, [ + e._v(e._s(e.errorMessage)), + ]), + ]), + e._v(" "), + t("a", { + staticClass: "tk-submit-action-icon __markdown", + attrs: { + alt: "Markdown is supported", + href: "https://guides.github.com/features/mastering-markdown/", + target: "_blank", + rel: "noopener noreferrer", + }, + domProps: { innerHTML: e._s(e.iconMarkdown) }, + }), + e._v(" "), + e.replyId + ? t( + "el-button", + { + staticClass: "tk-cancel", + attrs: { size: "small" }, + on: { click: e.cancel }, + }, + [e._v(e._s(e.t("SUBMIT_CANCEL")))], + ) + : e._e(), + e._v(" "), + t( + "el-button", + { + staticClass: "tk-preview", + attrs: { size: "small" }, + on: { click: e.preview }, + }, + [e._v(e._s(e.t("SUBMIT_PREVIEW")))], + ), + e._v(" "), + t( + "el-button", + { + staticClass: "tk-send", + attrs: { + type: "primary", + size: "small", + disabled: !e.canSend, + }, + on: { click: e.send }, + }, + [ + e._v( + e._s( + e.isSending + ? e.t("SUBMIT_SENDING") + : e.t("SUBMIT_SEND"), + ), + ), + ], + ), + e._v(" "), + t( + "div", + { + ref: "turnstile-container", + staticClass: "tk-turnstile-container", + }, + [ + t("div", { + ref: "turnstile", + staticClass: "tk-turnstile", + }), + ], + ), + ], + 1, + ), + e._v(" "), + e.isPreviewing + ? t("div", { + ref: "comment-preview", + staticClass: "tk-preview-container", + domProps: { innerHTML: e._s(e.commentHtml) }, + }) + : e._e(), + ], + ); + }), + (t.Yp = [])); + }, + 5547: function (e, t) { + "use strict"; + t.A = function (e, t) { + for (var n = [], r = {}, i = 0; i < t.length; i++) { + var o = t[i], + a = o[0], + s = { + id: e + ":" + i, + css: o[1], + media: o[2], + sourceMap: o[3], + }; + r[a] + ? r[a].parts.push(s) + : n.push((r[a] = { id: a, parts: [s] })); + } + return n; + }; + }, + 4478: function (e, t, n) { + "use strict"; + e.exports = n(6615); + }, + 6615: function (e, t, n) { + "use strict"; + var r = n(477), + i = r(n(8850)), + o = r(n(1332)), + a = r(n(9367)), + s = Object.freeze({}), + u = Array.isArray; + function c(e) { + return null == e; + } + function l(e) { + return null != e; + } + function d(e) { + return !0 === e; + } + function f(e) { + return ( + "string" == typeof e || + "number" == typeof e || + "symbol" == (0, a["default"])(e) || + "boolean" == typeof e + ); + } + function p(e) { + return "function" == typeof e; + } + function h(e) { + return null !== e && "object" == (0, a["default"])(e); + } + var m = Object.prototype.toString; + function g(e) { + return "[object Object]" === m.call(e); + } + function v(e) { + var t = parseFloat(String(e)); + return t >= 0 && Math.floor(t) === t && isFinite(e); + } + function _(e) { + return ( + l(e) && + "function" == typeof e.then && + "function" == typeof e["catch"] + ); + } + function y(e) { + return null == e + ? "" + : Array.isArray(e) || (g(e) && e.toString === m) + ? JSON.stringify(e, b, 2) + : String(e); + } + function b(e, t) { + return t && t.__v_isRef ? t.value : t; + } + function k(e) { + var t = parseFloat(e); + return isNaN(t) ? e : t; + } + function w(e, t) { + for ( + var n = Object.create(null), r = e.split(","), i = 0; + i < r.length; + i++ + ) + n[r[i]] = !0; + return t + ? function (e) { + return n[e.toLowerCase()]; + } + : function (e) { + return n[e]; + }; + } + var E = w("key,ref,slot,slot-scope,is"); + function A(e, t) { + var n = e.length; + if (n) { + if (t === e[n - 1]) return void (e.length = n - 1); + var r = e.indexOf(t); + if (r > -1) return e.splice(r, 1); + } + } + var C = Object.prototype.hasOwnProperty; + function x(e, t) { + return C.call(e, t); + } + function I(e) { + var t = Object.create(null); + return function (n) { + return t[n] || (t[n] = e(n)); + }; + } + var D = /-(\w)/g, + S = I(function (e) { + return e.replace(D, function (e, t) { + return t ? t.toUpperCase() : ""; + }); + }), + O = I(function (e) { + return e.charAt(0).toUpperCase() + e.slice(1); + }), + T = /\B([A-Z])/g, + M = I(function (e) { + return e.replace(T, "-$1").toLowerCase(); + }), + N = Function.prototype.bind + ? function (e, t) { + return e.bind(t); + } + : function (e, t) { + function n(n) { + var r = arguments.length; + return r + ? r > 1 + ? e.apply(t, arguments) + : e.call(t, n) + : e.call(t); + } + return ((n._length = e.length), n); + }; + function P(e, t) { + t = t || 0; + for (var n = e.length - t, r = new Array(n); n--; ) + r[n] = e[n + t]; + return r; + } + function F(e, t) { + for (var n in t) e[n] = t[n]; + return e; + } + function L(e) { + for (var t = {}, n = 0; n < e.length; n++) e[n] && F(t, e[n]); + return t; + } + function R(e, t, n) {} + var j = function (e, t, n) { + return !1; + }, + $ = function (e) { + return e; + }; + function U(e, t) { + if (e === t) return !0; + var n = h(e), + r = h(t); + if (!n || !r) return !n && !r && String(e) === String(t); + try { + var i = Array.isArray(e), + o = Array.isArray(t); + if (i && o) + return ( + e.length === t.length && + e.every(function (e, n) { + return U(e, t[n]); + }) + ); + if (e instanceof Date && t instanceof Date) + return e.getTime() === t.getTime(); + if (i || o) return !1; + var a = Object.keys(e), + s = Object.keys(t); + return ( + a.length === s.length && + a.every(function (n) { + return U(e[n], t[n]); + }) + ); + } catch (e) { + return !1; + } + } + function B(e, t) { + for (var n = 0; n < e.length; n++) if (U(e[n], t)) return n; + return -1; + } + function G(e) { + var t = !1; + return function () { + t || ((t = !0), e.apply(this, arguments)); + }; + } + function z(e, t) { + return e === t ? 0 === e && 1 / e != 1 / t : e == e || t == t; + } + var H = "data-server-rendered", + q = ["component", "directive", "filter"], + V = [ + "beforeCreate", + "created", + "beforeMount", + "mounted", + "beforeUpdate", + "updated", + "beforeDestroy", + "destroyed", + "activated", + "deactivated", + "errorCaptured", + "serverPrefetch", + "renderTracked", + "renderTriggered", + ], + W = { + optionMergeStrategies: Object.create(null), + silent: !1, + productionTip: !1, + devtools: !1, + performance: !1, + errorHandler: null, + warnHandler: null, + ignoredElements: [], + keyCodes: Object.create(null), + isReservedTag: j, + isReservedAttr: j, + isUnknownElement: j, + getTagNamespace: R, + parsePlatformTagName: $, + mustUseProp: j, + async: !0, + _lifecycleHooks: V, + }; + function X(e) { + var t = (e + "").charCodeAt(0); + return 36 === t || 95 === t; + } + function K(e, t, n, r) { + Object.defineProperty(e, t, { + value: n, + enumerable: !!r, + writable: !0, + configurable: !0, + }); + } + var Y = new RegExp( + "[^".concat( + /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/ + .source, + ".$_\\d]", + ), + ), + J = "__proto__" in {}, + Q = "undefined" != typeof window, + Z = Q && window.navigator.userAgent.toLowerCase(), + ee = Z && /msie|trident/.test(Z), + te = Z && Z.indexOf("msie 9.0") > 0, + ne = Z && Z.indexOf("edge/") > 0; + Z && Z.indexOf("android"); + var re = Z && /iphone|ipad|ipod|ios/.test(Z); + (Z && /chrome\/\d+/.test(Z), Z && /phantomjs/.test(Z)); + var ie, + oe = Z && Z.match(/firefox\/(\d+)/), + ae = {}.watch, + se = !1; + if (Q) + try { + var ue = {}; + (Object.defineProperty(ue, "passive", { + get: function () { + se = !0; + }, + }), + window.addEventListener("test-passive", null, ue)); + } catch (s) {} + var ce = function () { + return ( + void 0 === ie && + (ie = + !Q && + "undefined" != typeof n.g && + n.g.process && + "server" === n.g.process.env.VUE_ENV), + ie + ); + }, + le = Q && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + function de(e) { + return "function" == typeof e && /native code/.test(e.toString()); + } + var fe, + pe = + "undefined" != typeof Symbol && + de(Symbol) && + "undefined" != typeof Reflect && + de(Reflect.ownKeys); + fe = + "undefined" != typeof Set && de(Set) + ? Set + : (function () { + function e() { + ((0, i["default"])(this, e), + (this.set = Object.create(null))); + } + return ( + (0, o["default"])(e, [ + { + key: "has", + value: function (e) { + return !0 === this.set[e]; + }, + }, + { + key: "add", + value: function (e) { + this.set[e] = !0; + }, + }, + { + key: "clear", + value: function () { + this.set = Object.create(null); + }, + }, + ]), + e + ); + })(); + var he = null; + function me() { + var e = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : null; + (e || (he && he._scope.off()), (he = e), e && e._scope.on()); + } + var ge = (function () { + function e(t, n, r, o, a, s, u, c) { + ((0, i["default"])(this, e), + (this.tag = t), + (this.data = n), + (this.children = r), + (this.text = o), + (this.elm = a), + (this.ns = void 0), + (this.context = s), + (this.fnContext = void 0), + (this.fnOptions = void 0), + (this.fnScopeId = void 0), + (this.key = n && n.key), + (this.componentOptions = u), + (this.componentInstance = void 0), + (this.parent = void 0), + (this.raw = !1), + (this.isStatic = !1), + (this.isRootInsert = !0), + (this.isComment = !1), + (this.isCloned = !1), + (this.isOnce = !1), + (this.asyncFactory = c), + (this.asyncMeta = void 0), + (this.isAsyncPlaceholder = !1)); + } + return ( + (0, o["default"])(e, [ + { + key: "child", + get: function () { + return this.componentInstance; + }, + }, + ]), + e + ); + })(), + ve = function () { + var e = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : "", + t = new ge(); + return ((t.text = e), (t.isComment = !0), t); + }; + function _e(e) { + return new ge(void 0, void 0, void 0, String(e)); + } + function ye(e) { + var t = new ge( + e.tag, + e.data, + e.children && e.children.slice(), + e.text, + e.elm, + e.context, + e.componentOptions, + e.asyncFactory, + ); + return ( + (t.ns = e.ns), + (t.isStatic = e.isStatic), + (t.key = e.key), + (t.isComment = e.isComment), + (t.fnContext = e.fnContext), + (t.fnOptions = e.fnOptions), + (t.fnScopeId = e.fnScopeId), + (t.asyncMeta = e.asyncMeta), + (t.isCloned = !0), + t + ); + } + var be = 0, + ke = [], + we = function () { + for (var e = 0; e < ke.length; e++) { + var t = ke[e]; + ((t.subs = t.subs.filter(function (e) { + return e; + })), + (t._pending = !1)); + } + ke.length = 0; + }, + Ee = (function () { + function e() { + ((0, i["default"])(this, e), + (this._pending = !1), + (this.id = be++), + (this.subs = [])); + } + return ( + (0, o["default"])(e, [ + { + key: "addSub", + value: function (e) { + this.subs.push(e); + }, + }, + { + key: "removeSub", + value: function (e) { + ((this.subs[this.subs.indexOf(e)] = null), + this._pending || + ((this._pending = !0), ke.push(this))); + }, + }, + { + key: "depend", + value: function (t) { + e.target && e.target.addDep(this); + }, + }, + { + key: "notify", + value: function (e) { + for ( + var t = this.subs.filter(function (e) { + return e; + }), + n = 0, + r = t.length; + n < r; + n++ + ) + t[n].update(); + }, + }, + ]), + e + ); + })(); + Ee.target = null; + var Ae = []; + function Ce(e) { + (Ae.push(e), (Ee.target = e)); + } + function xe() { + (Ae.pop(), (Ee.target = Ae[Ae.length - 1])); + } + var Ie = Array.prototype, + De = Object.create(Ie); + [ + "push", + "pop", + "shift", + "unshift", + "splice", + "sort", + "reverse", + ].forEach(function (e) { + var t = Ie[e]; + K(De, e, function () { + for ( + var n = arguments.length, r = new Array(n), i = 0; + i < n; + i++ + ) + r[i] = arguments[i]; + var o, + a = t.apply(this, r), + s = this.__ob__; + switch (e) { + case "push": + case "unshift": + o = r; + break; + case "splice": + o = r.slice(2); + } + return (o && s.observeArray(o), s.dep.notify(), a); + }); + }); + var Se = Object.getOwnPropertyNames(De), + Oe = {}, + Te = !0; + function Me(e) { + Te = e; + } + var Ne = { notify: R, depend: R, addSub: R, removeSub: R }, + Pe = (function () { + function e(t) { + var n = + arguments.length > 1 && + arguments[1] !== undefined && + arguments[1], + r = + arguments.length > 2 && + arguments[2] !== undefined && + arguments[2]; + if ( + ((0, i["default"])(this, e), + (this.value = t), + (this.shallow = n), + (this.mock = r), + (this.dep = r ? Ne : new Ee()), + (this.vmCount = 0), + K(t, "__ob__", this), + u(t)) + ) { + if (!r) + if (J) t.__proto__ = De; + else + for (var o = 0, a = Se.length; o < a; o++) { + var s = Se[o]; + K(t, s, De[s]); + } + n || this.observeArray(t); + } else + for (var c = Object.keys(t), l = 0; l < c.length; l++) + Le(t, c[l], Oe, void 0, n, r); + } + return ( + (0, o["default"])(e, [ + { + key: "observeArray", + value: function (e) { + for (var t = 0, n = e.length; t < n; t++) + Fe(e[t], !1, this.mock); + }, + }, + ]), + e + ); + })(); + function Fe(e, t, n) { + return e && x(e, "__ob__") && e.__ob__ instanceof Pe + ? e.__ob__ + : !Te || + (!n && ce()) || + (!u(e) && !g(e)) || + !Object.isExtensible(e) || + e.__v_skip || + Ve(e) || + e instanceof ge + ? void 0 + : new Pe(e, t, n); + } + function Le(e, t, n, r, i, o) { + arguments.length > 6 && undefined; + var a = new Ee(), + s = Object.getOwnPropertyDescriptor(e, t); + if (!s || !1 !== s.configurable) { + var c = s && s.get, + l = s && s.set; + (c && !l) || (n !== Oe && 2 !== arguments.length) || (n = e[t]); + var d = i ? n && n.__ob__ : Fe(n, !1, o); + return ( + Object.defineProperty(e, t, { + enumerable: !0, + configurable: !0, + get: function () { + var t = c ? c.call(e) : n; + return ( + Ee.target && + (a.depend(), d && (d.dep.depend(), u(t) && $e(t))), + Ve(t) && !i ? t.value : t + ); + }, + set: function (t) { + var r = c ? c.call(e) : n; + if (z(r, t)) { + if (l) l.call(e, t); + else { + if (c) return; + if (!i && Ve(r) && !Ve(t)) return void (r.value = t); + n = t; + } + ((d = i ? t && t.__ob__ : Fe(t, !1, o)), a.notify()); + } + }, + }), + a + ); + } + } + function Re(e, t, n) { + if (!He(e)) { + var r = e.__ob__; + return u(e) && v(t) + ? ((e.length = Math.max(e.length, t)), + e.splice(t, 1, n), + r && !r.shallow && r.mock && Fe(n, !1, !0), + n) + : t in e && !(t in Object.prototype) + ? ((e[t] = n), n) + : e._isVue || (r && r.vmCount) + ? n + : r + ? (Le(r.value, t, n, void 0, r.shallow, r.mock), + r.dep.notify(), + n) + : ((e[t] = n), n); + } + } + function je(e, t) { + if (u(e) && v(t)) e.splice(t, 1); + else { + var n = e.__ob__; + e._isVue || + (n && n.vmCount) || + He(e) || + (x(e, t) && (delete e[t], n && n.dep.notify())); + } + } + function $e(e) { + for (var t, n = 0, r = e.length; n < r; n++) + ((t = e[n]) && t.__ob__ && t.__ob__.dep.depend(), + u(t) && $e(t)); + } + function Ue(e) { + return (Be(e, !0), K(e, "__v_isShallow", !0), e); + } + function Be(e, t) { + He(e) || Fe(e, t, ce()); + } + function Ge(e) { + return He(e) ? Ge(e.__v_raw) : !(!e || !e.__ob__); + } + function ze(e) { + return !(!e || !e.__v_isShallow); + } + function He(e) { + return !(!e || !e.__v_isReadonly); + } + var qe = "__v_isRef"; + function Ve(e) { + return !(!e || !0 !== e.__v_isRef); + } + function We(e, t) { + if (Ve(e)) return e; + var n = {}; + return ( + K(n, qe, !0), + K(n, "__v_isShallow", t), + K(n, "dep", Le(n, "value", e, null, t, ce())), + n + ); + } + function Xe(e, t, n) { + Object.defineProperty(e, n, { + enumerable: !0, + configurable: !0, + get: function () { + var e = t[n]; + if (Ve(e)) return e.value; + var r = e && e.__ob__; + return (r && r.dep.depend(), e); + }, + set: function (e) { + var r = t[n]; + Ve(r) && !Ve(e) ? (r.value = e) : (t[n] = e); + }, + }); + } + function Ke(e, t, n) { + var r = e[t]; + if (Ve(r)) return r; + var i = { + get value() { + var r = e[t]; + return void 0 === r ? n : r; + }, + set value(n) { + e[t] = n; + }, + }; + return (K(i, qe, !0), i); + } + var Ye = "__v_rawToReadonly", + Je = "__v_rawToShallowReadonly"; + function Qe(e) { + return Ze(e, !1); + } + function Ze(e, t) { + if (!g(e)) return e; + if (He(e)) return e; + var n = t ? Je : Ye, + r = e[n]; + if (r) return r; + var i = Object.create(Object.getPrototypeOf(e)); + (K(e, n, i), + K(i, "__v_isReadonly", !0), + K(i, "__v_raw", e), + Ve(e) && K(i, qe, !0), + (t || ze(e)) && K(i, "__v_isShallow", !0)); + for (var o = Object.keys(e), a = 0; a < o.length; a++) + et(i, e, o[a], t); + return i; + } + function et(e, t, n, r) { + Object.defineProperty(e, n, { + enumerable: !0, + configurable: !0, + get: function () { + var e = t[n]; + return r || !g(e) ? e : Qe(e); + }, + set: function () {}, + }); + } + var tt = "watcher", + nt = "".concat(tt, " callback"), + rt = "".concat(tt, " getter"), + it = "".concat(tt, " cleanup"); + function ot(e, t) { + return ut(e, null, { flush: "post" }); + } + var at, + st = {}; + function ut(e, t) { + var n, + r, + i = + arguments.length > 2 && arguments[2] !== undefined + ? arguments[2] + : s, + o = i.immediate, + a = i.deep, + c = i.flush, + l = void 0 === c ? "pre" : c, + d = (i.onTrack, i.onTrigger, he), + f = function (e, t) { + var n = en( + e, + null, + arguments.length > 2 && arguments[2] !== undefined + ? arguments[2] + : null, + d, + t, + ); + return (a && n && n.__ob__ && n.__ob__.dep.depend(), n); + }, + h = !1, + m = !1; + if ( + (Ve(e) + ? ((n = function () { + return e.value; + }), + (h = ze(e))) + : Ge(e) + ? ((n = function () { + return (e.__ob__.dep.depend(), e); + }), + (a = !0)) + : u(e) + ? ((m = !0), + (h = e.some(function (e) { + return Ge(e) || ze(e); + })), + (n = function () { + return e.map(function (e) { + return Ve(e) + ? e.value + : Ge(e) + ? (e.__ob__.dep.depend(), On(e)) + : p(e) + ? f(e, rt) + : void 0; + }); + })) + : (n = p(e) + ? t + ? function () { + return f(e, rt); + } + : function () { + if (!d || !d._isDestroyed) + return (r && r(), f(e, tt, [v])); + } + : R), + t && a) + ) { + var g = n; + n = function () { + return On(g()); + }; + } + var v = function (e) { + r = _.onStop = function () { + f(e, it); + }; + }; + if (ce()) + return ( + (v = R), + t ? o && f(t, nt, [n(), m ? [] : void 0, v]) : n(), + R + ); + var _ = new Pn(he, n, R, { lazy: !0 }); + _.noRecurse = !t; + var y = m ? [] : st; + return ( + (_.run = function () { + if (_.active) + if (t) { + var e = _.get(); + (a || + h || + (m + ? e.some(function (e, t) { + return z(e, y[t]); + }) + : z(e, y))) && + (r && r(), + f(t, nt, [e, y === st ? void 0 : y, v]), + (y = e)); + } else _.get(); + }), + "sync" === l + ? (_.update = _.run) + : "post" === l + ? ((_.post = !0), + (_.update = function () { + return nr(_); + })) + : (_.update = function () { + if (d && d === he && !d._isMounted) { + var e = d._preWatchers || (d._preWatchers = []); + e.indexOf(_) < 0 && e.push(_); + } else nr(_); + }), + t + ? o + ? _.run() + : (y = _.get()) + : "post" === l && d + ? d.$once("hook:mounted", function () { + return _.get(); + }) + : _.get(), + function () { + _.teardown(); + } + ); + } + var ct = (function () { + function e() { + var t = + arguments.length > 0 && + arguments[0] !== undefined && + arguments[0]; + ((0, i["default"])(this, e), + (this.detached = t), + (this.active = !0), + (this.effects = []), + (this.cleanups = []), + (this.parent = at), + !t && + at && + (this.index = + (at.scopes || (at.scopes = [])).push(this) - 1)); + } + return ( + (0, o["default"])(e, [ + { + key: "run", + value: function (e) { + if (this.active) { + var t = at; + try { + return ((at = this), e()); + } finally { + at = t; + } + } + }, + }, + { + key: "on", + value: function () { + at = this; + }, + }, + { + key: "off", + value: function () { + at = this.parent; + }, + }, + { + key: "stop", + value: function (e) { + if (this.active) { + var t, n; + for (t = 0, n = this.effects.length; t < n; t++) + this.effects[t].teardown(); + for (t = 0, n = this.cleanups.length; t < n; t++) + this.cleanups[t](); + if (this.scopes) + for (t = 0, n = this.scopes.length; t < n; t++) + this.scopes[t].stop(!0); + if (!this.detached && this.parent && !e) { + var r = this.parent.scopes.pop(); + r && + r !== this && + ((this.parent.scopes[this.index] = r), + (r.index = this.index)); + } + ((this.parent = void 0), (this.active = !1)); + } + }, + }, + ]), + e + ); + })(); + function lt() { + return at; + } + function dt(e) { + var t = e._provided, + n = e.$parent && e.$parent._provided; + return n === t ? (e._provided = Object.create(n)) : t; + } + var ft = I(function (e) { + var t = "&" === e.charAt(0), + n = "~" === (e = t ? e.slice(1) : e).charAt(0), + r = "!" === (e = n ? e.slice(1) : e).charAt(0); + return { + name: (e = r ? e.slice(1) : e), + once: n, + capture: r, + passive: t, + }; + }); + function pt(e, t) { + function n() { + var e = n.fns; + if (!u(e)) return en(e, null, arguments, t, "v-on handler"); + for (var r = e.slice(), i = 0; i < r.length; i++) + en(r[i], null, arguments, t, "v-on handler"); + } + return ((n.fns = e), n); + } + function ht(e, t, n, r, i, o) { + var a, s, u, l; + for (a in e) + ((s = e[a]), + (u = t[a]), + (l = ft(a)), + c(s) || + (c(u) + ? (c(s.fns) && (s = e[a] = pt(s, o)), + d(l.once) && (s = e[a] = i(l.name, s, l.capture)), + n(l.name, s, l.capture, l.passive, l.params)) + : s !== u && ((u.fns = s), (e[a] = u)))); + for (a in t) c(e[a]) && r((l = ft(a)).name, t[a], l.capture); + } + function mt(e, t, n) { + var r; + e instanceof ge && (e = e.data.hook || (e.data.hook = {})); + var i = e[t]; + function o() { + (n.apply(this, arguments), A(r.fns, o)); + } + (c(i) + ? (r = pt([o])) + : l(i.fns) && d(i.merged) + ? (r = i).fns.push(o) + : (r = pt([i, o])), + (r.merged = !0), + (e[t] = r)); + } + function gt(e, t, n, r, i) { + if (l(t)) { + if (x(t, n)) return ((e[n] = t[n]), i || delete t[n], !0); + if (x(t, r)) return ((e[n] = t[r]), i || delete t[r], !0); + } + return !1; + } + function vt(e) { + return f(e) ? [_e(e)] : u(e) ? yt(e) : void 0; + } + function _t(e) { + return l(e) && l(e.text) && !1 === e.isComment; + } + function yt(e, t) { + var n, + r, + i, + o, + a = []; + for (n = 0; n < e.length; n++) + c((r = e[n])) || + "boolean" == typeof r || + ((o = a[(i = a.length - 1)]), + u(r) + ? r.length > 0 && + (_t((r = yt(r, "".concat(t || "", "_").concat(n)))[0]) && + _t(o) && + ((a[i] = _e(o.text + r[0].text)), r.shift()), + a.push.apply(a, r)) + : f(r) + ? _t(o) + ? (a[i] = _e(o.text + r)) + : "" !== r && a.push(_e(r)) + : _t(r) && _t(o) + ? (a[i] = _e(o.text + r.text)) + : (d(e._isVList) && + l(r.tag) && + c(r.key) && + l(t) && + (r.key = "__vlist".concat(t, "_").concat(n, "__")), + a.push(r))); + return a; + } + function bt(e, t) { + var n, + r, + i, + o, + a = null; + if (u(e) || "string" == typeof e) + for (a = new Array(e.length), n = 0, r = e.length; n < r; n++) + a[n] = t(e[n], n); + else if ("number" == typeof e) + for (a = new Array(e), n = 0; n < e; n++) a[n] = t(n + 1, n); + else if (h(e)) + if (pe && e[Symbol.iterator]) { + a = []; + for (var s = e[Symbol.iterator](), c = s.next(); !c.done; ) + (a.push(t(c.value, a.length)), (c = s.next())); + } else + for ( + i = Object.keys(e), + a = new Array(i.length), + n = 0, + r = i.length; + n < r; + n++ + ) + ((o = i[n]), (a[n] = t(e[o], o, n))); + return (l(a) || (a = []), (a._isVList = !0), a); + } + function kt(e, t, n, r) { + var i, + o = this.$scopedSlots[e]; + o + ? ((n = n || {}), + r && (n = F(F({}, r), n)), + (i = o(n) || (p(t) ? t() : t))) + : (i = this.$slots[e] || (p(t) ? t() : t)); + var a = n && n.slot; + return a ? this.$createElement("template", { slot: a }, i) : i; + } + function wt(e) { + return br(this.$options, "filters", e) || $; + } + function Et(e, t) { + return u(e) ? -1 === e.indexOf(t) : e !== t; + } + function At(e, t, n, r, i) { + var o = W.keyCodes[t] || n; + return i && r && !W.keyCodes[t] + ? Et(i, r) + : o + ? Et(o, e) + : r + ? M(r) !== t + : void 0 === e; + } + function Ct(e, t, n, r, i) { + if (n && h(n)) { + var o; + u(n) && (n = L(n)); + var a = function (a) { + if ("class" === a || "style" === a || E(a)) o = e; + else { + var s = e.attrs && e.attrs.type; + o = + r || W.mustUseProp(t, s, a) + ? e.domProps || (e.domProps = {}) + : e.attrs || (e.attrs = {}); + } + var u = S(a), + c = M(a); + u in o || + c in o || + ((o[a] = n[a]), !i) || + ((e.on || (e.on = {}))["update:".concat(a)] = function (e) { + n[a] = e; + }); + }; + for (var s in n) a(s); + } + return e; + } + function xt(e, t) { + var n = this._staticTrees || (this._staticTrees = []), + r = n[e]; + return ( + (r && !t) || + Dt( + (r = n[e] = + this.$options.staticRenderFns[e].call( + this._renderProxy, + this._c, + this, + )), + "__static__".concat(e), + !1, + ), + r + ); + } + function It(e, t, n) { + return ( + Dt(e, "__once__".concat(t).concat(n ? "_".concat(n) : ""), !0), + e + ); + } + function Dt(e, t, n) { + if (u(e)) + for (var r = 0; r < e.length; r++) + e[r] && + "string" != typeof e[r] && + St(e[r], "".concat(t, "_").concat(r), n); + else St(e, t, n); + } + function St(e, t, n) { + ((e.isStatic = !0), (e.key = t), (e.isOnce = n)); + } + function Ot(e, t) { + if (t && g(t)) { + var n = (e.on = e.on ? F({}, e.on) : {}); + for (var r in t) { + var i = n[r], + o = t[r]; + n[r] = i ? [].concat(i, o) : o; + } + } + return e; + } + function Tt(e, t, n, r) { + t = t || { $stable: !n }; + for (var i = 0; i < e.length; i++) { + var o = e[i]; + u(o) + ? Tt(o, t, n) + : o && (o.proxy && (o.fn.proxy = !0), (t[o.key] = o.fn)); + } + return (r && (t.$key = r), t); + } + function Mt(e, t) { + for (var n = 0; n < t.length; n += 2) { + var r = t[n]; + "string" == typeof r && r && (e[t[n]] = t[n + 1]); + } + return e; + } + function Nt(e, t) { + return "string" == typeof e ? t + e : e; + } + function Pt(e) { + ((e._o = It), + (e._n = k), + (e._s = y), + (e._l = bt), + (e._t = kt), + (e._q = U), + (e._i = B), + (e._m = xt), + (e._f = wt), + (e._k = At), + (e._b = Ct), + (e._v = _e), + (e._e = ve), + (e._u = Tt), + (e._g = Ot), + (e._d = Mt), + (e._p = Nt)); + } + function Ft(e, t) { + if (!e || !e.length) return {}; + for (var n = {}, r = 0, i = e.length; r < i; r++) { + var o = e[r], + a = o.data; + if ( + (a && a.attrs && a.attrs.slot && delete a.attrs.slot, + (o.context !== t && o.fnContext !== t) || + !a || + null == a.slot) + ) + (n["default"] || (n["default"] = [])).push(o); + else { + var s = a.slot, + u = n[s] || (n[s] = []); + "template" === o.tag + ? u.push.apply(u, o.children || []) + : u.push(o); + } + } + for (var c in n) n[c].every(Lt) && delete n[c]; + return n; + } + function Lt(e) { + return (e.isComment && !e.asyncFactory) || " " === e.text; + } + function Rt(e) { + return e.isComment && e.asyncFactory; + } + function jt(e, t, n, r) { + var i, + o = Object.keys(n).length > 0, + a = t ? !!t.$stable : !o, + u = t && t.$key; + if (t) { + if (t._normalized) return t._normalized; + if (a && r && r !== s && u === r.$key && !o && !r.$hasNormal) + return r; + for (var c in ((i = {}), t)) + t[c] && "$" !== c[0] && (i[c] = $t(e, n, c, t[c])); + } else i = {}; + for (var l in n) l in i || (i[l] = Ut(n, l)); + return ( + t && Object.isExtensible(t) && (t._normalized = i), + K(i, "$stable", a), + K(i, "$key", u), + K(i, "$hasNormal", o), + i + ); + } + function $t(e, t, n, r) { + var i = function () { + var t = he; + me(e); + var n = arguments.length ? r.apply(null, arguments) : r({}), + i = + (n = + n && "object" == (0, a["default"])(n) && !u(n) + ? [n] + : vt(n)) && n[0]; + return ( + me(t), + n && (!i || (1 === n.length && i.isComment && !Rt(i))) + ? void 0 + : n + ); + }; + return ( + r.proxy && + Object.defineProperty(t, n, { + get: i, + enumerable: !0, + configurable: !0, + }), + i + ); + } + function Ut(e, t) { + return function () { + return e[t]; + }; + } + function Bt(e) { + return { + get attrs() { + if (!e._attrsProxy) { + var t = (e._attrsProxy = {}); + (K(t, "_v_attr_proxy", !0), + Gt(t, e.$attrs, s, e, "$attrs")); + } + return e._attrsProxy; + }, + get listeners() { + return ( + e._listenersProxy || + Gt( + (e._listenersProxy = {}), + e.$listeners, + s, + e, + "$listeners", + ), + e._listenersProxy + ); + }, + get slots() { + return (function (e) { + return ( + e._slotsProxy || Ht((e._slotsProxy = {}), e.$scopedSlots), + e._slotsProxy + ); + })(e); + }, + emit: N(e.$emit, e), + expose: function (t) { + t && + Object.keys(t).forEach(function (n) { + return Xe(e, t, n); + }); + }, + }; + } + function Gt(e, t, n, r, i) { + var o = !1; + for (var a in t) + a in e ? t[a] !== n[a] && (o = !0) : ((o = !0), zt(e, a, r, i)); + for (var s in e) s in t || ((o = !0), delete e[s]); + return o; + } + function zt(e, t, n, r) { + Object.defineProperty(e, t, { + enumerable: !0, + configurable: !0, + get: function () { + return n[r][t]; + }, + }); + } + function Ht(e, t) { + for (var n in t) e[n] = t[n]; + for (var r in e) r in t || delete e[r]; + } + function qt() { + var e = he; + return e._setupContext || (e._setupContext = Bt(e)); + } + var Vt = null; + function Wt(e, t) { + return ( + (e.__esModule || (pe && "Module" === e[Symbol.toStringTag])) && + (e = e["default"]), + h(e) ? t.extend(e) : e + ); + } + function Xt(e) { + if (u(e)) + for (var t = 0; t < e.length; t++) { + var n = e[t]; + if (l(n) && (l(n.componentOptions) || Rt(n))) return n; + } + } + var Kt = 1, + Yt = 2; + function Jt(e, t, n, r, i, o) { + return ( + (u(n) || f(n)) && ((i = r), (r = n), (n = void 0)), + d(o) && (i = Yt), + (function (e, t, n, r, i) { + return l(n) && l(n.__ob__) + ? ve() + : (l(n) && l(n.is) && (t = n.is), + t + ? (u(r) && + p(r[0]) && + (((n = n || {}).scopedSlots = { default: r[0] }), + (r.length = 0)), + i === Yt + ? (r = vt(r)) + : i === Kt && + (r = (function (e) { + for (var t = 0; t < e.length; t++) + if (u(e[t])) + return Array.prototype.concat.apply([], e); + return e; + })(r)), + "string" == typeof t + ? ((a = + (e.$vnode && e.$vnode.ns) || + W.getTagNamespace(t)), + (o = W.isReservedTag(t) + ? new ge( + W.parsePlatformTagName(t), + n, + r, + void 0, + void 0, + e, + ) + : (n && n.pre) || + !l((s = br(e.$options, "components", t))) + ? new ge(t, n, r, void 0, void 0, e) + : lr(s, n, e, r, t))) + : (o = lr(t, n, e, r)), + u(o) + ? o + : l(o) + ? (l(a) && Qt(o, a), + l(n) && + (function (e) { + (h(e.style) && On(e.style), + h(e["class"]) && On(e["class"])); + })(n), + o) + : ve()) + : ve()); + var o, a, s; + })(e, t, n, r, i) + ); + } + function Qt(e, t, n) { + if ( + ((e.ns = t), + "foreignObject" === e.tag && ((t = void 0), (n = !0)), + l(e.children)) + ) + for (var r = 0, i = e.children.length; r < i; r++) { + var o = e.children[r]; + l(o.tag) && + (c(o.ns) || (d(n) && "svg" !== o.tag)) && + Qt(o, t, n); + } + } + function Zt(e, t, n) { + Ce(); + try { + if (t) + for (var r = t; (r = r.$parent); ) { + var i = r.$options.errorCaptured; + if (i) + for (var o = 0; o < i.length; o++) + try { + if (!1 === i[o].call(r, e, t, n)) return; + } catch (e) { + tn(e, r, "errorCaptured hook"); + } + } + tn(e, t, n); + } finally { + xe(); + } + } + function en(e, t, n, r, i) { + var o; + try { + (o = n ? e.apply(t, n) : e.call(t)) && + !o._isVue && + _(o) && + !o._handled && + (o["catch"](function (e) { + return Zt(e, r, i + " (Promise/async)"); + }), + (o._handled = !0)); + } catch (e) { + Zt(e, r, i); + } + return o; + } + function tn(e, t, n) { + if (W.errorHandler) + try { + return W.errorHandler.call(null, e, t, n); + } catch (t) { + t !== e && nn(t); + } + nn(e); + } + function nn(e, t, n) { + if (!Q || "undefined" == typeof console) throw e; + console.error(e); + } + var rn, + on = !1, + an = [], + sn = !1; + function un() { + sn = !1; + var e = an.slice(0); + an.length = 0; + for (var t = 0; t < e.length; t++) e[t](); + } + if ("undefined" != typeof Promise && de(Promise)) { + var cn = Promise.resolve(); + ((rn = function () { + (cn.then(un), re && setTimeout(R)); + }), + (on = !0)); + } else if ( + ee || + "undefined" == typeof MutationObserver || + (!de(MutationObserver) && + "[object MutationObserverConstructor]" !== + MutationObserver.toString()) + ) + rn = + "undefined" != typeof setImmediate && de(setImmediate) + ? function () { + setImmediate(un); + } + : function () { + setTimeout(un, 0); + }; + else { + var ln = 1, + dn = new MutationObserver(un), + fn = document.createTextNode(String(ln)); + (dn.observe(fn, { characterData: !0 }), + (rn = function () { + ((ln = (ln + 1) % 2), (fn.data = String(ln))); + }), + (on = !0)); + } + function pn(e, t) { + var n; + if ( + (an.push(function () { + if (e) + try { + e.call(t); + } catch (e) { + Zt(e, t, "nextTick"); + } + else n && n(t); + }), + sn || ((sn = !0), rn()), + !e && "undefined" != typeof Promise) + ) + return new Promise(function (e) { + n = e; + }); + } + function hn(e) { + return function (t) { + var n = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : he; + if (n) + return (function (e, t, n) { + var r = e.$options; + r[t] = gr(r[t], n); + })(n, e, t); + }; + } + var mn = hn("beforeMount"), + gn = hn("mounted"), + vn = hn("beforeUpdate"), + _n = hn("updated"), + yn = hn("beforeDestroy"), + bn = hn("destroyed"), + kn = hn("activated"), + wn = hn("deactivated"), + En = hn("serverPrefetch"), + An = hn("renderTracked"), + Cn = hn("renderTriggered"), + xn = hn("errorCaptured"), + In = "2.7.16", + Dn = Object.freeze({ + __proto__: null, + version: In, + defineComponent: function (e) { + return e; + }, + ref: function (e) { + return We(e, !1); + }, + shallowRef: function (e) { + return We(e, !0); + }, + isRef: Ve, + toRef: Ke, + toRefs: function (e) { + var t = u(e) ? new Array(e.length) : {}; + for (var n in e) t[n] = Ke(e, n); + return t; + }, + unref: function (e) { + return Ve(e) ? e.value : e; + }, + proxyRefs: function (e) { + if (Ge(e)) return e; + for (var t = {}, n = Object.keys(e), r = 0; r < n.length; r++) + Xe(t, e, n[r]); + return t; + }, + customRef: function (e) { + var t = new Ee(), + n = e( + function () { + t.depend(); + }, + function () { + t.notify(); + }, + ), + r = n.get, + i = n.set, + o = { + get value() { + return r(); + }, + set value(e) { + i(e); + }, + }; + return (K(o, qe, !0), o); + }, + triggerRef: function (e) { + e.dep && e.dep.notify(); + }, + reactive: function (e) { + return (Be(e, !1), e); + }, + isReactive: Ge, + isReadonly: He, + isShallow: ze, + isProxy: function (e) { + return Ge(e) || He(e); + }, + shallowReactive: Ue, + markRaw: function (e) { + return (Object.isExtensible(e) && K(e, "__v_skip", !0), e); + }, + toRaw: function Jo(e) { + var t = e && e.__v_raw; + return t ? Jo(t) : e; + }, + readonly: Qe, + shallowReadonly: function (e) { + return Ze(e, !0); + }, + computed: function (e, t) { + var n, + r, + i = p(e); + i ? ((n = e), (r = R)) : ((n = e.get), (r = e.set)); + var o = ce() ? null : new Pn(he, n, R, { lazy: !0 }), + a = { + effect: o, + get value() { + return o + ? (o.dirty && o.evaluate(), + Ee.target && o.depend(), + o.value) + : n(); + }, + set value(e) { + r(e); + }, + }; + return (K(a, qe, !0), K(a, "__v_isReadonly", i), a); + }, + watch: function (e, t, n) { + return ut(e, t, n); + }, + watchEffect: function (e, t) { + return ut(e, null, t); + }, + watchPostEffect: ot, + watchSyncEffect: function (e, t) { + return ut(e, null, { flush: "sync" }); + }, + EffectScope: ct, + effectScope: function (e) { + return new ct(e); + }, + onScopeDispose: function (e) { + at && at.cleanups.push(e); + }, + getCurrentScope: lt, + provide: function (e, t) { + he && (dt(he)[e] = t); + }, + inject: function (e, t) { + var n = + arguments.length > 2 && + arguments[2] !== undefined && + arguments[2], + r = he; + if (r) { + var i = r.$parent && r.$parent._provided; + if (i && e in i) return i[e]; + if (arguments.length > 1) return n && p(t) ? t.call(r) : t; + } + }, + h: function (e, t, n) { + return Jt(he, e, t, n, 2, !0); + }, + getCurrentInstance: function () { + return he && { proxy: he }; + }, + useSlots: function () { + return qt().slots; + }, + useAttrs: function () { + return qt().attrs; + }, + useListeners: function () { + return qt().listeners; + }, + mergeDefaults: function (e, t) { + var n = u(e) + ? e.reduce(function (e, t) { + return ((e[t] = {}), e); + }, {}) + : e; + for (var r in t) { + var i = n[r]; + i + ? u(i) || p(i) + ? (n[r] = { type: i, default: t[r] }) + : (i["default"] = t[r]) + : null === i && (n[r] = { default: t[r] }); + } + return n; + }, + nextTick: pn, + set: Re, + del: je, + useCssModule: function () { + var e = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : "$style"; + return (he && he[e]) || s; + }, + useCssVars: function (e) { + if (Q) { + var t = he; + t && + ot(function () { + var n = t.$el, + r = e(t, t._setupProxy); + if (n && 1 === n.nodeType) { + var i = n.style; + for (var o in r) i.setProperty("--".concat(o), r[o]); + } + }); + } + }, + defineAsyncComponent: function (e) { + p(e) && (e = { loader: e }); + var t = e, + n = t.loader, + r = t.loadingComponent, + i = t.errorComponent, + o = t.delay, + a = void 0 === o ? 200 : o, + s = t.timeout, + u = (t.suspensible, t.onError), + c = null, + l = 0, + d = function f() { + var e; + return ( + c || + (e = c = + n() + ["catch"](function (e) { + if ( + ((e = + e instanceof Error + ? e + : new Error(String(e))), + u) + ) + return new Promise(function (t, n) { + u( + e, + function () { + return t((l++, (c = null), f())); + }, + function () { + return n(e); + }, + l + 1, + ); + }); + throw e; + }) + .then(function (t) { + return e !== c && c + ? c + : (t && + (t.__esModule || + "Module" === t[Symbol.toStringTag]) && + (t = t["default"]), + t); + })) + ); + }; + return function () { + return { + component: d(), + delay: a, + timeout: s, + error: i, + loading: r, + }; + }; + }, + onBeforeMount: mn, + onMounted: gn, + onBeforeUpdate: vn, + onUpdated: _n, + onBeforeUnmount: yn, + onUnmounted: bn, + onActivated: kn, + onDeactivated: wn, + onServerPrefetch: En, + onRenderTracked: An, + onRenderTriggered: Cn, + onErrorCaptured: function (e) { + var t = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : he; + xn(e, t); + }, + }), + Sn = new fe(); + function On(e) { + return (Tn(e, Sn), Sn.clear(), e); + } + function Tn(e, t) { + var n, + r, + i = u(e); + if ( + !( + (!i && !h(e)) || + e.__v_skip || + Object.isFrozen(e) || + e instanceof ge + ) + ) { + if (e.__ob__) { + var o = e.__ob__.dep.id; + if (t.has(o)) return; + t.add(o); + } + if (i) for (n = e.length; n--; ) Tn(e[n], t); + else if (Ve(e)) Tn(e.value, t); + else + for (n = (r = Object.keys(e)).length; n--; ) Tn(e[r[n]], t); + } + } + var Mn, + Nn = 0, + Pn = (function () { + function e(t, n, r, o, a) { + ((0, i["default"])(this, e), + (function (e) { + var t = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : at; + t && t.active && t.effects.push(e); + })(this, at && !at._vm ? at : t ? t._scope : void 0), + (this.vm = t) && a && (t._watcher = this), + o + ? ((this.deep = !!o.deep), + (this.user = !!o.user), + (this.lazy = !!o.lazy), + (this.sync = !!o.sync), + (this.before = o.before)) + : (this.deep = this.user = this.lazy = this.sync = !1), + (this.cb = r), + (this.id = ++Nn), + (this.active = !0), + (this.post = !1), + (this.dirty = this.lazy), + (this.deps = []), + (this.newDeps = []), + (this.depIds = new fe()), + (this.newDepIds = new fe()), + (this.expression = ""), + p(n) + ? (this.getter = n) + : ((this.getter = (function (e) { + if (!Y.test(e)) { + var t = e.split("."); + return function (e) { + for (var n = 0; n < t.length; n++) { + if (!e) return; + e = e[t[n]]; + } + return e; + }; + } + })(n)), + this.getter || (this.getter = R)), + (this.value = this.lazy ? void 0 : this.get())); + } + return ( + (0, o["default"])(e, [ + { + key: "get", + value: function () { + var e; + Ce(this); + var t = this.vm; + try { + e = this.getter.call(t, t); + } catch (e) { + if (!this.user) throw e; + Zt( + e, + t, + 'getter for watcher "'.concat(this.expression, '"'), + ); + } finally { + (this.deep && On(e), xe(), this.cleanupDeps()); + } + return e; + }, + }, + { + key: "addDep", + value: function (e) { + var t = e.id; + this.newDepIds.has(t) || + (this.newDepIds.add(t), + this.newDeps.push(e), + this.depIds.has(t) || e.addSub(this)); + }, + }, + { + key: "cleanupDeps", + value: function () { + for (var e = this.deps.length; e--; ) { + var t = this.deps[e]; + this.newDepIds.has(t.id) || t.removeSub(this); + } + var n = this.depIds; + ((this.depIds = this.newDepIds), + (this.newDepIds = n), + this.newDepIds.clear(), + (n = this.deps), + (this.deps = this.newDeps), + (this.newDeps = n), + (this.newDeps.length = 0)); + }, + }, + { + key: "update", + value: function () { + this.lazy + ? (this.dirty = !0) + : this.sync + ? this.run() + : nr(this); + }, + }, + { + key: "run", + value: function () { + if (this.active) { + var e = this.get(); + if (e !== this.value || h(e) || this.deep) { + var t = this.value; + if (((this.value = e), this.user)) { + var n = 'callback for watcher "'.concat( + this.expression, + '"', + ); + en(this.cb, this.vm, [e, t], this.vm, n); + } else this.cb.call(this.vm, e, t); + } + } + }, + }, + { + key: "evaluate", + value: function () { + ((this.value = this.get()), (this.dirty = !1)); + }, + }, + { + key: "depend", + value: function () { + for (var e = this.deps.length; e--; ) + this.deps[e].depend(); + }, + }, + { + key: "teardown", + value: function () { + if ( + (this.vm && + !this.vm._isBeingDestroyed && + A(this.vm._scope.effects, this), + this.active) + ) { + for (var e = this.deps.length; e--; ) + this.deps[e].removeSub(this); + ((this.active = !1), this.onStop && this.onStop()); + } + }, + }, + ]), + e + ); + })(); + function Fn(e, t) { + Mn.$on(e, t); + } + function Ln(e, t) { + Mn.$off(e, t); + } + function Rn(e, t) { + var n = Mn; + return function r() { + null !== t.apply(null, arguments) && n.$off(e, r); + }; + } + function jn(e, t, n) { + ((Mn = e), ht(t, n || {}, Fn, Ln, Rn, e), (Mn = void 0)); + } + var $n = null; + function Un(e) { + var t = $n; + return ( + ($n = e), + function () { + $n = t; + } + ); + } + function Bn(e) { + for (; e && (e = e.$parent); ) if (e._inactive) return !0; + return !1; + } + function Gn(e, t) { + if (t) { + if (((e._directInactive = !1), Bn(e))) return; + } else if (e._directInactive) return; + if (e._inactive || null === e._inactive) { + e._inactive = !1; + for (var n = 0; n < e.$children.length; n++) Gn(e.$children[n]); + Hn(e, "activated"); + } + } + function zn(e, t) { + if (!((t && ((e._directInactive = !0), Bn(e))) || e._inactive)) { + e._inactive = !0; + for (var n = 0; n < e.$children.length; n++) zn(e.$children[n]); + Hn(e, "deactivated"); + } + } + function Hn(e, t, n) { + var r = + !(arguments.length > 3 && arguments[3] !== undefined) || + arguments[3]; + Ce(); + var i = he, + o = lt(); + r && me(e); + var a = e.$options[t], + s = "".concat(t, " hook"); + if (a) + for (var u = 0, c = a.length; u < c; u++) + en(a[u], e, n || null, e, s); + (e._hasHookEvent && e.$emit("hook:" + t), + r && (me(i), o && o.on()), + xe()); + } + var qn = [], + Vn = [], + Wn = {}, + Xn = !1, + Kn = !1, + Yn = 0, + Jn = 0, + Qn = Date.now; + if (Q && !ee) { + var Zn = window.performance; + Zn && + "function" == typeof Zn.now && + Qn() > document.createEvent("Event").timeStamp && + (Qn = function () { + return Zn.now(); + }); + } + var er = function (e, t) { + if (e.post) { + if (!t.post) return 1; + } else if (t.post) return -1; + return e.id - t.id; + }; + function tr() { + var e, t; + for ( + Jn = Qn(), Kn = !0, qn.sort(er), Yn = 0; + Yn < qn.length; + Yn++ + ) + ((e = qn[Yn]).before && e.before(), + (t = e.id), + (Wn[t] = null), + e.run()); + var n = Vn.slice(), + r = qn.slice(); + ((Yn = qn.length = Vn.length = 0), + (Wn = {}), + (Xn = Kn = !1), + (function (e) { + for (var t = 0; t < e.length; t++) + ((e[t]._inactive = !0), Gn(e[t], !0)); + })(n), + (function (e) { + for (var t = e.length; t--; ) { + var n = e[t], + r = n.vm; + r && + r._watcher === n && + r._isMounted && + !r._isDestroyed && + Hn(r, "updated"); + } + })(r), + we(), + le && W.devtools && le.emit("flush")); + } + function nr(e) { + var t = e.id; + if (null == Wn[t] && (e !== Ee.target || !e.noRecurse)) { + if (((Wn[t] = !0), Kn)) { + for (var n = qn.length - 1; n > Yn && qn[n].id > e.id; ) n--; + qn.splice(n + 1, 0, e); + } else qn.push(e); + Xn || ((Xn = !0), pn(tr)); + } + } + function rr(e, t) { + if (e) { + for ( + var n = Object.create(null), + r = pe ? Reflect.ownKeys(e) : Object.keys(e), + i = 0; + i < r.length; + i++ + ) { + var o = r[i]; + if ("__ob__" !== o) { + var a = e[o].from; + if (a in t._provided) n[o] = t._provided[a]; + else if ("default" in e[o]) { + var s = e[o]["default"]; + n[o] = p(s) ? s.call(t) : s; + } + } + } + return n; + } + } + function ir(e, t, n, r, i) { + var o, + a = this, + c = i.options; + x(r, "_uid") + ? ((o = Object.create(r))._original = r) + : ((o = r), (r = r._original)); + var l = d(c._compiled), + f = !l; + ((this.data = e), + (this.props = t), + (this.children = n), + (this.parent = r), + (this.listeners = e.on || s), + (this.injections = rr(c.inject, r)), + (this.slots = function () { + return ( + a.$slots || jt(r, e.scopedSlots, (a.$slots = Ft(n, r))), + a.$slots + ); + }), + Object.defineProperty(this, "scopedSlots", { + enumerable: !0, + get: function () { + return jt(r, e.scopedSlots, this.slots()); + }, + }), + l && + ((this.$options = c), + (this.$slots = this.slots()), + (this.$scopedSlots = jt(r, e.scopedSlots, this.$slots))), + c._scopeId + ? (this._c = function (e, t, n, i) { + var a = Jt(o, e, t, n, i, f); + return ( + a && + !u(a) && + ((a.fnScopeId = c._scopeId), (a.fnContext = r)), + a + ); + }) + : (this._c = function (e, t, n, r) { + return Jt(o, e, t, n, r, f); + })); + } + function or(e, t, n, r, i) { + var o = ye(e); + return ( + (o.fnContext = n), + (o.fnOptions = r), + t.slot && ((o.data || (o.data = {})).slot = t.slot), + o + ); + } + function ar(e, t) { + for (var n in t) e[S(n)] = t[n]; + } + function sr(e) { + return e.name || e.__name || e._componentTag; + } + Pt(ir.prototype); + var ur = { + init: function (e, t) { + if ( + e.componentInstance && + !e.componentInstance._isDestroyed && + e.data.keepAlive + ) { + var n = e; + ur.prepatch(n, n); + } else + (e.componentInstance = (function (e, t) { + var n = { _isComponent: !0, _parentVnode: e, parent: t }, + r = e.data.inlineTemplate; + return ( + l(r) && + ((n.render = r.render), + (n.staticRenderFns = r.staticRenderFns)), + new e.componentOptions.Ctor(n) + ); + })(e, $n)).$mount(t ? e.elm : void 0, t); + }, + prepatch: function (e, t) { + var n = t.componentOptions; + !(function (e, t, n, r, i) { + var o = r.data.scopedSlots, + a = e.$scopedSlots, + u = !!( + (o && !o.$stable) || + (a !== s && !a.$stable) || + (o && e.$scopedSlots.$key !== o.$key) || + (!o && e.$scopedSlots.$key) + ), + c = !!(i || e.$options._renderChildren || u), + l = e.$vnode; + ((e.$options._parentVnode = r), + (e.$vnode = r), + e._vnode && (e._vnode.parent = r), + (e.$options._renderChildren = i)); + var d = r.data.attrs || s; + (e._attrsProxy && + Gt( + e._attrsProxy, + d, + (l.data && l.data.attrs) || s, + e, + "$attrs", + ) && + (c = !0), + (e.$attrs = d), + (n = n || s)); + var f = e.$options._parentListeners; + if ( + (e._listenersProxy && + Gt(e._listenersProxy, n, f || s, e, "$listeners"), + (e.$listeners = e.$options._parentListeners = n), + jn(e, n, f), + t && e.$options.props) + ) { + Me(!1); + for ( + var p = e._props, h = e.$options._propKeys || [], m = 0; + m < h.length; + m++ + ) { + var g = h[m], + v = e.$options.props; + p[g] = kr(g, v, t, e); + } + (Me(!0), (e.$options.propsData = t)); + } + c && ((e.$slots = Ft(i, r.context)), e.$forceUpdate()); + })( + (t.componentInstance = e.componentInstance), + n.propsData, + n.listeners, + t, + n.children, + ); + }, + insert: function (e) { + var t, + n = e.context, + r = e.componentInstance; + (r._isMounted || ((r._isMounted = !0), Hn(r, "mounted")), + e.data.keepAlive && + (n._isMounted + ? (((t = r)._inactive = !1), Vn.push(t)) + : Gn(r, !0))); + }, + destroy: function (e) { + var t = e.componentInstance; + t._isDestroyed || + (e.data.keepAlive ? zn(t, !0) : t.$destroy()); + }, + }, + cr = Object.keys(ur); + function lr(e, t, n, r, i) { + if (!c(e)) { + var o = n.$options._base; + if ((h(e) && (e = o.extend(e)), "function" == typeof e)) { + var a; + if ( + c(e.cid) && + ((e = (function (e, t) { + if (d(e.error) && l(e.errorComp)) return e.errorComp; + if (l(e.resolved)) return e.resolved; + var n = Vt; + if ( + (n && + l(e.owners) && + -1 === e.owners.indexOf(n) && + e.owners.push(n), + d(e.loading) && l(e.loadingComp)) + ) + return e.loadingComp; + if (n && !l(e.owners)) { + var r = (e.owners = [n]), + i = !0, + o = null, + a = null; + n.$on("hook:destroyed", function () { + return A(r, n); + }); + var s = function (e) { + for (var t = 0, n = r.length; t < n; t++) + r[t].$forceUpdate(); + e && + ((r.length = 0), + null !== o && (clearTimeout(o), (o = null)), + null !== a && (clearTimeout(a), (a = null))); + }, + u = G(function (n) { + ((e.resolved = Wt(n, t)), + i ? (r.length = 0) : s(!0)); + }), + f = G(function (t) { + l(e.errorComp) && ((e.error = !0), s(!0)); + }), + p = e(u, f); + return ( + h(p) && + (_(p) + ? c(e.resolved) && p.then(u, f) + : _(p.component) && + (p.component.then(u, f), + l(p.error) && (e.errorComp = Wt(p.error, t)), + l(p.loading) && + ((e.loadingComp = Wt(p.loading, t)), + 0 === p.delay + ? (e.loading = !0) + : (o = setTimeout(function () { + ((o = null), + c(e.resolved) && + c(e.error) && + ((e.loading = !0), s(!1))); + }, p.delay || 200))), + l(p.timeout) && + (a = setTimeout(function () { + ((a = null), c(e.resolved) && f(null)); + }, p.timeout)))), + (i = !1), + e.loading ? e.loadingComp : e.resolved + ); + } + })((a = e), o)), + void 0 === e) + ) + return (function (e, t, n, r, i) { + var o = ve(); + return ( + (o.asyncFactory = e), + (o.asyncMeta = { + data: t, + context: n, + children: r, + tag: i, + }), + o + ); + })(a, t, n, r, i); + ((t = t || {}), + Fr(e), + l(t.model) && + (function (e, t) { + var n = (e.model && e.model.prop) || "value", + r = (e.model && e.model.event) || "input"; + (t.attrs || (t.attrs = {}))[n] = t.model.value; + var i = t.on || (t.on = {}), + o = i[r], + a = t.model.callback; + l(o) + ? (u(o) ? -1 === o.indexOf(a) : o !== a) && + (i[r] = [a].concat(o)) + : (i[r] = a); + })(e.options, t)); + var f = (function (e, t, n) { + var r = t.options.props; + if (!c(r)) { + var i = {}, + o = e.attrs, + a = e.props; + if (l(o) || l(a)) + for (var s in r) { + var u = M(s); + gt(i, a, s, u, !0) || gt(i, o, s, u, !1); + } + return i; + } + })(t, e); + if (d(e.options.functional)) + return (function (e, t, n, r, i) { + var o = e.options, + a = {}, + c = o.props; + if (l(c)) for (var d in c) a[d] = kr(d, c, t || s); + else + (l(n.attrs) && ar(a, n.attrs), + l(n.props) && ar(a, n.props)); + var f = new ir(n, a, i, r, e), + p = o.render.call(null, f._c, f); + if (p instanceof ge) return or(p, n, f.parent, o); + if (u(p)) { + for ( + var h = vt(p) || [], m = new Array(h.length), g = 0; + g < h.length; + g++ + ) + m[g] = or(h[g], n, f.parent, o); + return m; + } + })(e, f, t, n, r); + var p = t.on; + if (((t.on = t.nativeOn), d(e.options.abstract))) { + var m = t.slot; + ((t = {}), m && (t.slot = m)); + } + !(function (e) { + for ( + var t = e.hook || (e.hook = {}), n = 0; + n < cr.length; + n++ + ) { + var r = cr[n], + i = t[r], + o = ur[r]; + i === o || (i && i._merged) || (t[r] = i ? dr(o, i) : o); + } + })(t); + var g = sr(e.options) || i; + return new ge( + "vue-component-" + .concat(e.cid) + .concat(g ? "-".concat(g) : ""), + t, + void 0, + void 0, + void 0, + n, + { + Ctor: e, + propsData: f, + listeners: p, + tag: i, + children: r, + }, + a, + ); + } + } + } + function dr(e, t) { + var n = function (n, r) { + (e(n, r), t(n, r)); + }; + return ((n._merged = !0), n); + } + var fr = R, + pr = W.optionMergeStrategies; + function hr(e, t) { + var n, + r, + i, + o = + !(arguments.length > 2 && arguments[2] !== undefined) || + arguments[2]; + if (!t) return e; + for ( + var a = pe ? Reflect.ownKeys(t) : Object.keys(t), s = 0; + s < a.length; + s++ + ) + "__ob__" !== (n = a[s]) && + ((r = e[n]), + (i = t[n]), + o && x(e, n) + ? r !== i && g(r) && g(i) && hr(r, i) + : Re(e, n, i)); + return e; + } + function mr(e, t, n) { + return n + ? function () { + var r = p(t) ? t.call(n, n) : t, + i = p(e) ? e.call(n, n) : e; + return r ? hr(r, i) : i; + } + : t + ? e + ? function () { + return hr( + p(t) ? t.call(this, this) : t, + p(e) ? e.call(this, this) : e, + ); + } + : t + : e; + } + function gr(e, t) { + var n = t ? (e ? e.concat(t) : u(t) ? t : [t]) : e; + return n + ? (function (e) { + for (var t = [], n = 0; n < e.length; n++) + -1 === t.indexOf(e[n]) && t.push(e[n]); + return t; + })(n) + : n; + } + function vr(e, t, n, r) { + var i = Object.create(e || null); + return t ? F(i, t) : i; + } + ((pr.data = function (e, t, n) { + return n + ? mr(e, t, n) + : t && "function" != typeof t + ? e + : mr(e, t); + }), + V.forEach(function (e) { + pr[e] = gr; + }), + q.forEach(function (e) { + pr[e + "s"] = vr; + }), + (pr.watch = function (e, t, n, r) { + if ((e === ae && (e = void 0), t === ae && (t = void 0), !t)) + return Object.create(e || null); + if (!e) return t; + var i = {}; + for (var o in (F(i, e), t)) { + var a = i[o], + s = t[o]; + (a && !u(a) && (a = [a]), + (i[o] = a ? a.concat(s) : u(s) ? s : [s])); + } + return i; + }), + (pr.props = + pr.methods = + pr.inject = + pr.computed = + function (e, t, n, r) { + if (!e) return t; + var i = Object.create(null); + return (F(i, e), t && F(i, t), i); + }), + (pr.provide = function (e, t) { + return e + ? function () { + var n = Object.create(null); + return ( + hr(n, p(e) ? e.call(this) : e), + t && hr(n, p(t) ? t.call(this) : t, !1), + n + ); + } + : t; + })); + var _r = function (e, t) { + return void 0 === t ? e : t; + }; + function yr(e, t, n) { + if ( + (p(t) && (t = t.options), + (function (e, t) { + var n = e.props; + if (n) { + var r, + i, + o = {}; + if (u(n)) + for (r = n.length; r--; ) + "string" == typeof (i = n[r]) && + (o[S(i)] = { type: null }); + else if (g(n)) + for (var a in n) + ((i = n[a]), (o[S(a)] = g(i) ? i : { type: i })); + e.props = o; + } + })(t), + (function (e, t) { + var n = e.inject; + if (n) { + var r = (e.inject = {}); + if (u(n)) + for (var i = 0; i < n.length; i++) + r[n[i]] = { from: n[i] }; + else if (g(n)) + for (var o in n) { + var a = n[o]; + r[o] = g(a) ? F({ from: o }, a) : { from: a }; + } + } + })(t), + (function (e) { + var t = e.directives; + if (t) + for (var n in t) { + var r = t[n]; + p(r) && (t[n] = { bind: r, update: r }); + } + })(t), + !t._base && + (t["extends"] && (e = yr(e, t["extends"], n)), t.mixins)) + ) + for (var r = 0, i = t.mixins.length; r < i; r++) + e = yr(e, t.mixins[r], n); + var o, + a = {}; + for (o in e) s(o); + for (o in t) x(e, o) || s(o); + function s(r) { + var i = pr[r] || _r; + a[r] = i(e[r], t[r], n, r); + } + return a; + } + function br(e, t, n, r) { + if ("string" == typeof n) { + var i = e[t]; + if (x(i, n)) return i[n]; + var o = S(n); + if (x(i, o)) return i[o]; + var a = O(o); + return x(i, a) ? i[a] : i[n] || i[o] || i[a]; + } + } + function kr(e, t, n, r) { + var i = t[e], + o = !x(n, e), + a = n[e], + s = Cr(Boolean, i.type); + if (s > -1) + if (o && !x(i, "default")) a = !1; + else if ("" === a || a === M(e)) { + var u = Cr(String, i.type); + (u < 0 || s < u) && (a = !0); + } + if (void 0 === a) { + a = (function (e, t, n) { + if (x(t, "default")) { + var r = t["default"]; + return e && + e.$options.propsData && + void 0 === e.$options.propsData[n] && + void 0 !== e._props[n] + ? e._props[n] + : p(r) && "Function" !== Er(t.type) + ? r.call(e) + : r; + } + })(r, i, e); + var c = Te; + (Me(!0), Fe(a), Me(c)); + } + return a; + } + var wr = /^\s*function (\w+)/; + function Er(e) { + var t = e && e.toString().match(wr); + return t ? t[1] : ""; + } + function Ar(e, t) { + return Er(e) === Er(t); + } + function Cr(e, t) { + if (!u(t)) return Ar(t, e) ? 0 : -1; + for (var n = 0, r = t.length; n < r; n++) + if (Ar(t[n], e)) return n; + return -1; + } + var xr = { enumerable: !0, configurable: !0, get: R, set: R }; + function Ir(e, t, n) { + ((xr.get = function () { + return this[t][n]; + }), + (xr.set = function (e) { + this[t][n] = e; + }), + Object.defineProperty(e, n, xr)); + } + function Dr(e) { + var t = e.$options; + if ( + (t.props && + (function (e, t) { + var n = e.$options.propsData || {}, + r = (e._props = Ue({})), + i = (e.$options._propKeys = []), + o = !e.$parent; + for (var a in (o || Me(!1), t)) + (i.push(a), + Le(r, a, kr(a, t, n, e), void 0, !0), + a in e || Ir(e, "_props", a)); + Me(!0); + })(e, t.props), + (function (e) { + var t = e.$options, + n = t.setup; + if (n) { + var r = (e._setupContext = Bt(e)); + (me(e), Ce()); + var i = en(n, null, [e._props || Ue({}), r], e, "setup"); + if ((xe(), me(), p(i))) t.render = i; + else if (h(i)) + if (((e._setupState = i), i.__sfc)) { + var o = (e._setupProxy = {}); + for (var a in i) "__sfc" !== a && Xe(o, i, a); + } else for (var s in i) X(s) || Xe(e, i, s); + } + })(e), + t.methods && + (function (e, t) { + for (var n in (e.$options.props, t)) + e[n] = "function" != typeof t[n] ? R : N(t[n], e); + })(e, t.methods), + t.data) + ) + !(function (e) { + var t = e.$options.data; + g( + (t = e._data = + p(t) + ? (function (e, t) { + Ce(); + try { + return e.call(t, t); + } catch (e) { + return (Zt(e, t, "data()"), {}); + } finally { + xe(); + } + })(t, e) + : t || {}), + ) || (t = {}); + var n = Object.keys(t), + r = e.$options.props; + e.$options.methods; + for (var i = n.length; i--; ) { + var o = n[i]; + (r && x(r, o)) || X(o) || Ir(e, "_data", o); + } + var a = Fe(t); + a && a.vmCount++; + })(e); + else { + var n = Fe((e._data = {})); + n && n.vmCount++; + } + (t.computed && + (function (e, t) { + var n = (e._computedWatchers = Object.create(null)), + r = ce(); + for (var i in t) { + var o = t[i], + a = p(o) ? o : o.get; + (r || (n[i] = new Pn(e, a || R, R, Sr)), + i in e || Or(e, i, o)); + } + })(e, t.computed), + t.watch && + t.watch !== ae && + (function (e, t) { + for (var n in t) { + var r = t[n]; + if (u(r)) + for (var i = 0; i < r.length; i++) Nr(e, n, r[i]); + else Nr(e, n, r); + } + })(e, t.watch)); + } + var Sr = { lazy: !0 }; + function Or(e, t, n) { + var r = !ce(); + (p(n) + ? ((xr.get = r ? Tr(t) : Mr(n)), (xr.set = R)) + : ((xr.get = n.get + ? r && !1 !== n.cache + ? Tr(t) + : Mr(n.get) + : R), + (xr.set = n.set || R)), + Object.defineProperty(e, t, xr)); + } + function Tr(e) { + return function () { + var t = this._computedWatchers && this._computedWatchers[e]; + if (t) + return ( + t.dirty && t.evaluate(), + Ee.target && t.depend(), + t.value + ); + }; + } + function Mr(e) { + return function () { + return e.call(this, this); + }; + } + function Nr(e, t, n, r) { + return ( + g(n) && ((r = n), (n = n.handler)), + "string" == typeof n && (n = e[n]), + e.$watch(t, n, r) + ); + } + var Pr = 0; + function Fr(e) { + var t = e.options; + if (e["super"]) { + var n = Fr(e["super"]); + if (n !== e.superOptions) { + e.superOptions = n; + var r = (function (e) { + var t, + n = e.options, + r = e.sealedOptions; + for (var i in n) + n[i] !== r[i] && (t || (t = {}), (t[i] = n[i])); + return t; + })(e); + (r && F(e.extendOptions, r), + (t = e.options = yr(n, e.extendOptions)).name && + (t.components[t.name] = e)); + } + } + return t; + } + function Lr(e) { + this._init(e); + } + function Rr(e) { + return e && (sr(e.Ctor.options) || e.tag); + } + function jr(e, t) { + return u(e) + ? e.indexOf(t) > -1 + : "string" == typeof e + ? e.split(",").indexOf(t) > -1 + : ((n = e), "[object RegExp]" === m.call(n) && e.test(t)); + var n; + } + function $r(e, t) { + var n = e.cache, + r = e.keys, + i = e._vnode, + o = e.$vnode; + for (var a in n) { + var s = n[a]; + if (s) { + var u = s.name; + u && !t(u) && Ur(n, a, r, i); + } + } + o.componentOptions.children = void 0; + } + function Ur(e, t, n, r) { + var i = e[t]; + (!i || (r && i.tag === r.tag) || i.componentInstance.$destroy(), + (e[t] = null), + A(n, t)); + } + (!(function (e) { + e.prototype._init = function (e) { + var t = this; + ((t._uid = Pr++), + (t._isVue = !0), + (t.__v_skip = !0), + (t._scope = new ct(!0)), + (t._scope.parent = void 0), + (t._scope._vm = !0), + e && e._isComponent + ? (function (e, t) { + var n = (e.$options = Object.create( + e.constructor.options, + )), + r = t._parentVnode; + ((n.parent = t.parent), (n._parentVnode = r)); + var i = r.componentOptions; + ((n.propsData = i.propsData), + (n._parentListeners = i.listeners), + (n._renderChildren = i.children), + (n._componentTag = i.tag), + t.render && + ((n.render = t.render), + (n.staticRenderFns = t.staticRenderFns))); + })(t, e) + : (t.$options = yr(Fr(t.constructor), e || {}, t)), + (t._renderProxy = t), + (t._self = t), + (function (e) { + var t = e.$options, + n = t.parent; + if (n && !t.abstract) { + for (; n.$options.abstract && n.$parent; ) n = n.$parent; + n.$children.push(e); + } + ((e.$parent = n), + (e.$root = n ? n.$root : e), + (e.$children = []), + (e.$refs = {}), + (e._provided = n ? n._provided : Object.create(null)), + (e._watcher = null), + (e._inactive = null), + (e._directInactive = !1), + (e._isMounted = !1), + (e._isDestroyed = !1), + (e._isBeingDestroyed = !1)); + })(t), + (function (e) { + ((e._events = Object.create(null)), (e._hasHookEvent = !1)); + var t = e.$options._parentListeners; + t && jn(e, t); + })(t), + (function (e) { + ((e._vnode = null), (e._staticTrees = null)); + var t = e.$options, + n = (e.$vnode = t._parentVnode), + r = n && n.context; + ((e.$slots = Ft(t._renderChildren, r)), + (e.$scopedSlots = n + ? jt(e.$parent, n.data.scopedSlots, e.$slots) + : s), + (e._c = function (t, n, r, i) { + return Jt(e, t, n, r, i, !1); + }), + (e.$createElement = function (t, n, r, i) { + return Jt(e, t, n, r, i, !0); + })); + var i = n && n.data; + (Le(e, "$attrs", (i && i.attrs) || s, null, !0), + Le(e, "$listeners", t._parentListeners || s, null, !0)); + })(t), + Hn(t, "beforeCreate", void 0, !1), + (function (e) { + var t = rr(e.$options.inject, e); + t && + (Me(!1), + Object.keys(t).forEach(function (n) { + Le(e, n, t[n]); + }), + Me(!0)); + })(t), + Dr(t), + (function (e) { + var t = e.$options.provide; + if (t) { + var n = p(t) ? t.call(e) : t; + if (!h(n)) return; + for ( + var r = dt(e), + i = pe ? Reflect.ownKeys(n) : Object.keys(n), + o = 0; + o < i.length; + o++ + ) { + var a = i[o]; + Object.defineProperty( + r, + a, + Object.getOwnPropertyDescriptor(n, a), + ); + } + } + })(t), + Hn(t, "created"), + t.$options.el && t.$mount(t.$options.el)); + }; + })(Lr), + (function (e) { + (Object.defineProperty(e.prototype, "$data", { + get: function () { + return this._data; + }, + }), + Object.defineProperty(e.prototype, "$props", { + get: function () { + return this._props; + }, + }), + (e.prototype.$set = Re), + (e.prototype.$delete = je), + (e.prototype.$watch = function (e, t, n) { + var r = this; + if (g(t)) return Nr(r, e, t, n); + (n = n || {}).user = !0; + var i = new Pn(r, e, t, n); + if (n.immediate) { + var o = 'callback for immediate watcher "'.concat( + i.expression, + '"', + ); + (Ce(), en(t, r, [i.value], r, o), xe()); + } + return function () { + i.teardown(); + }; + })); + })(Lr), + (function (e) { + var t = /^hook:/; + ((e.prototype.$on = function (e, n) { + var r = this; + if (u(e)) + for (var i = 0, o = e.length; i < o; i++) r.$on(e[i], n); + else + ((r._events[e] || (r._events[e] = [])).push(n), + t.test(e) && (r._hasHookEvent = !0)); + return r; + }), + (e.prototype.$once = function (e, t) { + var n = this; + function r() { + (n.$off(e, r), t.apply(n, arguments)); + } + return ((r.fn = t), n.$on(e, r), n); + }), + (e.prototype.$off = function (e, t) { + var n = this; + if (!arguments.length) + return ((n._events = Object.create(null)), n); + if (u(e)) { + for (var r = 0, i = e.length; r < i; r++) n.$off(e[r], t); + return n; + } + var o = n._events[e]; + if (!o) return n; + if (!t) return ((n._events[e] = null), n); + for (var a, s = o.length; s--; ) + if ((a = o[s]) === t || a.fn === t) { + o.splice(s, 1); + break; + } + return n; + }), + (e.prototype.$emit = function (e) { + var t = this, + n = t._events[e]; + if (n) { + n = n.length > 1 ? P(n) : n; + for ( + var r = P(arguments, 1), + i = 'event handler for "'.concat(e, '"'), + o = 0, + a = n.length; + o < a; + o++ + ) + en(n[o], t, r, t, i); + } + return t; + })); + })(Lr), + (function (e) { + ((e.prototype._update = function (e, t) { + var n = this, + r = n.$el, + i = n._vnode, + o = Un(n); + ((n._vnode = e), + (n.$el = i + ? n.__patch__(i, e) + : n.__patch__(n.$el, e, t, !1)), + o(), + r && (r.__vue__ = null), + n.$el && (n.$el.__vue__ = n)); + for ( + var a = n; + a && a.$vnode && a.$parent && a.$vnode === a.$parent._vnode; + ) + ((a.$parent.$el = a.$el), (a = a.$parent)); + }), + (e.prototype.$forceUpdate = function () { + this._watcher && this._watcher.update(); + }), + (e.prototype.$destroy = function () { + var e = this; + if (!e._isBeingDestroyed) { + (Hn(e, "beforeDestroy"), (e._isBeingDestroyed = !0)); + var t = e.$parent; + (!t || + t._isBeingDestroyed || + e.$options.abstract || + A(t.$children, e), + e._scope.stop(), + e._data.__ob__ && e._data.__ob__.vmCount--, + (e._isDestroyed = !0), + e.__patch__(e._vnode, null), + Hn(e, "destroyed"), + e.$off(), + e.$el && (e.$el.__vue__ = null), + e.$vnode && (e.$vnode.parent = null)); + } + })); + })(Lr), + (function (e) { + (Pt(e.prototype), + (e.prototype.$nextTick = function (e) { + return pn(e, this); + }), + (e.prototype._render = function () { + var e = this, + t = e.$options, + n = t.render, + r = t._parentVnode; + (r && + e._isMounted && + ((e.$scopedSlots = jt( + e.$parent, + r.data.scopedSlots, + e.$slots, + e.$scopedSlots, + )), + e._slotsProxy && Ht(e._slotsProxy, e.$scopedSlots)), + (e.$vnode = r)); + var i, + o = he, + a = Vt; + try { + (me(e), + (Vt = e), + (i = n.call(e._renderProxy, e.$createElement))); + } catch (u) { + (Zt(u, e, "render"), (i = e._vnode)); + } finally { + ((Vt = a), me(o)); + } + return ( + u(i) && 1 === i.length && (i = i[0]), + i instanceof ge || (i = ve()), + (i.parent = r), + i + ); + })); + })(Lr)); + var Br = [String, RegExp, Array], + Gr = { + KeepAlive: { + name: "keep-alive", + abstract: !0, + props: { include: Br, exclude: Br, max: [String, Number] }, + methods: { + cacheVNode: function () { + var e = this.cache, + t = this.keys, + n = this.vnodeToCache, + r = this.keyToCache; + if (n) { + var i = n.tag, + o = n.componentInstance, + a = n.componentOptions; + ((e[r] = { name: Rr(a), tag: i, componentInstance: o }), + t.push(r), + this.max && + t.length > parseInt(this.max) && + Ur(e, t[0], t, this._vnode), + (this.vnodeToCache = null)); + } + }, + }, + created: function () { + ((this.cache = Object.create(null)), (this.keys = [])); + }, + destroyed: function () { + for (var e in this.cache) Ur(this.cache, e, this.keys); + }, + mounted: function () { + var e = this; + (this.cacheVNode(), + this.$watch("include", function (t) { + $r(e, function (e) { + return jr(t, e); + }); + }), + this.$watch("exclude", function (t) { + $r(e, function (e) { + return !jr(t, e); + }); + })); + }, + updated: function () { + this.cacheVNode(); + }, + render: function () { + var e = this.$slots["default"], + t = Xt(e), + n = t && t.componentOptions; + if (n) { + var r = Rr(n), + i = this.include, + o = this.exclude; + if ((i && (!r || !jr(i, r))) || (o && r && jr(o, r))) + return t; + var a = this.cache, + s = this.keys, + u = + null == t.key + ? n.Ctor.cid + (n.tag ? "::".concat(n.tag) : "") + : t.key; + (a[u] + ? ((t.componentInstance = a[u].componentInstance), + A(s, u), + s.push(u)) + : ((this.vnodeToCache = t), (this.keyToCache = u)), + (t.data.keepAlive = !0)); + } + return t || (e && e[0]); + }, + }, + }; + (!(function (e) { + var t = { + get: function () { + return W; + }, + }; + (Object.defineProperty(e, "config", t), + (e.util = { + warn: fr, + extend: F, + mergeOptions: yr, + defineReactive: Le, + }), + (e.set = Re), + (e["delete"] = je), + (e.nextTick = pn), + (e.observable = function (e) { + return (Fe(e), e); + }), + (e.options = Object.create(null)), + q.forEach(function (t) { + e.options[t + "s"] = Object.create(null); + }), + (e.options._base = e), + F(e.options.components, Gr), + (function (e) { + e.use = function (e) { + var t = + this._installedPlugins || (this._installedPlugins = []); + if (t.indexOf(e) > -1) return this; + var n = P(arguments, 1); + return ( + n.unshift(this), + p(e.install) + ? e.install.apply(e, n) + : p(e) && e.apply(null, n), + t.push(e), + this + ); + }; + })(e), + (function (e) { + e.mixin = function (e) { + return ((this.options = yr(this.options, e)), this); + }; + })(e), + (function (e) { + e.cid = 0; + var t = 1; + e.extend = function (e) { + e = e || {}; + var n = this, + r = n.cid, + i = e._Ctor || (e._Ctor = {}); + if (i[r]) return i[r]; + var o = sr(e) || sr(n.options), + a = function (e) { + this._init(e); + }; + return ( + ((a.prototype = Object.create(n.prototype)).constructor = + a), + (a.cid = t++), + (a.options = yr(n.options, e)), + (a["super"] = n), + a.options.props && + (function (e) { + var t = e.options.props; + for (var n in t) Ir(e.prototype, "_props", n); + })(a), + a.options.computed && + (function (e) { + var t = e.options.computed; + for (var n in t) Or(e.prototype, n, t[n]); + })(a), + (a.extend = n.extend), + (a.mixin = n.mixin), + (a.use = n.use), + q.forEach(function (e) { + a[e] = n[e]; + }), + o && (a.options.components[o] = a), + (a.superOptions = n.options), + (a.extendOptions = e), + (a.sealedOptions = F({}, a.options)), + (i[r] = a), + a + ); + }; + })(e), + (function (e) { + q.forEach(function (t) { + e[t] = function (e, n) { + return n + ? ("component" === t && + g(n) && + ((n.name = n.name || e), + (n = this.options._base.extend(n))), + "directive" === t && + p(n) && + (n = { bind: n, update: n }), + (this.options[t + "s"][e] = n), + n) + : this.options[t + "s"][e]; + }; + }); + })(e)); + })(Lr), + Object.defineProperty(Lr.prototype, "$isServer", { get: ce }), + Object.defineProperty(Lr.prototype, "$ssrContext", { + get: function () { + return this.$vnode && this.$vnode.ssrContext; + }, + }), + Object.defineProperty(Lr, "FunctionalRenderContext", { + value: ir, + }), + (Lr.version = In)); + var zr = w("style,class"), + Hr = w("input,textarea,option,select,progress"), + qr = w("contenteditable,draggable,spellcheck"), + Vr = w("events,caret,typing,plaintext-only"), + Wr = function (e, t) { + return Qr(t) || "false" === t + ? "false" + : "contenteditable" === e && Vr(t) + ? t + : "true"; + }, + Xr = w( + "allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible", + ), + Kr = "http://www.w3.org/1999/xlink", + Yr = function (e) { + return ":" === e.charAt(5) && "xlink" === e.slice(0, 5); + }, + Jr = function (e) { + return Yr(e) ? e.slice(6, e.length) : ""; + }, + Qr = function (e) { + return null == e || !1 === e; + }; + function Zr(e, t) { + return { + staticClass: ei(e.staticClass, t.staticClass), + class: l(e["class"]) ? [e["class"], t["class"]] : t["class"], + }; + } + function ei(e, t) { + return e ? (t ? e + " " + t : e) : t || ""; + } + function ti(e) { + return Array.isArray(e) + ? (function (e) { + for (var t, n = "", r = 0, i = e.length; r < i; r++) + l((t = ti(e[r]))) && + "" !== t && + (n && (n += " "), (n += t)); + return n; + })(e) + : h(e) + ? (function (e) { + var t = ""; + for (var n in e) e[n] && (t && (t += " "), (t += n)); + return t; + })(e) + : "string" == typeof e + ? e + : ""; + } + var ni = { + svg: "http://www.w3.org/2000/svg", + math: "http://www.w3.org/1998/Math/MathML", + }, + ri = w( + "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot", + ), + ii = w( + "svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignobject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view", + !0, + ), + oi = function (e) { + return ri(e) || ii(e); + }, + ai = Object.create(null), + si = w("text,number,password,search,email,tel,url"), + ui = Object.freeze({ + __proto__: null, + createElement: function (e, t) { + var n = document.createElement(e); + return ( + "select" !== e || + (t.data && + t.data.attrs && + void 0 !== t.data.attrs.multiple && + n.setAttribute("multiple", "multiple")), + n + ); + }, + createElementNS: function (e, t) { + return document.createElementNS(ni[e], t); + }, + createTextNode: function (e) { + return document.createTextNode(e); + }, + createComment: function (e) { + return document.createComment(e); + }, + insertBefore: function (e, t, n) { + e.insertBefore(t, n); + }, + removeChild: function (e, t) { + e.removeChild(t); + }, + appendChild: function (e, t) { + e.appendChild(t); + }, + parentNode: function (e) { + return e.parentNode; + }, + nextSibling: function (e) { + return e.nextSibling; + }, + tagName: function (e) { + return e.tagName; + }, + setTextContent: function (e, t) { + e.textContent = t; + }, + setStyleScope: function (e, t) { + e.setAttribute(t, ""); + }, + }), + ci = { + create: function (e, t) { + li(t); + }, + update: function (e, t) { + e.data.ref !== t.data.ref && (li(e, !0), li(t)); + }, + destroy: function (e) { + li(e, !0); + }, + }; + function li(e, t) { + var n = e.data.ref; + if (l(n)) { + var r = e.context, + i = e.componentInstance || e.elm, + o = t ? null : i, + a = t ? void 0 : i; + if (p(n)) en(n, r, [o], r, "template ref function"); + else { + var s = e.data.refInFor, + c = "string" == typeof n || "number" == typeof n, + d = Ve(n), + f = r.$refs; + if (c || d) + if (s) { + var h = c ? f[n] : n.value; + t + ? u(h) && A(h, i) + : u(h) + ? h.includes(i) || h.push(i) + : c + ? ((f[n] = [i]), di(r, n, f[n])) + : (n.value = [i]); + } else if (c) { + if (t && f[n] !== i) return; + ((f[n] = a), di(r, n, o)); + } else if (d) { + if (t && n.value !== i) return; + n.value = o; + } + } + } + } + function di(e, t, n) { + var r = e._setupState; + r && x(r, t) && (Ve(r[t]) ? (r[t].value = n) : (r[t] = n)); + } + var fi = new ge("", {}, []), + pi = ["create", "activate", "update", "remove", "destroy"]; + function hi(e, t) { + return ( + e.key === t.key && + e.asyncFactory === t.asyncFactory && + ((e.tag === t.tag && + e.isComment === t.isComment && + l(e.data) === l(t.data) && + (function (e, t) { + if ("input" !== e.tag) return !0; + var n, + r = l((n = e.data)) && l((n = n.attrs)) && n.type, + i = l((n = t.data)) && l((n = n.attrs)) && n.type; + return r === i || (si(r) && si(i)); + })(e, t)) || + (d(e.isAsyncPlaceholder) && c(t.asyncFactory.error))) + ); + } + function mi(e, t, n) { + var r, + i, + o = {}; + for (r = t; r <= n; ++r) l((i = e[r].key)) && (o[i] = r); + return o; + } + var gi = { + create: vi, + update: vi, + destroy: function (e) { + vi(e, fi); + }, + }; + function vi(e, t) { + (e.data.directives || t.data.directives) && + (function (e, t) { + var n, + r, + i, + o = e === fi, + a = t === fi, + s = yi(e.data.directives, e.context), + u = yi(t.data.directives, t.context), + c = [], + l = []; + for (n in u) + ((r = s[n]), + (i = u[n]), + r + ? ((i.oldValue = r.value), + (i.oldArg = r.arg), + ki(i, "update", t, e), + i.def && i.def.componentUpdated && l.push(i)) + : (ki(i, "bind", t, e), + i.def && i.def.inserted && c.push(i))); + if (c.length) { + var d = function () { + for (var n = 0; n < c.length; n++) + ki(c[n], "inserted", t, e); + }; + o ? mt(t, "insert", d) : d(); + } + if ( + (l.length && + mt(t, "postpatch", function () { + for (var n = 0; n < l.length; n++) + ki(l[n], "componentUpdated", t, e); + }), + !o) + ) + for (n in s) u[n] || ki(s[n], "unbind", e, e, a); + })(e, t); + } + var _i = Object.create(null); + function yi(e, t) { + var n, + r, + i = Object.create(null); + if (!e) return i; + for (n = 0; n < e.length; n++) { + if ( + ((r = e[n]).modifiers || (r.modifiers = _i), + (i[bi(r)] = r), + t._setupState && t._setupState.__sfc) + ) { + var o = r.def || br(t, "_setupState", "v-" + r.name); + r.def = "function" == typeof o ? { bind: o, update: o } : o; + } + r.def = r.def || br(t.$options, "directives", r.name); + } + return i; + } + function bi(e) { + return ( + e.rawName || + "" + .concat(e.name, ".") + .concat(Object.keys(e.modifiers || {}).join(".")) + ); + } + function ki(e, t, n, r, i) { + var o = e.def && e.def[t]; + if (o) + try { + o(n.elm, e, n, r, i); + } catch (r) { + Zt( + r, + n.context, + "directive ".concat(e.name, " ").concat(t, " hook"), + ); + } + } + var wi = [ci, gi]; + function Ei(e, t) { + var n = t.componentOptions; + if ( + !( + (l(n) && !1 === n.Ctor.options.inheritAttrs) || + (c(e.data.attrs) && c(t.data.attrs)) + ) + ) { + var r, + i, + o = t.elm, + a = e.data.attrs || {}, + s = t.data.attrs || {}; + for (r in ((l(s.__ob__) || d(s._v_attr_proxy)) && + (s = t.data.attrs = F({}, s)), + s)) + ((i = s[r]), a[r] !== i && Ai(o, r, i, t.data.pre)); + for (r in ((ee || ne) && + s.value !== a.value && + Ai(o, "value", s.value), + a)) + c(s[r]) && + (Yr(r) + ? o.removeAttributeNS(Kr, Jr(r)) + : qr(r) || o.removeAttribute(r)); + } + } + function Ai(e, t, n, r) { + r || e.tagName.indexOf("-") > -1 + ? Ci(e, t, n) + : Xr(t) + ? Qr(n) + ? e.removeAttribute(t) + : ((n = + "allowfullscreen" === t && "EMBED" === e.tagName + ? "true" + : t), + e.setAttribute(t, n)) + : qr(t) + ? e.setAttribute(t, Wr(t, n)) + : Yr(t) + ? Qr(n) + ? e.removeAttributeNS(Kr, Jr(t)) + : e.setAttributeNS(Kr, t, n) + : Ci(e, t, n); + } + function Ci(e, t, n) { + Qr(n) + ? e.removeAttribute(t) + : (!ee || + te || + "TEXTAREA" !== e.tagName || + "placeholder" !== t || + "" === n || + e.__ieph || + (e.addEventListener("input", function r(t) { + (t.stopImmediatePropagation(), + e.removeEventListener("input", r)); + }), + (e.__ieph = !0)), + e.setAttribute(t, n)); + } + var xi = { create: Ei, update: Ei }; + function Ii(e, t) { + var n = t.elm, + r = t.data, + i = e.data; + if ( + !( + c(r.staticClass) && + c(r["class"]) && + (c(i) || (c(i.staticClass) && c(i["class"]))) + ) + ) { + var o = (function (e) { + for (var t = e.data, n = e, r = e; l(r.componentInstance); ) + (r = r.componentInstance._vnode) && + r.data && + (t = Zr(r.data, t)); + for (; l((n = n.parent)); ) + n && n.data && (t = Zr(t, n.data)); + return (function (e, t) { + return l(e) || l(t) ? ei(e, ti(t)) : ""; + })(t.staticClass, t["class"]); + })(t), + a = n._transitionClasses; + (l(a) && (o = ei(o, ti(a))), + o !== n._prevClass && + (n.setAttribute("class", o), (n._prevClass = o))); + } + } + var Di, + Si = { create: Ii, update: Ii }, + Oi = "__r", + Ti = "__c"; + function Mi(e, t, n) { + var r = Di; + return function i() { + null !== t.apply(null, arguments) && Fi(e, i, n, r); + }; + } + var Ni = on && !(oe && Number(oe[1]) <= 53); + function Pi(e, t, n, r) { + if (Ni) { + var i = Jn, + o = t; + t = o._wrapper = function (e) { + if ( + e.target === e.currentTarget || + e.timeStamp >= i || + e.timeStamp <= 0 || + e.target.ownerDocument !== document + ) + return o.apply(this, arguments); + }; + } + Di.addEventListener(e, t, se ? { capture: n, passive: r } : n); + } + function Fi(e, t, n, r) { + (r || Di).removeEventListener(e, t._wrapper || t, n); + } + function Li(e, t) { + if (!c(e.data.on) || !c(t.data.on)) { + var n = t.data.on || {}, + r = e.data.on || {}; + ((Di = t.elm || e.elm), + (function (e) { + if (l(e[Oi])) { + var t = ee ? "change" : "input"; + ((e[t] = [].concat(e[Oi], e[t] || [])), delete e[Oi]); + } + l(e[Ti]) && + ((e.change = [].concat(e[Ti], e.change || [])), + delete e[Ti]); + })(n), + ht(n, r, Pi, Fi, Mi, t.context), + (Di = void 0)); + } + } + var Ri, + ji = { + create: Li, + update: Li, + destroy: function (e) { + return Li(e, fi); + }, + }; + function $i(e, t) { + if (!c(e.data.domProps) || !c(t.data.domProps)) { + var n, + r, + i = t.elm, + o = e.data.domProps || {}, + a = t.data.domProps || {}; + for (n in ((l(a.__ob__) || d(a._v_attr_proxy)) && + (a = t.data.domProps = F({}, a)), + o)) + n in a || (i[n] = ""); + for (n in a) { + if (((r = a[n]), "textContent" === n || "innerHTML" === n)) { + if ((t.children && (t.children.length = 0), r === o[n])) + continue; + 1 === i.childNodes.length && i.removeChild(i.childNodes[0]); + } + if ("value" === n && "PROGRESS" !== i.tagName) { + i._value = r; + var s = c(r) ? "" : String(r); + Ui(i, s) && (i.value = s); + } else if ( + "innerHTML" === n && + ii(i.tagName) && + c(i.innerHTML) + ) { + (Ri = Ri || document.createElement("div")).innerHTML = + "".concat(r, ""); + for (var u = Ri.firstChild; i.firstChild; ) + i.removeChild(i.firstChild); + for (; u.firstChild; ) i.appendChild(u.firstChild); + } else if (r !== o[n]) + try { + i[n] = r; + } catch (e) {} + } + } + } + function Ui(e, t) { + return ( + !e.composing && + ("OPTION" === e.tagName || + (function (e, t) { + var n = !0; + try { + n = document.activeElement !== e; + } catch (e) {} + return n && e.value !== t; + })(e, t) || + (function (e, t) { + var n = e.value, + r = e._vModifiers; + if (l(r)) { + if (r.number) return k(n) !== k(t); + if (r.trim) return n.trim() !== t.trim(); + } + return n !== t; + })(e, t)) + ); + } + var Bi = { create: $i, update: $i }, + Gi = I(function (e) { + var t = {}, + n = /:(.+)/; + return ( + e.split(/;(?![^(]*\))/g).forEach(function (e) { + if (e) { + var r = e.split(n); + r.length > 1 && (t[r[0].trim()] = r[1].trim()); + } + }), + t + ); + }); + function zi(e) { + var t = Hi(e.style); + return e.staticStyle ? F(e.staticStyle, t) : t; + } + function Hi(e) { + return Array.isArray(e) ? L(e) : "string" == typeof e ? Gi(e) : e; + } + var qi, + Vi = /^--/, + Wi = /\s*!important$/, + Xi = function (e, t, n) { + if (Vi.test(t)) e.style.setProperty(t, n); + else if (Wi.test(n)) + e.style.setProperty(M(t), n.replace(Wi, ""), "important"); + else { + var r = Yi(t); + if (Array.isArray(n)) + for (var i = 0, o = n.length; i < o; i++) e.style[r] = n[i]; + else e.style[r] = n; + } + }, + Ki = ["Webkit", "Moz", "ms"], + Yi = I(function (e) { + if ( + ((qi = qi || document.createElement("div").style), + "filter" !== (e = S(e)) && e in qi) + ) + return e; + for ( + var t = e.charAt(0).toUpperCase() + e.slice(1), n = 0; + n < Ki.length; + n++ + ) { + var r = Ki[n] + t; + if (r in qi) return r; + } + }); + function Ji(e, t) { + var n = t.data, + r = e.data; + if ( + !( + c(n.staticStyle) && + c(n.style) && + c(r.staticStyle) && + c(r.style) + ) + ) { + var i, + o, + a = t.elm, + s = r.staticStyle, + u = r.normalizedStyle || r.style || {}, + d = s || u, + f = Hi(t.data.style) || {}; + t.data.normalizedStyle = l(f.__ob__) ? F({}, f) : f; + var p = (function (e, t) { + for (var n, r = {}, i = e; i.componentInstance; ) + (i = i.componentInstance._vnode) && + i.data && + (n = zi(i.data)) && + F(r, n); + (n = zi(e.data)) && F(r, n); + for (var o = e; (o = o.parent); ) + o.data && (n = zi(o.data)) && F(r, n); + return r; + })(t); + for (o in d) c(p[o]) && Xi(a, o, ""); + for (o in p) ((i = p[o]), Xi(a, o, null == i ? "" : i)); + } + } + var Qi = { create: Ji, update: Ji }, + Zi = /\s+/; + function eo(e, t) { + if (t && (t = t.trim())) + if (e.classList) + t.indexOf(" ") > -1 + ? t.split(Zi).forEach(function (t) { + return e.classList.add(t); + }) + : e.classList.add(t); + else { + var n = " ".concat(e.getAttribute("class") || "", " "); + n.indexOf(" " + t + " ") < 0 && + e.setAttribute("class", (n + t).trim()); + } + } + function to(e, t) { + if (t && (t = t.trim())) + if (e.classList) + (t.indexOf(" ") > -1 + ? t.split(Zi).forEach(function (t) { + return e.classList.remove(t); + }) + : e.classList.remove(t), + e.classList.length || e.removeAttribute("class")); + else { + for ( + var n = " ".concat(e.getAttribute("class") || "", " "), + r = " " + t + " "; + n.indexOf(r) >= 0; + ) + n = n.replace(r, " "); + (n = n.trim()) + ? e.setAttribute("class", n) + : e.removeAttribute("class"); + } + } + function no(e) { + if (e) { + if ("object" == (0, a["default"])(e)) { + var t = {}; + return (!1 !== e.css && F(t, ro(e.name || "v")), F(t, e), t); + } + return "string" == typeof e ? ro(e) : void 0; + } + } + var ro = I(function (e) { + return { + enterClass: "".concat(e, "-enter"), + enterToClass: "".concat(e, "-enter-to"), + enterActiveClass: "".concat(e, "-enter-active"), + leaveClass: "".concat(e, "-leave"), + leaveToClass: "".concat(e, "-leave-to"), + leaveActiveClass: "".concat(e, "-leave-active"), + }; + }), + io = Q && !te, + oo = "transition", + ao = "animation", + so = "transition", + uo = "transitionend", + co = "animation", + lo = "animationend"; + io && + (void 0 === window.ontransitionend && + void 0 !== window.onwebkittransitionend && + ((so = "WebkitTransition"), (uo = "webkitTransitionEnd")), + void 0 === window.onanimationend && + void 0 !== window.onwebkitanimationend && + ((co = "WebkitAnimation"), (lo = "webkitAnimationEnd"))); + var fo = Q + ? window.requestAnimationFrame + ? window.requestAnimationFrame.bind(window) + : setTimeout + : function (e) { + return e(); + }; + function po(e) { + fo(function () { + fo(e); + }); + } + function ho(e, t) { + var n = e._transitionClasses || (e._transitionClasses = []); + n.indexOf(t) < 0 && (n.push(t), eo(e, t)); + } + function mo(e, t) { + (e._transitionClasses && A(e._transitionClasses, t), to(e, t)); + } + function go(e, t, n) { + var r = _o(e, t), + i = r.type, + o = r.timeout, + a = r.propCount; + if (!i) return n(); + var s = i === oo ? uo : lo, + u = 0, + c = function () { + (e.removeEventListener(s, l), n()); + }, + l = function (t) { + t.target === e && ++u >= a && c(); + }; + (setTimeout(function () { + u < a && c(); + }, o + 1), + e.addEventListener(s, l)); + } + var vo = /\b(transform|all)(,|$)/; + function _o(e, t) { + var n, + r = window.getComputedStyle(e), + i = (r[so + "Delay"] || "").split(", "), + o = (r[so + "Duration"] || "").split(", "), + a = yo(i, o), + s = (r[co + "Delay"] || "").split(", "), + u = (r[co + "Duration"] || "").split(", "), + c = yo(s, u), + l = 0, + d = 0; + return ( + t === oo + ? a > 0 && ((n = oo), (l = a), (d = o.length)) + : t === ao + ? c > 0 && ((n = ao), (l = c), (d = u.length)) + : (d = (n = + (l = Math.max(a, c)) > 0 ? (a > c ? oo : ao) : null) + ? n === oo + ? o.length + : u.length + : 0), + { + type: n, + timeout: l, + propCount: d, + hasTransform: n === oo && vo.test(r[so + "Property"]), + } + ); + } + function yo(e, t) { + for (; e.length < t.length; ) e = e.concat(e); + return Math.max.apply( + null, + t.map(function (t, n) { + return bo(t) + bo(e[n]); + }), + ); + } + function bo(e) { + return 1e3 * Number(e.slice(0, -1).replace(",", ".")); + } + function ko(e, t) { + var n = e.elm; + l(n._leaveCb) && ((n._leaveCb.cancelled = !0), n._leaveCb()); + var r = no(e.data.transition); + if (!c(r) && !l(n._enterCb) && 1 === n.nodeType) { + for ( + var i = r.css, + o = r.type, + a = r.enterClass, + s = r.enterToClass, + u = r.enterActiveClass, + d = r.appearClass, + f = r.appearToClass, + m = r.appearActiveClass, + g = r.beforeEnter, + v = r.enter, + _ = r.afterEnter, + y = r.enterCancelled, + b = r.beforeAppear, + w = r.appear, + E = r.afterAppear, + A = r.appearCancelled, + C = r.duration, + x = $n, + I = $n.$vnode; + I && I.parent; + ) + ((x = I.context), (I = I.parent)); + var D = !x._isMounted || !e.isRootInsert; + if (!D || w || "" === w) { + var S = D && d ? d : a, + O = D && m ? m : u, + T = D && f ? f : s, + M = (D && b) || g, + N = D && p(w) ? w : v, + P = (D && E) || _, + F = (D && A) || y, + L = k(h(C) ? C.enter : C), + R = !1 !== i && !te, + j = Ao(N), + $ = (n._enterCb = G(function () { + (R && (mo(n, T), mo(n, O)), + $.cancelled ? (R && mo(n, S), F && F(n)) : P && P(n), + (n._enterCb = null)); + })); + (e.data.show || + mt(e, "insert", function () { + var t = n.parentNode, + r = t && t._pending && t._pending[e.key]; + (r && + r.tag === e.tag && + r.elm._leaveCb && + r.elm._leaveCb(), + N && N(n, $)); + }), + M && M(n), + R && + (ho(n, S), + ho(n, O), + po(function () { + (mo(n, S), + $.cancelled || + (ho(n, T), + j || (Eo(L) ? setTimeout($, L) : go(n, o, $)))); + })), + e.data.show && (t && t(), N && N(n, $)), + R || j || $()); + } + } + } + function wo(e, t) { + var n = e.elm; + l(n._enterCb) && ((n._enterCb.cancelled = !0), n._enterCb()); + var r = no(e.data.transition); + if (c(r) || 1 !== n.nodeType) return t(); + if (!l(n._leaveCb)) { + var i = r.css, + o = r.type, + a = r.leaveClass, + s = r.leaveToClass, + u = r.leaveActiveClass, + d = r.beforeLeave, + f = r.leave, + p = r.afterLeave, + m = r.leaveCancelled, + g = r.delayLeave, + v = r.duration, + _ = !1 !== i && !te, + y = Ao(f), + b = k(h(v) ? v.leave : v), + w = (n._leaveCb = G(function () { + (n.parentNode && + n.parentNode._pending && + (n.parentNode._pending[e.key] = null), + _ && (mo(n, s), mo(n, u)), + w.cancelled + ? (_ && mo(n, a), m && m(n)) + : (t(), p && p(n)), + (n._leaveCb = null)); + })); + g ? g(E) : E(); + } + function E() { + w.cancelled || + (!e.data.show && + n.parentNode && + ((n.parentNode._pending || (n.parentNode._pending = {}))[ + e.key + ] = e), + d && d(n), + _ && + (ho(n, a), + ho(n, u), + po(function () { + (mo(n, a), + w.cancelled || + (ho(n, s), + y || (Eo(b) ? setTimeout(w, b) : go(n, o, w)))); + })), + f && f(n, w), + _ || y || w()); + } + } + function Eo(e) { + return "number" == typeof e && !isNaN(e); + } + function Ao(e) { + if (c(e)) return !1; + var t = e.fns; + return l(t) + ? Ao(Array.isArray(t) ? t[0] : t) + : (e._length || e.length) > 1; + } + function Co(e, t) { + !0 !== t.data.show && ko(t); + } + var xo = (function (e) { + var t, + n, + r = {}, + i = e.modules, + o = e.nodeOps; + for (t = 0; t < pi.length; ++t) + for (r[pi[t]] = [], n = 0; n < i.length; ++n) + l(i[n][pi[t]]) && r[pi[t]].push(i[n][pi[t]]); + function a(e) { + var t = o.parentNode(e); + l(t) && o.removeChild(t, e); + } + function s(e, t, n, i, a, s, u) { + if ( + (l(e.elm) && l(s) && (e = s[u] = ye(e)), + (e.isRootInsert = !a), + !(function (e, t, n, i) { + var o = e.data; + if (l(o)) { + var a = l(e.componentInstance) && o.keepAlive; + if ( + (l((o = o.hook)) && l((o = o.init)) && o(e, !1), + l(e.componentInstance)) + ) + return ( + p(e, t), + h(n, e.elm, i), + d(a) && + (function (e, t, n, i) { + for (var o, a = e; a.componentInstance; ) + if ( + l( + (o = (a = a.componentInstance._vnode).data), + ) && + l((o = o.transition)) + ) { + for (o = 0; o < r.activate.length; ++o) + r.activate[o](fi, a); + t.push(a); + break; + } + h(n, e.elm, i); + })(e, t, n, i), + !0 + ); + } + })(e, t, n, i)) + ) { + var c = e.data, + f = e.children, + g = e.tag; + l(g) + ? ((e.elm = e.ns + ? o.createElementNS(e.ns, g) + : o.createElement(g, e)), + _(e), + m(e, f, t), + l(c) && v(e, t), + h(n, e.elm, i)) + : d(e.isComment) + ? ((e.elm = o.createComment(e.text)), h(n, e.elm, i)) + : ((e.elm = o.createTextNode(e.text)), h(n, e.elm, i)); + } + } + function p(e, t) { + (l(e.data.pendingInsert) && + (t.push.apply(t, e.data.pendingInsert), + (e.data.pendingInsert = null)), + (e.elm = e.componentInstance.$el), + g(e) ? (v(e, t), _(e)) : (li(e), t.push(e))); + } + function h(e, t, n) { + l(e) && + (l(n) + ? o.parentNode(n) === e && o.insertBefore(e, t, n) + : o.appendChild(e, t)); + } + function m(e, t, n) { + if (u(t)) + for (var r = 0; r < t.length; ++r) + s(t[r], n, e.elm, null, !0, t, r); + else + f(e.text) && + o.appendChild(e.elm, o.createTextNode(String(e.text))); + } + function g(e) { + for (; e.componentInstance; ) e = e.componentInstance._vnode; + return l(e.tag); + } + function v(e, n) { + for (var i = 0; i < r.create.length; ++i) r.create[i](fi, e); + l((t = e.data.hook)) && + (l(t.create) && t.create(fi, e), l(t.insert) && n.push(e)); + } + function _(e) { + var t; + if (l((t = e.fnScopeId))) o.setStyleScope(e.elm, t); + else + for (var n = e; n; ) + (l((t = n.context)) && + l((t = t.$options._scopeId)) && + o.setStyleScope(e.elm, t), + (n = n.parent)); + l((t = $n)) && + t !== e.context && + t !== e.fnContext && + l((t = t.$options._scopeId)) && + o.setStyleScope(e.elm, t); + } + function y(e, t, n, r, i, o) { + for (; r <= i; ++r) s(n[r], o, e, t, !1, n, r); + } + function b(e) { + var t, + n, + i = e.data; + if (l(i)) + for ( + l((t = i.hook)) && l((t = t.destroy)) && t(e), t = 0; + t < r.destroy.length; + ++t + ) + r.destroy[t](e); + if (l((t = e.children))) + for (n = 0; n < e.children.length; ++n) b(e.children[n]); + } + function k(e, t, n) { + for (; t <= n; ++t) { + var r = e[t]; + l(r) && (l(r.tag) ? (E(r), b(r)) : a(r.elm)); + } + } + function E(e, t) { + if (l(t) || l(e.data)) { + var n, + i = r.remove.length + 1; + for ( + l(t) + ? (t.listeners += i) + : (t = (function (e, t) { + function n() { + 0 == --n.listeners && a(e); + } + return ((n.listeners = t), n); + })(e.elm, i)), + l((n = e.componentInstance)) && + l((n = n._vnode)) && + l(n.data) && + E(n, t), + n = 0; + n < r.remove.length; + ++n + ) + r.remove[n](e, t); + l((n = e.data.hook)) && l((n = n.remove)) ? n(e, t) : t(); + } else a(e.elm); + } + function A(e, t, n, r) { + for (var i = n; i < r; i++) { + var o = t[i]; + if (l(o) && hi(e, o)) return i; + } + } + function C(e, t, n, i, a, u) { + if (e !== t) { + l(t.elm) && l(i) && (t = i[a] = ye(t)); + var f = (t.elm = e.elm); + if (d(e.isAsyncPlaceholder)) + l(t.asyncFactory.resolved) + ? D(e.elm, t, n) + : (t.isAsyncPlaceholder = !0); + else if ( + d(t.isStatic) && + d(e.isStatic) && + t.key === e.key && + (d(t.isCloned) || d(t.isOnce)) + ) + t.componentInstance = e.componentInstance; + else { + var p, + h = t.data; + l(h) && l((p = h.hook)) && l((p = p.prepatch)) && p(e, t); + var m = e.children, + v = t.children; + if (l(h) && g(t)) { + for (p = 0; p < r.update.length; ++p) r.update[p](e, t); + l((p = h.hook)) && l((p = p.update)) && p(e, t); + } + (c(t.text) + ? l(m) && l(v) + ? m !== v && + (function (e, t, n, r, i) { + for ( + var a, + u, + d, + f = 0, + p = 0, + h = t.length - 1, + m = t[0], + g = t[h], + v = n.length - 1, + _ = n[0], + b = n[v], + w = !i; + f <= h && p <= v; + ) + c(m) + ? (m = t[++f]) + : c(g) + ? (g = t[--h]) + : hi(m, _) + ? (C(m, _, r, n, p), + (m = t[++f]), + (_ = n[++p])) + : hi(g, b) + ? (C(g, b, r, n, v), + (g = t[--h]), + (b = n[--v])) + : hi(m, b) + ? (C(m, b, r, n, v), + w && + o.insertBefore( + e, + m.elm, + o.nextSibling(g.elm), + ), + (m = t[++f]), + (b = n[--v])) + : hi(g, _) + ? (C(g, _, r, n, p), + w && + o.insertBefore(e, g.elm, m.elm), + (g = t[--h]), + (_ = n[++p])) + : (c(a) && (a = mi(t, f, h)), + c( + (u = l(_.key) + ? a[_.key] + : A(_, t, f, h)), + ) + ? s(_, r, e, m.elm, !1, n, p) + : hi((d = t[u]), _) + ? (C(d, _, r, n, p), + (t[u] = void 0), + w && + o.insertBefore( + e, + d.elm, + m.elm, + )) + : s(_, r, e, m.elm, !1, n, p), + (_ = n[++p])); + f > h + ? y( + e, + c(n[v + 1]) ? null : n[v + 1].elm, + n, + p, + v, + r, + ) + : p > v && k(t, f, h); + })(f, m, v, n, u) + : l(v) + ? (l(e.text) && o.setTextContent(f, ""), + y(f, null, v, 0, v.length - 1, n)) + : l(m) + ? k(m, 0, m.length - 1) + : l(e.text) && o.setTextContent(f, "") + : e.text !== t.text && o.setTextContent(f, t.text), + l(h) && + l((p = h.hook)) && + l((p = p.postpatch)) && + p(e, t)); + } + } + } + function x(e, t, n) { + if (d(n) && l(e.parent)) e.parent.data.pendingInsert = t; + else + for (var r = 0; r < t.length; ++r) + t[r].data.hook.insert(t[r]); + } + var I = w("attrs,class,staticClass,staticStyle,key"); + function D(e, t, n, r) { + var i, + o = t.tag, + a = t.data, + s = t.children; + if ( + ((r = r || (a && a.pre)), + (t.elm = e), + d(t.isComment) && l(t.asyncFactory)) + ) + return ((t.isAsyncPlaceholder = !0), !0); + if ( + l(a) && + (l((i = a.hook)) && l((i = i.init)) && i(t, !0), + l((i = t.componentInstance))) + ) + return (p(t, n), !0); + if (l(o)) { + if (l(s)) + if (e.hasChildNodes()) + if ( + l((i = a)) && + l((i = i.domProps)) && + l((i = i.innerHTML)) + ) { + if (i !== e.innerHTML) return !1; + } else { + for ( + var u = !0, c = e.firstChild, f = 0; + f < s.length; + f++ + ) { + if (!c || !D(c, s[f], n, r)) { + u = !1; + break; + } + c = c.nextSibling; + } + if (!u || c) return !1; + } + else m(t, s, n); + if (l(a)) { + var h = !1; + for (var g in a) + if (!I(g)) { + ((h = !0), v(t, n)); + break; + } + !h && a["class"] && On(a["class"]); + } + } else e.data !== t.text && (e.data = t.text); + return !0; + } + return function (e, t, n, i) { + if (!c(t)) { + var a, + u = !1, + f = []; + if (c(e)) ((u = !0), s(t, f)); + else { + var p = l(e.nodeType); + if (!p && hi(e, t)) C(e, t, f, null, null, i); + else { + if (p) { + if ( + (1 === e.nodeType && + e.hasAttribute(H) && + (e.removeAttribute(H), (n = !0)), + d(n) && D(e, t, f)) + ) + return (x(t, f, !0), e); + ((a = e), + (e = new ge( + o.tagName(a).toLowerCase(), + {}, + [], + void 0, + a, + ))); + } + var h = e.elm, + m = o.parentNode(h); + if ( + (s(t, f, h._leaveCb ? null : m, o.nextSibling(h)), + l(t.parent)) + ) + for (var v = t.parent, _ = g(t); v; ) { + for (var y = 0; y < r.destroy.length; ++y) + r.destroy[y](v); + if (((v.elm = t.elm), _)) { + for (var w = 0; w < r.create.length; ++w) + r.create[w](fi, v); + var E = v.data.hook.insert; + if (E.merged) + for ( + var A = E.fns.slice(1), I = 0; + I < A.length; + I++ + ) + A[I](); + } else li(v); + v = v.parent; + } + l(m) ? k([e], 0, 0) : l(e.tag) && b(e); + } + } + return (x(t, f, u), t.elm); + } + l(e) && b(e); + }; + })({ + nodeOps: ui, + modules: [ + xi, + Si, + ji, + Bi, + Qi, + Q + ? { + create: Co, + activate: Co, + remove: function (e, t) { + !0 !== e.data.show ? wo(e, t) : t(); + }, + } + : {}, + ].concat(wi), + }); + te && + document.addEventListener("selectionchange", function () { + var e = document.activeElement; + e && e.vmodel && Po(e, "input"); + }); + var Io = { + inserted: function (e, t, n, r) { + "select" === n.tag + ? (r.elm && !r.elm._vOptions + ? mt(n, "postpatch", function () { + Io.componentUpdated(e, t, n); + }) + : Do(e, t, n.context), + (e._vOptions = [].map.call(e.options, To))) + : ("textarea" === n.tag || si(e.type)) && + ((e._vModifiers = t.modifiers), + t.modifiers.lazy || + (e.addEventListener("compositionstart", Mo), + e.addEventListener("compositionend", No), + e.addEventListener("change", No), + te && (e.vmodel = !0))); + }, + componentUpdated: function (e, t, n) { + if ("select" === n.tag) { + Do(e, t, n.context); + var r = e._vOptions, + i = (e._vOptions = [].map.call(e.options, To)); + i.some(function (e, t) { + return !U(e, r[t]); + }) && + (e.multiple + ? t.value.some(function (e) { + return Oo(e, i); + }) + : t.value !== t.oldValue && Oo(t.value, i)) && + Po(e, "change"); + } + }, + }; + function Do(e, t, n) { + (So(e, t), + (ee || ne) && + setTimeout(function () { + So(e, t); + }, 0)); + } + function So(e, t, n) { + var r = t.value, + i = e.multiple; + if (!i || Array.isArray(r)) { + for (var o, a, s = 0, u = e.options.length; s < u; s++) + if (((a = e.options[s]), i)) + ((o = B(r, To(a)) > -1), + a.selected !== o && (a.selected = o)); + else if (U(To(a), r)) + return void ( + e.selectedIndex !== s && (e.selectedIndex = s) + ); + i || (e.selectedIndex = -1); + } + } + function Oo(e, t) { + return t.every(function (t) { + return !U(t, e); + }); + } + function To(e) { + return "_value" in e ? e._value : e.value; + } + function Mo(e) { + e.target.composing = !0; + } + function No(e) { + e.target.composing && + ((e.target.composing = !1), Po(e.target, "input")); + } + function Po(e, t) { + var n = document.createEvent("HTMLEvents"); + (n.initEvent(t, !0, !0), e.dispatchEvent(n)); + } + function Fo(e) { + return !e.componentInstance || (e.data && e.data.transition) + ? e + : Fo(e.componentInstance._vnode); + } + var Lo = { + bind: function (e, t, n) { + var r = t.value, + i = (n = Fo(n)).data && n.data.transition, + o = (e.__vOriginalDisplay = + "none" === e.style.display ? "" : e.style.display); + r && i + ? ((n.data.show = !0), + ko(n, function () { + e.style.display = o; + })) + : (e.style.display = r ? o : "none"); + }, + update: function (e, t, n) { + var r = t.value; + !r != !t.oldValue && + ((n = Fo(n)).data && n.data.transition + ? ((n.data.show = !0), + r + ? ko(n, function () { + e.style.display = e.__vOriginalDisplay; + }) + : wo(n, function () { + e.style.display = "none"; + })) + : (e.style.display = r ? e.__vOriginalDisplay : "none")); + }, + unbind: function (e, t, n, r, i) { + i || (e.style.display = e.__vOriginalDisplay); + }, + }, + Ro = { model: Io, show: Lo }, + jo = { + name: String, + appear: Boolean, + css: Boolean, + mode: String, + type: String, + enterClass: String, + leaveClass: String, + enterToClass: String, + leaveToClass: String, + enterActiveClass: String, + leaveActiveClass: String, + appearClass: String, + appearActiveClass: String, + appearToClass: String, + duration: [Number, String, Object], + }; + function $o(e) { + var t = e && e.componentOptions; + return t && t.Ctor.options.abstract ? $o(Xt(t.children)) : e; + } + function Uo(e) { + var t = {}, + n = e.$options; + for (var r in n.propsData) t[r] = e[r]; + var i = n._parentListeners; + for (var o in i) t[S(o)] = i[o]; + return t; + } + function Bo(e, t) { + if (/\d-keep-alive$/.test(t.tag)) + return e("keep-alive", { props: t.componentOptions.propsData }); + } + var Go = function (e) { + return e.tag || Rt(e); + }, + zo = function (e) { + return "show" === e.name; + }, + Ho = { + name: "transition", + props: jo, + abstract: !0, + render: function (e) { + var t = this, + n = this.$slots["default"]; + if (n && (n = n.filter(Go)).length) { + var r = this.mode, + i = n[0]; + if ( + (function (e) { + for (; (e = e.parent); ) + if (e.data.transition) return !0; + })(this.$vnode) + ) + return i; + var o = $o(i); + if (!o) return i; + if (this._leaving) return Bo(e, i); + var a = "__transition-".concat(this._uid, "-"); + o.key = + null == o.key + ? o.isComment + ? a + "comment" + : a + o.tag + : f(o.key) + ? 0 === String(o.key).indexOf(a) + ? o.key + : a + o.key + : o.key; + var s = ((o.data || (o.data = {})).transition = Uo(this)), + u = this._vnode, + c = $o(u); + if ( + (o.data.directives && + o.data.directives.some(zo) && + (o.data.show = !0), + c && + c.data && + !(function (e, t) { + return t.key === e.key && t.tag === e.tag; + })(o, c) && + !Rt(c) && + (!c.componentInstance || + !c.componentInstance._vnode.isComment)) + ) { + var l = (c.data.transition = F({}, s)); + if ("out-in" === r) + return ( + (this._leaving = !0), + mt(l, "afterLeave", function () { + ((t._leaving = !1), t.$forceUpdate()); + }), + Bo(e, i) + ); + if ("in-out" === r) { + if (Rt(o)) return u; + var d, + p = function () { + d(); + }; + (mt(s, "afterEnter", p), + mt(s, "enterCancelled", p), + mt(l, "delayLeave", function (e) { + d = e; + })); + } + } + return i; + } + }, + }, + qo = F({ tag: String, moveClass: String }, jo); + delete qo.mode; + var Vo = { + props: qo, + beforeMount: function () { + var e = this, + t = this._update; + this._update = function (n, r) { + var i = Un(e); + (e.__patch__(e._vnode, e.kept, !1, !0), + (e._vnode = e.kept), + i(), + t.call(e, n, r)); + }; + }, + render: function (e) { + for ( + var t = this.tag || this.$vnode.data.tag || "span", + n = Object.create(null), + r = (this.prevChildren = this.children), + i = this.$slots["default"] || [], + o = (this.children = []), + a = Uo(this), + s = 0; + s < i.length; + s++ + ) { + var u = i[s]; + u.tag && + null != u.key && + 0 !== String(u.key).indexOf("__vlist") && + (o.push(u), + (n[u.key] = u), + ((u.data || (u.data = {})).transition = a)); + } + if (r) { + for (var c = [], l = [], d = 0; d < r.length; d++) { + var f = r[d]; + ((f.data.transition = a), + (f.data.pos = f.elm.getBoundingClientRect()), + n[f.key] ? c.push(f) : l.push(f)); + } + ((this.kept = e(t, null, c)), (this.removed = l)); + } + return e(t, null, o); + }, + updated: function () { + var e = this.prevChildren, + t = this.moveClass || (this.name || "v") + "-move"; + e.length && + this.hasMove(e[0].elm, t) && + (e.forEach(Wo), + e.forEach(Xo), + e.forEach(Ko), + (this._reflow = document.body.offsetHeight), + e.forEach(function (e) { + if (e.data.moved) { + var n = e.elm, + r = n.style; + (ho(n, t), + (r.transform = + r.WebkitTransform = + r.transitionDuration = + ""), + n.addEventListener( + uo, + (n._moveCb = function i(e) { + (e && e.target !== n) || + (e && !/transform$/.test(e.propertyName)) || + (n.removeEventListener(uo, i), + (n._moveCb = null), + mo(n, t)); + }), + )); + } + })); + }, + methods: { + hasMove: function (e, t) { + if (!io) return !1; + if (this._hasMove) return this._hasMove; + var n = e.cloneNode(); + (e._transitionClasses && + e._transitionClasses.forEach(function (e) { + to(n, e); + }), + eo(n, t), + (n.style.display = "none"), + this.$el.appendChild(n)); + var r = _o(n); + return ( + this.$el.removeChild(n), + (this._hasMove = r.hasTransform) + ); + }, + }, + }; + function Wo(e) { + (e.elm._moveCb && e.elm._moveCb(), + e.elm._enterCb && e.elm._enterCb()); + } + function Xo(e) { + e.data.newPos = e.elm.getBoundingClientRect(); + } + function Ko(e) { + var t = e.data.pos, + n = e.data.newPos, + r = t.left - n.left, + i = t.top - n.top; + if (r || i) { + e.data.moved = !0; + var o = e.elm.style; + ((o.transform = o.WebkitTransform = + "translate(".concat(r, "px,").concat(i, "px)")), + (o.transitionDuration = "0s")); + } + } + var Yo = { Transition: Ho, TransitionGroup: Vo }; + ((Lr.config.mustUseProp = function (e, t, n) { + return ( + ("value" === n && Hr(e) && "button" !== t) || + ("selected" === n && "option" === e) || + ("checked" === n && "input" === e) || + ("muted" === n && "video" === e) + ); + }), + (Lr.config.isReservedTag = oi), + (Lr.config.isReservedAttr = zr), + (Lr.config.getTagNamespace = function (e) { + return ii(e) ? "svg" : "math" === e ? "math" : void 0; + }), + (Lr.config.isUnknownElement = function (e) { + if (!Q) return !0; + if (oi(e)) return !1; + if (((e = e.toLowerCase()), null != ai[e])) return ai[e]; + var t = document.createElement(e); + return e.indexOf("-") > -1 + ? (ai[e] = + t.constructor === window.HTMLUnknownElement || + t.constructor === window.HTMLElement) + : (ai[e] = /HTMLUnknownElement/.test(t.toString())); + }), + F(Lr.options.directives, Ro), + F(Lr.options.components, Yo), + (Lr.prototype.__patch__ = Q ? xo : R), + (Lr.prototype.$mount = function (e, t) { + return (function (e, t, n) { + var r; + ((e.$el = t), + e.$options.render || (e.$options.render = ve), + Hn(e, "beforeMount"), + (r = function () { + e._update(e._render(), n); + }), + new Pn( + e, + r, + R, + { + before: function () { + e._isMounted && + !e._isDestroyed && + Hn(e, "beforeUpdate"); + }, + }, + !0, + ), + (n = !1)); + var i = e._preWatchers; + if (i) for (var o = 0; o < i.length; o++) i[o].run(); + return ( + null == e.$vnode && ((e._isMounted = !0), Hn(e, "mounted")), + e + ); + })( + this, + (e = + e && Q + ? (function (e) { + return "string" == typeof e + ? document.querySelector(e) || + document.createElement("div") + : e; + })(e) + : void 0), + t, + ); + }), + Q && + setTimeout(function () { + W.devtools && le && le.emit("init", Lr); + }, 0), + F(Lr, Dn), + (e.exports = Lr)); + }, + 3774: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.Lexer = void 0)); + var i = r(n(8850)), + o = r(n(1332)), + a = n(4001), + s = n(4008), + u = n(5779), + c = n(9105); + function l(e) { + return e + .replace(/---/g, "—") + .replace(/--/g, "–") + .replace(/(^|[-\u2014/(\[{"\s])'/g, "$1‘") + .replace(/'/g, "’") + .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1“") + .replace(/"/g, "”") + .replace(/\.{3}/g, "…"); + } + function d(e) { + var t, + n, + r = "", + i = e.length; + for (t = 0; t < i; t++) + ((n = e.charCodeAt(t)), + Math.random() > 0.5 && (n = "x" + n.toString(16)), + (r += "&#" + n + ";")); + return r; + } + t.Lexer = (function () { + function e(t) { + ((0, i["default"])(this, e), + (this.tokens = []), + (this.tokens.links = Object.create(null)), + (this.options = t || s.defaults), + (this.options.tokenizer = + this.options.tokenizer || new a.Tokenizer()), + (this.tokenizer = this.options.tokenizer), + (this.tokenizer.options = this.options), + (this.tokenizer.lexer = this), + (this.inlineQueue = []), + (this.state = { inLink: !1, inRawBlock: !1, top: !0 })); + var n = { block: u.block.normal, inline: u.inline.normal }; + (this.options.pedantic + ? ((n.block = u.block.pedantic), + (n.inline = u.inline.pedantic)) + : this.options.gfm && + ((n.block = u.block.gfm), + this.options.breaks + ? (n.inline = u.inline.breaks) + : (n.inline = u.inline.gfm)), + (this.tokenizer.rules = n)); + } + return ( + (0, o["default"])( + e, + [ + { + key: "lex", + value: function (e) { + var t; + for ( + e = e + .replace(/\r\n|\r/g, "\n") + .replace(/\t/g, " "), + this.blockTokens(e, this.tokens); + (t = this.inlineQueue.shift()); + ) + this.inlineTokens(t.src, t.tokens); + return this.tokens; + }, + }, + { + key: "blockTokens", + value: function (e) { + var t, + n, + r, + i, + o = this, + a = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : []; + this.options.pedantic && (e = e.replace(/^ +$/gm, "")); + for ( + var s, + u = function () { + if ( + o.options.extensions && + o.options.extensions.block && + o.options.extensions.block.some(function (n) { + return ( + !!(t = n.call({ lexer: o }, e, a)) && + ((e = e.substring(t.raw.length)), + a.push(t), + !0) + ); + }) + ) + return 0; + if ((t = o.tokenizer.space(e))) + return ( + (e = e.substring(t.raw.length)), + 1 === t.raw.length && a.length > 0 + ? (a[a.length - 1].raw += "\n") + : a.push(t), + 0 + ); + if ((t = o.tokenizer.code(e))) + return ( + (e = e.substring(t.raw.length)), + !(n = a[a.length - 1]) || + ("paragraph" !== n.type && "text" !== n.type) + ? a.push(t) + : ((n.raw += "\n" + t.raw), + (n.text += "\n" + t.text), + (o.inlineQueue[ + o.inlineQueue.length - 1 + ].src = n.text)), + 0 + ); + if ((t = o.tokenizer.fences(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ((t = o.tokenizer.heading(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ((t = o.tokenizer.hr(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ((t = o.tokenizer.blockquote(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ((t = o.tokenizer.list(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ((t = o.tokenizer.html(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ((t = o.tokenizer.def(e))) + return ( + (e = e.substring(t.raw.length)), + !(n = a[a.length - 1]) || + ("paragraph" !== n.type && "text" !== n.type) + ? o.tokens.links[t.tag] || + (o.tokens.links[t.tag] = { + href: t.href, + title: t.title, + }) + : ((n.raw += "\n" + t.raw), + (n.text += "\n" + t.raw), + (o.inlineQueue[ + o.inlineQueue.length - 1 + ].src = n.text)), + 0 + ); + if ((t = o.tokenizer.table(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ((t = o.tokenizer.lheading(e))) + return ( + (e = e.substring(t.raw.length)), + a.push(t), + 0 + ); + if ( + ((r = e), + o.options.extensions && + o.options.extensions.startBlock) + ) { + var s, + u = Infinity, + c = e.slice(1); + (o.options.extensions.startBlock.forEach( + function (e) { + "number" == + typeof (s = e.call({ lexer: this }, c)) && + s >= 0 && + (u = Math.min(u, s)); + }, + ), + u < Infinity && + u >= 0 && + (r = e.substring(0, u + 1))); + } + if (o.state.top && (t = o.tokenizer.paragraph(r))) + return ( + (n = a[a.length - 1]), + i && "paragraph" === n.type + ? ((n.raw += "\n" + t.raw), + (n.text += "\n" + t.text), + o.inlineQueue.pop(), + (o.inlineQueue[ + o.inlineQueue.length - 1 + ].src = n.text)) + : a.push(t), + (i = r.length !== e.length), + (e = e.substring(t.raw.length)), + 0 + ); + if ((t = o.tokenizer.text(e))) + return ( + (e = e.substring(t.raw.length)), + (n = a[a.length - 1]) && "text" === n.type + ? ((n.raw += "\n" + t.raw), + (n.text += "\n" + t.text), + o.inlineQueue.pop(), + (o.inlineQueue[ + o.inlineQueue.length - 1 + ].src = n.text)) + : a.push(t), + 0 + ); + if (e) { + var l = + "Infinite loop on byte: " + e.charCodeAt(0); + if (o.options.silent) + return (console.error(l), 1); + throw new Error(l); + } + }; + e && (0 === (s = u()) || 1 !== s); + ); + return ((this.state.top = !0), a); + }, + }, + { + key: "inline", + value: function (e, t) { + this.inlineQueue.push({ src: e, tokens: t }); + }, + }, + { + key: "inlineTokens", + value: function (e) { + var t, + n, + r, + i, + o, + a, + s = this, + u = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : [], + f = e; + if (this.tokens.links) { + var p = Object.keys(this.tokens.links); + if (p.length > 0) + for ( + ; + null != + (i = + this.tokenizer.rules.inline.reflinkSearch.exec( + f, + )); + ) + p.includes( + i[0].slice(i[0].lastIndexOf("[") + 1, -1), + ) && + (f = + f.slice(0, i.index) + + "[" + + (0, c.repeatString)("a", i[0].length - 2) + + "]" + + f.slice( + this.tokenizer.rules.inline.reflinkSearch + .lastIndex, + )); + } + for ( + ; + null != + (i = this.tokenizer.rules.inline.blockSkip.exec(f)); + ) + f = + f.slice(0, i.index) + + "[" + + (0, c.repeatString)("a", i[0].length - 2) + + "]" + + f.slice( + this.tokenizer.rules.inline.blockSkip.lastIndex, + ); + for ( + ; + null != + (i = this.tokenizer.rules.inline.escapedEmSt.exec(f)); + ) + f = + f.slice(0, i.index) + + "++" + + f.slice( + this.tokenizer.rules.inline.escapedEmSt.lastIndex, + ); + for ( + var h, + m = function () { + if ( + (o || (a = ""), + (o = !1), + (t = s.tokenizer.owo(e))) + ) + return ( + (e = e.substring(t.raw.length)), + t.type && u.push(t), + 0 + ); + if ( + s.options.extensions && + s.options.extensions.inline && + s.options.extensions.inline.some(function (n) { + return ( + !!(t = n.call({ lexer: s }, e, u)) && + ((e = e.substring(t.raw.length)), + u.push(t), + !0) + ); + }) + ) + return 0; + if ((t = s.tokenizer.escape(e))) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ((t = s.tokenizer.tag(e))) + return ( + (e = e.substring(t.raw.length)), + (n = u[u.length - 1]) && + "text" === t.type && + "text" === n.type + ? ((n.raw += t.raw), (n.text += t.text)) + : u.push(t), + 0 + ); + if ((t = s.tokenizer.link(e))) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ((t = s.tokenizer.reflink(e, s.tokens.links))) + return ( + (e = e.substring(t.raw.length)), + (n = u[u.length - 1]) && + "text" === t.type && + "text" === n.type + ? ((n.raw += t.raw), (n.text += t.text)) + : u.push(t), + 0 + ); + if ((t = s.tokenizer.emStrong(e, f, a))) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ((t = s.tokenizer.codespan(e))) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ((t = s.tokenizer.br(e))) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ((t = s.tokenizer.del(e))) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ((t = s.tokenizer.autolink(e, d))) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ( + !s.state.inLink && + (t = s.tokenizer.url(e, d)) + ) + return ( + (e = e.substring(t.raw.length)), + u.push(t), + 0 + ); + if ( + ((r = e), + s.options.extensions && + s.options.extensions.startInline) + ) { + var i, + c = Infinity, + p = e.slice(1); + (s.options.extensions.startInline.forEach( + function (e) { + "number" == + typeof (i = e.call({ lexer: this }, p)) && + i >= 0 && + (c = Math.min(c, i)); + }, + ), + c < Infinity && + c >= 0 && + (r = e.substring(0, c + 1))); + } + if ((t = s.tokenizer.inlineText(r, l))) + return ( + (e = e.substring(t.raw.length)), + "_" !== t.raw.slice(-1) && + (a = t.raw.slice(-1)), + (o = !0), + (n = u[u.length - 1]) && "text" === n.type + ? ((n.raw += t.raw), (n.text += t.text)) + : u.push(t), + 0 + ); + if (e) { + var h = + "Infinite loop on byte: " + e.charCodeAt(0); + if (s.options.silent) + return (console.error(h), 1); + throw new Error(h); + } + }; + e && (0 === (h = m()) || 1 !== h); + ); + return u; + }, + }, + ], + [ + { + key: "rules", + get: function () { + return { block: u.block, inline: u.inline }; + }, + }, + { + key: "lex", + value: function (t, n) { + return new e(n).lex(t); + }, + }, + { + key: "lexInline", + value: function (t, n) { + return new e(n).inlineTokens(t); + }, + }, + ], + ), + e + ); + })(); + }, + 2817: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.Parser = void 0)); + var i = r(n(8850)), + o = r(n(1332)), + a = n(7565), + s = n(1674), + u = n(2123), + c = n(4008), + l = n(9105); + t.Parser = (function () { + function e(t) { + ((0, i["default"])(this, e), + (this.options = t || c.defaults), + (this.options.renderer = + this.options.renderer || new a.Renderer()), + (this.renderer = this.options.renderer), + (this.renderer.options = this.options), + (this.textRenderer = new s.TextRenderer()), + (this.slugger = new u.Slugger())); + } + return ( + (0, o["default"])( + e, + [ + { + key: "parse", + value: function (e) { + var t, + n, + r, + i, + o, + a, + s, + u, + c, + d, + f, + p, + h, + m, + g, + v, + _, + y, + b, + k = + !( + arguments.length > 1 && arguments[1] !== undefined + ) || arguments[1], + w = "", + E = e.length; + for (t = 0; t < E; t++) + if ( + ((d = e[t]), + !( + this.options.extensions && + this.options.extensions.renderers && + this.options.extensions.renderers[d.type] + ) || + (!1 === + (b = this.options.extensions.renderers[ + d.type + ].call({ parser: this }, d)) && + [ + "space", + "hr", + "heading", + "code", + "table", + "blockquote", + "list", + "html", + "paragraph", + "text", + ].includes(d.type))) + ) + switch (d.type) { + case "space": + continue; + case "hr": + w += this.renderer.hr(); + continue; + case "heading": + w += this.renderer.heading( + this.parseInline(d.tokens), + d.depth, + (0, l.unescape)( + this.parseInline( + d.tokens, + this.textRenderer, + ), + ), + this.slugger, + ); + continue; + case "code": + w += this.renderer.code( + d.text, + d.lang, + d.escaped, + ); + continue; + case "table": + for ( + u = "", s = "", i = d.header.length, n = 0; + n < i; + n++ + ) + s += this.renderer.tablecell( + this.parseInline(d.header[n].tokens), + { header: !0, align: d.align[n] }, + ); + for ( + u += this.renderer.tablerow(s), + c = "", + i = d.rows.length, + n = 0; + n < i; + n++ + ) { + for ( + s = "", o = (a = d.rows[n]).length, r = 0; + r < o; + r++ + ) + s += this.renderer.tablecell( + this.parseInline(a[r].tokens), + { header: !1, align: d.align[r] }, + ); + c += this.renderer.tablerow(s); + } + w += this.renderer.table(u, c); + continue; + case "blockquote": + ((c = this.parse(d.tokens)), + (w += this.renderer.blockquote(c))); + continue; + case "list": + for ( + f = d.ordered, + p = d.start, + h = d.loose, + i = d.items.length, + c = "", + n = 0; + n < i; + n++ + ) + ((v = (g = d.items[n]).checked), + (_ = g.task), + (m = ""), + g.task && + ((y = this.renderer.checkbox(v)), + h + ? g.tokens.length > 0 && + "paragraph" === g.tokens[0].type + ? ((g.tokens[0].text = + y + " " + g.tokens[0].text), + g.tokens[0].tokens && + g.tokens[0].tokens.length > 0 && + "text" === + g.tokens[0].tokens[0].type && + (g.tokens[0].tokens[0].text = + y + + " " + + g.tokens[0].tokens[0].text)) + : g.tokens.unshift({ + type: "text", + text: y, + }) + : (m += y)), + (m += this.parse(g.tokens, h)), + (c += this.renderer.listitem(m, _, v))); + w += this.renderer.list(c, f, p); + continue; + case "html": + w += this.renderer.html(d.text); + continue; + case "paragraph": + w += this.renderer.paragraph( + this.parseInline(d.tokens), + ); + continue; + case "text": + for ( + c = d.tokens + ? this.parseInline(d.tokens) + : d.text; + t + 1 < E && "text" === e[t + 1].type; + ) + c += + "\n" + + ((d = e[++t]).tokens + ? this.parseInline(d.tokens) + : d.text); + w += k ? this.renderer.paragraph(c) : c; + continue; + default: + var A = + 'Token with "' + + d.type + + '" type was not found.'; + if (this.options.silent) + return void console.error(A); + throw new Error(A); + } + else w += b || ""; + return w; + }, + }, + { + key: "parseInline", + value: function (e, t) { + t = t || this.renderer; + var n, + r, + i, + o = "", + a = e.length; + for (n = 0; n < a; n++) + if ( + ((r = e[n]), + !( + this.options.extensions && + this.options.extensions.renderers && + this.options.extensions.renderers[r.type] + ) || + (!1 === + (i = this.options.extensions.renderers[ + r.type + ].call({ parser: this }, r)) && + [ + "escape", + "html", + "link", + "image", + "strong", + "em", + "codespan", + "br", + "del", + "text", + ].includes(r.type))) + ) + switch (r.type) { + case "owo": + o += t.owo(r.text); + break; + case "escape": + case "text": + o += t.text(r.text); + break; + case "html": + o += t.html(r.text); + break; + case "link": + o += t.link( + r.href, + r.title, + this.parseInline(r.tokens, t), + ); + break; + case "image": + o += t.image(r.href, r.title, r.text); + break; + case "strong": + o += t.strong(this.parseInline(r.tokens, t)); + break; + case "em": + o += t.em(this.parseInline(r.tokens, t)); + break; + case "codespan": + o += t.codespan(r.text); + break; + case "br": + o += t.br(); + break; + case "del": + o += t.del(this.parseInline(r.tokens, t)); + break; + default: + var s = + 'Token with "' + + r.type + + '" type was not found.'; + if (this.options.silent) + return void console.error(s); + throw new Error(s); + } + else o += i || ""; + return o; + }, + }, + ], + [ + { + key: "parse", + value: function (t, n) { + return new e(n).parse(t); + }, + }, + { + key: "parseInline", + value: function (t, n) { + return new e(n).parseInline(t); + }, + }, + ], + ), + e + ); + })(); + }, + 7565: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.Renderer = void 0)); + var i = r(n(8850)), + o = r(n(1332)), + a = n(4008), + s = n(9105); + t.Renderer = (function () { + function e(t) { + ((0, i["default"])(this, e), (this.options = t || a.defaults)); + } + return ( + (0, o["default"])(e, [ + { + key: "owo", + value: function (e) { + var t = this.options.odata; + return t && t[e] + ? ':' +
+                            e +
+                            ':' + : ":" + e + ":"; + }, + }, + { + key: "code", + value: function (e, t, n) { + var r = (t || "").match(/\S*/)[0]; + if (this.options.highlight) { + var i = this.options.highlight(e, r); + null != i && i !== e && ((n = !0), (e = i)); + } + return ( + (e = e.replace(/\n$/, "") + "\n"), + r + ? '
    ' +
    +                            (n ? e : (0, s.escape)(e, !0)) +
    +                            "
    \n" + : "
    " +
    +                            (n ? e : (0, s.escape)(e, !0)) +
    +                            "
    \n" + ); + }, + }, + { + key: "blockquote", + value: function (e) { + return "
    \n" + e + "
    \n"; + }, + }, + { + key: "html", + value: function (e) { + return e; + }, + }, + { + key: "heading", + value: function (e, t, n, r) { + return this.options.headerIds + ? "' + + e + + "\n" + : "" + e + "\n"; + }, + }, + { + key: "hr", + value: function () { + return this.options.xhtml ? "
    \n" : "
    \n"; + }, + }, + { + key: "list", + value: function (e, t, n) { + var r = t ? "ol" : "ul"; + return ( + "<" + + r + + (t && 1 !== n ? ' start="' + n + '"' : "") + + ">\n" + + e + + "\n" + ); + }, + }, + { + key: "listitem", + value: function (e) { + return "
  • " + e + "
  • \n"; + }, + }, + { + key: "checkbox", + value: function (e) { + return ( + " " + ); + }, + }, + { + key: "paragraph", + value: function (e) { + return "

    " + e + "

    \n"; + }, + }, + { + key: "table", + value: function (e, t) { + return ( + t && (t = "" + t + ""), + "\n\n" + + e + + "\n" + + t + + "
    \n" + ); + }, + }, + { + key: "tablerow", + value: function (e) { + return "\n" + e + "\n"; + }, + }, + { + key: "tablecell", + value: function (e, t) { + var n = t.header ? "th" : "td"; + return ( + (t.align + ? "<" + n + ' align="' + t.align + '">' + : "<" + n + ">") + + e + + "\n" + ); + }, + }, + { + key: "strong", + value: function (e) { + return "" + e + ""; + }, + }, + { + key: "em", + value: function (e) { + return "" + e + ""; + }, + }, + { + key: "codespan", + value: function (e) { + return "" + e + ""; + }, + }, + { + key: "br", + value: function () { + return this.options.xhtml ? "
    " : "
    "; + }, + }, + { + key: "del", + value: function (e) { + return "" + e + ""; + }, + }, + { + key: "link", + value: function (e, t, n) { + if ( + null === + (e = (0, s.cleanUrl)( + this.options.sanitize, + this.options.baseUrl, + e, + )) + ) + return n; + var r = '
    ") + ); + }, + }, + { + key: "image", + value: function (e, t, n) { + if ( + null === + (e = (0, s.cleanUrl)( + this.options.sanitize, + this.options.baseUrl, + e, + )) + ) + return n; + var r = '' + n + '" : ">") + ); + }, + }, + { + key: "text", + value: function (e) { + return e; + }, + }, + ]), + e + ); + })(); + }, + 2123: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.Slugger = void 0)); + var i = r(n(8850)), + o = r(n(1332)); + t.Slugger = (function () { + function e() { + ((0, i["default"])(this, e), (this.seen = {})); + } + return ( + (0, o["default"])(e, [ + { + key: "serialize", + value: function (e) { + return e + .toLowerCase() + .trim() + .replace(/<[!\/a-z].*?>/gi, "") + .replace( + /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, + "", + ) + .replace(/\s/g, "-"); + }, + }, + { + key: "getNextSafeSlug", + value: function (e, t) { + var n = e, + r = 0; + if (this.seen.hasOwnProperty(n)) { + r = this.seen[e]; + do { + n = e + "-" + ++r; + } while (this.seen.hasOwnProperty(n)); + } + return (t || ((this.seen[e] = r), (this.seen[n] = 0)), n); + }, + }, + { + key: "slug", + value: function (e) { + var t = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : {}, + n = this.serialize(e); + return this.getNextSafeSlug(n, t.dryrun); + }, + }, + ]), + e + ); + })(); + }, + 1674: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.TextRenderer = void 0)); + var i = r(n(8850)), + o = r(n(1332)); + t.TextRenderer = (function () { + function e() { + (0, i["default"])(this, e); + } + return ( + (0, o["default"])(e, [ + { + key: "strong", + value: function (e) { + return e; + }, + }, + { + key: "em", + value: function (e) { + return e; + }, + }, + { + key: "codespan", + value: function (e) { + return e; + }, + }, + { + key: "del", + value: function (e) { + return e; + }, + }, + { + key: "html", + value: function (e) { + return e; + }, + }, + { + key: "text", + value: function (e) { + return e; + }, + }, + { + key: "link", + value: function (e, t, n) { + return "" + n; + }, + }, + { + key: "image", + value: function (e, t, n) { + return "" + n; + }, + }, + { + key: "br", + value: function () { + return ""; + }, + }, + ]), + e + ); + })(); + }, + 4001: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.Tokenizer = void 0)); + var i = r(n(8850)), + o = r(n(1332)), + a = r(n(9272)), + s = n(4008), + u = n(9105); + function c(e, t) { + var n = + ("undefined" != typeof Symbol && e[Symbol.iterator]) || + e["@@iterator"]; + if (!n) { + if ( + Array.isArray(e) || + (n = (function (e, t) { + if (e) { + if ("string" == typeof e) return l(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return ( + "Object" === n && + e.constructor && + (n = e.constructor.name), + "Map" === n || "Set" === n + ? Array.from(e) + : "Arguments" === n || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ? l(e, t) + : void 0 + ); + } + })(e)) || + (t && e && "number" == typeof e.length) + ) { + n && (e = n); + var r = 0, + i = function () {}; + return { + s: i, + n: function () { + return r >= e.length + ? { done: !0 } + : { done: !1, value: e[r++] }; + }, + e: function (e) { + throw e; + }, + f: i, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + } + var o, + a = !0, + s = !1; + return { + s: function () { + n = n.call(e); + }, + n: function () { + var e = n.next(); + return ((a = e.done), e); + }, + e: function (e) { + ((s = !0), (o = e)); + }, + f: function () { + try { + a || null == n["return"] || n["return"](); + } finally { + if (s) throw o; + } + }, + }; + } + function l(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r; + } + function d(e, t, n, r) { + var i = t.href, + o = t.title ? (0, u.escape)(t.title) : null, + a = e[1].replace(/\\([\[\]])/g, "$1"); + if ("!" !== e[0].charAt(0)) { + r.state.inLink = !0; + var s = { + type: "link", + raw: n, + href: i, + title: o, + text: a, + tokens: r.inlineTokens(a, []), + }; + return ((r.state.inLink = !1), s); + } + return { + type: "image", + raw: n, + href: i, + title: o, + text: (0, u.escape)(a), + }; + } + t.Tokenizer = (function () { + function e(t) { + ((0, i["default"])(this, e), (this.options = t || s.defaults)); + } + return ( + (0, o["default"])(e, [ + { + key: "space", + value: function (e) { + var t = this.rules.block.newline.exec(e); + if (t && t[0].length > 0) + return { type: "space", raw: t[0] }; + }, + }, + { + key: "code", + value: function (e) { + var t = this.rules.block.code.exec(e); + if (t) { + var n = t[0].replace(/^ {1,4}/gm, ""); + return { + type: "code", + raw: t[0], + codeBlockStyle: "indented", + text: this.options.pedantic + ? n + : (0, u.rtrim)(n, "\n"), + }; + } + }, + }, + { + key: "fences", + value: function (e) { + var t = this.rules.block.fences.exec(e); + if (t) { + var n = t[0], + r = (function (e, t) { + var n = e.match(/^(\s+)(?:```)/); + if (null === n) return t; + var r = n[1]; + return t + .split("\n") + .map(function (e) { + var t = e.match(/^\s+/); + return null === t + ? e + : (0, a["default"])(t, 1)[0].length >= + r.length + ? e.slice(r.length) + : e; + }) + .join("\n"); + })(n, t[3] || ""); + return { + type: "code", + raw: n, + lang: t[2] ? t[2].trim() : t[2], + text: r, + }; + } + }, + }, + { + key: "heading", + value: function (e) { + var t = this.rules.block.heading.exec(e); + if (t) { + var n = t[2].trim(); + if (/#$/.test(n)) { + var r = (0, u.rtrim)(n, "#"); + this.options.pedantic + ? (n = r.trim()) + : (r && !/ $/.test(r)) || (n = r.trim()); + } + var i = { + type: "heading", + raw: t[0], + depth: t[1].length, + text: n, + tokens: [], + }; + return (this.lexer.inline(i.text, i.tokens), i); + } + }, + }, + { + key: "hr", + value: function (e) { + var t = this.rules.block.hr.exec(e); + if (t) return { type: "hr", raw: t[0] }; + }, + }, + { + key: "blockquote", + value: function (e) { + var t = this.rules.block.blockquote.exec(e); + if (t) { + var n = t[0].replace(/^ *> ?/gm, ""); + return { + type: "blockquote", + raw: t[0], + tokens: this.lexer.blockTokens(n, []), + text: n, + }; + } + }, + }, + { + key: "list", + value: function (e) { + var t = this.rules.block.list.exec(e); + if (t) { + var n, + r, + i, + o, + a, + s, + u, + l, + d, + f, + p, + h, + m = t[1].trim(), + g = m.length > 1, + v = { + type: "list", + raw: "", + ordered: g, + start: g ? +m.slice(0, -1) : "", + loose: !1, + items: [], + }; + ((m = g + ? "\\d{1,9}\\".concat(m.slice(-1)) + : "\\".concat(m)), + this.options.pedantic && (m = g ? m : "[*+-]")); + for ( + var _ = new RegExp( + "^( {0,3}".concat(m, ")((?: [^\\n]*)?(?:\\n|$))"), + ); + e && + ((h = !1), (t = _.exec(e))) && + !this.rules.block.hr.test(e); + ) { + if ( + ((n = t[0]), + (e = e.substring(n.length)), + (l = t[2].split("\n", 1)[0]), + (d = e.split("\n", 1)[0]), + this.options.pedantic + ? ((o = 2), (p = l.trimLeft())) + : ((o = (o = t[2].search(/[^ ]/)) > 4 ? 1 : o), + (p = l.slice(o)), + (o += t[1].length)), + (s = !1), + !l && + /^ *$/.test(d) && + ((n += d + "\n"), + (e = e.substring(d.length + 1)), + (h = !0)), + !h) + ) + for ( + var y = new RegExp( + "^ {0,".concat( + Math.min(3, o - 1), + "}(?:[*+-]|\\d{1,9}[.)])", + ), + ); + e && + ((l = f = e.split("\n", 1)[0]), + this.options.pedantic && + (l = l.replace( + /^ {1,4}(?=( {4})*[^ ])/g, + " ", + )), + !y.test(l)); + ) { + if (l.search(/[^ ]/) >= o || !l.trim()) + p += "\n" + l.slice(o); + else { + if (s) break; + p += "\n" + l; + } + (s || l.trim() || (s = !0), + (n += f + "\n"), + (e = e.substring(f.length + 1))); + } + (v.loose || + (u + ? (v.loose = !0) + : /\n *\n *$/.test(n) && (u = !0)), + this.options.gfm && + (r = /^\[[ xX]\] /.exec(p)) && + ((i = "[ ] " !== r[0]), + (p = p.replace(/^\[[ xX]\] +/, ""))), + v.items.push({ + type: "list_item", + raw: n, + task: !!r, + checked: i, + loose: !1, + text: p, + }), + (v.raw += n)); + } + ((v.items[v.items.length - 1].raw = n.trimRight()), + (v.items[v.items.length - 1].text = p.trimRight()), + (v.raw = v.raw.trimRight())); + var b = v.items.length; + for (a = 0; a < b; a++) { + ((this.lexer.state.top = !1), + (v.items[a].tokens = this.lexer.blockTokens( + v.items[a].text, + [], + ))); + var k = v.items[a].tokens.filter(function (e) { + return "space" === e.type; + }), + w = k.every(function (e) { + var t, + n = 0, + r = c(e.raw.split("")); + try { + for (r.s(); !(t = r.n()).done; ) + if (("\n" === t.value && (n += 1), n > 1)) + return !0; + } catch (i) { + r.e(i); + } finally { + r.f(); + } + return !1; + }); + !v.loose && + k.length && + w && + ((v.loose = !0), (v.items[a].loose = !0)); + } + return v; + } + }, + }, + { + key: "html", + value: function (e) { + var t = this.rules.block.html.exec(e); + if (t) { + var n = { + type: "html", + raw: t[0], + pre: + !this.options.sanitizer && + ("pre" === t[1] || + "script" === t[1] || + "style" === t[1]), + text: t[0], + }; + return ( + this.options.sanitize && + ((n.type = "paragraph"), + (n.text = this.options.sanitizer + ? this.options.sanitizer(t[0]) + : (0, u.escape)(t[0])), + (n.tokens = []), + this.lexer.inline(n.text, n.tokens)), + n + ); + } + }, + }, + { + key: "def", + value: function (e) { + var t = this.rules.block.def.exec(e); + if (t) + return ( + t[3] && (t[3] = t[3].substring(1, t[3].length - 1)), + { + type: "def", + tag: t[1].toLowerCase().replace(/\s+/g, " "), + raw: t[0], + href: t[2], + title: t[3], + } + ); + }, + }, + { + key: "table", + value: function (e) { + var t = this.rules.block.table.exec(e); + if (t) { + var n = { + type: "table", + header: (0, u.splitCells)(t[1]).map(function (e) { + return { text: e }; + }), + align: t[2].replace(/^ *|\| *$/g, "").split(/ *\| */), + rows: + t[3] && t[3].trim() + ? t[3].replace(/\n[ \t]*$/, "").split("\n") + : [], + }; + if (n.header.length === n.align.length) { + n.raw = t[0]; + var r, + i, + o, + a, + s = n.align.length; + for (r = 0; r < s; r++) + /^ *-+: *$/.test(n.align[r]) + ? (n.align[r] = "right") + : /^ *:-+: *$/.test(n.align[r]) + ? (n.align[r] = "center") + : /^ *:-+ *$/.test(n.align[r]) + ? (n.align[r] = "left") + : (n.align[r] = null); + for (s = n.rows.length, r = 0; r < s; r++) + n.rows[r] = (0, u.splitCells)( + n.rows[r], + n.header.length, + ).map(function (e) { + return { text: e }; + }); + for (s = n.header.length, i = 0; i < s; i++) + ((n.header[i].tokens = []), + this.lexer.inlineTokens( + n.header[i].text, + n.header[i].tokens, + )); + for (s = n.rows.length, i = 0; i < s; i++) + for (a = n.rows[i], o = 0; o < a.length; o++) + ((a[o].tokens = []), + this.lexer.inlineTokens( + a[o].text, + a[o].tokens, + )); + return n; + } + } + }, + }, + { + key: "lheading", + value: function (e) { + var t = this.rules.block.lheading.exec(e); + if (t) { + var n = { + type: "heading", + raw: t[0], + depth: "=" === t[2].charAt(0) ? 1 : 2, + text: t[1], + tokens: [], + }; + return (this.lexer.inline(n.text, n.tokens), n); + } + }, + }, + { + key: "paragraph", + value: function (e) { + var t = this.rules.block.paragraph.exec(e); + if (t) { + var n = { + type: "paragraph", + raw: t[0], + text: + "\n" === t[1].charAt(t[1].length - 1) + ? t[1].slice(0, -1) + : t[1], + tokens: [], + }; + return (this.lexer.inline(n.text, n.tokens), n); + } + }, + }, + { + key: "text", + value: function (e) { + var t = this.rules.block.text.exec(e); + if (t) { + var n = { + type: "text", + raw: t[0], + text: t[0], + tokens: [], + }; + return (this.lexer.inline(n.text, n.tokens), n); + } + }, + }, + { + key: "escape", + value: function (e) { + var t = this.rules.inline.escape.exec(e); + if (t) + return { + type: "escape", + raw: t[0], + text: (0, u.escape)(t[1]), + }; + }, + }, + { + key: "tag", + value: function (e) { + var t = this.rules.inline.tag.exec(e); + if (t) + return ( + !this.lexer.state.inLink && /^/i.test(t[0]) && + (this.lexer.state.inLink = !1), + !this.lexer.state.inRawBlock && + /^<(pre|code|kbd|script)(\s|>)/i.test(t[0]) + ? (this.lexer.state.inRawBlock = !0) + : this.lexer.state.inRawBlock && + /^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0]) && + (this.lexer.state.inRawBlock = !1), + { + type: this.options.sanitize ? "text" : "html", + raw: t[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + text: this.options.sanitize + ? this.options.sanitizer + ? this.options.sanitizer(t[0]) + : (0, u.escape)(t[0]) + : t[0], + } + ); + }, + }, + { + key: "link", + value: function (e) { + var t = this.rules.inline.link.exec(e); + if (t) { + var n = t[2].trim(); + if (!this.options.pedantic && /^$/.test(n)) return; + var r = (0, u.rtrim)(n.slice(0, -1), "\\"); + if ((n.length - r.length) % 2 == 0) return; + } else { + var i = (0, u.findClosingBracket)(t[2], "()"); + if (i > -1) { + var o = + (0 === t[0].indexOf("!") ? 5 : 4) + + t[1].length + + i; + ((t[2] = t[2].substring(0, i)), + (t[0] = t[0].substring(0, o).trim()), + (t[3] = "")); + } + } + var a = t[2], + s = ""; + if (this.options.pedantic) { + var c = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(a); + c && ((a = c[1]), (s = c[3])); + } else s = t[3] ? t[3].slice(1, -1) : ""; + return ( + (a = a.trim()), + /^$/.test(n) + ? a.slice(1) + : a.slice(1, -1)), + d( + t, + { + href: a + ? a.replace(this.rules.inline._escapes, "$1") + : a, + title: s + ? s.replace(this.rules.inline._escapes, "$1") + : s, + }, + t[0], + this.lexer, + ) + ); + } + }, + }, + { + key: "reflink", + value: function (e, t) { + var n; + if ( + (n = this.rules.inline.reflink.exec(e)) || + (n = this.rules.inline.nolink.exec(e)) + ) { + var r = (n[2] || n[1]).replace(/\s+/g, " "); + if (!(r = t[r.toLowerCase()]) || !r.href) { + var i = n[0].charAt(0); + return { type: "text", raw: i, text: i }; + } + return d(n, r, n[0], this.lexer); + } + }, + }, + { + key: "emStrong", + value: function (e, t) { + var n = + arguments.length > 2 && arguments[2] !== undefined + ? arguments[2] + : "", + r = this.rules.inline.emStrong.lDelim.exec(e); + if ( + r && + (!r[3] || + !n.match( + /(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDF50-\uDF59\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEC0-\uDED3\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDCD0-\uDCEB\uDCF0-\uDCF9\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])/, + )) + ) { + var i = r[1] || r[2] || ""; + if ( + !i || + (i && + ("" === n || this.rules.inline.punctuation.exec(n))) + ) { + var o, + a, + s = r[0].length - 1, + u = s, + c = 0, + l = + "*" === r[0][0] + ? this.rules.inline.emStrong.rDelimAst + : this.rules.inline.emStrong.rDelimUnd; + for ( + l.lastIndex = 0, t = t.slice(-1 * e.length + s); + null != (r = l.exec(t)); + ) + if ( + (o = r[1] || r[2] || r[3] || r[4] || r[5] || r[6]) + ) + if (((a = o.length), r[3] || r[4])) u += a; + else if ( + !((r[5] || r[6]) && s % 3) || + (s + a) % 3 + ) { + if (!((u -= a) > 0)) { + if ( + ((a = Math.min(a, a + u + c)), + Math.min(s, a) % 2) + ) { + var d = e.slice(1, s + r.index + a); + return { + type: "em", + raw: e.slice(0, s + r.index + a + 1), + text: d, + tokens: this.lexer.inlineTokens(d, []), + }; + } + var f = e.slice(2, s + r.index + a - 1); + return { + type: "strong", + raw: e.slice(0, s + r.index + a + 1), + text: f, + tokens: this.lexer.inlineTokens(f, []), + }; + } + } else c += a; + } + } + }, + }, + { + key: "codespan", + value: function (e) { + var t = this.rules.inline.code.exec(e); + if (t) { + var n = t[2].replace(/\n/g, " "), + r = /[^ ]/.test(n), + i = /^ /.test(n) && / $/.test(n); + return ( + r && i && (n = n.substring(1, n.length - 1)), + (n = (0, u.escape)(n, !0)), + { type: "codespan", raw: t[0], text: n } + ); + } + }, + }, + { + key: "br", + value: function (e) { + var t = this.rules.inline.br.exec(e); + if (t) return { type: "br", raw: t[0] }; + }, + }, + { + key: "del", + value: function (e) { + var t = this.rules.inline.del.exec(e); + if (t) + return { + type: "del", + raw: t[0], + text: t[2], + tokens: this.lexer.inlineTokens(t[2], []), + }; + }, + }, + { + key: "owo", + value: function (e) { + var t = this.rules.inline.owo.exec(e); + if (t && t[0].length > 1) + return { type: "owo", raw: t[0], text: t[1] }; + }, + }, + { + key: "autolink", + value: function (e, t) { + var n, + r, + i = this.rules.inline.autolink.exec(e); + if (i) + return ( + (r = + "@" === i[2] + ? "mailto:" + + (n = (0, u.escape)( + this.options.mangle ? t(i[1]) : i[1], + )) + : (n = (0, u.escape)(i[1]))), + { + type: "link", + raw: i[0], + text: n, + href: r, + tokens: [{ type: "text", raw: n, text: n }], + } + ); + }, + }, + { + key: "url", + value: function (e, t) { + var n; + if ((n = this.rules.inline.url.exec(e))) { + var r, i; + if ("@" === n[2]) + i = + "mailto:" + + (r = (0, u.escape)( + this.options.mangle ? t(n[0]) : n[0], + )); + else { + var o; + do { + ((o = n[0]), + (n[0] = this.rules.inline._backpedal.exec( + n[0], + )[0])); + } while (o !== n[0]); + ((r = (0, u.escape)(n[0])), + (i = "www." === n[1] ? "http://" + r : r)); + } + return { + type: "link", + raw: n[0], + text: r, + href: i, + tokens: [{ type: "text", raw: r, text: r }], + }; + } + }, + }, + { + key: "inlineText", + value: function (e, t) { + var n, + r = this.rules.inline.text.exec(e); + if (r) + return ( + (n = this.lexer.state.inRawBlock + ? this.options.sanitize + ? this.options.sanitizer + ? this.options.sanitizer(r[0]) + : (0, u.escape)(r[0]) + : r[0] + : (0, u.escape)( + this.options.smartypants ? t(r[0]) : r[0], + )), + { type: "text", raw: r[0], text: n } + ); + }, + }, + ]), + e + ); + })(); + }, + 4008: function (e, t) { + "use strict"; + function n() { + return { + baseUrl: null, + breaks: !1, + extensions: null, + gfm: !0, + headerIds: !0, + headerPrefix: "", + highlight: null, + langPrefix: "language-", + mangle: !0, + pedantic: !1, + renderer: null, + sanitize: !1, + sanitizer: null, + silent: !1, + smartLists: !1, + smartypants: !1, + tokenizer: null, + walkTokens: null, + xhtml: !1, + }; + } + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.changeDefaults = function (e) { + t.defaults = e; + }), + (t.defaults = void 0), + (t.getDefaults = n), + (t.defaults = { + baseUrl: null, + breaks: !1, + extensions: null, + gfm: !0, + headerIds: !0, + headerPrefix: "", + highlight: null, + langPrefix: "language-", + mangle: !0, + pedantic: !1, + renderer: null, + sanitize: !1, + sanitizer: null, + silent: !1, + smartLists: !1, + smartypants: !1, + tokenizer: null, + walkTokens: null, + xhtml: !1, + })); + }, + 9105: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.checkSanitizeDeprecation = function (e) { + e && + e.sanitize && + !e.silent && + console.warn( + "marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options", + ); + }), + (t.cleanUrl = function (e, t, n) { + if (e) { + var r; + try { + r = decodeURIComponent(c(n)).replace(d, "").toLowerCase(); + } catch (i) { + return null; + } + if ( + 0 === r.indexOf("javascript:") || + 0 === r.indexOf("vbscript:") || + 0 === r.indexOf("data:") + ) + return null; + } + t && !f.test(n) && (n = v(t, n)); + try { + n = encodeURI(n).replace(/%25/g, "%"); + } catch (i) { + return null; + } + return n; + }), + (t.edit = function (e, t) { + ((e = e.source || e), (t = t || "")); + var n = { + replace: function (t, r) { + return ( + (r = (r = r.source || r).replace(l, "$1")), + (e = e.replace(t, r)), + n + ); + }, + getRegex: function () { + return new RegExp(e, t); + }, + }; + return n; + }), + (t.escape = function (e, t) { + if (t) { + if (n.test(e)) return e.replace(r, s); + } else if (i.test(e)) return e.replace(o, s); + return e; + }), + (t.findClosingBracket = function (e, t) { + if (-1 === e.indexOf(t[1])) return -1; + for (var n = e.length, r = 0, i = 0; i < n; i++) + if ("\\" === e[i]) i++; + else if (e[i] === t[0]) r++; + else if (e[i] === t[1] && --r < 0) return i; + return -1; + }), + (t.merge = function (e) { + for (var t, n, r = 1; r < arguments.length; r++) + for (n in (t = arguments[r])) + Object.prototype.hasOwnProperty.call(t, n) && (e[n] = t[n]); + return e; + }), + (t.noopTest = void 0), + (t.repeatString = function (e, t) { + if (t < 1) return ""; + for (var n = ""; t > 1; ) + (1 & t && (n += e), (t >>= 1), (e += e)); + return n + e; + }), + (t.resolveUrl = v), + (t.rtrim = _), + (t.splitCells = function (e, t) { + var n = e + .replace(/\|/g, function (e, t, n) { + for (var r = !1, i = t; --i >= 0 && "\\" === n[i]; ) + r = !r; + return r ? "|" : " |"; + }) + .split(/ \|/), + r = 0; + if ( + (n[0].trim() || n.shift(), + n.length > 0 && !n[n.length - 1].trim() && n.pop(), + n.length > t) + ) + n.splice(t); + else for (; n.length < t; ) n.push(""); + for (; r < n.length; r++) + n[r] = n[r].trim().replace(/\\\|/g, "|"); + return n; + }), + (t.unescape = c)); + var n = /[&<>"']/, + r = /[&<>"']/g, + i = /[<>"']|&(?!#?\w+;)/, + o = /[<>"']|&(?!#?\w+;)/g, + a = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + }, + s = function (e) { + return a[e]; + }, + u = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi; + function c(e) { + return e.replace(u, function (e, t) { + return "colon" === (t = t.toLowerCase()) + ? ":" + : "#" === t.charAt(0) + ? "x" === t.charAt(1) + ? String.fromCharCode(parseInt(t.substring(2), 16)) + : String.fromCharCode(+t.substring(1)) + : ""; + }); + } + var l = /(^|[^\[])\^/g, + d = /[^\w:]/g, + f = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i, + p = {}, + h = /^[^:]+:\/*[^/]*$/, + m = /^([^:]+:)[\s\S]*$/, + g = /^([^:]+:\/*[^/]*)[\s\S]*$/; + function v(e, t) { + p[" " + e] || + (h.test(e) + ? (p[" " + e] = e + "/") + : (p[" " + e] = _(e, "/", !0))); + var n = -1 === (e = p[" " + e]).indexOf(":"); + return "//" === t.substring(0, 2) + ? n + ? t + : e.replace(m, "$1") + t + : "/" === t.charAt(0) + ? n + ? t + : e.replace(g, "$1") + t + : e + t; + } + function _(e, t, n) { + var r = e.length; + if (0 === r) return ""; + for (var i = 0; i < r; ) { + var o = e.charAt(r - i - 1); + if (o !== t || n) { + if (o === t || !n) break; + i++; + } else i++; + } + return e.substr(0, r - i); + } + t.noopTest = { exec: function () {} }; + }, + 78: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + Object.defineProperty(t, "Lexer", { + enumerable: !0, + get: function () { + return r.Lexer; + }, + }), + Object.defineProperty(t, "Parser", { + enumerable: !0, + get: function () { + return i.Parser; + }, + }), + Object.defineProperty(t, "Renderer", { + enumerable: !0, + get: function () { + return a.Renderer; + }, + }), + Object.defineProperty(t, "Slugger", { + enumerable: !0, + get: function () { + return u.Slugger; + }, + }), + Object.defineProperty(t, "TextRenderer", { + enumerable: !0, + get: function () { + return s.TextRenderer; + }, + }), + Object.defineProperty(t, "Tokenizer", { + enumerable: !0, + get: function () { + return o.Tokenizer; + }, + }), + Object.defineProperty(t, "defaults", { + enumerable: !0, + get: function () { + return l.defaults; + }, + }), + Object.defineProperty(t, "getDefaults", { + enumerable: !0, + get: function () { + return l.getDefaults; + }, + }), + (t.lexer = void 0), + (t.marked = p), + (t.walkTokens = + t.use = + t.setOptions = + t.parser = + t.parseInline = + t.parse = + t.options = + void 0)); + var r = n(3774), + i = n(2817), + o = n(4001), + a = n(7565), + s = n(1674), + u = n(2123), + c = n(9105), + l = n(4008); + function d(e, t) { + var n = + ("undefined" != typeof Symbol && e[Symbol.iterator]) || + e["@@iterator"]; + if (!n) { + if ( + Array.isArray(e) || + (n = (function (e, t) { + if (e) { + if ("string" == typeof e) return f(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return ( + "Object" === n && + e.constructor && + (n = e.constructor.name), + "Map" === n || "Set" === n + ? Array.from(e) + : "Arguments" === n || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ? f(e, t) + : void 0 + ); + } + })(e)) || + (t && e && "number" == typeof e.length) + ) { + n && (e = n); + var r = 0, + i = function () {}; + return { + s: i, + n: function () { + return r >= e.length + ? { done: !0 } + : { done: !1, value: e[r++] }; + }, + e: function (e) { + throw e; + }, + f: i, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + } + var o, + a = !0, + s = !1; + return { + s: function () { + n = n.call(e); + }, + n: function () { + var e = n.next(); + return ((a = e.done), e); + }, + e: function (e) { + ((s = !0), (o = e)); + }, + f: function () { + try { + a || null == n["return"] || n["return"](); + } finally { + if (s) throw o; + } + }, + }; + } + function f(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r; + } + function p(e, t, n) { + if (null == e) + throw new Error( + "marked(): input parameter is undefined or null", + ); + if ("string" != typeof e) + throw new Error( + "marked(): input parameter is of type " + + Object.prototype.toString.call(e) + + ", string expected", + ); + if ( + ("function" == typeof t && ((n = t), (t = null)), + (t = (0, c.merge)({}, p.defaults, t || {})), + (0, c.checkSanitizeDeprecation)(t), + n) + ) { + var o, + a = t.highlight; + try { + o = r.Lexer.lex(e, t); + } catch (d) { + return n(d); + } + var s = function (e) { + var r; + if (!e) + try { + (t.walkTokens && p.walkTokens(o, t.walkTokens), + (r = i.Parser.parse(o, t))); + } catch (d) { + e = d; + } + return ((t.highlight = a), e ? n(e) : n(null, r)); + }; + if (!a || a.length < 3) return s(); + if ((delete t.highlight, !o.length)) return s(); + var u = 0; + return ( + p.walkTokens(o, function (e) { + "code" === e.type && + (u++, + setTimeout(function () { + a(e.text, e.lang, function (t, n) { + if (t) return s(t); + (null != n && + n !== e.text && + ((e.text = n), (e.escaped = !0)), + 0 == --u && s()); + }); + }, 0)); + }), + void (0 === u && s()) + ); + } + try { + var l = r.Lexer.lex(e, t); + return ( + t.walkTokens && p.walkTokens(l, t.walkTokens), + i.Parser.parse(l, t) + ); + } catch (d) { + if ( + ((d.message += + "\nPlease report this to https://github.com/markedjs/marked."), + t.silent) + ) + return ( + "

    An error occurred:

    " +
    +                    (0, c.escape)(d.message + "", !0) +
    +                    "
    " + ); + throw d; + } + } + ((p.options = p.setOptions = + function (e) { + return ( + (0, c.merge)(p.defaults, e), + (0, l.changeDefaults)(p.defaults), + p + ); + }), + (p.getDefaults = l.getDefaults), + (p.defaults = l.defaults), + (p.use = function () { + for ( + var e = arguments.length, t = new Array(e), n = 0; + n < e; + n++ + ) + t[n] = arguments[n]; + var r, + i = c.merge.apply(void 0, [{}].concat(t)), + s = p.defaults.extensions || { + renderers: {}, + childTokens: {}, + }; + t.forEach(function (e) { + if ( + (e.extensions && + ((r = !0), + e.extensions.forEach(function (e) { + if (!e.name) throw new Error("extension name required"); + if (e.renderer) { + var t = s.renderers ? s.renderers[e.name] : null; + s.renderers[e.name] = t + ? function () { + for ( + var n = arguments.length, + r = new Array(n), + i = 0; + i < n; + i++ + ) + r[i] = arguments[i]; + var o = e.renderer.apply(this, r); + return (!1 === o && (o = t.apply(this, r)), o); + } + : e.renderer; + } + if (e.tokenizer) { + if ( + !e.level || + ("block" !== e.level && "inline" !== e.level) + ) + throw new Error( + "extension level must be 'block' or 'inline'", + ); + (s[e.level] + ? s[e.level].unshift(e.tokenizer) + : (s[e.level] = [e.tokenizer]), + e.start && + ("block" === e.level + ? s.startBlock + ? s.startBlock.push(e.start) + : (s.startBlock = [e.start]) + : "inline" === e.level && + (s.startInline + ? s.startInline.push(e.start) + : (s.startInline = [e.start])))); + } + e.childTokens && + (s.childTokens[e.name] = e.childTokens); + })), + e.renderer) + ) { + var t = p.defaults.renderer || new a.Renderer(), + n = function (n) { + var r = t[n]; + t[n] = function () { + for ( + var i = arguments.length, o = new Array(i), a = 0; + a < i; + a++ + ) + o[a] = arguments[a]; + var s = e.renderer[n].apply(t, o); + return (!1 === s && (s = r.apply(t, o)), s); + }; + }; + for (var u in e.renderer) n(u); + i.renderer = t; + } + if (e.tokenizer) { + var c = p.defaults.tokenizer || new o.Tokenizer(), + l = function (t) { + var n = c[t]; + c[t] = function () { + for ( + var r = arguments.length, i = new Array(r), o = 0; + o < r; + o++ + ) + i[o] = arguments[o]; + var a = e.tokenizer[t].apply(c, i); + return (!1 === a && (a = n.apply(c, i)), a); + }; + }; + for (var d in e.tokenizer) l(d); + i.tokenizer = c; + } + if (e.walkTokens) { + var f = p.defaults.walkTokens; + i.walkTokens = function (t) { + (e.walkTokens.call(this, t), f && f.call(this, t)); + }; + } + (r && (i.extensions = s), p.setOptions(i)); + }); + }), + (p.walkTokens = function (e, t) { + var n, + r = d(e); + try { + var i = function () { + var e = n.value; + switch ((t.call(p, e), e.type)) { + case "table": + var r, + i = d(e.header); + try { + for (i.s(); !(r = i.n()).done; ) { + var o = r.value; + p.walkTokens(o.tokens, t); + } + } catch (f) { + i.e(f); + } finally { + i.f(); + } + var a, + s = d(e.rows); + try { + for (s.s(); !(a = s.n()).done; ) { + var u, + c = d(a.value); + try { + for (c.s(); !(u = c.n()).done; ) { + var l = u.value; + p.walkTokens(l.tokens, t); + } + } catch (f) { + c.e(f); + } finally { + c.f(); + } + } + } catch (f) { + s.e(f); + } finally { + s.f(); + } + break; + case "list": + p.walkTokens(e.items, t); + break; + default: + p.defaults.extensions && + p.defaults.extensions.childTokens && + p.defaults.extensions.childTokens[e.type] + ? p.defaults.extensions.childTokens[e.type].forEach( + function (n) { + p.walkTokens(e[n], t); + }, + ) + : e.tokens && p.walkTokens(e.tokens, t); + } + }; + for (r.s(); !(n = r.n()).done; ) i(); + } catch (o) { + r.e(o); + } finally { + r.f(); + } + }), + (p.parseInline = function (e, t) { + if (null == e) + throw new Error( + "marked.parseInline(): input parameter is undefined or null", + ); + if ("string" != typeof e) + throw new Error( + "marked.parseInline(): input parameter is of type " + + Object.prototype.toString.call(e) + + ", string expected", + ); + ((t = (0, c.merge)({}, p.defaults, t || {})), + (0, c.checkSanitizeDeprecation)(t)); + try { + var n = r.Lexer.lexInline(e, t); + return ( + t.walkTokens && p.walkTokens(n, t.walkTokens), + i.Parser.parseInline(n, t) + ); + } catch (o) { + if ( + ((o.message += + "\nPlease report this to https://github.com/markedjs/marked."), + t.silent) + ) + return ( + "

    An error occurred:

    " +
    +                      (0, c.escape)(o.message + "", !0) +
    +                      "
    " + ); + throw o; + } + }), + (p.Parser = i.Parser), + (p.parser = i.Parser.parse), + (p.Renderer = a.Renderer), + (p.TextRenderer = s.TextRenderer), + (p.Lexer = r.Lexer), + (p.lexer = r.Lexer.lex), + (p.Tokenizer = o.Tokenizer), + (p.Slugger = u.Slugger), + (p.parse = p), + (t.options = p.options), + (t.setOptions = p.setOptions), + (t.use = p.use), + (t.walkTokens = p.walkTokens), + (t.parseInline = p.parseInline), + (t.parse = p), + (t.parser = i.Parser.parse), + (t.lexer = r.Lexer.lex)); + }, + 5779: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.inline = t.block = void 0)); + var r = n(9105), + i = (t.block = { + newline: /^(?: *(?:\n|$))+/, + code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, + fences: + /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/, + hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, + heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, + blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, + list: /^( {0,3}bull)( [^\n]+?)?(?:\n|$)/, + html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", + def: /^ {0,3}\[(label)\]: *(?:\n *)?]+)>?(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, + table: r.noopTest, + lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, + _paragraph: + /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, + text: /^[^\n]+/, + }); + ((i._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/), + (i._title = + /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/), + (i.def = (0, r.edit)(i.def) + .replace("label", i._label) + .replace("title", i._title) + .getRegex()), + (i.bullet = /(?:[*+-]|\d{1,9}[.)])/), + (i.listItemStart = (0, r.edit)(/^( *)(bull) */) + .replace("bull", i.bullet) + .getRegex()), + (i.list = (0, r.edit)(i.list) + .replace(/bull/g, i.bullet) + .replace( + "hr", + "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))", + ) + .replace("def", "\\n+(?=" + i.def.source + ")") + .getRegex()), + (i._tag = + "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"), + (i._comment = /|$)/), + (i.html = (0, r.edit)(i.html, "i") + .replace("comment", i._comment) + .replace("tag", i._tag) + .replace( + "attribute", + / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/, + ) + .getRegex()), + (i.paragraph = (0, r.edit)(i._paragraph) + .replace("hr", i.hr) + .replace("heading", " {0,3}#{1,6} ") + .replace("|lheading", "") + .replace("|table", "") + .replace("blockquote", " {0,3}>") + .replace( + "fences", + " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n", + ) + .replace("list", " {0,3}(?:[*+-]|1[.)]) ") + .replace( + "html", + ")|<(?:script|pre|style|textarea|!--)", + ) + .replace("tag", i._tag) + .getRegex()), + (i.blockquote = (0, r.edit)(i.blockquote) + .replace("paragraph", i.paragraph) + .getRegex()), + (i.normal = (0, r.merge)({}, i)), + (i.gfm = (0, r.merge)({}, i.normal, { + table: + "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)", + })), + (i.gfm.table = (0, r.edit)(i.gfm.table) + .replace("hr", i.hr) + .replace("heading", " {0,3}#{1,6} ") + .replace("blockquote", " {0,3}>") + .replace("code", " {4}[^\\n]") + .replace( + "fences", + " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n", + ) + .replace("list", " {0,3}(?:[*+-]|1[.)]) ") + .replace( + "html", + ")|<(?:script|pre|style|textarea|!--)", + ) + .replace("tag", i._tag) + .getRegex()), + (i.gfm.paragraph = (0, r.edit)(i._paragraph) + .replace("hr", i.hr) + .replace("heading", " {0,3}#{1,6} ") + .replace("|lheading", "") + .replace("table", i.gfm.table) + .replace("blockquote", " {0,3}>") + .replace( + "fences", + " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n", + ) + .replace("list", " {0,3}(?:[*+-]|1[.)]) ") + .replace( + "html", + ")|<(?:script|pre|style|textarea|!--)", + ) + .replace("tag", i._tag) + .getRegex()), + (i.pedantic = (0, r.merge)({}, i.normal, { + html: (0, r.edit)( + "^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))", + ) + .replace("comment", i._comment) + .replace( + /tag/g, + "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b", + ) + .getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: r.noopTest, + paragraph: (0, r.edit)(i.normal._paragraph) + .replace("hr", i.hr) + .replace("heading", " *#{1,6} *[^\n]") + .replace("lheading", i.lheading) + .replace("blockquote", " {0,3}>") + .replace("|fences", "") + .replace("|list", "") + .replace("|html", "") + .getRegex(), + }))); + var o = (t.inline = { + owo: /^:(\S*):/, + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, + autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, + url: r.noopTest, + tag: "^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^", + link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(ref)\]/, + nolink: /^!?\[(ref)\](?:\[\])?/, + reflinkSearch: "reflink|nolink(?!\\()", + emStrong: { + lDelim: + /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, + rDelimAst: + /^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, + rDelimUnd: + /^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/, + }, + code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, + br: /^( {2,}|\\)\n(?!\s*$)/, + del: r.noopTest, + text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"), + (o.punctuation = (0, r.edit)(o.punctuation) + .replace(/punctuation/g, o._punctuation) + .getRegex()), + (o.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g), + (o.escapedEmSt = /\\\*|\\_/g), + (o._comment = (0, r.edit)(i._comment) + .replace("(?:--\x3e|$)", "--\x3e") + .getRegex()), + (o.emStrong.lDelim = (0, r.edit)(o.emStrong.lDelim) + .replace(/punct/g, o._punctuation) + .getRegex()), + (o.emStrong.rDelimAst = (0, r.edit)(o.emStrong.rDelimAst, "g") + .replace(/punct/g, o._punctuation) + .getRegex()), + (o.emStrong.rDelimUnd = (0, r.edit)(o.emStrong.rDelimUnd, "g") + .replace(/punct/g, o._punctuation) + .getRegex()), + (o._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g), + (o._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/), + (o._email = + /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/), + (o.autolink = (0, r.edit)(o.autolink) + .replace("scheme", o._scheme) + .replace("email", o._email) + .getRegex()), + (o._attribute = + /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/), + (o.tag = (0, r.edit)(o.tag) + .replace("comment", o._comment) + .replace("attribute", o._attribute) + .getRegex()), + (o._label = + /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/), + (o._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/), + (o._title = + /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/), + (o.link = (0, r.edit)(o.link) + .replace("label", o._label) + .replace("href", o._href) + .replace("title", o._title) + .getRegex()), + (o.reflink = (0, r.edit)(o.reflink) + .replace("label", o._label) + .replace("ref", i._label) + .getRegex()), + (o.nolink = (0, r.edit)(o.nolink) + .replace("ref", i._label) + .getRegex()), + (o.reflinkSearch = (0, r.edit)(o.reflinkSearch, "g") + .replace("reflink", o.reflink) + .replace("nolink", o.nolink) + .getRegex()), + (o.normal = (0, r.merge)({}, o)), + (o.pedantic = (0, r.merge)({}, o.normal, { + strong: { + start: /^__|\*\*/, + middle: + /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, + endAst: /\*\*(?!\*)/g, + endUnd: /__(?!_)/g, + }, + em: { + start: /^_|\*/, + middle: + /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, + endAst: /\*(?!\*)/g, + endUnd: /_(?!_)/g, + }, + link: (0, r.edit)(/^!?\[(label)\]\((.*?)\)/) + .replace("label", o._label) + .getRegex(), + reflink: (0, r.edit)(/^!?\[(label)\]\s*\[([^\]]*)\]/) + .replace("label", o._label) + .getRegex(), + })), + (o.gfm = (0, r.merge)({}, o.normal, { + escape: (0, r.edit)(o.escape).replace("])", "~|])").getRegex(), + _extended_email: + /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, + url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, + _backpedal: + /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\'.concat(e.logo, "") + + '
    ', + r = 0; + r < this.packages.length; + r++ + ) { + n += '
      '); + for ( + var i = this.odata[this.packages[r]].container, o = 0; + o < i.length; + o++ + ) { + var a = i[o].icon.replace( + "') + .concat(a, ""); + } + n += "
    "; + } + n += '
      '; + for (var s = 0; s < this.packages.length; s++) + n += "
    • ".concat( + this.packages[s], + "
    • ", + ); + ((n += "
    "), + (this.container.innerHTML = n), + (this.logo = + this.container.getElementsByClassName("OwO-logo")[0]), + this.logo.addEventListener("click", function () { + t.toggle(); + }), + this.container + .getElementsByClassName("OwO-body")[0] + .addEventListener("click", function (e) { + var n = null; + if ( + (e.target.classList.contains("OwO-item") + ? (n = e.target) + : e.target.parentNode.classList.contains( + "OwO-item", + ) && (n = e.target.parentNode), + n) + ) { + var r = t.area.selectionEnd, + i = t.area.value, + o = n.innerHTML; + if (-1 !== o.indexOf(" 2 && f[2] !== undefined ? f[2] : {}), + (o = e || (s.app ? s.app.$tcb : null)), + (a = r.envId || s.app.$twikoo.envId), + (u = + r.funcName || + (null === s.app || void 0 === s.app + ? void 0 + : s.app.$twikoo.funcName) || + "twikoo"), + !o) + ) { + t.next = 33; + break; + } + return ( + (t.prev = 5), + (t.next = 8), + o.app.callFunction({ + name: u, + data: c({ event: n }, r), + }) + ); + case 8: + case 27: + case 36: + return t.abrupt("return", t.sent); + case 11: + ((t.prev = 11), + (t.t0 = t["catch"](5)), + (t.t1 = n), + (t.next = + "COMMENT_LIKE" === t.t1 + ? 16 + : "COMMENT_GET" === t.t1 + ? 18 + : "COMMENT_SUBMIT" === t.t1 + ? 20 + : "COUNTER_GET" === t.t1 + ? 22 + : 24)); + break; + case 16: + return ( + (d = "comment-like"), + t.abrupt("break", 24) + ); + case 18: + return ((d = "comment-get"), t.abrupt("break", 24)); + case 20: + return ( + (d = "comment-submit"), + t.abrupt("break", 24) + ); + case 22: + return ((d = "counter-get"), t.abrupt("break", 24)); + case 24: + if (!d) { + t.next = 30; + break; + } + return ( + (t.next = 27), + o.app.callFunction({ name: d, data: r }) + ); + case 30: + throw new Error( + "请升级 Twikoo 云函数版本再试,如果仍无法解决,请删除并重新创建 Twikoo 云函数 - https://twikoo.js.org", + ); + case 31: + t.next = 40; + break; + case 33: + if (!l(a)) { + t.next = 39; + break; + } + return ( + (t.next = 36), + new Promise(function (e, t) { + try { + var i = localStorage.getItem( + "twikoo-access-token", + ), + o = new XMLHttpRequest(); + ((o.onreadystatechange = function () { + if (4 === o.readyState) + if (200 === o.status) { + var n = JSON.parse(o.responseText); + (n.accessToken && + localStorage.setItem( + "twikoo-access-token", + n.accessToken, + ), + e({ result: n })); + } else t(o.status); + }), + o.open("POST", a), + o.setRequestHeader( + "Content-Type", + "application/json", + ), + o.send( + JSON.stringify( + c({ event: n, accessToken: i }, r), + ), + )); + } catch (s) { + t(s); + } + }) + ); + case 39: + throw new Error( + "缺少 envId 配置 - https://twikoo.js.org", + ); + case 40: + case "end": + return t.stop(); + } + }, + t, + null, + [[5, 11]], + ); + }), + ); + return function (t, n) { + return e.apply(this, arguments); + }; + })(); + }, + 7080: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.getQQAvatar = function (e) { + var t = e.replace(/@qq.com/gi, ""); + return "https://thirdqq.qlogo.cn/g?b=sdk&nk=".concat( + t, + "&s=140", + ); + }), + (t.isQQ = function (e) { + return ( + /^[1-9][0-9]{4,10}$/.test(e) || + /^[1-9][0-9]{4,10}@qq.com$/i.test(e) + ); + }), + (t.normalizeMail = function (e) { + return String(e).trim().toLowerCase(); + })); + }, + 9212: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.initMarkedOwo = function (e) { + if (e && Object.values(e)) { + var t = {}; + return ( + Object.values(e).forEach(function (e) { + e.container.forEach(function (e) { + var n = p(e.icon); + n && (t[e.text] = n); + }); + }), + t + ); + } + }), + (t.initOwoEmotions = function (e) { + return d.apply(this, arguments); + })); + var i = r(n(479)), + o = r(n(1819)), + a = r(n(4964)), + s = n(8129); + function u(e, t) { + var n = + ("undefined" != typeof Symbol && e[Symbol.iterator]) || + e["@@iterator"]; + if (!n) { + if ( + Array.isArray(e) || + (n = (function (e, t) { + if (e) { + if ("string" == typeof e) return c(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return ( + "Object" === n && + e.constructor && + (n = e.constructor.name), + "Map" === n || "Set" === n + ? Array.from(e) + : "Arguments" === n || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ? c(e, t) + : void 0 + ); + } + })(e)) || + (t && e && "number" == typeof e.length) + ) { + n && (e = n); + var r = 0, + i = function () {}; + return { + s: i, + n: function () { + return r >= e.length + ? { done: !0 } + : { done: !1, value: e[r++] }; + }, + e: function (e) { + throw e; + }, + f: i, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + } + var o, + a = !0, + s = !1; + return { + s: function () { + n = n.call(e); + }, + n: function () { + var e = n.next(); + return ((a = e.done), e); + }, + e: function (e) { + ((s = !0), (o = e)); + }, + f: function () { + try { + a || null == n["return"] || n["return"](); + } finally { + if (s) throw o; + } + }, + }; + } + function c(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r; + } + function l(e) { + return new Promise(function (t) { + var n = new XMLHttpRequest(); + ((n.onreadystatechange = function () { + if (4 === n.readyState) + if ( + (n.status >= 200 && n.status < 300) || + 304 === n.status + ) { + var e = (function (e) { + try { + return ( + Object.values(e).forEach(function (e) { + if ("image" === e.type) { + var t, + n = u(e.container); + try { + for (n.s(); !(t = n.n()).done; ) { + var r = t.value; + r.text || (r.text = h(p(r.icon))); + } + } catch (i) { + n.e(i); + } finally { + n.f(); + } + } + }), + e + ); + } catch (t) { + s.logger.warn("OwO data is bad: ", t); + } + })(JSON.parse(n.responseText)); + t(e); + } else + s.logger.warn( + "OwO data request was unsuccessful: " + n.status, + ); + }), + n.open("get", e, !0), + n.send(null)); + }); + } + function d() { + return (d = (0, a["default"])( + i["default"].mark(function e(t) { + var n, r; + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + return ( + (n = {}), + (e.next = 3), + Promise.all( + t.split(",").map(function (e) { + return l(e.trim()); + }), + ) + ); + case 3: + return ( + (r = e.sent), + Object.assign.apply( + Object, + [n].concat((0, o["default"])(r)), + ), + e.abrupt("return", n) + ); + case 6: + case "end": + return e.stop(); + } + }, e); + }), + )).apply(this, arguments); + } + var f = document.createElement("template"); + function p(e) { + try { + return ((f.innerHTML = e), f.content.childNodes[0].src); + } catch (t) { + return ""; + } + } + function h(e) { + return e.split("#").shift().split("?").shift().split("/").pop(); + } + }, + 4161: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = void 0)); + var r, + i, + o = n(1085), + a = function (e, t) { + var n = document.getElementById("twikoo"); + (i && n.contains(i)) || + !e || + "none" === e || + (((i = document.createElement("link")).href = + "default" === e + ? "".concat(t, "/themes/prism.min.css") + : "".concat(t, "/themes/prism-").concat(e, ".min.css")), + (i.rel = "stylesheet"), + (i.type = "text/css"), + n.appendChild(i)); + }; + t["default"] = function (e, t, i) { + var s = + o.app && o.app.$twikoo.prismCdn + ? o.app.$twikoo.prismCdn + : "https://cdn.jsdelivr.net/npm/prismjs@1.28.0"; + ((window.Prism = window.Prism || {}), + (window.Prism.manual = !0), + r || + ((r = n(1965)), + n(210), + (r.plugins.autoloader.languages_path = "".concat( + s, + "/components/", + )), + i && + (n(8072), + i + .split(",") + .map(function (e) { + return e.trim(); + }) + .forEach(function (e) { + "showLanguage" === e + ? n(4296) + : "copyButton" === e && n(5472); + }))), + a(t, s), + r.highlightAllUnder(e)); + }; + }, + 7564: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = void 0)); + var i, + o = r(n(3852)), + a = "ADMIN_COMMENT", + s = "ADMIN_CONFIG_CATEGORY", + u = "ADMIN_CONFIG_ITEM", + c = "ADMIN_IMPORT", + l = [ + "qmsg", + "serverchan", + "pushplus", + "pushplushxtrip", + "dingtalk", + "wecom", + "bark", + "gocqhttp", + "atri", + "pushdeer", + "igot", + "telegram", + "feishu", + ].map(function (e) { + return '"'.concat(e, '"'); + }), + d = [ + "126", + "163", + "1und1", + "AOL", + "DebugMail", + "DynectEmail", + "FastMail", + "GandiMail", + "Gmail", + "Godaddy", + "GodaddyAsia", + "GodaddyEurope", + "Hotmail", + "Mail.ru", + "Maildev", + "Mailgun", + "Mailjet", + "Mailosaur", + "Mandrill", + "Naver", + "OpenMailBox", + "Outlook365", + "Postmark", + "QQ", + "QQex", + "SES", + "SES-EU-WEST-1", + "SES-US-EAST-1", + "SES-US-WEST-2", + "SendCloud", + "SendGrid", + "SendPulse", + "SendinBlue", + "Sparkpost", + "Yahoo", + "Yandex", + "Zoho", + "hot.ee", + "iCloud", + "mail.ee", + "qiye.aliyun", + ].map(function (e) { + return '"'.concat(e, '"'); + }), + f = [ + "default", + "coy", + "dark", + "funky", + "okaidia", + "solarizedlight", + "tomorrow", + "twilight", + ].map(function (e) { + return '"'.concat(e, '"'); + }), + p = ["showLanguage", "copyButton"].map(function (e) { + return '"'.concat(e, '"'); + }), + h = [ + "qcloud", + "7bu (https://7bu.top)", + "smms (https://sm.ms)", + "lskypro", + "piclist", + "easyimage", + ].map(function (e) { + return '"'.concat(e, '"'); + }), + m = ["lskypro", "piclist", "easyimage"].map(function (e) { + return '"'.concat(e, '"'); + }), + g = [ + "404", + "mp", + "identicon", + "monsterid", + "wavatar", + "retro", + "robohash", + "blank", + ].map(function (e) { + return '"'.concat(e, '"'); + }); + t["default"] = + ((i = { + ADMIN_CLIENT_VERSION: [ + "前端版本:", + "前端版本:", + "前端版本:", + "Client version: ", + "Клиент версияси: ", + "クライアントバージョン:", + "클라이언트 버전: ", + ], + ADMIN_SERVER_VERSION: [ + "云函数版本:", + "云函數版本:", + "雲端函式版本:", + "Server version: ", + "Сервернинг версияси: ", + "サーバーサイドバージョン: ", + "서버 버전: ", + ], + }), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, a, [ + "评论管理", + "評論管理", + "留言管理", + "Comment", + "Изоҳ", + "コメント管理", + "댓글 관리", + ]), + a + "_DELETE", + [ + "删除", + "刪除", + "移除", + "Delete", + "Ўчирмоқ", + "削除", + "삭제", + ], + ), + a + "_DELETE_CONFIRM", + [ + "确认删除?", + "確認刪除?", + "確認移除?", + "Confirm deletion?", + "Ўчириш тасдиқлансинми?", + "本当に削除しますか?", + "정말 삭제하시겠습니까?", + ], + ), + a + "_FILTER_ALL", + [ + "全部", + "全部", + "全部", + "All", + "Ҳаммаси", + "全部", + "전체", + ], + ), + a + "_FILTER_VISIBLE", + [ + "只看可见", + "只看可見", + "只看可見", + "Visible", + "Кўринадиган", + "表示中のみ", + "표시 댓글", + ], + ), + a + "_FILTER_HIDDEN", + [ + "只看隐藏", + "只看隱藏", + "只看隱藏", + "Hidden", + "Яширилган", + "非表示中のみ", + "숨김 댓글", + ], + ), + a + "_HIDE", + [ + "隐藏", + "隱藏", + "隱藏", + "Hide", + "Яширмоқ", + "非表示", + "숨기기", + ], + ), + a + "_IS_SPAM_SUFFIX", + [ + " (已隐藏)", + " (已隱藏)", + " (已隱藏)", + " (Hidden)", + " (Яширилган)", + " (非表示)", + " (숨김 처리됨)", + ], + ), + a + "_SEARCH", + ["搜索", "搜索", "搜尋", "Search", "Излаш", "検索", "검색"], + ), + a + "_SEARCH_PLACEHOLDER", + [ + "搜索昵称、邮箱、网址、IP、评论正文、文章地址", + "搜索暱稱、郵箱、網址、IP、評論正文、文章地址", + "搜索暱稱、郵件、網址、IP、留言正文、文章路徑", + "Search by nick, mail, website, IP, comment, or article path", + "Тахаллус, почта, веб-сайт, ИП, шарҳ ёки мақола йўли бўйича излаш", + "名前、メールアドレス、ウェブサイトURL、IPアドレス、コメント内容、記事のURLを検索", + "닉네임, 이메일, 웹사이트, IP, 댓글 내용, 게시글 주소로 검색", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, a + "_SHOW", [ + "显示", + "顯示", + "顯示", + "Show", + "Кўрсатиш", + "表示", + "표시", + ]), + a + "_TOP", + [ + "置顶", + "置頂", + "置頂", + "Pin", + "Қадамоқ", + "固定する", + "고정", + ], + ), + a + "_UNTOP", + [ + "取消置顶", + "取消置頂", + "取消置頂", + "Unpin", + "Қадоқни ечмоқ", + "固定を解除", + "고정 해제", + ], + ), + a + "_VIEW", + [ + "查看", + "查看", + "檢視", + "View", + "Кўриниш", + "閲覧", + "보기", + ], + ), + "ADMIN_CONFIG", + [ + "配置管理", + "配置管理", + "設定值管理", + "Configuration", + "Конфигурация", + "設定管理", + "환경설정", + ], + ), + s + "_COMMON", + [ + "通用", + "通用", + "一般", + "General", + "Умумий", + "一般", + "일반", + ], + ), + s + "_IM", + [ + "即时通知", + "即時通知", + "即時通知", + "Instant notification", + "Тезкор хабарнома", + "即時通知", + "실시간 알림", + ], + ), + s + "_MAIL", + [ + "邮件通知", + "郵件通知", + "郵件通知", + "Email notification", + "Электрон почта хабарномаси", + "メール通知", + "이메일 알림", + ], + ), + s + "_PLUGIN", + [ + "插件", + "插件", + "擴充功能", + "Plugin", + "Плагин", + "プラグイン", + "플러그인", + ], + ), + s + "_PRIVACY", + [ + "隐私", + "隱私", + "隱私權", + "Privacy", + "Шахсий қоидалар", + "プライバシー", + "개인정보", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, s + "_SPAM", [ + "反垃圾", + "反垃圾", + "防垃圾", + "Spam", + "Спам", + "スパム対策", + "스팸 관리", + ]), + "ADMIN_CONFIG_EMAIL_TEST", + [ + "邮件通知测试", + "郵件通知測試", + "郵件通知測試", + "Email notification test", + "Электрон почта хабарномаси тести", + "メール通知テスト", + "이메일 알림 테스트", + ], + ), + "ADMIN_CONFIG_EMAIL_TEST_BTN", + [ + "发送测试邮件", + "發送測試郵件", + "發送測試郵件", + "Send test mail", + "Синов хатини юбориш", + "テストメールを送信", + "테스트 메일 발송", + ], + ), + "ADMIN_CONFIG_EMAIL_TEST_HELP", + [ + "输入一个邮箱地址,发送测试邮件", + "輸入一個郵箱位址,發送測試郵件", + "輸入一個郵箱帳號,發送測試郵件", + "Input an email address & send test mail", + "Э-почта манзилини киритинг ва синов хатини юборинг", + "メールアドレスを入力してテストメールを送信", + "이메일 주소를 입력하고 테스트 메일을 발송하세요", + ], + ), + "ADMIN_CONFIG_EMAIL_TEST_RESULT", + [ + "测试结果:", + "測試結果:", + "測試結果:", + "Test result: ", + "Тест натижаси: ", + "テスト結果:", + "테스트 결과: ", + ], + ), + "ADMIN_CONFIG_EXAMPLE", + [ + "示例:", + "示例:", + "範例:", + "Example: ", + "Намуна: ", + "例:", + "예시: ", + ], + ), + u + "_AKISMET_KEY", + [ + 'Akismet 反垃圾评论,用于垃圾评论检测,设为 "MANUAL_REVIEW" 开启人工审核,留空不使用反垃圾。注册:https://akismet.com', + 'Akismet 反垃圾評論,用於垃圾評論檢測,設為 "MANUAL_REVIEW" 開啟人工審核,留空不使用反垃圾。註冊:https://akismet.com', + 'Akismet 防垃圾留言,用於垃圾留言檢測,設為 "MANUAL_REVIEW" 以開啟人工審核,留空則不使用防垃圾。註冊:https://akismet.com', + 'Akismet spam protection. Set to "MANUAL_REVIEW" to enable manual review. Leave it blank to not use anti-spam. Register Akismet: https://akismet.com', + 'Акисмет спам ҳимояси. Қўлда кўриб чиқишни ёқиш учун "MANUAL_REVIEW" га созланг. Анти-спамдан фойдаланмаслик учун уни бўш қолдиринг. Акисметни рўйхатдан ўтказиш: https://akismet.com', + 'Akismetは、スパムコメントの検出に使用されるアンチスパムサービスです。"MANUAL_REVIEW"に設定することで、手動レビューを有効化します。コメントのスパム対策にAkismetを使用することで、不要なコメントをブロックし、サイトのセキュリティを向上させることができます。 Akismetの詳細情報と登録は、https://akismet.com で提供されています。', + 'Akismet 스팸 방지. 스팸 댓글 감지에 사용합니다. "MANUAL_REVIEW"를 설정하면 수동 검토를 활성화합니다. 비워두면 스팸 수동 검토를 사용하지 않습니다. Akismet 등록: https://akismet.com', + ], + ), + u + "_BLOGGER_NICK", + [ + "博主的昵称。", + "博主的昵稱。", + "站長的暱稱。", + "Admin nick name.", + "Админ исми.", + "管理者の名前。", + "관리자 닉네임.", + ], + ), + u + "_BLOGGER_EMAIL", + [ + "博主的邮箱地址,用于邮件通知、博主标识。", + "博主的郵箱地址,用於郵件通知、博主標識。", + "站長的郵箱帳號,用於郵件通知、站長認證。", + "Admin Email address. Used for Email notification and admin identification.", + "Админ электрон почта манзили. Электрон почта хабарномаси ва администратор идентификацияси учун фойдаланилади.", + "管理者のメールアドレス。メール通知と管理者の識別に使用されます。", + "관리자 이메일 주소. 이메일 알림 및 관리자 식별에 사용됩니다.", + ], + ), + u + "_COMMENT_BG_IMG", + [ + "评论框自定义背景图片 URL 地址。", + "評論框自定義背景圖片 URL 地址。", + "留言區塊自訂背景圖片 URL 網址。", + "URL for custom background image.", + "Махсус фон расми учун УРЛ.", + "コメントボックスのカスタム背景画像のURL。", + "댓글창 배경 이미지 URL 주소.", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, u + "_COMMENT_PAGE_SIZE", [ + "评论列表分页大小,默认为 8。", + "評論列表分頁大小,預設為 8。", + "留言列表分頁大小,預設為 8。", + "Comment page size. Default: 8.", + "Изоҳ саҳифаси ўлчами. Стандарт: 8.", + "コメントリストのページサイズ。デフォルトは8。", + "한 페이지당 표시 댓글 수. 기본값: 8.", + ]), + u + "_COMMENT_PLACEHOLDER", + [ + "评论框提示信息,可用
    换行,默认为空", + "評論框提示信息,可用
    換行,預設為空", + "留言區塊提示資訊,可用
    換行,預設空白", + "Comment placeholder. Use
    to start a newline. Default: empty.", + "Изоҳ тўлдирувчиси. Янги қаторни бошлаш учун <бр> дан фойдаланинг. Стандарт: бўш.", + "コメントボックスのヒントメッセージ。
    で改行。デフォルトは空。", + "댓글 입력창에 표시될 기본 문구.
    태그로 줄바꿈 가능. 기본값: 비어 있음.", + ], + ), + u + "_CORS_ALLOW_ORIGIN", + [ + "CORS 安全域名,注意:如果您不了解什么是 CORS,此项请留空,错误设置会导致无法加载,默认为空,格式为 https://blog.example.com;如需添加多域名请使用,分隔", + "CORS 安全域名,注意:错误设置会导致无法加載,默認為空,格式为 https://blog.example.com;如需添加多域名請使用,分隔", + "CORS 安全網域,注意:設定錯誤將會導致載入失敗,預設空白,格式應為 https://blog.example.com;如需添加多域名請使用,分隔", + "CORS allow origin, note: incorrect settings can cause loading failure. Default: blank, format: https://blog.example.com; If you need to add multiple domain names, please use, separate", + "Версел СОРС келиб чиқишига рухсат беради, эътибор беринг: нотўғри созламалар юклашда хатоликка олиб келиши мумкин. Стандарт: бўш, формат: https://blog.example.com; Агар сиз бир нечта домен номларини қўшмоқчи бўлсангиз, илтимос, ажратишдан фойдаланинг.", + "CORS セキュアドメイン。注意:誤った設定は読み込みエラーを引き起こす可能性があります。デフォルトは空、形式は https://blog.example.com です。複数のドメインを追加する場合は、コンマで区切ってください。", + "댓글 서버 접근 허용 웹사이트 주소. 참고: 등록된 웹사이트만 댓글 시스템과 안전하게 통신합니다. 주소 오류 시 댓글창이 사라질 수 있습니다. 기본값: 비어 있음(보안 취약), 형식: https://blog.example.com; 여러 주소는 쉼표(,)로 구분.", + ], + ), + u + "_DEFAULT_GRAVATAR", + [ + '默认的头像显示。默认值(留空)为 "initials",可选:'.concat( + g.join("、"), + ), + '預設的頭像顯示。預設值(留空)為 "initials",可選:'.concat( + g.join("、"), + ), + '預設的大頭貼照圖示。預設值(留空)為 "initials",選項:'.concat( + g.join("、"), + ), + 'Avatar placeholder. Default (when empty): "initials". Choose from: '.concat( + g.join(", "), + ), + "Аватар тўлдирувчиси. Стандарт (агар бўш қолдирилса): «идентификатор». Қуйидагилардан танланг: ".concat( + g.join(", "), + ), + 'デフォルトのプロフィール画像表示。デフォルト(空欄時)は "initials" で、選択肢は:'.concat( + g.join("、"), + " です", + ), + '프로필 기본 이미지. 기본값(비워둘 경우): "initials". 사용 가능 스타일: '.concat( + g.join(", "), + ), + ], + ), + u + "_EMOTION_CDN", + [ + "表情 CDN,英文逗号分隔。默认为:https://owo.imaegoo.com/owo.json", + "表情 CDN,英文逗號分隔。預設為:https://owo.imaegoo.com/owo.json", + "表情 CDN 來源,使用英文逗號分隔。預設為:https://owo.imaegoo.com/owo.json", + "Emoji CDN. Separate by comma. Default: https://owo.imaegoo.com/owo.json", + "Emoji CDN. Вергул билан ажратинг. Default: https://owo.imaegoo.com/owo.json", + "顔文字CDN。コンマで区切ってください。デフォルト:https://owo.imaegoo.com/owo.json", + "이모티콘 데이터 웹 주소. 쉼표(,)로 구분. 기본값: https://owo.imaegoo.com/owo.json", + ], + ), + u + "_FORBIDDEN_WORDS", + [ + "违禁词配置,包含违禁词的内容会直接标记为垃圾评论。英文逗号分隔。", + "違禁詞配置,包含違禁詞的內容會直接標記為垃圾評論。英文逗號分隔。", + "禁用詞語設定,包含禁用詞語的內容會直接標記為垃圾留言。使用英文逗號分隔。", + "Configure prohibited words. Comments containing prohibited words will be auto spammed. Separate by comma.", + "Тақиқланган сўзларни созланг. Тақиқланган сўзларни ўз ичига олган шарҳлар автоматик равишда спамга юборилади. Вергул билан ажратинг.", + "禁止ワード設定。禁止ワードを含むコンテンツは直ちにスパムコメントとしてマークされます。コンマで区切ってください。", + "금지어 설정. 금지어 포함 댓글은 스팸으로 숨김 처리 됩니다. 쉼표로 구분.", + ], + ), + u + "_BLOCKED_WORDS", + [ + "屏蔽词配置,包含屏蔽词的内容会直接评论失败。英文逗号分隔。", + "屏蔽词配置,包含屏蔽词的内容会直接评论失败。英文逗号分隔。", + "屏蔽词配置,包含屏蔽词的内容会直接评论失败。英文逗号分隔。", + "Configure blocked words. Comments containing blocked words will fail to send. Separate by comma.", + "Configure blocked words. Comments containing blocked words will fail to send. Separate by comma.", + "ブロックワード設定。ブロックワードを含むコンテンツは送信に失敗します。コンマで区切ってください。", + "차단어 설정. 차단어 포함 댓글은 등록에 실패합니다. 쉼표로 구분.", + ], + ), + u + "_GRAVATAR_CDN", + [ + "自定义头像 CDN 地址。如:cn.gravatar.com, weavatar.com, cravatar.cn, sdn.geekzu.org, gravatar.loli.net,默认:weavatar.com", + "自定義頭像 CDN 地址。如:cn.gravatar.com, weavatar.com, cravatar.cn, sdn.geekzu.org, gravatar.loli.net,預設:weavatar.com", + "自訂大頭貼照 CDN 來源。如:cn.gravatar.com, weavatar.com, cravatar.cn, sdn.geekzu.org, gravatar.loli.net,預設:weavatar.com", + "Custom avator CDN. (Examples: gravatar.com) Default: weavatar.com.", + "Custom avator CDN. (Мисоллар: gravatar.com) Default: weavatar.com.", + "カスタムプロフィール画像CDNアドレス。例:cn.gravatar.com、weavatar.com、cravatar.cn、sdn.geekzu.org、gravatar.loli.net、デフォルト:weavatar.com", + "프로필 이미지(아바타) Gravatar 서버 주소. 더 빠르거나 안정적인 서버를 선택할 수 있습니다. (예: gravatar.com) 기본값: weavatar.com.", + ], + ), + u + "_HIDE_ADMIN_CRYPT", + [ + "隐藏管理面板入口。可设置一个“暗号”,只有在“昵称”一栏输入相同的“暗号”时,管理面板入口才会显示,留空则不隐藏管理入口", + "隱藏管理面板入口。可設定一個“暗號”,只有在“暱稱”一欄輸入相同的“暗號”時,管理面板入口才會顯示,留空則不隱藏管理入口", + "隱藏管理控制台入口。可設定一個“暗號”,只有在「暱稱」一欄輸入相同的「暗號」時,管理控制台入口才會顯示,留白則不隱藏管理入口", + "Set a cipher to hide the management panel entrance, only when the same cipher is entered in the nickname field the management panel entry will be displayed. Leave it blank to not hide the management entrance.", + "Бошқарув панелига киришни яшириш учун шифрни ўрнатинг, фақат тахаллус майдонига худди шу шифр киритилганда бошқарув панелидаги ёзув кўрсатилади. Бошқарув киришини яширмаслик учун уни бўш қолдиринг.", + '管理パネルのログイン画面を非表示にする。 "パスワード" を設定でき、 "名前" フィールドに同じ "パスワード" を入力した場合のみ、管理パネルのログイン画面が表示されます。空白の場合、管理パネルのログイン画面は非表示にされません。', + "환경설정 버튼을 숨깁니다. 암호를 설정하여, 닉네임 입력란에 동일한 암호를 입력해야만 환경설정 버튼이 표시됩니다. 비워두면 버튼을 숨기지 않습니다.", + ], + ), + u + "_HIGHLIGHT", + [ + "启用代码高亮功能。如果您的主题和代码高亮有冲突,请设为 false。默认:true", + "啟用代碼高亮功能。如果您的主題和代碼高亮有衝突,請設為 false。預設:true", + "啟用程式碼醒目顯示功能。如果您的主題和此功能發生衝突,請設定為 false。預設:true", + "Enable code highlighting. If your theme conflicts with code highlighting, please set it to false. Default: true.", + "Кодни ажратиб кўрсатишни ёқинг. Агар мавзуингиз кодни ажратиб кўрсатишга зид бўлса, уни «фалсе» га ўрнатинг. Стандарт: рост.", + "コードハイライト機能を有効にします。テーマとコードハイライトに競合がある場合、falseに設定してください。デフォルト:true", + "코드 하이라이팅 기능을 활성화합니다. 테마와 코드 하이라이팅이 충돌하면 false로 설정하세요. 기본값: true.", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, u + "_HIGHLIGHT_THEME", [ + "代码高亮主题,可选:".concat( + f.join("、"), + ",访问 https://prismjs.com 可预览主题效果。如果您的主题和代码高亮有冲突,请设为 none。默认:none", + ), + "代碼高亮主題,可選:".concat( + f.join("、"), + ",訪問 https://prismjs.com 可預覽主題效果。如果您的主題和代碼高亮有衝突,請設為 none。預設:none", + ), + "程式碼醒目顯示主題,選項:".concat( + f.join("、"), + ",瀏覽 https://prismjs.com 可預覽主題效果。如果您的主題和此功能發生衝突,請設定為 none。預設:none", + ), + "Code highlighting theme. Select from: ".concat( + f.join(", "), + ". Visit https://prismjs.com for preview. If your theme conflicts with code highlighting, please set it to none. Default: none.", + ), + "Кодни таъкидлаш мавзуси. Қуйидагилардан танланг: ".concat( + f.join(", "), + ". Олдиндан кўриш учун https://prismjs.com сайтига ташриф буюринг. Агар мавзуингиз кодни ажратиб кўрсатишга зид бўлса, уни «Ҳеч» га ўрнатинг. Стандарт: йўқ.", + ), + "コードハイライトのテーマ。選択肢:".concat( + f.join("、"), + "、テーマの効果をプレビューするには https://prismjs.com を訪問してください。テーマとコードハイライトに競合がある場合、noneに設定してください。デフォルト:none", + ), + "코드 하이라이팅 테마. 사용 가능 테마: ".concat( + f.join(", "), + ". https://prismjs.com 에서 미리보기를 확인하세요. 테마와 코드 하이라이팅이 충돌하면 none으로 설정하세요. 기본값: none.", + ), + ]), + u + "_HIGHLIGHT_PLUGIN", + [ + "代码高亮插件,可选:".concat( + p.join("、"), + ",分别表示:展示代码语言、展示代码拷贝按钮。可以同时设置多个选项,如果想要不添加任何代码高亮插件,请设为 none。默认:none。", + ), + "代碼高亮插件,可選:".concat( + p.join("、"), + ",分別表示:展示代碼語言、展示代碼拷貝按鈕。可以同時設置多個選項,如果想要不添加任何代碼高亮插件,請設為 none。預設:none。", + ), + "代碼高亮外掛程式,可選:".concat( + p.join("、"), + ",分別表示:展示代碼語言、展示代碼拷貝按鈕。 可以同時設置多個選項,如果想要不添加任何代碼高亮外掛程式,請設定為 none。預設:none。", + ), + "Code highlight plug-in, optional: ".concat( + p.join(", "), + ", respectively: show code language, show code copy button. Multiple options can be set at the same time, if you want to add no code highlighting plug-ins, please set it to none. Default: none. ", + ), + "Плагин подсветки кода, опционально: ".concat( + p.join(","), + ", соответственно: показывать язык кода, показывать кнопку копирования кода. Вы можете установить несколько опций одновременно, если вы хотите не добавлять плагин подсветки кода, установите значение none. по умолчанию: none.", + ), + "コード・ハイライト・プラグイン。オプション: ".concat( + p.join(","), + ", それぞれ: コード言語の表示、コード・コピー・ボタンの表示。複数のオプションを同時に設定できますが、コード・ハイライト・プラグインを追加したくない場合は、noneに設定してください。", + ), + "코드 하이라이트 추가 기능. 선택 가능: ".concat( + p.join(", "), + ". (코드 언어 표시, 복사 버튼) 여러 기능을 동시에 설정할 수 있으며, 추가하지 않으려면 none으로 설정하세요. 기본값: none.", + ), + ], + ), + u + "_IMAGE_CDN", + [ + "插入图片所使用的图床,目前支持:".concat( + h.join("、"), + ), + "插入圖片所使用的圖床,目前支持:".concat( + h.join("、"), + ), + "插入圖片所使用的圖床,目前支援:".concat( + h.join("、"), + ), + "The image bed for image uploading. Select from: ".concat( + h.join(", "), + ), + "Расм юклаш учун расм тўшаги. Қуйидагилардан танланг: ".concat( + h.join(", "), + ), + "画像のアップロードに使用する画像ホスティングサービス。次のうちから選択してください:".concat( + h.join("、"), + ), + "댓글 이미지 업로드 기능에 사용될 호스팅 서비스. 사용 가능 목록: ".concat( + h.join(", "), + ), + ], + ), + u + "_IMAGE_CDN_URL", + [ + "图床的 URL,仅当 IMAGE_CDN 为 ".concat( + m.join(" / "), + " 时需要填写", + ), + "圖床的 URL,僅當 IMAGE_CDN 為 ".concat( + m.join(" / "), + " 時需要填寫", + ), + "圖床的 URL,僅當 IMAGE_CDN 為 ".concat( + m.join(" / "), + " 時需要填寫", + ), + "The URL for the image bed. Required if your IMAGE_CDN is one of these: ".concat( + m.join(", "), + ), + "IMAGE_CDN томонидан белгиланган расм тўшаги URL. Агар сизнинг IMAGE_CDN шулардан бири бўлса: ".concat( + m.join(", "), + ), + "IMAGE_CDNで設定した画像ホスティングサービスのURL。IMAGE_CDNが以下のいずれかの場合は入力が必要です:".concat( + m.join("、"), + ), + "이미지 저장소 URL. IMAGE_CDN 설정이 다음 중 하나인 경우 필요합니다: ${customImageBedServices.join(", + ")}", + ], + ), + u + "_IMAGE_CDN_TOKEN", + [ + "图床 token。qcloud 图床无需设置", + "图床 token。qcloud 图床无需设置", + "圖床 token。qcloud 圖床不需設定", + "The image bed token. Unnessessary for qcloud", + "Тасвир токен белгиси. Қслоуд учун кераксиз", + "画像ホスティングトークン。qcloud画像ホスティングを利用する場合は設定の必要はありません", + "이미지 호스팅 토큰. qcloud은 설정 불필요.", + ], + ), + u + "_LIGHTBOX", + [ + "使用简易图片点击放大效果。默认:false", + "使用簡易圖片點擊放大效果。預設:false", + "使用簡易圖片點擊放大效果。預設:false", + "Use simple Lightbox effect. Default: false", + "Используйте простые эффекты лайтбокса. По умолчанию: false", + "シンプルな画像拡大機能を使用します。デフォルト:false", + "라이트박스 효과, 댓글 이미지 클릭 시 확대 효과 사용. 기본값: false", + ], + ), + u + "_LIMIT_PER_MINUTE", + [ + "单个 IP 发言频率限制(条/10分钟),0 为无限制,默认:10", + "單個 IP 發言頻率限制(條/10分鐘),0 為無限制,預設:10", + "單個 IP 留言頻率限制(則/10分鐘),0 為無限,預設:10", + "How many comments can be posted by each IP every 10 minutes, 0 is unlimited, default: 10.", + "Ҳар бир ИП ҳар 10 дақиқада қанча шарҳ қолдириши мумкин, 0 чексиз, стандарт: 10.", + "同一IPにおける10分ごとの投稿回数制限。0は無制限、デフォルト:10", + "IP별 댓글 작성 빈도 제한 (10분당 건수), 0은 무제한. 기본값: 10.", + ], + ), + u + "_LIMIT_PER_MINUTE_ALL", + [ + "全站发言频率限制(条/10分钟),0 为无限制,默认:10", + "全站發言頻率限制(條/10分鐘),0 為無限制,預設:10", + "全站留言頻率限制(則/10分鐘),0 為無限,預設:10", + "How many comments can be posted by all IPs every 10 minutes, 0 is unlimited, default: 10.", + "Барча ИП-лар ҳар 10 дақиқада қанча шарҳ қўйиши мумкин, 0 чексиз, стандарт: 10.", + "全IPにおける10分ごとの投稿回数制限。0は無制限、デフォルト:10", + "10분당 사이트 전체에 작성 가능한 총 댓글 수 제한. 0은 무제한. 기본값: 10.", + ], + ), + u + "_LIMIT_LENGTH", + [ + "评论长度限制,0 为无限制,默认:500", + "評論長度限制,0 為無限制,預設:500", + "留言長度限制,0 為無限,預設:500", + "Comment length limitation, 0 is unlimited, default: 500.", + "Шарҳ узунлиги чеклови, 0 чексиз, стандарт: 500.", + "コメント長さの制限。0は無制限、デフォルト:500", + "댓글 길이 제한. 0은 무제한. 기본값: 500.", + ], + ), + u + "_MAIL_SUBJECT", + [ + "自定义通知邮件主题,留空则使用默认主题。", + "自定義通知郵件主題,留空則使用預設主題。", + "自訂通知郵件主題,留白則使用預設主題。", + "Custom Email notification subject. Leave it blank to use the default subject.", + "Махсус электрон почта хабарномаси мавзуси. Стандарт мавзуни ишлатиш учун уни бўш қолдиринг.", + "カスタム通知メールの件名。空白の場合はデフォルトの件名を使用します。", + "댓글 알림 이메일 제목 설정. 비워두면 기본 제목을 사용합니다.", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + i, + u + "_MAIL_SUBJECT_ADMIN", + [ + "自定义博主通知邮件主题,留空则使用默认主题。", + "自定義博主通知郵件主題,留空則使用預設主題。", + "自訂站長通知郵件主題,留白則使用預設主題。", + "Custom admin Email notification subject. Leave it blank to use the default subject.", + "Махсус администратор электрон почта хабарномаси мавзуси. Стандарт мавзуни ишлатиш учун уни бўш қолдиринг.", + "管理者へのカスタム通知メールの件名。空白の場合はデフォルトの件名を使用します。", + "관리자에게 발송되는 댓글 알림 이메일 제목 설정. 비워두면 기본 제목을 사용합니다.", + ], + ), + u + "_MAIL_TEMPLATE", + [ + "自定义通知邮件模板,留空则使用默认模板。可包含的字段:${SITE_URL}, ${SITE_NAME}, ${PARENT_NICK}, ${PARENT_COMMENT}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IMG}, ${PARENT_IMG}", + "自定義通知郵件模板,留空則使用預設模板。可包含的字段:${SITE_URL}, ${SITE_NAME}, ${PARENT_NICK}, ${PARENT_COMMENT}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IMG}, ${PARENT_IMG}", + "自訂通知郵件模板,留白則使用預設模板。可包含的欄位:${SITE_URL}, ${SITE_NAME}, ${PARENT_NICK}, ${PARENT_COMMENT}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IMG}, ${PARENT_IMG}", + "Custom Email notification template. Leave it blank to use the default template. Fields that can be included: ${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IMG}, ${PARENT_IMG}", + "Махсус электрон почта хабарномаси шаблони. Стандарт шаблонни ишлатиш учун уни бўш қолдиринг. Қўшилиши мумкин бўлган майдонлар: ${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IMG}, ${PARENT_IMG}", + "カスタム通知メールテンプレート。空白の場合はデフォルトテンプレートを使用します。使用可能なフィールド:${SITE_URL}、${SITE_NAME}、${PARENT_NICK}、${PARENT_COMMENT}、${NICK}、${COMMENT}、${POST_URL}、${IMG}、${PARENT_IMG}", + "댓글 알림 이메일 템플릿 설정. 비워두면 기본 템플릿 사용. 다음 변수를 사용하면 해당 값으로 자동 치환됩니다: ${SITE_URL}, ${SITE_NAME}, ${PARENT_NICK}, ${PARENT_COMMENT}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IMG}, ${PARENT_IMG}", + ], + ), + u + "_MAIL_TEMPLATE_ADMIN", + [ + "自定义博主通知邮件模板,留空则使用默认模板。可包含的字段:${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IP}, ${MAIL}, ${IMG}", + "自定義博主通知郵件模板,留空則使用預設模板。可包含的字段:${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IP}, ${MAIL}, ${IMG}", + "自訂站長通知郵件模板,留白則使用預設模板。可包含的欄位:${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IP}, ${MAIL}, ${IMG}", + "Custom admin Email notification template. Leave it blank to use the default template. Fields that can be included: ${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IP}, ${MAIL}, ${IMG}", + "Махсус администратор электрон почта хабарномаси шаблони. Стандарт шаблонни ишлатиш учун уни бўш қолдиринг. Қўшилиши мумкин бўлган майдонлар: ${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IMG}, ${PARENT_IMG}", + "管理者へのカスタム通知メールテンプレート。空白の場合はデフォルトテンプレートを使用します。使用可能なフィールド:${SITE_URL}、${SITE_NAME}、${NICK}、${COMMENT}、${POST_URL}、${IP}、${MAIL}、${IMG}", + "관리자 알림 이메일 템플릿 설정. 비워두면 기본 템플릿 사용. 다음 변수를 사용하면 해당 값으로 자동 치환됩니다: ${SITE_URL}, ${SITE_NAME}, ${NICK}, ${COMMENT}, ${POST_URL}, ${IP}, ${MAIL}, ${IMG}", + ], + ), + u + "_MASTER_TAG", + [ + "博主标识自定义文字,默认为 “博主”。", + "博主標識自定義文字,預設為 “博主”。", + "站長認證自訂文字,預設為「博主」。", + "Custom admin identifier.", + "Махсус администратор идентификатори.", + '管理者を表すカスタムテキスト。デフォルト:"ブロガー"', + "관리자 태그 설정. (닉네임 옆에 표시됨. 예: 관리자)", + ], + ), + u + "_NOTIFY_SPAM", + [ + "垃圾评论是否发送通知,默认:true", + "垃圾評論是否發送通知,默認:true", + "垃圾留言是否發送通知,預設:true", + "Notifications for spam comments. Default: true.", + "Спам шарҳлар учун билдиришномалар. Стандарт: рост.", + "スパムコメントの通知を送信するかどうか。デフォルト:true", + "스팸 댓글 알림 발송 여부. 기본값: true.", + ], + ), + u + "_TURNSTILE_SITE_KEY", + [ + "Turnstile 验证码的站点密钥。申请地址: https://dash.cloudflare.com/?to=/:account/turnstile", + "Turnstile 验证码的站点密钥。申请地址: https://dash.cloudflare.com/?to=/:account/turnstile", + "Turnstile 验证码的站点密钥。申请地址: https://dash.cloudflare.com/?to=/:account/turnstile", + "Turnstile CAPTCHA Site Key. Get from: https://dash.cloudflare.com/?to=/:account/turnstile", + "Turnstile CAPTCHA Site Key. Get from: https://dash.cloudflare.com/?to=/:account/turnstile", + "Turnstile CAPTCHAのサイトキー。参照: https://dash.cloudflare.com/?to=/:account/turnstile", + "Turnstile CAPTCHA(스팸봇 방지) 사이트 키. 발급처: https://dash.cloudflare.com/?to=/:account/turnstile", + ], + ), + u + "_TURNSTILE_SECRET_KEY", + [ + "Turnstile 验证码的密钥", + "Turnstile 验证码的密钥", + "Turnstile 验证码的密钥", + "Turnstile CAPTCHA Secret Key", + "Turnstile CAPTCHA Secret Key", + "Turnstile CAPTCHAのシークレットキー", + "Turnstile CAPTCHA Secret Key", + ], + ), + u + "_QCLOUD_SECRET_ID", + [ + "腾讯云 secret id,用于垃圾评论检测。同时设置腾讯云和 Akismet 时,只有腾讯云会生效。注册:https://twikoo.js.org/cms.html", + "騰訊雲 secret id,用於垃圾評論檢測。同時設定騰訊雲和 Akismet 時,只有騰訊雲會生效。註冊:https://twikoo.js.org/cms.html", + "騰訊雲 Secret ID,用於垃圾留言檢測。同時設定騰訊雲和 Akismet 時,只有騰訊雲會被啟用。註冊:https://twikoo.js.org/cms.html", + "Tencent Cloud secret id for spam detection. When Tencent Cloud and Akismet are set at the same time, only Tencent Cloud will take effect. Register: https://twikoo.js.org/cms.html", + "Спамни аниқлаш учун Тенсент Слоуд махфий идентификатори. Тенсент Слоуд ва Акисмет бир вақтнинг ўзида ўрнатилганда, фақат Тенсент Слоуд кучга киради. Рўйхатдан ўтиш: https://twikoo.js.org/cms.html", + "Tencent CloudのシークレットID。スパムコメントの検出に使用されます。同時にTencent CloudとAkismetを設定した場合、Tencent Cloudのみが有効になります。登録:https://twikoo.js.org/cms.html", + "Tencent Cloud secret id (스팸 감지용). Tencent Cloud와 Akismet 동시 설정 시 Tencent Cloud만 적용. 등록: https://twikoo.js.org/cms.html", + ], + ), + u + "_QCLOUD_CMS_BIZTYPE", + [ + "腾讯云内容安全 Biztype 名称,用于垃圾评论策略。可以自定义垃圾拦截规则", + "騰訊雲內容安全 Biztype 名稱,用於垃圾評論策略。可以自定義垃圾攔截規則", + "騰訊雲內容安全 Biztype 名稱,用於垃圾評論策略。可以自定義垃圾攔截規則", + "Tencent Cloud Content Security Biztype name for spam comment policy. Spam blocking rules can be customized", + "Tencent Cloud Content Security Biztype име, използвано за спам политика. Може да персонализира правилата за блокиране на спам", + "Tencent Cloud Content Security Biztype name スパムコメントポリシー。スパムブロックルールはカスタマイズ可能", + "Tencent Cloud Content Security Biztype 이름 (스팸 댓글 정책용). 스팸 차단 규칙 설정 가능.", + ], + ), + u + "_QCLOUD_SECRET_KEY", + [ + "腾讯云 secret key", + "騰訊雲 secret key", + "騰訊雲 Secret Key", + "Tencent Cloud secret key.", + "Тенсент Клауд махфий калити.", + "Tencent Cloudのシークレットキー", + "Tencent Cloud Secret Key.", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, u + "_PUSHOO_CHANNEL", [ + "即时消息推送平台名称,支持:".concat( + l.join("、"), + " 等", + ), + "即時消息推送平台名称,支持:".concat( + l.join("、"), + " 等", + ), + "即時訊息推送平台名稱,支援:".concat( + l.join("、"), + " 等", + ), + "IM notification push channel. Support: ".concat( + l.join(", "), + ), + "ИМ билдиришномаси суриш канали. Қўллаб-қувватлаш: ".concat( + l.join(", "), + ), + "即時メッセージプッシュプラットフォームの名前。".concat( + l.join("、"), + " などに対応しています。", + ), + "실시간 알림을 받을 서비스 설정. 지원: ".concat( + l.join(", "), + ), + ]), + u + "_PUSHOO_TOKEN", + [ + "即时消息推送 token。请参考 https://pushoo.js.org 里的详细说明配置", + "即時消息推送 token。请参考 https://pushoo.js.org 里的详细说明配置", + "即時訊息推送 Token。請参考 https://pushoo.js.org 裡的詳細說明進行設定", + "IM notification push token. See https://pushoo.js.org for details", + "ИМ билдиришномаси пуш токени. Тафсилотлар учун https://pushoo.js.org га қаранг", + "即時メッセージプッシュトークン。詳細な設定については、https://pushoo.js.org の説明をご覧ください", + "선택한 실시간 알림 서비스 인증 토큰. 설정 방법은 https://pushoo.js.org 를 참조.", + ], + ), + u + "_DISPLAYED_FIELDS", + [ + "界面上展示的输入框,默认:nick,mail,link", + "界面上顯示的輸入框,預設:nick,mail,link", + "界面上顯示的輸入框,預設:nick,mail,link", + "Input boxes displayed on the interface. Default: nick,mail,link", + "Поля ввода, отображаемые на интерфейсе, Стандарт: nick,mail,link", + "画面に表示される入力欄。デフォルト:nick,mail,link", + "화면에 표시할 정보 입력란. 기본값: nick,mail,link", + ], + ), + u + "_REQUIRED_FIELDS", + [ + "评论必填信息,设为 nick,mail,link 代表全必填,设为 none 代表全选填,默认:nick,mail", + "評論必填信息,設為 nick,mail,link 代表全必填,設為 none 代表全選填,預設:nick,mail", + "留言必填資訊,設為 nick,mail,link 代表全必填,設為 none 代表全選填,預設:nick,mail", + 'Required fields for comments. Set to "nick,mail,link" means all fields are required. Set to "none" means all fields are optional. Default: nick,mail.', + "Шарҳлар учун зарур майдонлар. «Ниск,маил,линк» га ўрнатилган бўлса, барча майдонлар талаб қилинади. «Йўқ» га ўрнатилиши барча майдонлар ихтиёрий эканлигини англатади. Стандарт: ник, почта.", + "コメント必須項目。すべてを必須にする場合は nick,mail,link に設定、すべてを任意にする場合はnoneに設定してください。デフォルト:nick,mail", + '댓글 작성 시 필수 입력 정보. "nick,mail,link"는 모두 필수, "none"은 모두 선택 압력. 기본값: nick,mail.', + ], + ), + u + "_SC_MAIL_NOTIFY", + [ + "是否同时通过 IM 和邮件 2 种方式通知博主,默认只通过 IM 通知博主,默认:false", + "是否同時通過 IM 和郵件 2 種方式通知博主,預設只通過 IM 通知博主,預設:false", + "是否同時透過 IM 和郵件 2 種方式通知博主,預設只透過 IM 通知博主,預設:false", + "Whether to notify admin via IM and email at the same time, the default is to notify admin only via IM. Default: false.", + "Администраторни бир вақтнинг ўзида ИМ ва электрон почта орқали хабардор қилиш керакми, сукут бўйича администраторни фақат ИМ орқали хабардор қилиш керак. Стандарт: нотўғри.", + "管理者にIMとメールで同時に通知するかどうか。デフォルトはIMのみで通知、デフォルト:false", + "실시간 알림과 이메일로 동시에 관리자에게 알릴지 여부. 기본값은 실시간 알림만 사용. 기본값: false.", + ], + ), + u + "_SENDER_EMAIL", + [ + "邮件通知邮箱地址。对于大多数邮箱服务商,SENDER_EMAIL 必须和 SMTP_USER 保持一致,否则无法发送邮件。", + "郵件通知郵箱地址。對於大多數郵箱服務商,SENDER_EMAIL 必須和 SMTP_USER 保持一致,否則無法發送郵件。", + "郵件通知郵箱帳號。對於大多數電郵服務提供商,SENDER_EMAIL 必須和 SMTP_USER 保持一致,否則無法傳送郵件。", + "Email address for Email notification. For most email service providers, SENDER_EMAIL must be consistent with SMTP_USER, otherwise emails cannot be sent.", + "Электрон почта хабарномаси учун электрон почта манзили. Аксарият электрон почта хизмати провайдерлари учун SENDER_EMAIL билан мос келиши керак, акс ҳолда электрон почта хабарларини юбориб бўлмайди.", + "メール通知のメールアドレス。 ほとんどのメールボックス・プロバイダでは、SENDER_EMAILはSMTP_USERと同じでなければなりません。", + "알림 이메일 발신 주소. 대부분의 이메일 서비스 제공자의 경우 SENDER_EMAIL과 SMTP_USER가 일치해야 메일 발송이 가능합니다.", + ], + ), + u + "_SENDER_NAME", + [ + "邮件通知标题。", + "郵件通知標題。", + "郵件通知標題。", + "The title for Email notification.", + "Электрон почта хабарномаси сарлавҳаси.", + "メール通知のタイトル", + "알림 이메일 발신자 이름.", + ], + ), + u + "_SHOW_EMOTION", + [ + "启用插入表情功能,默认为:true", + "啟用插入表情功能,預設為:true", + "啟用插入表情功能,預設為:true", + "Enable emojis. Default: true.", + "Кулгичларни ёқинг. Стандарт: рост.", + "顔文字の挿入を有効にするかどうか。デフォルト:true", + "이모티콘 삽입 기능 활성화. 기본값: true.", + ], + ), + u + "_SHOW_IMAGE", + [ + "启用插入图片功能,默认为:true", + "啟用插入圖片功能,預設為:true", + "啟用插入圖片功能,預設為:true", + "Enable picture uploading. Default: true.", + "Расм юклашни ёқинг. Стандарт: рост.", + "画像のアップロードを有効にするかどうか。デフォルト:true", + "이미지 업로드 기능 활성화. 기본값: true.", + ], + ), + u + "_SHOW_UA", + [ + "是否显示用户系统和浏览器,默认为:true", + "是否顯示使用者系統和瀏覽器,預設為:true", + "是否顯示使用者作業系統和瀏覽器,預設為:true", + "Show users' OS and browser. Default: true.", + "Фойдаланувчиларнинг ОС ва браузерини кўрсатиш. Стандарт: рост.", + "ユーザーのOSとブラウザーの情報を表示するかどうか。デフォルト:true", + "댓글 작성자의 운영체제 및 브라우저 표시 여부. 기본값: true.", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, u + "_SHOW_REGION", [ + "是否显示用户 IP 属地到省,可能不准确,不支持 IPv6,默认为:false", + "是否顯示使用者 IP 屬地到省,預設為:false", + "是否顯示使用者 IP 所屬地(精確到省),預設為:false", + "Show users' IP region (province). Default: false.", + "Фойдаланувчиларнинг ИП ҳудудини (вилоят) кўрсатиш. Стандарт: нотўғри.", + "ユーザーIPの所在地(省)を表示するかどうか。正確でない場合があります。IPv6はサポートされていません。デフォルト:false", + "사용자 IP 지역(도/시 단위) 표시 여부 (부정확할 수 있음, IPv6 미지원). 기본값: false.", + ]), + u + "_SITE_NAME", + [ + "网站名称", + "網站名稱", + "網站名稱", + "Website name.", + "Вебсайт номи.", + "ウェブサイト名", + "웹사이트 이름.", + ], + ), + u + "_SITE_URL", + [ + "网站地址", + "網站地址", + "網站網址", + "Website URL.", + "Вебсайт URL.", + "ウェブサイトのアドレス", + "웹사이트 주소.", + ], + ), + u + "_SMTP_HOST", + [ + "自定义 SMTP 服务器地址。如您已配置 SMTP_SERVICE,此项请留空。", + "自定義 SMTP 伺服器地址。如您已配置 SMTP_SERVICE,此項請留空。", + "自訂 SMTP 伺服器位址。如您已設定 SMTP_SERVICE,此項請留白。", + "Custom SMTP server address. If you have configured SMTP_SERVICE, please leave it empty.", + "Махсус СМТП сервер манзили. Агар сиз СМТП_СEРВИСE созлаган бўлсангиз, уни бўш қолдиринг.", + "自定义 SMTP 服务器地址。如您已配置 SMTP_SERVICE,此项请留空。", + "カスタムSMTPサーバのアドレス。SMTP_SERVICEを設定している場合は空白のままにします。", + "SMTP 서버 주소. SMTP_SERVICE를 설정한 경우 비워두세요.", + ], + ), + u + "_SMTP_PASS", + [ + "邮件通知邮箱密码,QQ、163邮箱请填写授权码。", + "郵件通知郵箱密碼,QQ、163郵箱請填寫授權碼。", + "郵件通知郵箱密碼,QQ、163 郵箱請填寫授權碼。", + "Email notification mailbox password. Enter authorization code for QQ/163 mail.", + "Электрон почта хабарномаси почта қутиси пароли. ҚҚ/163 почтаси учун авторизация кодини киритинг.", + "メール通知のメールボックスパスワード。QQ、163メールは認証コードを入力してください", + "알림 이메일 계정 SMTP용 비밀번호. (QQ, 163 등 대부분 별도의 앱 비밀번호/인증 코드 사용)", + ], + ), + u + "_SMTP_PORT", + [ + "自定义 SMTP 端口。如您已配置 SMTP_SERVICE,此项请留空。", + "自定義 SMTP 端口。如您已配置 SMTP_SERVICE,此項請留空。", + "自訂 SMTP 連接埠。如您已設定 SMTP_SERVICE,此項請留白。", + "Custom SMTP port. If you have configured SMTP_SERVICE, please leave it empty.", + "Махсус СМТП порти. Агар сиз СМТП_СEРВИС созлаган бўлсангиз, уни бўш қолдиринг.", + "カスタムSMTPポート。SMTP_SERVICEを設定している場合は、空白のままにします。", + "SMTP 포트. SMTP_SERVICE를 설정한 경우 비워두세요.", + ], + ), + u + "_SMTP_SECURE", + [ + "自定义 SMTP 是否使用TLS,请填写 true 或 false。如您已配置 SMTP_SERVICE,此项请留空。", + "自定義 SMTP 是否使用TLS,請填寫 true 或 false。如您已配置 SMTP_SERVICE,此項請留空。", + "自訂 SMTP 是否使用 TLS,請填寫 true 或 false。如您已設定 SMTP_SERVICE,此項請留白。", + 'Custom TLS for SMTP. Enter "true" or "false". If you have configured SMTP_SERVICE, please leave it empty.', + "СМТП учун махсус ТЛС. «Тўғри» ёки «нотўғри» ни киритинг. Агар сиз СМТП_СEРВИС созлаган бўлсангиз, уни бўш қолдиринг.", + "SMTPがTLSを使用するかどうかをカスタマイズします。trueまたはfalseを記入してください。SMTP_SERVICEを設定している場合は、この項目を空白にしてください。", + "SMTP TLS 사용 여부 (true 또는 false 입력). SMTP_SERVICE를 설정한 경우 비워두세요.", + ], + ), + u + "_SMTP_SERVICE", + [ + "邮件通知邮箱服务商。支持:".concat(d.join("、")), + "郵件通知郵箱服務商。支持:".concat(d.join("、")), + "郵件通知郵箱服務提供商。支援:".concat(d.join("、")), + "Email service provider for Email notification. Support: ".concat( + d.join(", "), + ), + "Электрон почта хабарномаси учун электрон почта хизмати провайдери. Қўллаб-қувватлаш: ".concat( + d.join(", "), + ), + "メール通知メールボックスサービスプロバイダ。サポート: ".concat( + d.join(","), + ".", + ), + "알림 발송 이메일 서비스 선택. 지원 목록: ".concat( + d.join(", "), + ), + ], + ), + u + "_SMTP_USER", + [ + "邮件通知邮箱用户名。", + "郵件通知郵箱用户名。", + "郵件通知郵箱使用者名稱。", + "Email notification mailbox username.", + "Электрон почта хабарномаси почта қутиси фойдаланувчи номи.", + "メール通知のメールボックスユーザー名。", + "선택한 이메일 알림 서비스 아이디", + ], + ), + "ADMIN_CONFIG_RESET", + [ + "重置", + "重置", + "還原", + "Reset", + "Ресет", + "リセット", + "초기화", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, "ADMIN_CONFIG_SAVE", [ + "保存", + "保存", + "儲存", + "Save", + "Сақлаш", + "保存", + "저장", + ]), + "ADMIN_CREDENTIALS", + [ + "私钥文件", + "私鑰文件", + "私鑰檔案", + "Private key file", + "Shaxsiy kalit fayli", + "秘密鍵ファイル", + "개인 키 파일", + ], + ), + "ADMIN_CREDENTIALS_FAQ", + [ + "如何获得私钥", + "如何獲得私鑰", + "如何獲取私鑰", + "How to get the private key", + "Shaxsiy kalitni qanday olish mumkin", + "秘密鍵を取得する方法", + "개인 키 발급 방법", + ], + ), + "ADMIN_CREDENTIALS_PLACEHOLDER", + [ + "请粘贴私钥文件内容", + "請貼上私鑰文件內容", + "請貼上私鑰檔案內容", + "Please paste the contents of the private key file", + "Iltimos, shaxsiy kalit faylining mazmunini joylashtiring", + "秘密鍵ファイルの内容を貼り付けてください", + "개인 키 파일 내용을 붙여넣으세요", + ], + ), + "ADMIN_FORGOT", + [ + "忘记密码", + "忘記密碼", + "忘記密碼", + "Forget your password", + "Парол унутилган", + "パスワードを忘れた", + "비밀번호 찾기", + ], + ), + "ADMIN_EXPORT", + [ + "导出", + "匯出", + "匯出", + "Export", + "Экспорт", + "エクスポート", + "내보내기", + ], + ), + "ADMIN_EXPORT_WARN", + [ + "将全部数据导出为 JSON 文件。如果遇到评论较多、导出失败或缺失数据,请连接数据库手动导出", + "將全部數據匯出為 JSON 檔。如果遇到評論較多、匯出失敗或缺失數據,請連接資料庫手動匯出", + "將全部數據匯出為 JSON 檔。如果遇到評論較多、匯出失敗或缺失數據,請連接資料庫手動匯出", + "Export all data as a JSON file. If you encounter export failures or missing data, connect to the database to export manually", + "Барча маълумотларни ЖСОН файли сифатида экспорт қилинг. Экспорт хатоси ёки этишмаётган маълумотларга дуч келсангиз, қўлда экспорт қилиш учун маълумотлар базасига уланинг", + "すべてのデータをJSONファイルとしてエクスポートします。コメントが多く、エクスポートに失敗したりデータが欠落している場合は、データベースに手動で接続してエクスポートしてください", + "모든 데이터를 JSON 파일로 내보냅니다. 댓글이 많아 내보내기 실패 또는 데이터 누락 발생 시, 데이터베이스에 직접 연결하여 수동으로 내보내세요.", + ], + ), + "ADMIN_EXPORT_COMMENT", + [ + "导出评论", + "匯出評論", + "匯出評論", + "Export comment", + "Изохни экспорт килиш", + "コメントをエクスポート", + "댓글 내보내기", + ], + ), + "ADMIN_EXPORT_COUNTER", + [ + "导出访问量", + "匯出訪問量", + "匯出訪問量", + "Export counter", + "Экспорт сони", + "ページビューをエクスポート", + "통계 내보내기", + ], + ), + c, + [ + "导入", + "匯入", + "匯入", + "Import", + "Импорт", + "インポート", + "가져오기", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, c + "_FILE_REQUIRED", [ + "未选择文件", + "未選擇文件", + "未選擇檔案", + "No file selected", + "Файлни танланмади", + "ファイルが選択されていません", + "파일이 선택되지 않았습니다", + ]), + c + "_IMPORTED", + [ + "完成导入 ", + "完成匯入 ", + "完成匯入 ", + "Imported ", + "Импорт қилинди ", + "インポート完了 ", + "가져오기 완료 ", + ], + ), + c + "_IMPORTING", + [ + "开始导入 ", + "開始匯入 ", + "開始匯入 ", + "Importing ", + "Импорт қилинмоқда ", + "インポートを開始 ", + "가져오는 중 ", + ], + ), + c + "_LOG", + [ + "日志", + "日誌", + "日誌", + "Log", + "Лог", + "システムログ", + "로그", + ], + ), + c + "_SELECT", + [ + "请选择", + "請選擇", + "請選擇", + "Select", + "Танланг", + "選択してください", + "선택하세요", + ], + ), + c + "_SELECT_FILE", + [ + "选择文件", + "選擇文件", + "選擇檔案", + "Select file", + "Файлни танланг", + "ファイルを選択", + "파일 선택", + ], + ), + c + "_SELECT_SOURCE", + [ + "选择源系统", + "選擇源系統", + "選擇來源系統", + "Select source", + "Манба танланг", + "ソースを選択", + "가져올 댓글 데이터 선택", + ], + ), + c + "_SOURCE_REQUIRED", + [ + "未选择源系统", + "未選擇源系統", + "未選擇來源系統", + "No source selected.", + "Ҳеч қандай манба танланмаган.", + "ソースが選択されていません", + "가져올 댓글 데이터가 선택되지 않았습니다.", + ], + ), + c + "_START", + [ + "开始导入", + "開始匯入", + "開始匯入", + "Start import", + "Импортни бошлаш", + "インポートを開始", + "가져오기 시작", + ], + ), + c + "_STARTING", + [ + "开始导入", + "開始匯入", + "開始匯入", + "Importing", + "Импорт қилинмоқда", + "インポート中です", + "가져오는 중", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, c + "_TIP_ARTALK", [ + "请上传 JSON 格式的 Artalk 导出文件,文件名通常为 comments.data.json", + "請上傳 JSON 格式的 Artalk 導出文件,文件名通常為 comments.data.json", + "請上傳 JSON 格式的 Artalk 匯出檔案,檔名通常為 comments.data.json", + "Please upload the Artalk export file in JSON format.The file name is usually comments.data.json", + "Арталк экспорт файлини ЖСОН форматида юкланг. Файл номи одатда comments.data.json бўлади.", + "JSON形式のArtalkエクスポートファイルをアップロードしてください。ファイル名は通常、comments.data.jsonです。", + "JSON 형식의 Artalk 내보내기 파일을 업로드하세요. 파일 이름은 보통 comments.data.json 입니다.", + ]), + c + "_TIP_DISQUS", + [ + "请上传 XML 格式的 Disqus 导出文件,文件名通常为 [网站名称]-[导出时间]-all.xml", + "請上傳 XML 格式的 Disqus 導出文件,文件名通常為 [網站名稱]-[導出時間]-all.xml", + "請上傳 XML 格式的 Disqus 匯出檔案,檔名通常為 [網站名稱]-[匯出時間]-all.xml", + "Please upload the Disqus export file in XML format. The file name is usually [website name]-[export time]-all.xml", + "Disqus экспорт файлини ХМЛ форматида юкланг. Файл номи одатда [веб-сайт номи]-[экспорт vaqti]-all.xml", + "DisqusエクスポートファイルをXML形式でアップロードしてください。ファイル名は通常、[サイト名]-[エクスポート時間]-all.xmlです。", + "XML 형식의 Disqus 내보내기 파일을 업로드하세요. 파일 이름은 보통 [웹사이트이름]-[내보내기시간]-all.xml 입니다.", + ], + ), + c + "_TIP_VALINE", + [ + "请上传 JSON 格式的 Valine 导出文件,文件名通常为 Comment.json", + "請上傳 JSON 格式的 Valine 導出文件,文件名通常為 Comment.json", + "請上傳 JSON 格式的 Valine 匯出檔案,檔名通常為 Comment.json", + "Please upload the Valine export file in JSON format. The file name is usually Comment.json", + "Илтимос, Валине экспорт файлини ЖСОН форматида юкланг. Файл номи одатда Comment.json", + "JSON形式のValineエクスポートファイルをアップロードしてください。ファイル名は通常、Comment.jsonです。", + "JSON 형식의 Valine 내보내기 파일을 업로드하세요. 파일 이름은 보통 Comment.json 입니다.", + ], + ), + c + "_UPLOADED", + [ + "上传完成 ", + "上傳完成 ", + "上傳完成 ", + "Uploaded ", + "Юкланди ", + "アップロード完了", + "업로드 완료 ", + ], + ), + c + "_UPLOADING", + [ + "已上传 ", + "已上傳 ", + "已上傳 ", + "Uploading ", + "Юкланмоқда ", + "アップロード中です", + "업로드 중 ", + ], + ), + c + "_WARN", + [ + "支持从其他评论系统的备份文件导入评论。\n数据是安全的,导入功能完全在您的云环境进行。\n建议在导入前备份 comment 数据库。", + "支持從其他評論系統的備份文件匯入評論。\n數據是安全的,匯入功能完全在您的雲環境進行。\n建議在匯入前備份 comment 數據庫。", + "支援從其他留言系統的備份檔案匯入留言。\n資料是安全的,匯入功能完全在您的雲端環境進行。\n建議在匯入前備份 comment 資料庫。", + "Import comments from other comment systems.\nThe data is safe, and the import function is performed entirely in your cloud environment.\nPlease backup your comment database before importing.", + "Бошқа шарҳ тизимларидан шарҳларни импорт қилинг.\nМаълумотлар хавфсиз ва импорт функцияси тўлиқ булутли муҳитда амалга оширилади.\nИмпорт қилишдан олдин шарҳлар маълумотлар базасини захираланг.", + "他のコメントシステムのバックアップファイルからのインポートに対応。\nデータは安全で、インポート機能はすべてクラウド環境で実行されます。\nインポート前にコメントデータベースをバックアップすることを推奨します。", + "다른 댓글 시스템의 백업 파일에서 댓글을 가져올 수 있습니다.\n데이터 가져오기는 설정하신 클라우드에서만 안전하게 진행됩니다.\n가져오기 전에 댓글 데이터베이스를 백업하는 것이 좋습니다.", + ], + ), + "ADMIN_LOGIN", + [ + "登录", + "登入", + "登入", + "Sign in", + "Тизимга кириш", + "ログイン", + "로그인", + ], + ), + "ADMIN_LOGIN_TITLE", + [ + "Twikoo 评论管理", + "Twikoo 評論管理", + "Twikoo 留言管理", + "Twikoo Management Panel", + "Twikoo Бошқарув Панели", + "Twikoo コメント管理", + "Twikoo 관리자 패널", + ], + ), + "ADMIN_LOGOUT", + [ + "退出登录", + "退出登入", + "登出", + "Sign out", + "Тизимдан чиқиш", + "ログアウト", + "로그아웃", + ], + ), + "ADMIN_NEED_UPDATE", + [ + "若要使用评论管理,请更新 Twikoo 云函数", + "若要使用評論管理,請更新 Twikoo 雲函數", + "若要使用留言管理功能,請更新 Twikoo 雲端函數", + "A new version of Twikoo is required for comment management.", + "Фикрларни бошқариш учун Твикоо нинг янги версияси талаб қилинади.", + "コメント管理を使用するには、Twikoo クラウド関数を更新してください", + "새 버전의 댓글 관리를 사용하려면 Twikoo Cloud Function을 업데이트하세요.", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, "ADMIN_PASSWORD", [ + "密码", + "密碼", + "密碼", + "Password", + "Пароль", + "パスワード", + "비밀번호", + ]), + "ADMIN_PASSWORD_PLACEHOLDER", + [ + "请输入", + "請輸入", + "請輸入", + "Enter your password...", + "Паролингизни киритинг...", + "入力してください", + "비밀번호를 입력하세요...", + ], + ), + "ADMIN_PASSWORD_REQUIRED", + [ + "请输入密码", + "請輸入密碼", + "請輸入密碼", + "Please enter your password", + "Илтимос, паролингизни киритинг", + "パスワードを入力してください", + "비밀번호를 입력하세요", + ], + ), + "ADMIN_REGIST", + [ + "注册", + "註冊", + "註冊", + "Register", + "Рўйхатдан ўтиш", + "登録", + "관리자 등록", + ], + ), + "ADMIN_REGIST_FAILED", + [ + "注册失败", + "註冊失敗", + "註冊失敗", + "Register failed", + "Рўйхатдан ўтиш амалга ошмади", + "登録に失敗しました", + "관리자 등록 실패", + ], + ), + "ADMIN_SET_PASSWORD", + [ + "设置密码", + "設置密碼", + "設定密碼", + "Set password", + "Пароль қўйиш", + "パスワードの設定", + "비밀번호 설정", + ], + ), + "ADMIN_SET_PASSWORD_CONFIRM", + [ + "确认密码", + "確認密碼", + "確認密碼", + "Confirm password", + "Паролни тасдиқланг", + "パスワードの確認", + "비밀번호 확인", + ], + ), + "ADMIN_SET_PASSWORD_CONFIRM_PLACEHOLDER", + [ + "确认密码", + "確認密碼", + "確認密碼", + "Confirm password...", + "Паролни тасдиқлаш...", + "パスワードの確認", + "비밀번호 확인...", + ], + ), + "ADMIN_SET_PASSWORD_PLACEHOLDER", + [ + "密码", + "密碼", + "密碼", + "Password", + "Пароль", + "パスワード", + "비밀번호", + ], + ), + "ADMIN_TITLE", + [ + "Twikoo 管理面板", + "Twikoo 管理面板", + "Twikoo 管理控制台", + "Twikoo Management Panel", + "Twikoo Бошқарув Панели", + "Twikoo管理パネル", + "Twikoo 관리 패널", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, "COMMENTS_COUNT_SUFFIX", [ + " 条评论", + " 條評論", + " 則留言", + " comments", + " изоҳлар", + " 件のコメント", + "개의 댓글", + ]), + "COMMENTS_EXPAND", + [ + "查看更多", + "查看更多", + "檢視更多", + "Load more", + "Давомини юклаш", + "もっと見る", + "더 보기", + ], + ), + "COMMENTS_NO_COMMENTS", + [ + "没有评论", + "沒有評論", + "沒有留言", + "No comment", + "Изоҳларсиз", + "コメントはありません", + "아직 댓글이 없습니다.", + ], + ), + "COMMENT_EXPAND", + [ + "展开", + "展開", + "展開", + "Read more", + "Давомини ўқиш", + "全文を表示", + "더 보기", + ], + ), + "COMMENT_COLLAPSE", + [ + "收起", + "收起", + "閉合", + "Collapse", + "Очиш", + "折りたたむ", + "접기", + ], + ), + "COMMENT_MASTER_TAG", + [ + "博主", + "博主", + "站長", + "Admin", + "Модератор", + "管理者", + "관리자", + ], + ), + "COMMENT_REPLIED", + [ + "回复", + "回覆", + "回覆", + "Reply", + "Жавоб бериш", + "返信", + "답글", + ], + ), + "COMMENT_REVIEWING_TAG", + [ + "审核中", + "審核中", + "審核中", + "Pending", + "Кутилмоқда", + "検討中", + "검토 중", + ], + ), + "COMMENT_TOP_TAG", + [ + "置顶", + "置頂", + "置頂", + "Pinned", + "Қадоқланган", + "固定", + "고정됨", + ], + ), + "COMMENT_FAILED", + [ + "评论失败", + "評論失敗", + "評論失敗", + "Comment failed", + "Фикр билдирилмади", + "コメント失敗", + "댓글 등록 실패", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, "META_INPUT_LINK", [ + "网址", + "網址", + "網址", + "Website", + "Веб-сайт", + "ウェブサイト", + "웹사이트", + ]), + "META_INPUT_MAIL", + [ + "邮箱", + "郵箱", + "郵箱", + "Email", + "Email", + "メールアドレス", + "이메일", + ], + ), + "META_INPUT_NICK", + [ + "昵称", + "暱稱", + "暱稱", + "Nickname", + "Исм", + "名前", + "닉네임", + ], + ), + "META_INPUT_NOT_REQUIRED", + [ + "选填", + "選填", + "選填", + "Optional", + "Ихтиёрий", + "任意", + "선택", + ], + ), + "META_INPUT_REQUIRED", + [ + "必填", + "必填", + "必填", + "Required", + "Мажбурий", + "必須", + "필수", + ], + ), + "PAGINATION_COUNT_PREFIX", + ["共 ", "共 ", "共 ", "", "", "合計 ", "총 "], + ), + "PAGINATION_COUNT_SUFFIX", + [ + " 条", + " 條", + " 條", + " entries", + " ёзувлар", + " 件", + "개", + ], + ), + "PAGINATION_GOTO_PREFIX", + [ + "前往", + "前往", + "前往", + "Goto page", + "Саҳифага ўтиш", + "ページに移動", + "이동할 페이지: ", + ], + ), + "PAGINATION_GOTO_SUFFIX", + ["页", "頁", "頁", "", "ページ", ""], + ), + "PAGINATION_PAGESIZE", + [ + "条/页", + "條/頁", + "則/頁", + "entries/page", + "ёзувлар/саҳифа", + "件/ページ", + "개/페이지", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, "SUBMIT_CANCEL", [ + "取消", + "取消", + "取消", + "Cancel", + "Бекор қилиш", + "キャンセル", + "취소", + ]), + "SUBMIT_PREVIEW", + [ + "预览", + "預覽", + "預覽", + "Preview", + "Кўриб чиқиш", + "プレビュー", + "미리보기", + ], + ), + "SUBMIT_SEND", + [ + "发送", + "發送", + "傳送", + "Send", + "Юбормоқ", + "送信", + "등록", + ], + ), + "IMAGE_UPLOAD_PLACEHOLDER", + [ + "图片上传中", + "圖片上傳中", + "圖片上傳中", + "Uploading image", + "Расм юклаш", + "画像のアップロード中", + "이미지 업로드 중", + ], + ), + "IMAGE_UPLOAD_FAILED", + [ + "图片上传失败", + "圖片上傳失敗", + "圖片上傳失敗", + "IMAGE UPLOAD FAILED", + "РАСМ ЮКЛАНМАДИ", + "画像のアップロード失敗", + "이미지 업로드 실패", + ], + ), + "IMAGE_UPLOAD_FAILED_NO_CONF", + [ + "博主未配置图床服务", + "博主未配置圖床服務", + "博主未配置圖床服務", + "The blogger didn't configured any image bed service", + "Муаллиф ҳеч қандай тасвир хизматини созламаган", + "管理者が画像配信サービスを設定していません", + "블로거가 이미지 호스팅 서비스를 설정하지 않았습니다.", + ], + ), + "IMAGE_UPLOAD_PLEASE_WAIT", + [ + "图片上传中,请稍候再发送", + "圖片上傳中,請稍候再發送", + "圖片上傳中,請稍候再傳送", + "Uploading image, please try again later", + "Расм юкланмоқда, кейинроқ қайта уриниб кўринг", + "画像のアップロードが完了するまでお待ちください", + "이미지 업로드 중입니다. 잠시 후 다시 시도해주세요.", + ], + ), + "SUBMIT_SENDING", + [ + "发送中", + "發送中", + "正在傳送", + "Sending", + "Юбориш", + "送信中", + "등록 중", + ], + ), + "TIMEAGO_DAYS", + [ + "天前", + "天前", + "天前", + "days ago", + "кунлар олдин", + "日前", + "일 전", + ], + ), + "TIMEAGO_HOURS", + [ + "小时前", + "小時前", + "小時前", + "hours ago", + "соатлар олдин", + "時間前", + "시간 전", + ], + ), + (0, o["default"])( + (0, o["default"])( + (0, o["default"])(i, "TIMEAGO_MINUTES", [ + "分钟前", + "分鐘前", + "分鐘前", + "minutes ago", + "дақиқалар олдин", + "分前", + "분 전", + ]), + "TIMEAGO_NOW", + [ + "刚刚", + "剛剛", + "剛剛", + "Just now", + "Ҳозиргина", + "たった今", + "방금 전", + ], + ), + "TIMEAGO_SECONDS", + [ + "秒前", + "秒前", + "秒前", + "seconds ago", + "сониялар олдин", + "秒前", + "초 전", + ], + )); + }, + 5878: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.setLanguage = t["default"] = void 0)); + var i = r(n(7564)), + o = { + zh: 0, + "zh-cn": 0, + "zh-hk": 1, + "zh-tw": 2, + "en-us": 3, + "en-gb": 3, + en: 3, + uz: 4, + "uz-uz": 4, + ja: 5, + "ja-jp": 5, + ko: 6, + "ko-kr": 6, + }, + a = ""; + ((t.setLanguage = function () { + var e = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : {}; + e.lang && e.lang.toLowerCase() in o && (a = e.lang); + }), + (t["default"] = function (e, t) { + var n = (t || a || navigator.language).toLowerCase(); + return ( + (n && o[n] + ? i["default"][e][o[n]] + : i["default"][e][o["zh-cn"]]) || "" + ); + })); + }, + 8129: function (e, t, n) { + "use strict"; + var r = n(477), + i = n(9367); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.blobToDataURL = void 0), + Object.defineProperty(t, "call", { + enumerable: !0, + get: function () { + return p.call; + }, + }), + (t.getHref = + t.getFuncVer = + t.getCommentsCountApi = + t.convertLink = + void 0), + Object.defineProperty(t, "getQQAvatar", { + enumerable: !0, + get: function () { + return h.getQQAvatar; + }, + }), + (t.getUserAgent = t.getUrl = t.getRecentCommentsApi = void 0), + Object.defineProperty(t, "initMarkedOwo", { + enumerable: !0, + get: function () { + return m.initMarkedOwo; + }, + }), + Object.defineProperty(t, "initOwoEmotions", { + enumerable: !0, + get: function () { + return m.initOwoEmotions; + }, + }), + (t.isNotSet = void 0), + Object.defineProperty(t, "isQQ", { + enumerable: !0, + get: function () { + return h.isQQ; + }, + }), + Object.defineProperty(t, "isUrl", { + enumerable: !0, + get: function () { + return p.isUrl; + }, + }), + (t.logger = void 0), + Object.defineProperty(t, "marked", { + enumerable: !0, + get: function () { + return d["default"]; + }, + }), + Object.defineProperty(t, "normalizeMail", { + enumerable: !0, + get: function () { + return h.normalizeMail; + }, + }), + (t.readAsText = void 0), + Object.defineProperty(t, "renderCode", { + enumerable: !0, + get: function () { + return f["default"]; + }, + }), + (t.renderMath = t.renderLinks = void 0), + Object.defineProperty(t, "setLanguage", { + enumerable: !0, + get: function () { + return c.setLanguage; + }, + }), + Object.defineProperty(t, "t", { + enumerable: !0, + get: function () { + return c["default"]; + }, + }), + Object.defineProperty(t, "timeago", { + enumerable: !0, + get: function () { + return l["default"]; + }, + }), + (t.timestamp = void 0)); + var o, + a = r(n(479)), + s = r(n(1819)), + u = r(n(4964)), + c = (function (e, t) { + if (!t && e && e.__esModule) return e; + if (null === e || ("object" != i(e) && "function" != typeof e)) + return { default: e }; + var n = g(t); + if (n && n.has(e)) return n.get(e); + var r = { __proto__: null }, + o = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var a in e) + if ( + "default" !== a && + Object.prototype.hasOwnProperty.call(e, a) + ) { + var s = o ? Object.getOwnPropertyDescriptor(e, a) : null; + s && (s.get || s.set) + ? Object.defineProperty(r, a, s) + : (r[a] = e[a]); + } + return ((r["default"] = e), n && n.set(e, r), r); + })(n(5878)), + l = r(n(7435)), + d = r(n(37)), + f = r(n(4161)), + p = n(585), + h = n(7080), + m = n(9212); + function g(e) { + if ("function" != typeof WeakMap) return null; + var t = new WeakMap(), + n = new WeakMap(); + return (g = function (e) { + return e ? n : t; + })(e); + } + function v(e, t) { + var n = + ("undefined" != typeof Symbol && e[Symbol.iterator]) || + e["@@iterator"]; + if (!n) { + if ( + Array.isArray(e) || + (n = (function (e, t) { + if (e) { + if ("string" == typeof e) return _(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return ( + "Object" === n && + e.constructor && + (n = e.constructor.name), + "Map" === n || "Set" === n + ? Array.from(e) + : "Arguments" === n || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ? _(e, t) + : void 0 + ); + } + })(e)) || + (t && e && "number" == typeof e.length) + ) { + n && (e = n); + var r = 0, + i = function () {}; + return { + s: i, + n: function () { + return r >= e.length + ? { done: !0 } + : { done: !1, value: e[r++] }; + }, + e: function (e) { + throw e; + }, + f: i, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + } + var o, + a = !0, + s = !1; + return { + s: function () { + n = n.call(e); + }, + n: function () { + var e = n.next(); + return ((a = e.done), e); + }, + e: function (e) { + ((s = !0), (o = e)); + }, + f: function () { + try { + a || null == n["return"] || n["return"](); + } finally { + if (s) throw o; + } + }, + }; + } + function _(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r; + } + ((t.isNotSet = function (e) { + return e === undefined || null === e || "" === e; + }), + (t.logger = { + log: function (e, t) { + console.log("Twikoo: ".concat(e), t); + }, + info: function (e, t) { + console.info("Twikoo: ".concat(e), t); + }, + warn: function (e, t) { + console.warn("Twikoo: ".concat(e), t); + }, + error: function (e, t) { + console.error("Twikoo: ".concat(e), t); + }, + }), + (t.timestamp = function () { + return ( + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : new Date() + ).getTime(); + }), + (t.convertLink = function (e) { + return e + ? "http" !== e.substring(0, 4) + ? "http://".concat(e) + : e + : ""; + }), + (t.getFuncVer = (function () { + var e = (0, u["default"])( + a["default"].mark(function t(e) { + return a["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (o) { + t.next = 4; + break; + } + return ( + (t.next = 3), + (0, p.call)(e, "GET_FUNC_VERSION") + ); + case 3: + o = t.sent; + case 4: + return t.abrupt("return", o); + case 5: + case "end": + return t.stop(); + } + }, t); + }), + ); + return function (t) { + return e.apply(this, arguments); + }; + })()), + (t.getCommentsCountApi = (function () { + var e = (0, u["default"])( + a["default"].mark(function t(e, n) { + var r; + return a["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if (n.urls instanceof Array) { + t.next = 2; + break; + } + throw new Error("urls 参数有误"); + case 2: + if (0 !== n.urls.length) { + t.next = 4; + break; + } + return t.abrupt("return", []); + case 4: + return ( + (t.next = 6), + (0, p.call)(e, "GET_COMMENTS_COUNT", n) + ); + case 6: + return ( + (r = t.sent), + t.abrupt("return", r.result.data) + ); + case 8: + case "end": + return t.stop(); + } + }, t); + }), + ); + return function (t, n) { + return e.apply(this, arguments); + }; + })()), + (t.getRecentCommentsApi = (function () { + var e = (0, u["default"])( + a["default"].mark(function t(e, n) { + var r, i, o, s; + return a["default"].wrap(function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + return ( + (t.next = 2), + (0, p.call)(e, "GET_RECENT_COMMENTS", n) + ); + case 2: + ((r = t.sent), (i = v(r.result.data))); + try { + for (i.s(); !(o = i.n()).done; ) + (s = o.value).relativeTime = (0, l["default"])( + s.created, + ); + } catch (a) { + i.e(a); + } finally { + i.f(); + } + return t.abrupt("return", r.result.data); + case 6: + case "end": + return t.stop(); + } + }, t); + }), + ); + return function (t, n) { + return e.apply(this, arguments); + }; + })()), + (t.getUserAgent = (function () { + var e = (0, u["default"])( + a["default"].mark(function t() { + var e, n, r, i, o, s; + return a["default"].wrap( + function (t) { + for (;;) + switch ((t.prev = t.next)) { + case 0: + if ( + ((e = window.navigator.userAgent), + (t.prev = 1), + "Windows" !== + (n = navigator.userAgentData.platform) && + "macOS" !== n) + ) { + t.next = 10; + break; + } + return ( + (t.next = 6), + navigator.userAgentData.getHighEntropyValues([ + "platformVersion", + ]) + ); + case 6: + ((r = t.sent), + (i = r.platformVersion), + (o = parseInt(i.split(".")[0])), + "Windows" === n && o >= 13 + ? (e = e.replace( + /Windows NT 10\.0/i, + "Windows NT ".concat("11.0"), + )) + : "macOS" === n && + o >= 11 && + ((s = i.replace(/\./g, "_")), + (e = e.replace( + /Mac OS X 10_[0-9]+_[0-9]+/i, + "Mac OS X ".concat(s), + )))); + case 10: + t.next = 14; + break; + case 12: + ((t.prev = 12), (t.t0 = t["catch"](1))); + case 14: + return t.abrupt("return", e); + case 15: + case "end": + return t.stop(); + } + }, + t, + null, + [[1, 12]], + ); + }), + ); + return function () { + return e.apply(this, arguments); + }; + })()), + (t.getUrl = function (e) { + var t; + if (window.TWIKOO_MAGIC_PATH) t = window.TWIKOO_MAGIC_PATH; + else if (e && "string" == typeof e) + switch (e) { + case "location.pathname": + case "window.location.pathname": + t = window.location.pathname; + break; + case "location.href": + case "window.location.href": + t = window.location.href; + break; + default: + t = e; + } + else t = window.location.pathname; + return t; + }), + (t.getHref = function (e) { + var t, n; + return null !== + (t = + null !== (n = window.TWIKOO_MAGIC_HREF) && void 0 !== n + ? n + : e) && void 0 !== t + ? t + : window.location.href; + }), + (t.readAsText = function (e) { + return new Promise(function (t, n) { + var r = new FileReader(); + (r.readAsText(e), + (r.onloadend = function () { + r.error ? n(r.error) : t(r.result); + })); + }); + }), + (t.renderLinks = function (e) { + var t = []; + e instanceof Array + ? e.forEach(function (e) { + var n; + (n = t).push.apply( + n, + (0, s["default"])(e.getElementsByTagName("a")), + ); + }) + : e instanceof Element && (t = e.getElementsByTagName("a")); + var n, + r = v(t); + try { + for (r.s(); !(n = r.n()).done; ) { + var i = n.value; + (i.setAttribute("target", "_blank"), + i.setAttribute("rel", "noopener noreferrer")); + } + } catch (o) { + r.e(o); + } finally { + r.f(); + } + }), + (t.renderMath = function (e, t) { + "function" == typeof renderMathInElement && + renderMathInElement( + e, + t || { + delimiters: [ + { left: "$$", right: "$$", display: !0 }, + { left: "$", right: "$", display: !1 }, + { left: "\\(", right: "\\)", display: !1 }, + { left: "\\[", right: "\\]", display: !0 }, + ], + throwOnError: !1, + }, + ); + }), + (t.blobToDataURL = function (e) { + return new Promise(function (t) { + var n = new FileReader(); + ((n.onload = function (e) { + var n = e.target.result; + t(n); + }), + n.readAsDataURL(e)); + }); + })); + }, + 37: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = void 0)); + var r = n(78); + (r.marked.setOptions({ + renderer: new r.marked.Renderer(), + gfm: !0, + tables: !0, + breaks: !0, + pedantic: !1, + smartLists: !0, + smartypants: !0, + }), + (t["default"] = r.marked)); + }, + 824: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.install = function (e) { + return d.apply(this, arguments); + }), + (t.tcb = void 0)); + var i = r(n(479)), + o = r(n(4964)), + a = n(8129); + function s(e, t) { + var n = + ("undefined" != typeof Symbol && e[Symbol.iterator]) || + e["@@iterator"]; + if (!n) { + if ( + Array.isArray(e) || + (n = (function (e, t) { + if (e) { + if ("string" == typeof e) return u(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return ( + "Object" === n && + e.constructor && + (n = e.constructor.name), + "Map" === n || "Set" === n + ? Array.from(e) + : "Arguments" === n || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ? u(e, t) + : void 0 + ); + } + })(e)) || + (t && e && "number" == typeof e.length) + ) { + n && (e = n); + var r = 0, + i = function () {}; + return { + s: i, + n: function () { + return r >= e.length + ? { done: !0 } + : { done: !1, value: e[r++] }; + }, + e: function (e) { + throw e; + }, + f: i, + }; + } + throw new TypeError( + "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + } + var o, + a = !0, + s = !1; + return { + s: function () { + n = n.call(e); + }, + n: function () { + var e = n.next(); + return ((a = e.done), e); + }, + e: function (e) { + ((s = !0), (o = e)); + }, + f: function () { + try { + a || null == n["return"] || n["return"](); + } finally { + if (s) throw o; + } + }, + }; + } + function u(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r; + } + var c = [{ key: "envId", required: !0 }], + l = (t.tcb = { sdk: null, app: null, auth: null }); + function d() { + return ( + (d = (0, o["default"])( + i["default"].mark(function e(t) { + var n, + r = arguments; + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + return ( + (n = + r.length > 1 && r[1] !== undefined ? r[1] : {}), + (l.sdk = t), + f(n), + (e.next = 5), + p(n) + ); + case 5: + return e.abrupt("return", l); + case 6: + case "end": + return e.stop(); + } + }, e); + }), + )), + d.apply(this, arguments) + ); + } + function f(e) { + var t, + n = [], + r = s(c); + try { + for (r.s(); !(t = r.n()).done; ) { + var i = t.value; + i["default"] && (0, a.isNotSet)(e[i.key]) + ? (e[i.key] = i["default"]) + : i.required && (0, a.isNotSet)(e[i.key]) && n.push(i.key); + } + } catch (d) { + r.e(d); + } finally { + r.f(); + } + if (n.length > 0) { + var o, + u = s(n); + try { + for (u.s(); !(o = u.n()).done; ) { + var l = o.value; + a.logger.warn("".concat(l, " is required")); + } + } catch (d) { + u.e(d); + } finally { + u.f(); + } + throw new Error("Twikoo: failed to init"); + } + } + function p(e) { + return h.apply(this, arguments); + } + function h() { + return (h = (0, o["default"])( + i["default"].mark(function e(t) { + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + return (m(t), (e.next = 3), g()); + case 3: + case "end": + return e.stop(); + } + }, e); + }), + )).apply(this, arguments); + } + function m(e) { + l.app = l.sdk.init({ env: e.envId, region: e.region }); + } + function g() { + return v.apply(this, arguments); + } + function v() { + return (v = (0, o["default"])( + i["default"].mark(function e() { + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + return e.abrupt( + "return", + new Promise(function (e, t) { + ((l.auth = l.app.auth({ persistence: "local" })), + l.auth.hasLoginState() + ? e() + : l.auth + .anonymousAuthProvider() + .signIn() + .then(e) + ["catch"](t)); + }), + ); + case 1: + case "end": + return e.stop(); + } + }, e); + }), + )).apply(this, arguments); + } + }, + 7435: function (e, t, n) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = void 0)); + var r = n(8129), + i = function (e) { + var t = o(e.getDate(), 2), + n = o(e.getMonth() + 1, 2), + r = o(e.getFullYear(), 2); + return "".concat(r, "-").concat(n, "-").concat(t); + }, + o = function (e, t) { + for (var n = e.toString(); n.length < t; ) n = "0" + n; + return n; + }; + t["default"] = function (e) { + if (("number" == typeof e && (e = new Date(e)), e)) + try { + var t = e.getTime(), + n = Date.now() - t, + o = Math.floor(n / 864e5); + if (0 === o) { + var a = n % 864e5, + s = Math.floor(a / 36e5); + if (0 === s) { + var u = a % 36e5, + c = Math.floor(u / 6e4); + if (0 === c) { + var l = u % 6e4; + return ( + Math.round(l / 1e3) + + " ".concat((0, r.t)("TIMEAGO_SECONDS")) + ); + } + return c + " ".concat((0, r.t)("TIMEAGO_MINUTES")); + } + return s + " ".concat((0, r.t)("TIMEAGO_HOURS")); + } + return o < 0 + ? (0, r.t)("TIMEAGO_NOW") + : o < 8 + ? o + " ".concat((0, r.t)("TIMEAGO_DAYS")) + : i(e); + } catch (d) { + r.logger.log("timeAgo 错误", d); + } + }; + }, + 2199: function (e, t) { + "use strict"; + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.version = void 0), + (t.version = "1.6.44")); + }, + 1085: function (e, t, n) { + "use strict"; + var r = n(477); + (Object.defineProperty(t, "__esModule", { value: !0 }), + (t.render = t.app = void 0)); + var i = r(n(4478)), + o = r(n(6768)), + a = r(n(1463)), + s = r(n(5735)), + u = r(n(4511)); + (n(622), + n(8848), + n(6756), + n(4707), + i["default"].use(a["default"]), + i["default"].use(s["default"]), + i["default"].use(u["default"])); + var c = (t.app = null); + t.render = function (e) { + var n = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : {}; + return ( + (i["default"].prototype.$tcb = e), + (i["default"].prototype.$twikoo = n), + (t.app = c = + new i["default"]({ + render: function (e) { + return e(o["default"]); + }, + })), + c.$mount(n.el || "#twikoo"), + c + ); + }; + }, + 3723: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + ".el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-webkit-transition:.1s;transition:.1s;font-weight:500;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button{margin-left:10px}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#FFF;border-color:#409EFF;color:#409EFF}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#FFF;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#FFF;border-color:#EBEEF5;color:#C0C4CC}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{pointer-events:none;content:'';position:absolute;left:-1px;top:-1px;right:-1px;bottom:-1px;border-radius:inherit;background-color:rgba(255,255,255,.35)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#FFF;background-color:#409EFF;border-color:#409EFF}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#FFF}.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF;outline:0}.el-button--primary.is-active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#FFF;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409EFF;border-color:#409EFF;color:#FFF}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#FFF;background-color:#67C23A;border-color:#67C23A}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#FFF}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#FFF}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#FFF;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67C23A;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67C23A;border-color:#67C23A;color:#FFF}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#FFF;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#FFF;background-color:#E6A23C;border-color:#E6A23C}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#FFF}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#FFF}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#FFF;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#E6A23C;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#E6A23C;border-color:#E6A23C;color:#FFF}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#FFF;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#FFF;background-color:#F56C6C;border-color:#F56C6C}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#FFF}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#FFF}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#FFF;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#F56C6C;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#F56C6C;border-color:#F56C6C;color:#FFF}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#FFF;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#FFF;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#FFF}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#FFF}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#FFF;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#FFF}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#FFF;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--mini,.el-button--small{font-size:12px;border-radius:3px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small,.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini.is-circle{padding:7px}.el-button--text{border-color:transparent;color:#409EFF;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover{border-color:transparent}.el-button-group .el-button--danger:last-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:last-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:last-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:last-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:last-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child),.el-button-group>.el-dropdown>.el-button{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:first-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:first-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:first-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:first-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-right-color:rgba(255,255,255,.5)}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table;content:\"\"}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button.is-active,.el-button-group>.el-button:not(.is-disabled):active,.el-button-group>.el-button:not(.is-disabled):focus,.el-button-group>.el-button:not(.is-disabled):hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0}", + "", + ]), + (t["default"] = a)); + }, + 1315: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + ".el-input__inner,.el-textarea__inner{background-image:none;-webkit-box-sizing:border-box;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#FFF;border:1px solid #DCDFE6;border-radius:4px;transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea__inner:hover{border-color:#C0C4CC}.el-textarea__inner:focus{outline:0;border-color:#409EFF}.el-textarea .el-input__count{color:#909399;background:#FFF;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea.is-exceed .el-textarea__inner{border-color:#F56C6C}.el-textarea.is-exceed .el-input__count{color:#F56C6C}.el-input{position:relative;font-size:14px;display:inline-block;width:100%}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#C0C4CC;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input,.el-input__inner{font-size:inherit}.el-input .el-input__count .el-input__count-inner{background:#FFF;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#FFF;border-radius:4px;border:1px solid #DCDFE6;box-sizing:border-box;color:#606266;display:inline-block;height:40px;line-height:40px;outline:0;padding:0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}.el-input__prefix,.el-input__suffix{position:absolute;top:0;-webkit-transition:all .3s;text-align:center;height:100%;color:#C0C4CC}.el-input__inner::-ms-reveal{display:none}.el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input__inner::placeholder{color:#C0C4CC}.el-input__inner:hover{border-color:#C0C4CC}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409EFF;outline:0}.el-input__suffix{right:5px;transition:all .3s;pointer-events:none}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-exceed .el-input__inner{border-color:#F56C6C}.el-input.is-exceed .el-input__suffix .el-input__count{color:#F56C6C}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#F5F7FA;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #DCDFE6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--prepend .el-input__inner,.el-input-group__append{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.el-input-group__prepend div.el-select:hover .el-input__inner{border-color:transparent;background-color:transparent;color:inherit;border-top:0;border-bottom:0}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input__inner::-ms-clear{display:none;width:0;height:0}", + "", + ]), + (t["default"] = a)); + }, + 9211: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + ".el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-loading-spinner .el-loading-text{color:#409EFF;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#409EFF;stroke-linecap:round}.el-loading-spinner i{color:#409EFF}.el-loading-fade-enter,.el-loading-fade-leave-active{opacity:0}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}", + "", + ]), + (t["default"] = a)); + }, + 9737: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.twikoo {\n position: relative;\n}\n.twikoo svg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n}\n\n/* 全局 CSS */\n.tk-expand {\n width: 100%;\n cursor: pointer;\n padding: 0.75em;\n text-align: center;\n transition: all 0.5s;\n}\n.tk-expand:hover {\n background-color: rgba(0,0,0,0.13);\n}\n.tk-expand:active {\n background-color: rgba(0,0,0,0.19);\n}\n.tk-content img {\n max-width: 300px;\n max-height: 300px;\n vertical-align: middle;\n}\n.tk-owo-emotion,\n.twikoo .OwO-item img {\n width: 3em;\n height: auto;\n}\n\n/* element-ui overwrite */\n.twikoo .el-input__inner,\n.twikoo .el-textarea__inner {\n color: currentColor;\n background-color: transparent;\n border-color: rgba(144,147,153,0.31);\n}\n.twikoo .el-input__inner:hover,\n.twikoo .el-textarea__inner:hover {\n border-color: rgba(144,147,153,0.50);\n}\n.twikoo .el-input__inner:focus,\n.twikoo .el-textarea__inner:focus {\n border-color: #409eff;\n}\n.twikoo .el-input-group__append,\n.twikoo .el-input-group__prepend {\n color: currentColor;\n background-clip: padding-box;\n background-color: rgba(144,147,153,0.13);\n border-color: rgba(144,147,153,0.31);\n}\n.twikoo .el-button:not(.el-button--primary):not(.el-button--text) {\n color: currentColor;\n background-color: rgba(144,147,153,0.063);\n border-color: rgba(144,147,153,0.31);\n}\n.twikoo .el-button:not(.el-button--primary):not(.el-button--text):active,\n.twikoo .el-button:not(.el-button--primary):not(.el-button--text):focus,\n.twikoo .el-button:not(.el-button--primary):not(.el-button--text):hover {\n color: #409eff;\n background-color: rgba(64,158,255,0.063);\n border-color: rgba(64,158,255,0.50);\n}\n.twikoo .el-button--primary.is-disabled,\n.twikoo .el-button--primary.is-disabled:active,\n.twikoo .el-button--primary.is-disabled:focus,\n.twikoo .el-button--primary.is-disabled:hover {\n color: rgba(255,255,255,0.63);\n background-color: rgba(64,158,255,0.50);\n border-color: transparent;\n}\n.twikoo .el-loading-mask {\n background-color: transparent;\n backdrop-filter: opacity(20%);\n}\n.twikoo .el-textarea .el-input__count {\n color: currentColor;\n background: transparent;\n}\n.tk-admin-warn {\n padding: 1rem 1.5rem;\n background-color: #fff7d0;\n border-left: 0.5rem solid #e7c000;\n color: #6b5900;\n align-self: stretch;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 6640: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-action {\n display: flex;\n align-items: center;\n}\n.tk-action-link {\n margin-left: 0.5rem;\n color: #409eff;\n text-decoration: none;\n display: flex;\n align-items: center;\n}\n.tk-action-link .tk-action-icon-solid {\n display: none;\n}\n.tk-action-link.tk-liked .tk-action-icon,\n.tk-action-link:hover .tk-action-icon {\n display: none;\n}\n.tk-action-link.tk-liked .tk-action-icon-solid,\n.tk-action-link:hover .tk-action-icon-solid {\n display: block;\n}\n.tk-action-count {\n margin-left: 0.25rem;\n font-size: 0.75rem;\n height: 1.5rem;\n line-height: 1.5rem;\n}\n.tk-action-icon {\n display: inline-block;\n height: 1em;\n width: 1em;\n line-height: 0;\n color: #409eff;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 3514: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-admin-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n pointer-events: none;\n}\n.tk-admin {\n position: absolute;\n top: 0;\n left: 100%;\n width: 100%;\n height: 100%;\n overflow-y: auto;\n pointer-events: all;\n color: #ffffff;\n background-color: rgba(0,0,0,0.60);\n backdrop-filter: blur(5px);\n transition: all 0.5s ease;\n visibility: hidden;\n}\n.tk-admin::-webkit-scrollbar {\n width: 5px;\n background-color: transparent;\n}\n.tk-admin::-webkit-scrollbar-track {\n background-color: transparent;\n}\n.tk-admin::-webkit-scrollbar-thumb {\n background-color: rgba(255,255,255,0.31);\n}\n.tk-admin.__show {\n left: 0;\n visibility: visible;\n}\n.tk-admin-close {\n position: sticky;\n float: right;\n display: block;\n top: 0;\n right: 0;\n width: 1rem;\n height: 1rem;\n padding: 1rem;\n box-sizing: content-box;\n color: #ffffff;\n}\n.tk-login,\n.tk-regist {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n padding: 0 2rem;\n}\n.tk-login-title {\n color: #ffffff;\n font-size: 1.25rem;\n text-align: center;\n margin-top: 10rem;\n}\n.tk-password,\n.tk-login-msg {\n color: #ffffff;\n width: 80%;\n text-align: center;\n margin-top: 1rem;\n}\n.tk-password .el-input__inner {\n min-width: 100px;\n}\n.tk-login-msg a {\n color: #ffffff;\n margin-left: 1em;\n text-decoration: underline;\n}\n.tk-regist-button {\n margin-top: 1rem;\n}\n.tk-panel {\n color: #ffffff;\n padding: 2rem;\n}\n.tk-panel-title {\n font-size: 1.5rem;\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n}\n.tk-panel-logout {\n color: #ffffff;\n font-size: 1rem;\n text-decoration: underline;\n}\n.tk-panel .tk-tabs {\n display: flex;\n margin-bottom: 1em;\n border-bottom: 2px solid #c0c4cc;\n}\n.tk-panel .tk-tab {\n color: #c0c4cc;\n cursor: pointer;\n line-height: 2em;\n margin-right: 2em;\n margin-bottom: -2px;\n}\n.tk-panel .tk-tab.__active {\n color: #ffffff;\n border-bottom: 2px solid #ffffff;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 3301: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-admin-comment {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.tk-admin-comment a {\n color: currentColor;\n text-decoration: underline;\n}\n.tk-admin-warn {\n margin-bottom: 1em;\n}\n.tk-admin-comment-filter {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n}\n.tk-admin-comment-filter-keyword {\n flex: 1;\n}\n.tk-admin-comment-filter-type {\n height: 32px;\n margin: 0 0.5em;\n padding: 0 0.5em;\n color: #ffffff;\n background: none;\n border: 1px solid rgba(144,147,153,0.31);\n border-radius: 4px;\n position: relative;\n -moz-appearance: none;\n -webkit-appearance: none;\n}\n.tk-admin-comment-filter-type:focus {\n border-color: #409eff;\n}\n.tk-admin-comment-filter-type option {\n color: initial;\n}\n.tk-admin-comment-list {\n margin-top: 1em;\n}\n.tk-admin-comment-list,\n.tk-admin-comment-item {\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: stretch;\n}\n.tk-admin-comment-meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 0.5em;\n}\n.tk-admin-comment .tk-avatar {\n margin-right: 0.5em;\n}\n.tk-admin-comment .tk-content {\n max-height: none;\n}\n.tk-admin-actions {\n display: flex;\n margin-bottom: 1em;\n border-bottom: 1px solid rgba(255,255,255,0.5);\n}\n", + "", + ]), + (t["default"] = a)); + }, + 6384: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-admin-config-groups {\n overflow-y: auto;\n padding-right: 0.5em;\n}\n.tk-admin-config-groups .tk-admin-config-group,\n.tk-admin-config-groups .tk-admin-config-group-title {\n background: transparent;\n}\n.tk-admin-config-group-title {\n margin-top: 1em;\n font-size: 1.25rem;\n font-weight: bold;\n}\n.tk-admin-config-item {\n display: grid;\n align-items: center;\n grid-template-columns: 30% 70%;\n margin-top: 1em;\n}\n.tk-admin-config-title {\n text-align: right;\n margin-right: 1em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.tk-admin-config-desc {\n margin-top: 0.5em;\n font-size: 0.75em;\n overflow-wrap: break-word;\n}\n.tk-admin-config-actions {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 1em;\n}\n.tk-admin-config-message {\n margin-top: 0.5em;\n text-align: center;\n}\n.tk-admin-config-email-test-desc {\n margin: 1em 0;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 8120: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-admin-import {\n display: flex;\n flex-direction: column;\n}\n.tk-admin-import-label {\n margin-top: 1em;\n font-size: 1.25rem;\n font-weight: bold;\n}\n.tk-admin-import select,\n.tk-admin-import input,\n.tk-admin-import .el-button,\n.tk-admin-import .el-textarea {\n margin-top: 1em;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 269: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-avatar {\n flex-shrink: 0;\n height: 2.5rem;\n width: 2.5rem;\n overflow: hidden;\n text-align: center;\n border-radius: 5px;\n margin-right: 1rem;\n}\n.tk-comment .tk-submit .tk-avatar,\n.tk-replies .tk-avatar {\n height: 1.6rem;\n width: 1.6rem;\n}\n.tk-avatar.tk-has-avatar {\n background-color: rgba(144,147,153,0.13);\n}\n.tk-avatar.tk-clickable {\n cursor: pointer;\n}\n.tk-avatar .tk-avatar-img {\n height: 2.5rem;\n color: #c0c4cc;\n}\n.tk-comment .tk-submit .tk-avatar .tk-avatar-img,\n.tk-replies .tk-avatar .tk-avatar-img {\n height: 1.6rem;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 510: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-main {\n flex: 1;\n width: 0;\n}\n.tk-row {\n flex: 1;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n}\n.tk-nick-link {\n color: inherit;\n text-decoration: none;\n}\n.tk-replies .tk-nick-link {\n font-size: .9em;\n}\n.tk-nick-link:hover {\n color: #409eff;\n}\n.tk-actions {\n display: none;\n margin-left: 1em;\n}\n.tk-comment:hover .tk-actions {\n display: inline;\n}\n.tk-extras {\n color: #999999;\n font-size: 0.875em;\n display: flex;\n flex-wrap: wrap;\n}\n.tk-extra {\n margin-top: 0.5rem;\n margin-right: 0.75rem;\n display: flex;\n align-items: center;\n}\n.tk-icon.__comment {\n height: 1em;\n width: 1em;\n line-height: 1;\n}\n.tk-extra-text {\n line-height: 1;\n}\n.tk-tag {\n display: inline-block;\n padding: 0 0.5em;\n font-size: 0.75em;\n background-color: #f2f6fc;\n}\n.tk-tag-green {\n background-color: rgba(103,194,58,0.13);\n border: 1px solid rgba(103,194,58,0.50);\n border-radius: 2px;\n color: #67c23a;\n}\n.tk-tag-yellow {\n background-color: rgba(230,162,60,0.13);\n border: 1px solid rgba(230,162,60,0.50);\n border-radius: 2px;\n color: #e6a23c;\n}\n.tk-tag-blue {\n background-color: rgba(64,158,255,0.13);\n border: 1px solid rgba(64,158,255,0.50);\n border-radius: 2px;\n color: #409eff;\n}\n.tk-tag-red {\n background-color: rgba(245,108,108,0.13);\n border: 1px solid rgba(245,108,108,0.50);\n border-radius: 2px;\n color: #f56c6c;\n}\n.tk-comment {\n margin-top: 1rem;\n display: flex;\n flex-direction: row;\n word-break: break-all;\n}\n.tk-content {\n margin-top: 0.5rem;\n overflow: hidden;\n max-height: 500px;\n position: relative;\n}\n.tk-content-expand {\n max-height: none;\n}\n.tk-replies .tk-content {\n font-size: .9em;\n}\n.tk-comment .vemoji {\n max-height: 2em;\n vertical-align: middle;\n}\n.tk-replies {\n max-height: 200px;\n overflow: hidden;\n position: relative;\n}\n.tk-replies-expand {\n max-height: none;\n overflow: unset;\n}\n.tk-submit {\n margin-top: 1rem;\n}\n.tk-expand {\n font-size: 0.75em;\n}\n.tk-lightbox {\n display: block;\n position: fixed;\n background-color: rgba(0, 0, 0, 0.3);\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n}\n.tk-lightbox-image {\n min-width: 100px;\n min-height: 30px;\n width: auto;\n height: auto;\n max-width: 95%;\n max-height: 95%;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: linear-gradient(90deg, #eeeeee 50%, #e3e3e3 0);\n background-size: 40px 100%;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 3650: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-comments-title {\n font-size: 1.25rem;\n font-weight: bold;\n margin-bottom: 1rem;\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n}\n.tk-comments-count.__hidden {\n visibility: hidden;\n}\n.tk-comments-container {\n min-height: 10rem;\n display: flex;\n flex-direction: column;\n}\n.tk-comments-no {\n flex: 1;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.tk-comments-error {\n font-size: 0.75em;\n color: #ff0000;\n}\n.tk-icon.__comments {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: sub;\n margin-left: 0.5em;\n height: 0.75em;\n width: 0.75em;\n line-height: 0;\n cursor: pointer;\n color: #409eff;\n}\n.twikoo div.code-toolbar {\n position: relative;\n border-radius: .3em\n}\n.twikoo div.code-toolbar>.toolbar {\n position: absolute;\n right: 4px;\n top: 4px;\n font-size: .8125rem;\n font-weight: 500;\n display: flex;\n}\n.twikoo div.code-toolbar>.toolbar>.toolbar-item {\n margin-left: .3em\n}\n.twikoo div.code-toolbar>.toolbar>.toolbar-item>a,\n.twikoo div.code-toolbar>.toolbar>.toolbar-item>button,\n.twikoo div.code-toolbar>.toolbar>.toolbar-item>span {\n padding: 2px 4px;\n border-radius: .3em;\n}\n.twikoo div.code-toolbar>.toolbar>.toolbar-item>button {\n border: 1px solid rgba(128, 128, 128, 0.31);\n}\n.twikoo div.code-toolbar>.toolbar>.toolbar-item>button:hover {\n cursor: pointer;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 8440: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-footer {\n width: 100%;\n text-align: end;\n font-size: 0.75em;\n color: #999999;\n margin-top: 1em;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 7618: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-meta-input {\n display: flex;\n}\n.tk-meta-input .el-input {\n width: auto;\n width: calc((100% - 1rem) / 3); /* Fix Safari */\n flex: 1;\n}\n.tk-meta-input .el-input + .el-input {\n margin-left: 0.5rem;\n}\n.tk-meta-input .el-input .el-input-group__prepend {\n padding: 0 1rem;\n}\n.tk-meta-input .el-input input:invalid {\n border: 1px solid #f56c6c;\n box-shadow: none;\n}\n@media screen and (max-width: 767px) {\n.tk-meta-input {\n flex-direction: column;\n}\n.tk-meta-input .el-input {\n width: auto;\n}\n.tk-meta-input .el-input + .el-input {\n margin-left: 0;\n margin-top: 0.5rem;\n}\n}\n", + "", + ]), + (t["default"] = a)); + }, + 6785: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-pagination,\n.tk-pagination-pagers {\n display: flex;\n}\n.tk-pagination {\n width: 100%;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n}\n.tk-pagination-options {\n display: flex;\n align-items: center;\n}\n.tk-pagination-pager {\n width: 2em;\n height: 2em;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n}\n.tk-pagination-pager.__current {\n background-color: #409eff;\n pointer-events: none;\n}\n.tk-pagination .el-input {\n width: 50px;\n}\n.tk-pagination .el-input .el-input__inner {\n padding: 0;\n height: 28px;\n text-align: center;\n -moz-appearance: textfield;\n appearance: textfield;\n}\n.tk-pagination .el-input .el-input__inner::-webkit-inner-spin-button,\n.tk-pagination .el-input .el-input__inner::-webkit-outer-spin-button {\n -webkit-appearance: none;\n appearance: none;\n margin: 0;\n}\n", + "", + ]), + (t["default"] = a)); + }, + 7786: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + "\n.tk-submit {\n display: flex;\n flex-direction: column;\n}\n.tk-row {\n display: flex;\n flex-direction: row;\n}\n.tk-col {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n.tk-meta-input {\n margin-bottom: 0.5rem;\n}\n.tk-row.actions {\n position: relative;\n margin-top: 1rem;\n margin-bottom: 1rem;\n margin-left: 3.5rem;\n align-items: center;\n justify-content: flex-end;\n}\n.tk-row-actions-start {\n flex: 1;\n display: flex;\n align-items: center;\n}\n.tk-submit-action-icon {\n align-self: center;\n display: inline-block;\n width: 1.25em;\n line-height: 0;\n margin-right: 10px;\n cursor: pointer;\n flex-shrink: 0;\n}\n.tk-submit-action-icon svg:hover {\n opacity: 0.8;\n}\n.tk-submit-action-icon.__markdown {\n color: #909399;\n}\n.tk-error-message {\n word-break: break-all;\n color: #ff0000;\n font-size: 0.75em;\n flex-shrink: 1;\n}\n.tk-input-image {\n display: none;\n}\n.tk-input {\n flex: 1;\n}\n.tk-input .el-textarea__inner {\n background-position: right bottom;\n background-repeat: no-repeat;\n}\n.tk-turnstile-container {\n position: absolute;\n right: 0;\n bottom: -75px;\n z-index: 1;\n}\n.tk-turnstile {\n display: flex;\n flex-direction: column;\n}\n.tk-preview-container {\n margin-left: 3rem;\n margin-bottom: 1rem;\n padding: 5px 15px;\n border: 1px solid rgba(128,128,128,0.31);\n border-radius: 4px;\n word-break: break-word;\n}\n.tk-fade-in {\n animation: tkFadeIn .3s;\n}\n@keyframes tkFadeIn {\n0% {\n opacity: 0\n}\nto {\n opacity: 1\n}\n}\n", + "", + ]), + (t["default"] = a)); + }, + 6810: function (e, t, n) { + "use strict"; + n.r(t); + var r = n(5346), + i = n.n(r), + o = n(9067), + a = n.n(o)()(i()); + (a.push([ + e.id, + '/*!\n * OwO v1.0.2\n * Source: https://github.com/DIYgod/OwO/blob/master/dist/OwO.min.css\n * Author: DIYgod\n * Modified by: iMaeGoo\n * Released under the MIT License.\n */\n\n.OwO {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.OwO.OwO-open .OwO-body {\n display: block;\n}\n\n.OwO .OwO-logo {\n width: 1.125em;\n display: flex;\n}\n\n.OwO .OwO-body {\n display: none;\n position: absolute;\n left: 0;\n right: 0;\n max-width: 500px;\n color: #4a4a4a;\n background-color: #ffffff;\n border: 1px solid rgba(144,147,153,0.31);\n top: 2em;\n border-radius: 0 4px 4px;\n z-index: 1000;\n}\n\n.night .OwO .OwO-body,\n.darkmode .OwO .OwO-body,\n.DarkMode .OwO .OwO-body,\n[data-theme="dark"] .OwO .OwO-body,\n[data-user-color-scheme="dark"] .OwO .OwO-body {\n color: #ffffff;\n background-color: #4a4a4a;\n}\n\n.OwO .OwO-body .OwO-items {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n display: none;\n padding: 10px;\n padding-right: 0;\n margin: 0;\n overflow: auto;\n font-size: 0;\n}\n\n.OwO .OwO-body .OwO-items .OwO-item {\n list-style-type: none;\n padding: 5px 10px;\n border-radius: 5px;\n display: inline-block;\n font-size: 12px;\n line-height: 14px;\n cursor: pointer;\n -webkit-transition: .3s;\n transition: .3s;\n text-align: center;\n}\n\n.OwO .OwO-body .OwO-items .OwO-item:hover {\n background-color: rgba(144,147,153,0.13);\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);\n}\n\n.OwO .OwO-body .OwO-items-emoji .OwO-item {\n font-size: 20px;\n line-height: 19px;\n}\n\n.OwO .OwO-body .OwO-items-image .OwO-item {\n width: 14%;\n box-sizing: border-box;\n}\n\n@media screen and (max-width: 600px) {\n #twikoo .OwO-items > .OwO-item {\n width: 16%;\n }\n}\n\n@media screen and (max-width: 460px) {\n #twikoo .OwO-items > .OwO-item {\n width: 20%;\n }\n}\n\n@media screen and (max-width: 400px) {\n #twikoo .OwO-items > .OwO-item {\n width: 25%;\n }\n}\n\n@media screen and (max-width: 330px) {\n #twikoo .OwO-items > .OwO-item {\n width: 33%;\n }\n}\n\n\n.OwO .OwO-body .OwO-items-image .OwO-item img {\n max-width: 100%;\n}\n\n.OwO .OwO-body .OwO-items-show {\n display: block;\n}\n\n.OwO .OwO-body .OwO-bar {\n width: 100%;\n border-top: 1px solid rgba(144,147,153,0.31);\n border-radius: 0 0 4px 4px;\n}\n\n.OwO .OwO-body .OwO-bar .OwO-packages {\n margin: 0;\n padding: 0;\n font-size: 0;\n}\n\n.OwO .OwO-body .OwO-bar .OwO-packages li {\n list-style-type: none;\n display: inline-block;\n line-height: 30px;\n font-size: 14px;\n padding: 0 10px;\n cursor: pointer;\n margin-right: 3px;\n}\n\n.OwO .OwO-body .OwO-bar .OwO-packages li:nth-child(1) {\n border-radius: 0 0 0 3px;\n}\n\n.OwO .OwO-body .OwO-bar .OwO-packages li:hover {\n background-color: rgba(144,147,153,0.13);\n}\n\n.OwO .OwO-body .OwO-bar .OwO-packages .OwO-package-active {\n background-color: rgba(144,147,153,0.13);\n -webkit-transition: .3s;\n transition: .3s;\n}\n', + "", + ]), + (t["default"] = a)); + }, + 6937: function (e) { + e.exports = + ''; + }, + 9396: function (e) { + e.exports = + ''; + }, + 58: function (e) { + e.exports = + ''; + }, + 7051: function (e) { + e.exports = + ''; + }, + 8443: function (e) { + e.exports = + ''; + }, + 3793: function (e) { + e.exports = + ''; + }, + 8974: function (e) { + e.exports = + ''; + }, + 1423: function (e) { + e.exports = + ''; + }, + 740: function (e) { + e.exports = + ''; + }, + 7397: function (e) { + e.exports = + ''; + }, + 2531: function (e) { + e.exports = + ''; + }, + 3491: function (e) { + e.exports = + ''; + }, + 5171: function (e) { + e.exports = + ''; + }, + 6639: function (e) { + e.exports = + ''; + }, + 6359: function (e) { + e.exports = + ''; + }, + 9039: function (e) { + e.exports = + ''; + }, + 504: function (e) { + e.exports = + ''; + }, + 6370: function (e) { + e.exports = + ''; + }, + 3982: function (e) { + e.exports = + ''; + }, + 9966: function (e) { + e.exports = + ''; + }, + 5910: function (e) { + e.exports = + ''; + }, + 9671: function (e) { + e.exports = + ''; + }, + 9587: function (e) { + e.exports = + ''; + }, + 6768: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(1573), + i = n(8926), + o = i.A, + a = + (n(1288), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 7454: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(8114), + i = n(3397), + o = i.A, + a = + (n(2929), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 2053: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(4576), + i = n(4238), + o = i.A, + a = + (n(4797), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 8559: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(3227), + i = n(4555), + o = i.A, + a = + (n(7908), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 1140: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(74), + i = n(4868), + o = i.A, + a = + (n(7891), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 9097: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(9976), + i = n(3396), + o = i.A, + a = (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports; + }, + 9985: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(872), + i = n(9865), + o = i.A, + a = + (n(8087), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 4785: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(5897), + i = n(4064), + o = i.A, + a = + (n(4624), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 9078: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(3072), + i = n(3572), + o = i.A, + a = + (n(5489), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 8323: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(2048), + i = n(4333), + o = i.A, + a = + (n(3111), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 1452: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(2080), + i = n(418), + o = i.A, + a = + (n(3457), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 3415: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(1412), + i = n(2362), + o = i.A, + a = + (n(2418), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 6431: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(8675), + i = n(9171), + o = i.A, + a = + (n(292), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 5438: function (e, t, n) { + "use strict"; + (n.r(t), + n.d(t, { + __esModule: function () { + return i.B; + }, + default: function () { + return a; + }, + })); + var r = n(9564), + i = n(147), + o = i.A, + a = + (n(5107), + (0, n(4486).A)(o, r.XX, r.Yp, !1, null, null, null).exports); + }, + 4486: function (e, t, n) { + "use strict"; + function r(e, t, n, r, i, o, a, s) { + var u, + c = "function" == typeof e ? e.options : e; + if ( + (t && + ((c.render = t), (c.staticRenderFns = n), (c._compiled = !0)), + r && (c.functional = !0), + o && (c._scopeId = "data-v-" + o), + a + ? ((u = function (e) { + ((e = + e || + (this.$vnode && this.$vnode.ssrContext) || + (this.parent && + this.parent.$vnode && + this.parent.$vnode.ssrContext)) || + "undefined" == typeof __VUE_SSR_CONTEXT__ || + (e = __VUE_SSR_CONTEXT__), + i && i.call(this, e), + e && + e._registeredComponents && + e._registeredComponents.add(a)); + }), + (c._ssrRegister = u)) + : i && + (u = s + ? function () { + i.call( + this, + (c.functional ? this.parent : this).$root.$options + .shadowRoot, + ); + } + : i), + u) + ) + if (c.functional) { + c._injectStyles = u; + var l = c.render; + c.render = function (e, t) { + return (u.call(t), l(e, t)); + }; + } else { + var d = c.beforeCreate; + c.beforeCreate = d ? [].concat(d, u) : [u]; + } + return { exports: e, options: c }; + } + n.d(t, { + A: function () { + return r; + }, + }); + }, + 622: function (e, t, n) { + var r = n(3723); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("0e5ef982", r, !0, {})); + }, + 8848: function (e, t, n) { + var r = n(1315); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("1a92f302", r, !0, {})); + }, + 6756: function (e, t, n) { + var r = n(9211); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("e6b19834", r, !0, {})); + }, + 1288: function (e, t, n) { + var r = n(9737); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("5049e71b", r, !0, {})); + }, + 2929: function (e, t, n) { + var r = n(6640); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("2e97bedb", r, !0, {})); + }, + 4797: function (e, t, n) { + var r = n(3514); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("a49b0590", r, !0, {})); + }, + 7908: function (e, t, n) { + var r = n(3301); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("1287f7b8", r, !0, {})); + }, + 7891: function (e, t, n) { + var r = n(6384); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("6a83638c", r, !0, {})); + }, + 8087: function (e, t, n) { + var r = n(8120); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("59ad6a1e", r, !0, {})); + }, + 4624: function (e, t, n) { + var r = n(269); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("5a1fa943", r, !0, {})); + }, + 5489: function (e, t, n) { + var r = n(510); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("04e4e82c", r, !0, {})); + }, + 3111: function (e, t, n) { + var r = n(3650); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("5dbb03ca", r, !0, {})); + }, + 3457: function (e, t, n) { + var r = n(8440); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("042e8a68", r, !0, {})); + }, + 2418: function (e, t, n) { + var r = n(7618); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("59ca4f90", r, !0, {})); + }, + 292: function (e, t, n) { + var r = n(6785); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("88983344", r, !0, {})); + }, + 5107: function (e, t, n) { + var r = n(7786); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("cfea80b2", r, !0, {})); + }, + 4707: function (e, t, n) { + var r = n(6810); + (r.__esModule && (r = r["default"]), + "string" == typeof r && (r = [[e.id, r, ""]]), + r.locals && (e.exports = r.locals), + (0, n(5083).A)("8be46386", r, !0, {})); + }, + 5083: function (e, t, n) { + "use strict"; + n.d(t, { + A: function () { + return h; + }, + }); + var r = n(5547), + i = "undefined" != typeof document; + if ("undefined" != typeof DEBUG && DEBUG && !i) + throw new Error( + "vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.", + ); + var o = {}, + a = + i && + (document.head || document.getElementsByTagName("head")[0]), + s = null, + u = 0, + c = !1, + l = function () {}, + d = null, + f = "data-vue-ssr-id", + p = + "undefined" != typeof navigator && + /msie [6-9]\b/.test(navigator.userAgent.toLowerCase()); + function h(e, t, n, i) { + ((c = n), (d = i || {})); + var a = (0, r.A)(e, t); + return ( + m(a), + function (t) { + for (var n = [], i = 0; i < a.length; i++) { + var s = a[i]; + ((u = o[s.id]).refs--, n.push(u)); + } + for ( + t ? m((a = (0, r.A)(e, t))) : (a = []), i = 0; + i < n.length; + i++ + ) { + var u; + if (0 === (u = n[i]).refs) { + for (var c = 0; c < u.parts.length; c++) u.parts[c](); + delete o[u.id]; + } + } + } + ); + } + function m(e) { + for (var t = 0; t < e.length; t++) { + var n = e[t], + r = o[n.id]; + if (r) { + r.refs++; + for (var i = 0; i < r.parts.length; i++) + r.parts[i](n.parts[i]); + for (; i < n.parts.length; i++) r.parts.push(v(n.parts[i])); + r.parts.length > n.parts.length && + (r.parts.length = n.parts.length); + } else { + var a = []; + for (i = 0; i < n.parts.length; i++) a.push(v(n.parts[i])); + o[n.id] = { id: n.id, refs: 1, parts: a }; + } + } + } + function g() { + var e = document.createElement("style"); + return ((e.type = "text/css"), a.appendChild(e), e); + } + function v(e) { + var t, + n, + r = document.querySelector("style[" + f + '~="' + e.id + '"]'); + if (r) { + if (c) return l; + r.parentNode.removeChild(r); + } + if (p) { + var i = u++; + ((r = s || (s = g())), + (t = b.bind(null, r, i, !1)), + (n = b.bind(null, r, i, !0))); + } else + ((r = g()), + (t = k.bind(null, r)), + (n = function () { + r.parentNode.removeChild(r); + })); + return ( + t(e), + function (r) { + if (r) { + if ( + r.css === e.css && + r.media === e.media && + r.sourceMap === e.sourceMap + ) + return; + t((e = r)); + } else n(); + } + ); + } + var _, + y = + ((_ = []), + function (e, t) { + return ((_[e] = t), _.filter(Boolean).join("\n")); + }); + function b(e, t, n, r) { + var i = n ? "" : r.css; + if (e.styleSheet) e.styleSheet.cssText = y(t, i); + else { + var o = document.createTextNode(i), + a = e.childNodes; + (a[t] && e.removeChild(a[t]), + a.length ? e.insertBefore(o, a[t]) : e.appendChild(o)); + } + } + function k(e, t) { + var n = t.css, + r = t.media, + i = t.sourceMap; + if ( + (r && e.setAttribute("media", r), + d.ssrId && e.setAttribute(f, t.id), + i && + ((n += "\n/*# sourceURL=" + i.sources[0] + " */"), + (n += + "\n/*# sourceMappingURL=data:application/json;base64," + + btoa(unescape(encodeURIComponent(JSON.stringify(i)))) + + " */")), + e.styleSheet) + ) + e.styleSheet.cssText = n; + else { + for (; e.firstChild; ) e.removeChild(e.firstChild); + e.appendChild(document.createTextNode(n)); + } + } + }, + 1903: function () {}, + 4394: function () {}, + 6530: function (e) { + "use strict"; + ((e.exports = function (e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n]; + return r; + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 8554: function (e) { + "use strict"; + ((e.exports = function (e) { + if (Array.isArray(e)) return e; + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 8198: function (e, t, n) { + "use strict"; + var r = n(6530); + ((e.exports = function (e) { + if (Array.isArray(e)) return r(e); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 4964: function (e) { + "use strict"; + function t(e, t, n, r, i, o, a) { + try { + var s = e[o](a), + u = s.value; + } catch (c) { + return void n(c); + } + s.done ? t(u) : Promise.resolve(u).then(r, i); + } + ((e.exports = function (e) { + return function () { + var n = this, + r = arguments; + return new Promise(function (i, o) { + var a = e.apply(n, r); + function s(e) { + t(a, i, o, s, u, "next", e); + } + function u(e) { + t(a, i, o, s, u, "throw", e); + } + s(undefined); + }); + }; + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 8850: function (e) { + "use strict"; + ((e.exports = function (e, t) { + if (!(e instanceof t)) + throw new TypeError("Cannot call a class as a function"); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 1332: function (e, t, n) { + "use strict"; + var r = n(3987); + function i(e, t) { + for (var n = 0; n < t.length; n++) { + var i = t[n]; + ((i.enumerable = i.enumerable || !1), + (i.configurable = !0), + "value" in i && (i.writable = !0), + Object.defineProperty(e, r(i.key), i)); + } + } + ((e.exports = function (e, t, n) { + return ( + t && i(e.prototype, t), + n && i(e, n), + Object.defineProperty(e, "prototype", { writable: !1 }), + e + ); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 3852: function (e, t, n) { + "use strict"; + var r = n(3987); + ((e.exports = function (e, t, n) { + return ( + (t = r(t)) in e + ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0, + }) + : (e[t] = n), + e + ); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 477: function (e) { + "use strict"; + ((e.exports = function (e) { + return e && e.__esModule ? e : { default: e }; + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 6884: function (e) { + "use strict"; + ((e.exports = function (e) { + if ( + ("undefined" != typeof Symbol && null != e[Symbol.iterator]) || + null != e["@@iterator"] + ) + return Array.from(e); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 4805: function (e) { + "use strict"; + ((e.exports = function (e, t) { + var n = + null == e + ? null + : ("undefined" != typeof Symbol && e[Symbol.iterator]) || + e["@@iterator"]; + if (null != n) { + var r, + i, + o, + a, + s = [], + u = !0, + c = !1; + try { + if (((o = (n = n.call(e)).next), 0 === t)) { + if (Object(n) !== n) return; + u = !1; + } else + for ( + ; + !(u = (r = o.call(n)).done) && + (s.push(r.value), s.length !== t); + u = !0 + ); + } catch (e) { + ((c = !0), (i = e)); + } finally { + try { + if ( + !u && + null != n["return"] && + ((a = n["return"]()), Object(a) !== a) + ) + return; + } finally { + if (c) throw i; + } + } + return s; + } + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 2971: function (e) { + "use strict"; + ((e.exports = function () { + throw new TypeError( + "Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 5838: function (e) { + "use strict"; + ((e.exports = function () { + throw new TypeError( + "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 7120: function (e, t, n) { + "use strict"; + var r = n(9367)["default"]; + function i() { + ((e.exports = i = + function () { + return n; + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + var t, + n = {}, + o = Object.prototype, + a = o.hasOwnProperty, + s = + Object.defineProperty || + function (e, t, n) { + e[t] = n.value; + }, + u = "function" == typeof Symbol ? Symbol : {}, + c = u.iterator || "@@iterator", + l = u.asyncIterator || "@@asyncIterator", + d = u.toStringTag || "@@toStringTag"; + function f(e, t, n) { + return ( + Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0, + }), + e[t] + ); + } + try { + f({}, ""); + } catch (t) { + f = function (e, t, n) { + return (e[t] = n); + }; + } + function p(e, t, n, r) { + var i = t && t.prototype instanceof b ? t : b, + o = Object.create(i.prototype), + a = new N(r || []); + return (s(o, "_invoke", { value: S(e, n, a) }), o); + } + function h(e, t, n) { + try { + return { type: "normal", arg: e.call(t, n) }; + } catch (e) { + return { type: "throw", arg: e }; + } + } + n.wrap = p; + var m = "suspendedStart", + g = "suspendedYield", + v = "executing", + _ = "completed", + y = {}; + function b() {} + function k() {} + function w() {} + var E = {}; + f(E, c, function () { + return this; + }); + var A = Object.getPrototypeOf, + C = A && A(A(P([]))); + C && C !== o && a.call(C, c) && (E = C); + var x = (w.prototype = b.prototype = Object.create(E)); + function I(e) { + ["next", "throw", "return"].forEach(function (t) { + f(e, t, function (e) { + return this._invoke(t, e); + }); + }); + } + function D(e, t) { + function n(i, o, s, u) { + var c = h(e[i], e, o); + if ("throw" !== c.type) { + var l = c.arg, + d = l.value; + return d && "object" == r(d) && a.call(d, "__await") + ? t.resolve(d.__await).then( + function (e) { + n("next", e, s, u); + }, + function (e) { + n("throw", e, s, u); + }, + ) + : t.resolve(d).then( + function (e) { + ((l.value = e), s(l)); + }, + function (e) { + return n("throw", e, s, u); + }, + ); + } + u(c.arg); + } + var i; + s(this, "_invoke", { + value: function (e, r) { + function o() { + return new t(function (t, i) { + n(e, r, t, i); + }); + } + return (i = i ? i.then(o, o) : o()); + }, + }); + } + function S(e, n, r) { + var i = m; + return function (o, a) { + if (i === v) throw new Error("Generator is already running"); + if (i === _) { + if ("throw" === o) throw a; + return { value: t, done: !0 }; + } + for (r.method = o, r.arg = a; ; ) { + var s = r.delegate; + if (s) { + var u = O(s, r); + if (u) { + if (u === y) continue; + return u; + } + } + if ("next" === r.method) r.sent = r._sent = r.arg; + else if ("throw" === r.method) { + if (i === m) throw ((i = _), r.arg); + r.dispatchException(r.arg); + } else "return" === r.method && r.abrupt("return", r.arg); + i = v; + var c = h(e, n, r); + if ("normal" === c.type) { + if (((i = r.done ? _ : g), c.arg === y)) continue; + return { value: c.arg, done: r.done }; + } + "throw" === c.type && + ((i = _), (r.method = "throw"), (r.arg = c.arg)); + } + }; + } + function O(e, n) { + var r = n.method, + i = e.iterator[r]; + if (i === t) + return ( + (n.delegate = null), + ("throw" === r && + e.iterator["return"] && + ((n.method = "return"), + (n.arg = t), + O(e, n), + "throw" === n.method)) || + ("return" !== r && + ((n.method = "throw"), + (n.arg = new TypeError( + "The iterator does not provide a '" + r + "' method", + )))), + y + ); + var o = h(i, e.iterator, n.arg); + if ("throw" === o.type) + return ( + (n.method = "throw"), + (n.arg = o.arg), + (n.delegate = null), + y + ); + var a = o.arg; + return a + ? a.done + ? ((n[e.resultName] = a.value), + (n.next = e.nextLoc), + "return" !== n.method && + ((n.method = "next"), (n.arg = t)), + (n.delegate = null), + y) + : a + : ((n.method = "throw"), + (n.arg = new TypeError("iterator result is not an object")), + (n.delegate = null), + y); + } + function T(e) { + var t = { tryLoc: e[0] }; + (1 in e && (t.catchLoc = e[1]), + 2 in e && ((t.finallyLoc = e[2]), (t.afterLoc = e[3])), + this.tryEntries.push(t)); + } + function M(e) { + var t = e.completion || {}; + ((t.type = "normal"), delete t.arg, (e.completion = t)); + } + function N(e) { + ((this.tryEntries = [{ tryLoc: "root" }]), + e.forEach(T, this), + this.reset(!0)); + } + function P(e) { + if (e || "" === e) { + var n = e[c]; + if (n) return n.call(e); + if ("function" == typeof e.next) return e; + if (!isNaN(e.length)) { + var i = -1, + o = function n() { + for (; ++i < e.length; ) + if (a.call(e, i)) + return ((n.value = e[i]), (n.done = !1), n); + return ((n.value = t), (n.done = !0), n); + }; + return (o.next = o); + } + } + throw new TypeError(r(e) + " is not iterable"); + } + return ( + (k.prototype = w), + s(x, "constructor", { value: w, configurable: !0 }), + s(w, "constructor", { value: k, configurable: !0 }), + (k.displayName = f(w, d, "GeneratorFunction")), + (n.isGeneratorFunction = function (e) { + var t = "function" == typeof e && e.constructor; + return ( + !!t && + (t === k || + "GeneratorFunction" === (t.displayName || t.name)) + ); + }), + (n.mark = function (e) { + return ( + Object.setPrototypeOf + ? Object.setPrototypeOf(e, w) + : ((e.__proto__ = w), f(e, d, "GeneratorFunction")), + (e.prototype = Object.create(x)), + e + ); + }), + (n.awrap = function (e) { + return { __await: e }; + }), + I(D.prototype), + f(D.prototype, l, function () { + return this; + }), + (n.AsyncIterator = D), + (n.async = function (e, t, r, i, o) { + void 0 === o && (o = Promise); + var a = new D(p(e, t, r, i), o); + return n.isGeneratorFunction(t) + ? a + : a.next().then(function (e) { + return e.done ? e.value : a.next(); + }); + }), + I(x), + f(x, d, "Generator"), + f(x, c, function () { + return this; + }), + f(x, "toString", function () { + return "[object Generator]"; + }), + (n.keys = function (e) { + var t = Object(e), + n = []; + for (var r in t) n.push(r); + return ( + n.reverse(), + function i() { + for (; n.length; ) { + var e = n.pop(); + if (e in t) return ((i.value = e), (i.done = !1), i); + } + return ((i.done = !0), i); + } + ); + }), + (n.values = P), + (N.prototype = { + constructor: N, + reset: function (e) { + if ( + ((this.prev = 0), + (this.next = 0), + (this.sent = this._sent = t), + (this.done = !1), + (this.delegate = null), + (this.method = "next"), + (this.arg = t), + this.tryEntries.forEach(M), + !e) + ) + for (var n in this) + "t" === n.charAt(0) && + a.call(this, n) && + !isNaN(+n.slice(1)) && + (this[n] = t); + }, + stop: function () { + this.done = !0; + var e = this.tryEntries[0].completion; + if ("throw" === e.type) throw e.arg; + return this.rval; + }, + dispatchException: function (e) { + if (this.done) throw e; + var n = this; + function r(r, i) { + return ( + (s.type = "throw"), + (s.arg = e), + (n.next = r), + i && ((n.method = "next"), (n.arg = t)), + !!i + ); + } + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var o = this.tryEntries[i], + s = o.completion; + if ("root" === o.tryLoc) return r("end"); + if (o.tryLoc <= this.prev) { + var u = a.call(o, "catchLoc"), + c = a.call(o, "finallyLoc"); + if (u && c) { + if (this.prev < o.catchLoc) return r(o.catchLoc, !0); + if (this.prev < o.finallyLoc) return r(o.finallyLoc); + } else if (u) { + if (this.prev < o.catchLoc) return r(o.catchLoc, !0); + } else { + if (!c) + throw new Error( + "try statement without catch or finally", + ); + if (this.prev < o.finallyLoc) return r(o.finallyLoc); + } + } + } + }, + abrupt: function (e, t) { + for (var n = this.tryEntries.length - 1; n >= 0; --n) { + var r = this.tryEntries[n]; + if ( + r.tryLoc <= this.prev && + a.call(r, "finallyLoc") && + this.prev < r.finallyLoc + ) { + var i = r; + break; + } + } + i && + ("break" === e || "continue" === e) && + i.tryLoc <= t && + t <= i.finallyLoc && + (i = null); + var o = i ? i.completion : {}; + return ( + (o.type = e), + (o.arg = t), + i + ? ((this.method = "next"), + (this.next = i.finallyLoc), + y) + : this.complete(o) + ); + }, + complete: function (e, t) { + if ("throw" === e.type) throw e.arg; + return ( + "break" === e.type || "continue" === e.type + ? (this.next = e.arg) + : "return" === e.type + ? ((this.rval = this.arg = e.arg), + (this.method = "return"), + (this.next = "end")) + : "normal" === e.type && t && (this.next = t), + y + ); + }, + finish: function (e) { + for (var t = this.tryEntries.length - 1; t >= 0; --t) { + var n = this.tryEntries[t]; + if (n.finallyLoc === e) + return ( + this.complete(n.completion, n.afterLoc), + M(n), + y + ); + } + }, + catch: function (e) { + for (var t = this.tryEntries.length - 1; t >= 0; --t) { + var n = this.tryEntries[t]; + if (n.tryLoc === e) { + var r = n.completion; + if ("throw" === r.type) { + var i = r.arg; + M(n); + } + return i; + } + } + throw new Error("illegal catch attempt"); + }, + delegateYield: function (e, n, r) { + return ( + (this.delegate = { + iterator: P(e), + resultName: n, + nextLoc: r, + }), + "next" === this.method && (this.arg = t), + y + ); + }, + }), + n + ); + } + ((e.exports = i), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 9272: function (e, t, n) { + "use strict"; + var r = n(8554), + i = n(4805), + o = n(2075), + a = n(2971); + ((e.exports = function (e, t) { + return r(e) || i(e, t) || o(e, t) || a(); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 1819: function (e, t, n) { + "use strict"; + var r = n(8198), + i = n(6884), + o = n(2075), + a = n(5838); + ((e.exports = function (e) { + return r(e) || i(e) || o(e) || a(); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 7278: function (e, t, n) { + "use strict"; + var r = n(9367)["default"]; + ((e.exports = function (e, t) { + if ("object" != r(e) || !e) return e; + var n = e[Symbol.toPrimitive]; + if (void 0 !== n) { + var i = n.call(e, t || "default"); + if ("object" != r(i)) return i; + throw new TypeError( + "@@toPrimitive must return a primitive value.", + ); + } + return ("string" === t ? String : Number)(e); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 3987: function (e, t, n) { + "use strict"; + var r = n(9367)["default"], + i = n(7278); + ((e.exports = function (e) { + var t = i(e, "string"); + return "symbol" == r(t) ? t : String(t); + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 9367: function (e) { + "use strict"; + function t(n) { + return ( + (e.exports = t = + "function" == typeof Symbol && + "symbol" == typeof Symbol.iterator + ? function (e) { + return typeof e; + } + : function (e) { + return e && + "function" == typeof Symbol && + e.constructor === Symbol && + e !== Symbol.prototype + ? "symbol" + : typeof e; + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports), + t(n) + ); + } + ((e.exports = t), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 2075: function (e, t, n) { + "use strict"; + var r = n(6530); + ((e.exports = function (e, t) { + if (e) { + if ("string" == typeof e) return r(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return ( + "Object" === n && e.constructor && (n = e.constructor.name), + "Map" === n || "Set" === n + ? Array.from(e) + : "Arguments" === n || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ? r(e, t) + : void 0 + ); + } + }), + (e.exports.__esModule = !0), + (e.exports["default"] = e.exports)); + }, + 479: function (e, t, n) { + "use strict"; + var r = n(477)(n(9367)), + i = n(7120)(); + e.exports = i; + try { + regeneratorRuntime = i; + } catch (o) { + "object" === + ("undefined" == typeof globalThis + ? "undefined" + : (0, r["default"])(globalThis)) + ? (globalThis.regeneratorRuntime = i) + : Function("r", "regeneratorRuntime = r")(i); + } + }, + 5707: function (e) { + "use strict"; + e.exports = JSON.parse( + '{"name":"@cloudbase/js-sdk","version":"1.7.2","description":"cloudbase javascript sdk","main":"dist/index.cjs.js","module":"dist/index.esm.js","miniprogram":"miniprogram_dist","typings":"./index.d.ts","scripts":{"lint":"eslint --fix \\"./src/**/*.ts\\" \\"./database/**/*.ts\\"","build":"rm -rf dist/ && gulp build","build:cdn":"gulp cdn","build:miniapp":"gulp miniapp","build:e2e":"rm -rf dist/ && NODE_ENV=e2e gulp e2e"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"https://github.com/TencentCloudBase/cloudbase-js-sdk"},"keywords":["tcb","cloudbase","Cloudbase","serverless","Serverless","javascript","JavaScript"],"files":["miniprogram_dist","**/dist/","/index.d.ts","**/package.json"],"components":["app","auth","database","functions","storage"],"author":"","license":"ISC","dependencies":{"@cloudbase/analytics":"^1.1.1-alpha.0","@cloudbase/app":"^1.4.1","@cloudbase/auth":"^1.6.1","@cloudbase/database":"0.9.18-next","@cloudbase/functions":"^1.3.4","@cloudbase/realtime":"^1.1.4-alpha.0","@cloudbase/storage":"^1.3.4","@cloudbase/types":"^1.1.3-alpha.0","@cloudbase/utilities":"^1.3.4"},"devDependencies":{"@babel/core":"^7.9.0","@babel/plugin-proposal-class-properties":"^7.8.3","@babel/plugin-transform-runtime":"^7.9.0","@babel/preset-env":"^7.9.5","@babel/preset-typescript":"^7.9.0","@typescript-eslint/eslint-plugin":"^3.8.0","@typescript-eslint/parser":"^3.8.0","awesome-typescript-loader":"^5.2.1","babel-loader":"^8.1.0","eslint":"^7.6.0","eslint-config-alloy":"^3.7.4","gulp":"^4.0.2","gulp-clean":"^0.4.0","gulp-rename":"^2.0.0","gulp-sourcemaps":"^2.6.5","gulp-typescript":"^6.0.0-alpha.1","json-loader":"^0.5.7","merge-stream":"^2.0.0","package-json-cleanup-loader":"^1.0.3","typescript":"^3.8.3","webpack":"4.41.3","webpack-cli":"^3.3.11","webpack-node-externals":"^1.7.2","webpack-stream":"^5.2.1","webpack-visualizer-plugin":"^0.1.11"},"browserslist":["last 2 version","> 1%","not dead","chrome 53"],"gitHead":"29ca0bf24318daa1fbb230910edf0b1545e17e7f"}', + ); + }, + }, + t = {}; + function n(r) { + var i = t[r]; + if (i !== undefined) return i.exports; + var o = (t[r] = { id: r, loaded: !1, exports: {} }); + return (e[r](o, o.exports, n), (o.loaded = !0), o.exports); + } + ((n.amdO = {}), + (n.n = function (e) { + var t = + e && e.__esModule + ? function () { + return e["default"]; + } + : function () { + return e; + }; + return (n.d(t, { a: t }), t); + }), + (n.d = function (e, t) { + for (var r in t) + n.o(t, r) && + !n.o(e, r) && + Object.defineProperty(e, r, { enumerable: !0, get: t[r] }); + }), + (n.g = (function () { + if ("object" == typeof globalThis) return globalThis; + try { + return this || new Function("return this")(); + } catch (e) { + if ("object" == typeof window) return window; + } + })()), + (n.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }), + (n.r = function (e) { + ("undefined" != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), + Object.defineProperty(e, "__esModule", { value: !0 })); + }), + (n.nmd = function (e) { + return ((e.paths = []), e.children || (e.children = []), e); + })); + var r = {}; + return ( + (function () { + "use strict"; + var e = r, + t = n(477); + (Object.defineProperty(e, "__esModule", { value: !0 }), + (e["default"] = void 0), + (e.getCommentsCount = function () { + return m.apply(this, arguments); + }), + (e.getRecentComments = function () { + return g.apply(this, arguments); + }), + (e.init = p), + Object.defineProperty(e, "version", { + enumerable: !0, + get: function () { + return a.version; + }, + })); + var i = t(n(479)), + o = t(n(4964)), + a = n(2199), + s = n(824), + u = n(1085), + c = n(8129), + l = t(n(9459)); + function d(e) { + return f.apply(this, arguments); + } + function f() { + return (f = (0, o["default"])( + i["default"].mark(function e(t) { + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + return ((e.next = 2), (0, s.install)(l["default"], t)); + case 2: + return e.abrupt("return", e.sent); + case 3: + case "end": + return e.stop(); + } + }, e); + }), + )).apply(this, arguments); + } + function p() { + return h.apply(this, arguments); + } + function h() { + return ( + (h = (0, o["default"])( + i["default"].mark(function e() { + var t, + n, + r = arguments; + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + if ( + ((t = + r.length > 0 && r[0] !== undefined ? r[0] : {}), + !(0, c.isUrl)(t.envId)) + ) { + e.next = 5; + break; + } + ((e.t0 = null), (e.next = 8)); + break; + case 5: + return ((e.next = 7), d(t)); + case 7: + e.t0 = e.sent; + case 8: + ((n = e.t0), + (0, c.setLanguage)(t), + (0, u.render)(n, t)); + case 11: + case "end": + return e.stop(); + } + }, e); + }), + )), + h.apply(this, arguments) + ); + } + function m() { + return ( + (m = (0, o["default"])( + i["default"].mark(function e() { + var t, + n, + r = arguments; + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + if ( + ((t = + r.length > 0 && r[0] !== undefined ? r[0] : {}), + !(0, c.isUrl)(t.envId)) + ) { + e.next = 5; + break; + } + ((e.t0 = null), (e.next = 8)); + break; + case 5: + return ((e.next = 7), d(t)); + case 7: + e.t0 = e.sent; + case 8: + return ( + (n = e.t0), + (e.next = 11), + (0, c.getCommentsCountApi)(n, t) + ); + case 11: + return e.abrupt("return", e.sent); + case 12: + case "end": + return e.stop(); + } + }, e); + }), + )), + m.apply(this, arguments) + ); + } + function g() { + return ( + (g = (0, o["default"])( + i["default"].mark(function e() { + var t, + n, + r = arguments; + return i["default"].wrap(function (e) { + for (;;) + switch ((e.prev = e.next)) { + case 0: + if ( + ((t = + r.length > 0 && r[0] !== undefined ? r[0] : {}), + !(0, c.isUrl)(t.envId)) + ) { + e.next = 5; + break; + } + ((e.t0 = null), (e.next = 8)); + break; + case 5: + return ((e.next = 7), d(t)); + case 7: + e.t0 = e.sent; + case 8: + return ( + (n = e.t0), + (e.next = 11), + (0, c.getRecentCommentsApi)(n, t) + ); + case 11: + return e.abrupt("return", e.sent); + case 12: + case "end": + return e.stop(); + } + }, e); + }), + )), + g.apply(this, arguments) + ); + } + (n(9744), n(7441), n(5417), (e["default"] = p)); + })(), + r + ); + })(); + }), + "object" == typeof exports && "object" == typeof module + ? (module.exports = t()) + : "function" == typeof define && define.amd + ? define([], t) + : "object" == typeof exports + ? (exports.twikoo = t()) + : (e.twikoo = t())); diff --git a/public/assets/music/深海之息.m4a b/public/assets/music/深海之息.m4a new file mode 100644 index 0000000..8089623 Binary files /dev/null and b/public/assets/music/深海之息.m4a differ diff --git a/public/favicon/icon-dark.ico b/public/favicon/icon-dark.ico new file mode 100644 index 0000000..5f61d82 Binary files /dev/null and b/public/favicon/icon-dark.ico differ diff --git a/public/favicon/icon-light.ico b/public/favicon/icon-light.ico new file mode 100644 index 0000000..32ce082 Binary files /dev/null and b/public/favicon/icon-light.ico differ diff --git a/public/pio/models/pio/model.json b/public/pio/models/pio/model.json new file mode 100644 index 0000000..e2e8610 --- /dev/null +++ b/public/pio/models/pio/model.json @@ -0,0 +1,79 @@ +{ + "version":"1.0.0", + "model":"model.moc", + "textures":[ + "textures/default-costume.png", + "textures/pajamas-costume.png", + "textures/school-costume.png" + ], + "layout":{ + "center_x":0.0, + "center_y":-0.05, + "width":2.0 + }, + "hit_areas_custom":{ + "head_x":[-0.35, 0.6], + "head_y":[0.19, -0.2], + "body_x":[-0.3, -0.25], + "body_y":[0.3, -0.9] + }, + "motions":{ + "idle":[ + {"file":"motions/WakeUp.mtn"}, + {"file":"motions/Breath1.mtn"}, + {"file":"motions/Breath2.mtn"}, + {"file":"motions/Breath3.mtn"}, + {"file":"motions/Breath5.mtn"}, + {"file":"motions/Breath7.mtn"}, + {"file":"motions/Breath8.mtn"} + ], + "sleepy":[ + {"file":"motions/Sleeping.mtn"} + ], + "flick_head":[ + {"file":"motions/Touch Dere1.mtn"}, + {"file":"motions/Touch Dere2.mtn"}, + {"file":"motions/Touch Dere3.mtn"}, + {"file":"motions/Touch Dere4.mtn"}, + {"file":"motions/Touch Dere5.mtn"}, + {"file":"motions/Touch Dere6.mtn"} + ], + "tap_body":[ + {"file":"motions/Touch1.mtn"}, + {"file":"motions/Touch2.mtn"}, + {"file":"motions/Touch3.mtn"}, + {"file":"motions/Touch4.mtn"}, + {"file":"motions/Touch5.mtn"}, + {"file":"motions/Touch6.mtn"} + ], + "":[ + {"file":"motions/Breath1.mtn"}, + {"file":"motions/Breath2.mtn"}, + {"file":"motions/Breath3.mtn"}, + {"file":"motions/Breath4.mtn"}, + {"file":"motions/Breath5.mtn"}, + {"file":"motions/Breath6.mtn"}, + {"file":"motions/Breath7.mtn"}, + {"file":"motions/Breath8.mtn"}, + {"file":"motions/Fail.mtn"}, + {"file":"motions/Sleeping.mtn"}, + {"file":"motions/Success.mtn"}, + {"file":"motions/Sukebei1.mtn"}, + {"file":"motions/Sukebei2.mtn"}, + {"file":"motions/Sukebei3.mtn"}, + {"file":"motions/Touch Dere1.mtn"}, + {"file":"motions/Touch Dere2.mtn"}, + {"file":"motions/Touch Dere3.mtn"}, + {"file":"motions/Touch Dere4.mtn"}, + {"file":"motions/Touch Dere5.mtn"}, + {"file":"motions/Touch Dere6.mtn"}, + {"file":"motions/Touch1.mtn"}, + {"file":"motions/Touch2.mtn"}, + {"file":"motions/Touch3.mtn"}, + {"file":"motions/Touch4.mtn"}, + {"file":"motions/Touch5.mtn"}, + {"file":"motions/Touch6.mtn"}, + {"file":"motions/WakeUp.mtn"} + ] + } +} \ No newline at end of file diff --git a/public/pio/models/pio/model.moc b/public/pio/models/pio/model.moc new file mode 100644 index 0000000..4c7909d Binary files /dev/null and b/public/pio/models/pio/model.moc differ diff --git a/public/pio/models/pio/motions/Breath Dere1.mtn b/public/pio/models/pio/motions/Breath Dere1.mtn new file mode 100644 index 0000000..7f08daf --- /dev/null +++ b/public/pio/models/pio/motions/Breath Dere1.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.38,1.37,2.8,4.44,6.14,7.73,9.08,10.12,10.77,11,10.52,9.23,7.36,5.14,2.86,0.64,-1.23,-2.52,-3,-2.94,-2.78,-2.54,-2.24,-1.9,-1.54,-1.19,-0.87,-0.58,-0.34,-0.15,-0.04,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Y=0,0.02,0.09,0.21,0.4,0.66,0.99,1.39,1.86,2.39,3,3.77,4.55,5.31,6.03,6.66,7.21,7.63,7.9,8,7.84,7.41,6.77,5.96,5.07,4.12,3.18,2.31,1.54,0.89,0.41,0.1,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=0,0.38,1.37,2.8,4.44,6.14,7.73,9.08,10.12,10.77,11,10.14,7.83,4.5,0.54,-3.54,-7.5,-10.83,-13.14,-14,-13.72,-12.97,-11.84,-10.43,-8.87,-7.21,-5.57,-4.05,-2.7,-1.57,-0.71,-0.18,0,0,0,0,0,0,0,0,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55 +PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.48,0.37,0.27,0.2,0.17,0.17,0.17,0.17,0.172,0.176,0.182,0.19,0.22,0.28,0.34,0.4,0.46,0.51,0.54,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_ANGLE=0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2 +PARAM_BROW_SELECT=-0.5 +PARAM_MOUTH_OPEN_Y=0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.89,0.83,0.75,0.66,0.6,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.57,0.59,0.64,0.7,0.77,0.83,0.88,0.91,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92 +PARAM_MOUTH_OPEN2=-1 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0,0.1,0.37,0.76,1.21,1.68,2.11,2.48,2.76,2.94,3,2.76,2.11,1.18,0.07,-1.07,-2.18,-3.11,-3.76,-4,-3.88,-3.56,-3.08,-2.47,-1.8,-1.09,-0.39,0.26,0.84,1.33,1.69,1.92,2,1.87,1.59,1.23,0.87,0.53,0.25,0.07,0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BODY_Y=0,-0.01,-0.03,-0.07,-0.11,-0.16,-0.2,-0.23,-0.26,-0.274,-0.28,-0.262,-0.21,-0.14,-0.06,0.02,0.1,0.17,0.22,0.24,0.233,0.216,0.19,0.16,0.12,0.08,0.04,0.01,-0.03,-0.05,-0.073,-0.086,-0.09,-0.084,-0.071,-0.055,-0.039,-0.024,-0.011,-0.003,0 +PARAM_BREATH=0.5,0.46,0.41,0.35,0.32,0.3,0.34,0.43,0.53,0.65,0.75,0.83,0.89,0.91,0.905,0.891,0.87,0.84,0.81,0.77,0.73,0.69,0.65,0.6,0.56,0.52,0.48,0.45,0.42,0.4,0.384,0.374,0.37,0.379,0.397,0.42,0.44,0.47,0.484,0.496,0.5 +PARAM_BOING=0 +PARAM_HAIR_FRONT=0,0,0,0,0,0,0,0.03,0.11,0.21,0.3,0.38,0.41,0.37,0.26,0.12,-0.05,-0.22,-0.39,-0.56,-0.69,-0.8,-0.87,-0.9,-0.81,-0.58,-0.27,0.04,0.27,0.36,0.33,0.24,0.13,0.02,-0.07,-0.1,-0.082,-0.05,-0.03,-0.008,0 +PARAM_HAIR_SIDE_R=0,-0.005,-0.019,-0.04,-0.07,-0.1,-0.14,-0.18,-0.21,-0.25,-0.29,-0.32,-0.35,-0.37,-0.386,-0.396,-0.4,-0.37,-0.28,-0.15,0.01,0.16,0.32,0.45,0.54,0.57,0.52,0.4,0.26,0.12,-0.02,-0.13,-0.2,-0.23,-0.213,-0.17,-0.12,-0.07,-0.03,-0.01,0 +PARAM_HAIR_SIDE_L=0,0.003,0.013,0.028,0.047,0.07,0.09,0.12,0.14,0.17,0.19,0.21,0.234,0.249,0.26,0.268,0.27,0.23,0.14,0,-0.16,-0.33,-0.49,-0.63,-0.72,-0.76,-0.69,-0.53,-0.33,-0.13,0.06,0.21,0.31,0.35,0.32,0.26,0.19,0.11,0.05,0.01,0 +PARAM_TWIN_RIBBON_D=0,-0.018,-0.06,-0.13,-0.21,-0.29,-0.37,-0.43,-0.48,-0.51,-0.52,-0.48,-0.38,-0.25,-0.09,0.07,0.23,0.38,0.51,0.61,0.68,0.7,0.66,0.55,0.39,0.2,0,-0.19,-0.35,-0.46,-0.5,-0.483,-0.44,-0.37,-0.3,-0.22,-0.15,-0.09,-0.04,-0.01,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0 +PARAM_WING_DEFORM=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath Dere2.mtn b/public/pio/models/pio/motions/Breath Dere2.mtn new file mode 100644 index 0000000..cc6acd9 --- /dev/null +++ b/public/pio/models/pio/motions/Breath Dere2.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.35,1.29,2.74,4.53,6.6,8.86,11.27,13.67,16.13,18.44,20.64,22.67,24.45,25.92,27.04,27.75,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,27.65,26.71,25.26,23.47,21.4,19.14,16.73,14.33,11.87,9.56,7.36,5.33,3.55,2.08,0.96,0.25,0 +PARAM_ANGLE_Y=0,-0.18,-0.65,-1.37,-2.26,-3.3,-4.43,-5.63,-6.84,-8.06,-9.22,-10.32,-11.33,-12.23,-12.96,-13.52,-13.87,-14,-13.995,-13.982,-13.96,-13.93,-13.89,-13.83,-13.77,-13.7,-13.62,-13.53,-13.42,-13.31,-13.19,-13.05,-12.91,-12.75,-12.58,-12.4,-12.2,-12,-11.78,-11.55,-11.31,-11.05,-10.79,-10.5,-10.21,-9.9,-9.57,-9.24,-8.89,-8.52,-8.14,-7.74,-7.33,-6.9,-6.45,-6,-5.45,-4.92,-4.39,-3.88,-3.38,-2.91,-2.45,-2.04,-1.64,-1.28,-0.97,-0.68,-0.45,-0.26,-0.12,-0.03,0 +PARAM_ANGLE_Z=0,0.09,0.32,0.68,1.13,1.65,2.21,2.82,3.42,4.03,4.61,5.16,5.67,6.11,6.48,6.76,6.94,7,6.97,6.89,6.77,6.59,6.38,6.13,5.85,5.53,5.18,4.82,4.43,4.01,3.59,3.15,2.69,2.23,1.76,1.3,0.82,0.35,-0.11,-0.57,-1.01,-1.45,-1.87,-2.28,-2.66,-3.03,-3.38,-3.69,-3.98,-4.24,-4.46,-4.65,-4.8,-4.91,-4.98,-5,-4.94,-4.77,-4.51,-4.19,-3.82,-3.42,-2.99,-2.56,-2.12,-1.71,-1.31,-0.95,-0.63,-0.37,-0.17,-0.04,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.4,0.24,0.13,0.09,0.17,0.33,0.41,0.33,0.21,0.12,0.09,0.2,0.39,0.5,0.502,0.504,0.505,0.507,0.508,0.509,0.511,0.512,0.513,0.514,0.515,0.516,0.516,0.517,0.52,0.518,0.52,0.52,0.519,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.518,0.517,0.515,0.514,0.512,0.51,0.508,0.507,0.505,0.504,0.503,0.501,0.501,0.5,0.5 +PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.4,0.24,0.13,0.09,0.17,0.33,0.41,0.33,0.21,0.12,0.09,0.2,0.39,0.5,0.502,0.504,0.505,0.507,0.508,0.509,0.511,0.512,0.513,0.514,0.515,0.516,0.516,0.517,0.52,0.518,0.52,0.52,0.519,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.518,0.517,0.515,0.514,0.512,0.51,0.508,0.507,0.505,0.504,0.503,0.501,0.501,0.5,0.5 +PARAM_EYE_BALL_X=0,0.004,0.016,0.033,0.06,0.08,0.11,0.14,0.17,0.2,0.22,0.25,0.28,0.3,0.315,0.328,0.337,0.34,0.332,0.31,0.28,0.24,0.19,0.15,0.1,0.06,0.02,-0.02,-0.05,-0.08,-0.094,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.099,-0.095,-0.09,-0.084,-0.076,-0.068,-0.06,-0.051,-0.042,-0.034,-0.026,-0.019,-0.013,-0.007,-0.003,-0.001,0 +PARAM_EYE_BALL_Y=0,-0.005,-0.019,-0.04,-0.07,-0.1,-0.13,-0.17,-0.21,-0.24,-0.28,-0.31,-0.34,-0.37,-0.39,-0.406,-0.416,-0.42,-0.414,-0.397,-0.37,-0.34,-0.31,-0.27,-0.24,-0.2,-0.17,-0.14,-0.12,-0.097,-0.084,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.079,-0.076,-0.072,-0.067,-0.061,-0.055,-0.048,-0.041,-0.034,-0.027,-0.021,-0.015,-0.01,-0.006,-0.003,-0.001,0 +PARAM_BROW_L_Y=0,0,-0.001,-0.003,-0.005,-0.007,-0.01,-0.014,-0.018,-0.022,-0.027,-0.032,-0.038,-0.044,-0.05,-0.056,-0.063,-0.07,-0.077,-0.085,-0.093,-0.1,-0.108,-0.116,-0.124,-0.133,-0.141,-0.149,-0.157,-0.165,-0.174,-0.182,-0.19,-0.197,-0.205,-0.213,-0.22,-0.227,-0.234,-0.241,-0.247,-0.254,-0.259,-0.265,-0.27,-0.275,-0.28,-0.284,-0.287,-0.291,-0.293,-0.296,-0.298,-0.299,-0.3,-0.3,-0.296,-0.286,-0.271,-0.251,-0.23,-0.21,-0.18,-0.15,-0.13,-0.1,-0.08,-0.06,-0.038,-0.022,-0.01,-0.003,0 +PARAM_BROW_R_Y=0,0,-0.001,-0.003,-0.005,-0.008,-0.012,-0.016,-0.02,-0.025,-0.031,-0.037,-0.043,-0.05,-0.057,-0.064,-0.072,-0.08,-0.088,-0.096,-0.105,-0.114,-0.123,-0.132,-0.141,-0.15,-0.16,-0.169,-0.178,-0.187,-0.197,-0.206,-0.215,-0.224,-0.232,-0.241,-0.249,-0.257,-0.265,-0.273,-0.28,-0.287,-0.294,-0.3,-0.306,-0.312,-0.317,-0.322,-0.326,-0.329,-0.333,-0.335,-0.337,-0.339,-0.34,-0.34,-0.336,-0.324,-0.307,-0.28,-0.26,-0.23,-0.2,-0.17,-0.14,-0.12,-0.09,-0.06,-0.04,-0.025,-0.012,-0.003,0 +PARAM_BROW_L_ANGLE=0,0.001,0.004,0.009,0.016,0.024,0.034,0.046,0.059,0.074,0.09,0.107,0.126,0.146,0.17,0.19,0.21,0.23,0.26,0.28,0.31,0.33,0.36,0.39,0.41,0.44,0.47,0.5,0.52,0.55,0.58,0.61,0.63,0.66,0.68,0.71,0.73,0.76,0.78,0.8,0.82,0.85,0.865,0.883,0.901,0.917,0.932,0.946,0.958,0.969,0.978,0.986,0.992,0.996,0.999,1,0.987,0.95,0.9,0.84,0.76,0.68,0.6,0.51,0.42,0.34,0.26,0.19,0.13,0.07,0.03,0.01,0 +PARAM_BROW_R_ANGLE=0,0.001,0.004,0.009,0.016,0.024,0.034,0.046,0.059,0.074,0.09,0.107,0.126,0.146,0.17,0.19,0.21,0.23,0.26,0.28,0.31,0.33,0.36,0.39,0.41,0.44,0.47,0.5,0.52,0.55,0.58,0.61,0.63,0.66,0.68,0.71,0.73,0.76,0.78,0.8,0.82,0.85,0.865,0.883,0.901,0.917,0.932,0.946,0.958,0.969,0.978,0.986,0.992,0.996,0.999,1,0.987,0.95,0.9,0.84,0.76,0.68,0.6,0.51,0.42,0.34,0.26,0.19,0.13,0.07,0.03,0.01,0 +PARAM_EAR_DEFORM=0,-0.007,-0.026,-0.05,-0.09,-0.13,-0.18,-0.23,-0.27,-0.32,-0.37,-0.41,-0.45,-0.49,-0.52,-0.54,-0.555,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.56,-0.553,-0.534,-0.51,-0.47,-0.43,-0.38,-0.33,-0.29,-0.24,-0.19,-0.15,-0.11,-0.07,-0.04,-0.02,-0.005,0 +PARAM_MOUTH_OPEN_Y=0.5,0.505,0.518,0.54,0.56,0.59,0.63,0.66,0.7,0.73,0.76,0.79,0.82,0.85,0.87,0.886,0.896,0.9,0.895,0.881,0.86,0.84,0.81,0.78,0.75,0.72,0.69,0.67,0.649,0.634,0.624,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.618,0.614,0.608,0.601,0.592,0.582,0.572,0.561,0.551,0.541,0.532,0.523,0.515,0.509,0.504,0.501,0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0,-0.013,-0.05,-0.1,-0.16,-0.24,-0.32,-0.4,-0.49,-0.58,-0.66,-0.74,-0.81,-0.87,-0.93,-0.97,-0.99,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.987,-0.95,-0.9,-0.84,-0.76,-0.68,-0.6,-0.51,-0.42,-0.34,-0.26,-0.19,-0.13,-0.07,-0.03,-0.01,0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.505,0.517,0.535,0.56,0.58,0.61,0.64,0.68,0.71,0.74,0.77,0.79,0.81,0.833,0.848,0.857,0.86,0.859,0.855,0.849,0.842,0.832,0.821,0.808,0.794,0.778,0.762,0.744,0.725,0.706,0.687,0.666,0.65,0.62,0.6,0.58,0.56,0.54,0.52,0.499,0.48,0.461,0.443,0.425,0.409,0.393,0.379,0.366,0.354,0.344,0.336,0.329,0.324,0.321,0.32,0.322,0.328,0.338,0.349,0.362,0.377,0.392,0.408,0.424,0.439,0.453,0.466,0.477,0.487,0.494,0.498,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0 +PARAM_WING_DEFORM=0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0,0.006,0.023,0.05,0.08,0.13,0.17,0.22,0.28,0.34,0.39,0.45,0.5,0.54,0.59,0.62,0.65,0.664,0.67,0.67,0.67,0.67,0.669,0.668,0.666,0.665,0.663,0.661,0.659,0.656,0.653,0.65,0.646,0.642,0.637,0.632,0.627,0.621,0.614,0.607,0.6,0.592,0.583,0.574,0.565,0.555,0.544,0.533,0.521,0.508,0.495,0.481,0.467,0.452,0.436,0.42,0.4,0.37,0.34,0.31,0.28,0.24,0.21,0.18,0.15,0.12,0.09,0.06,0.04,0.024,0.011,0.003,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath Dere3.mtn b/public/pio/models/pio/motions/Breath Dere3.mtn new file mode 100644 index 0000000..4a05189 --- /dev/null +++ b/public/pio/models/pio/motions/Breath Dere3.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.007,0.03,0.06,0.11,0.17,0.24,0.32,0.42,0.52,0.63,0.75,0.87,1.01,1.15,1.29,1.44,1.59,1.75,1.91,2.07,2.23,2.4,2.56,2.72,2.89,3.05,3.21,3.36,3.51,3.66,3.8,3.94,4.07,4.2,4.32,4.43,4.53,4.62,4.71,4.78,4.85,4.9,4.94,4.97,4.993,5,4.94,4.76,4.48,4.13,3.72,3.27,2.8,2.32,1.86,1.42,1.02,0.67,0.39,0.18,0.04,0 +PARAM_ANGLE_Y=0,-0.015,-0.06,-0.13,-0.22,-0.34,-0.49,-0.65,-0.84,-1.04,-1.26,-1.5,-1.75,-2.02,-2.29,-2.58,-2.88,-3.18,-3.5,-3.82,-4.14,-4.47,-4.79,-5.12,-5.45,-5.77,-6.1,-6.41,-6.73,-7.03,-7.32,-7.6,-7.88,-8.15,-8.4,-8.63,-8.85,-9.06,-9.24,-9.42,-9.56,-9.69,-9.8,-9.89,-9.95,-9.99,-10,-9.87,-9.52,-8.97,-8.26,-7.44,-6.53,-5.6,-4.65,-3.72,-2.84,-2.05,-1.35,-0.78,-0.36,-0.09,0 +PARAM_ANGLE_Z=0,-0.08,-0.28,-0.59,-0.97,-1.41,-1.9,-2.41,-2.93,-3.46,-3.95,-4.42,-4.86,-5.24,-5.55,-5.79,-5.95,-6,-5.84,-5.38,-4.66,-3.72,-2.61,-1.34,0.04,1.5,3,4.5,5.96,7.34,8.61,9.72,10.66,11.38,11.84,12,11.95,11.81,11.59,11.29,10.91,10.49,10,9.46,8.89,8.29,7.65,7,6.33,5.67,5,4.35,3.71,3.11,2.54,2,1.51,1.09,0.71,0.41,0.19,0.05,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.58,0.64,0.72,0.8,0.87,0.91,0.92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.92,0.907,0.87,0.83,0.77,0.71,0.66,0.61,0.58,0.56,0.55 +PARAM_EYE_R_OPEN=0.55,0.58,0.64,0.72,0.8,0.87,0.91,0.92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.92,0.907,0.87,0.83,0.77,0.71,0.66,0.61,0.58,0.56,0.55 +PARAM_EYE_L_OPEN2=-1,-0.999,-0.994,-0.986,-0.976,-0.962,-0.947,-0.93,0.83,0.81,0.75,0.68,0.58,0.48,0.38,0.3,0.24,0.21,0.2,0.19,0.182,0.173,0.166,0.159,0.152,0.146,0.141,0.136,0.131,0.127,0.123,0.12,0.117,0.114,0.112,0.109,0.108,0.106,0.105,0.103,0.102,0.102,0.101,0.1,0.1,0.1,0.1,0.23,0.44,0.63,0.78,0.83,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +PARAM_EYE_R_OPEN2=-1,-0.999,-0.996,-0.99,-0.983,-0.973,-0.962,-0.95,0.82,0.8,0.75,0.67,0.57,0.48,0.38,0.3,0.24,0.21,0.2,0.19,0.182,0.173,0.166,0.159,0.152,0.147,0.141,0.136,0.131,0.127,0.123,0.12,0.117,0.114,0.112,0.109,0.108,0.106,0.105,0.103,0.102,0.102,0.101,0.1,0.1,0.1,0.1,0.23,0.45,0.65,0.79,0.85,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +PARAM_EYE_BALL_X=0,0,0,-0.002,-0.003,-0.005,-0.007,-0.009,-0.011,-0.013,-0.015,-0.018,-0.02,-0.022,-0.024,-0.026,-0.028,-0.03,-0.032,-0.034,-0.035,-0.037,-0.038,-0.039,-0.04,-0.042,-0.043,-0.043,-0.044,-0.045,-0.05,-0.046,-0.05,-0.047,-0.05,-0.048,-0.05,-0.05,-0.049,-0.05,-0.05,-0.05,-0.05,-0.05,-0.05,-0.05,-0.05,-0.049,-0.048,-0.045,-0.041,-0.037,-0.033,-0.028,-0.023,-0.019,-0.014,-0.01,-0.007,-0.004,-0.002,0,0 +PARAM_EYE_BALL_Y=0,0.004,0.013,0.028,0.047,0.07,0.09,0.12,0.14,0.17,0.19,0.21,0.23,0.253,0.268,0.28,0.287,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.289,0.29,0.29,0.287,0.287,0.286,0.285,0.284,0.283,0.281,0.28,0.278,0.276,0.274,0.272,0.269,0.267,0.264,0.261,0.257,0.254,0.25,0.243,0.231,0.216,0.197,0.18,0.15,0.13,0.11,0.09,0.07,0.047,0.031,0.018,0.008,0.002,0 +PARAM_BROW_L_Y=0,-0.018,-0.06,-0.11,-0.16,-0.21,-0.23,-0.24,-0.238,-0.231,-0.222,-0.212,-0.201,-0.191,-0.182,-0.176,-0.171,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.168,-0.162,-0.152,-0.14,-0.126,-0.111,-0.095,-0.079,-0.063,-0.048,-0.035,-0.023,-0.013,-0.006,-0.002,0 +PARAM_BROW_R_Y=0,-0.018,-0.06,-0.11,-0.16,-0.21,-0.23,-0.24,-0.238,-0.231,-0.222,-0.212,-0.201,-0.191,-0.182,-0.176,-0.171,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.168,-0.162,-0.152,-0.14,-0.126,-0.111,-0.095,-0.079,-0.063,-0.048,-0.035,-0.023,-0.013,-0.006,-0.002,0 +PARAM_BROW_ANGLE=0.2,0.202,0.207,0.218,0.232,0.251,0.27,0.3,0.34,0.37,0.41,0.43,0.46,0.477,0.492,0.502,0.508,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.51,0.506,0.495,0.478,0.46,0.43,0.4,0.37,0.34,0.32,0.29,0.26,0.24,0.224,0.211,0.203,0.2 +PARAM_BROW_SELECT=-0.5 +PARAM_MOUTH_OPEN_Y=0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.904,0.87,0.82,0.76,0.73,0.71,0.726,0.77,0.81,0.86,0.9,0.92,0.93,0.9,0.85,0.8,0.76,0.75,0.763,0.79,0.84,0.88,0.91,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92,0.92 +PARAM_MOUTH_OPEN2=-1 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0,0.003,0.012,0.027,0.047,0.07,0.1,0.13,0.16,0.2,0.24,0.28,0.32,0.36,0.4,0.44,0.48,0.52,0.56,0.6,0.63,0.67,0.7,0.73,0.75,0.77,0.787,0.8,0.807,0.81,0.808,0.801,0.791,0.777,0.76,0.74,0.72,0.69,0.66,0.63,0.6,0.57,0.53,0.5,0.46,0.42,0.39,0.35,0.31,0.28,0.24,0.21,0.18,0.15,0.12,0.09,0.07,0.05,0.033,0.019,0.009,0.002,0 +PARAM_BODY_ANGLE_X=0,-0.003,-0.011,-0.023,-0.04,-0.06,-0.08,-0.11,-0.14,-0.18,-0.21,-0.25,-0.29,-0.33,-0.37,-0.41,-0.45,-0.49,-0.54,-0.58,-0.62,-0.66,-0.7,-0.74,-0.78,-0.81,-0.84,-0.87,-0.9,-0.93,-0.95,-0.966,-0.98,-0.991,-0.998,-1,-0.996,-0.984,-0.966,-0.94,-0.91,-0.87,-0.83,-0.79,-0.74,-0.69,-0.64,-0.58,-0.53,-0.47,-0.42,-0.36,-0.31,-0.26,-0.21,-0.17,-0.13,-0.09,-0.06,-0.03,-0.016,-0.004,0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BODY_Y=0,0,0.002,0.003,0.006,0.009,0.013,0.017,0.021,0.026,0.032,0.037,0.043,0.049,0.055,0.061,0.068,0.074,0.081,0.087,0.093,0.099,0.105,0.111,0.116,0.122,0.126,0.131,0.135,0.139,0.142,0.145,0.147,0.149,0.15,0.15,0.149,0.148,0.145,0.141,0.136,0.131,0.125,0.118,0.111,0.104,0.096,0.087,0.079,0.071,0.063,0.054,0.046,0.039,0.032,0.025,0.019,0.014,0.009,0.005,0.002,0.001,0 +PARAM_BREATH=0.5,0.506,0.521,0.54,0.57,0.61,0.64,0.68,0.72,0.76,0.8,0.83,0.86,0.89,0.92,0.935,0.946,0.95,0.944,0.927,0.9,0.87,0.83,0.79,0.74,0.69,0.64,0.59,0.54,0.49,0.45,0.41,0.37,0.33,0.31,0.287,0.275,0.27,0.271,0.274,0.28,0.287,0.296,0.306,0.317,0.329,0.342,0.356,0.369,0.383,0.397,0.411,0.424,0.437,0.449,0.46,0.47,0.478,0.486,0.492,0.496,0.499,0.5 +PARAM_BOING=0,0.002,0.006,0.014,0.023,0.033,0.044,0.056,0.068,0.081,0.092,0.103,0.113,0.122,0.13,0.135,0.139,0.14,0.137,0.128,0.115,0.098,0.079,0.06,0.04,0.01,-0.01,-0.03,-0.052,-0.07,-0.087,-0.101,-0.111,-0.118,-0.12,-0.12,-0.118,-0.116,-0.113,-0.109,-0.105,-0.1,-0.095,-0.089,-0.083,-0.077,-0.07,-0.064,-0.058,-0.051,-0.045,-0.039,-0.033,-0.027,-0.022,-0.017,-0.013,-0.009,-0.006,-0.003,-0.002,0,0 +PARAM_HAIR_FRONT=0 +PARAM_HAIR_SIDE_R=0,-0.002,-0.007,-0.015,-0.024,-0.035,-0.047,-0.06,-0.073,-0.086,-0.099,-0.111,-0.121,-0.131,-0.139,-0.145,-0.149,-0.15,-0.144,-0.129,-0.11,-0.08,-0.04,-0.01,0.03,0.07,0.11,0.15,0.18,0.21,0.24,0.27,0.285,0.296,0.3,0.299,0.295,0.29,0.282,0.273,0.262,0.25,0.237,0.223,0.208,0.192,0.176,0.16,0.144,0.128,0.112,0.097,0.082,0.068,0.055,0.043,0.032,0.023,0.015,0.009,0.004,0.001,0 +PARAM_HAIR_SIDE_L=0,0.001,0.005,0.011,0.018,0.026,0.035,0.044,0.054,0.063,0.072,0.081,0.089,0.096,0.102,0.106,0.109,0.11,0.1,0.07,0.03,-0.01,-0.07,-0.13,-0.2,-0.27,-0.33,-0.4,-0.46,-0.51,-0.56,-0.6,-0.63,-0.653,-0.66,-0.657,-0.65,-0.637,-0.621,-0.601,-0.58,-0.55,-0.52,-0.49,-0.46,-0.42,-0.39,-0.35,-0.32,-0.28,-0.25,-0.21,-0.18,-0.15,-0.12,-0.09,-0.07,-0.05,-0.033,-0.019,-0.009,-0.002,0 +PARAM_TWIN_RIBBON_D=0,0.002,0.008,0.018,0.03,0.046,0.064,0.09,0.11,0.13,0.16,0.18,0.21,0.24,0.27,0.3,0.33,0.35,0.38,0.4,0.42,0.45,0.464,0.48,0.492,0.502,0.508,0.51,0.506,0.494,0.476,0.45,0.42,0.39,0.35,0.3,0.26,0.21,0.16,0.11,0.06,0.01,-0.04,-0.08,-0.13,-0.16,-0.2,-0.23,-0.26,-0.274,-0.286,-0.29,-0.281,-0.26,-0.23,-0.19,-0.15,-0.11,-0.08,-0.05,-0.02,-0.006,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0.002,0.008,0.017,0.03,0.045,0.062,0.082,0.1,0.13,0.15,0.17,0.2,0.22,0.24,0.27,0.29,0.311,0.33,0.347,0.363,0.376,0.386,0.394,0.398,0.4,0.399,0.396,0.392,0.386,0.379,0.37,0.361,0.35,0.338,0.325,0.311,0.297,0.282,0.267,0.251,0.235,0.218,0.202,0.186,0.17,0.154,0.138,0.123,0.108,0.094,0.08,0.068,0.056,0.045,0.035,0.026,0.018,0.012,0.007,0.003,0.001,0 +PARAM_WING_DEFORM=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath1.mtn b/public/pio/models/pio/motions/Breath1.mtn new file mode 100644 index 0000000..06ef786 --- /dev/null +++ b/public/pio/models/pio/motions/Breath1.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0 +PARAM_ANGLE_Z=0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5 +PARAM_EYE_R_OPEN=0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0 +PARAM_MOUTH_OPEN_Y=0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.5,0.502,0.504,0.507,0.511,0.515,0.52,0.525,0.531,0.537,0.543,0.55,0.557,0.564,0.571,0.578,0.585,0.591,0.598,0.605,0.611,0.617,0.622,0.628,0.633,0.637,0.641,0.644,0.647,0.648,0.65,0.65,0.65,0.649,0.647,0.645,0.642,0.639,0.635,0.631,0.627,0.622,0.617,0.611,0.605,0.6,0.594,0.587,0.581,0.575,0.569,0.563,0.556,0.55,0.545,0.539,0.533,0.528,0.523,0.519,0.515,0.511,0.508,0.505,0.503,0.501,0.5,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0,0.001,0.003,0.005,0.008,0.011,0.015,0.019,0.023,0.027,0.032,0.037,0.042,0.047,0.052,0.057,0.062,0.067,0.072,0.077,0.081,0.086,0.09,0.094,0.097,0.1,0.103,0.106,0.107,0.109,0.11,0.11,0.11,0.11,0.108,0.106,0.104,0.102,0.099,0.096,0.093,0.089,0.085,0.081,0.077,0.073,0.069,0.064,0.06,0.055,0.05,0.046,0.041,0.037,0.033,0.029,0.025,0.021,0.017,0.014,0.011,0.008,0.006,0.004,0.002,0.001,0,0 +PARAM_WING_DEFORM=0,0,0,-0.002,-0.003,-0.005,-0.007,-0.009,-0.012,-0.014,-0.017,-0.02,-0.023,-0.026,-0.03,-0.033,-0.036,-0.039,-0.043,-0.046,-0.049,-0.052,-0.055,-0.057,-0.06,-0.062,-0.064,-0.066,-0.067,-0.068,-0.069,-0.07,-0.07,-0.07,-0.07,-0.069,-0.068,-0.066,-0.065,-0.063,-0.061,-0.059,-0.057,-0.054,-0.052,-0.049,-0.046,-0.044,-0.041,-0.038,-0.035,-0.032,-0.029,-0.026,-0.024,-0.021,-0.018,-0.016,-0.013,-0.011,-0.009,-0.007,-0.005,-0.004,-0.002,-0.001,-0.001,0,0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath2.mtn b/public/pio/models/pio/motions/Breath2.mtn new file mode 100644 index 0000000..07c49ff --- /dev/null +++ b/public/pio/models/pio/motions/Breath2.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0 +PARAM_ANGLE_Z=0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5 +PARAM_EYE_R_OPEN=0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0 +PARAM_MOUTH_OPEN_Y=0.5 +PARAM_BODY_ANGLE_X=0,-0.03,-0.1,-0.21,-0.35,-0.51,-0.69,-0.88,-1.07,-1.26,-1.43,-1.59,-1.73,-1.84,-1.93,-1.98,-2,-1.989,-1.96,-1.91,-1.84,-1.75,-1.65,-1.54,-1.41,-1.27,-1.12,-0.96,-0.8,-0.63,-0.45,-0.27,-0.09,0.09,0.27,0.45,0.63,0.8,0.96,1.12,1.27,1.41,1.54,1.65,1.75,1.84,1.91,1.96,1.99,2,1.982,1.93,1.85,1.75,1.63,1.49,1.34,1.18,1.02,0.86,0.71,0.56,0.42,0.3,0.2,0.11,0.05,0.01,0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.5,0.501,0.503,0.505,0.508,0.511,0.515,0.519,0.524,0.529,0.534,0.539,0.545,0.55,0.556,0.562,0.568,0.574,0.58,0.585,0.591,0.596,0.601,0.606,0.611,0.615,0.619,0.622,0.625,0.627,0.629,0.63,0.63,0.63,0.629,0.627,0.625,0.622,0.619,0.615,0.611,0.607,0.603,0.598,0.593,0.588,0.582,0.577,0.571,0.566,0.56,0.555,0.549,0.544,0.539,0.534,0.529,0.525,0.52,0.516,0.513,0.51,0.507,0.504,0.503,0.501,0.5,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0,0,0.002,0.004,0.006,0.008,0.01,0.013,0.016,0.02,0.023,0.027,0.031,0.035,0.039,0.043,0.047,0.051,0.055,0.059,0.063,0.067,0.07,0.074,0.077,0.08,0.082,0.084,0.086,0.088,0.089,0.09,0.09,0.09,0.09,0.088,0.086,0.085,0.082,0.08,0.077,0.074,0.071,0.068,0.064,0.061,0.057,0.053,0.049,0.045,0.042,0.038,0.034,0.03,0.027,0.023,0.02,0.017,0.014,0.011,0.009,0.007,0.005,0.003,0.002,0.001,0,0 +PARAM_WING_DEFORM=0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath3.mtn b/public/pio/models/pio/motions/Breath3.mtn new file mode 100644 index 0000000..419f8b5 --- /dev/null +++ b/public/pio/models/pio/motions/Breath3.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-0.06,-0.22,-0.48,-0.81,-1.22,-1.68,-2.18,-2.71,-3.27,-3.84,-4.43,-5.01,-5.57,-6.13,-6.65,-7.14,-7.58,-7.99,-8.33,-8.61,-8.82,-8.95,-9,-8.96,-8.84,-8.64,-8.38,-8.06,-7.67,-7.22,-6.74,-6.2,-5.61,-5.01,-4.35,-3.68,-2.99,-2.28,-1.56,-0.83,-0.09,0.65,1.37,2.09,2.79,3.48,4.14,4.78,5.39,5.96,6.49,6.99,7.43,7.83,8.17,8.46,8.7,8.86,8.96,9,8.96,8.86,8.7,8.48,8.22,7.91,7.56,7.19,6.79,6.37,5.93,5.48,5.02,4.56,4.1,3.64,3.2,2.76,2.35,1.95,1.59,1.25,0.94,0.67,0.44,0.25,0.11,0.03,0 +PARAM_ANGLE_Y=0,0.1,0.37,0.81,1.36,2.04,2.8,3.63,4.52,5.46,6.4,7.38,8.34,9.29,10.21,11.08,11.89,12.64,13.31,13.88,14.36,14.71,14.92,15,14.996,14.985,14.965,14.94,14.9,14.86,14.8,14.74,14.67,14.58,14.49,14.39,14.28,14.15,14.02,13.87,13.72,13.55,13.37,13.18,12.97,12.76,12.53,12.29,12.04,11.77,11.5,11.21,10.9,10.58,10.26,9.91,9.56,9.18,8.8,8.41,8,7.53,7.08,6.63,6.19,5.76,5.34,4.93,4.54,4.15,3.78,3.43,3.09,2.76,2.45,2.15,1.87,1.61,1.37,1.14,0.93,0.75,0.58,0.43,0.3,0.19,0.11,0.05,0.01,0 +PARAM_ANGLE_Z=0,0.002,0.01,0.022,0.038,0.06,0.08,0.11,0.15,0.18,0.22,0.27,0.31,0.36,0.41,0.47,0.53,0.59,0.65,0.71,0.78,0.85,0.91,0.98,1.06,1.13,1.2,1.28,1.35,1.43,1.5,1.57,1.65,1.72,1.8,1.87,1.94,2.02,2.09,2.15,2.22,2.29,2.35,2.41,2.47,2.53,2.59,2.64,2.69,2.73,2.78,2.82,2.85,2.89,2.92,2.94,2.96,2.978,2.99,2.998,3,2.988,2.95,2.9,2.83,2.74,2.64,2.52,2.4,2.26,2.12,1.98,1.83,1.67,1.52,1.37,1.21,1.07,0.92,0.78,0.65,0.53,0.42,0.31,0.22,0.15,0.08,0.04,0.01,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.551,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.552,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.553,0.55,0.55,0.55,0.55,0.55,0.554,0.55,0.55,0.55,0.55,0.55,0.555,0.56,0.56,0.56,0.56,0.556,0.56,0.56,0.56,0.557,0.56,0.56,0.56,0.56,0.558,0.56,0.56,0.56,0.559,0.56,0.56,0.56,0.65,0.81,0.92,0.95,0.84,0.66,0.55,0.55,0.55,0.55,0.55,0.55,0.55 +PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.551,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.552,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.553,0.55,0.55,0.55,0.55,0.55,0.554,0.55,0.55,0.55,0.55,0.55,0.555,0.56,0.56,0.56,0.56,0.556,0.56,0.56,0.56,0.557,0.56,0.56,0.56,0.56,0.558,0.56,0.56,0.56,0.559,0.56,0.56,0.56,0.65,0.81,0.92,0.95,0.84,0.66,0.55,0.55,0.55,0.55,0.55,0.55,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0,-0.003,-0.01,-0.023,-0.038,-0.057,-0.08,-0.1,-0.13,-0.15,-0.18,-0.21,-0.23,-0.26,-0.29,-0.31,-0.33,-0.35,-0.373,-0.389,-0.402,-0.412,-0.418,-0.42,-0.418,-0.412,-0.403,-0.39,-0.374,-0.355,-0.33,-0.31,-0.28,-0.25,-0.22,-0.19,-0.16,-0.13,-0.09,-0.06,-0.02,0.02,0.05,0.09,0.12,0.16,0.19,0.22,0.25,0.28,0.31,0.34,0.36,0.38,0.403,0.42,0.434,0.445,0.453,0.458,0.46,0.458,0.453,0.445,0.433,0.42,0.404,0.387,0.367,0.35,0.33,0.3,0.28,0.26,0.23,0.21,0.19,0.16,0.14,0.12,0.1,0.081,0.064,0.048,0.034,0.022,0.013,0.006,0.001,0 +PARAM_EYE_BALL_Y=0,0.001,0.004,0.009,0.016,0.024,0.033,0.044,0.056,0.068,0.082,0.096,0.111,0.126,0.142,0.158,0.175,0.191,0.208,0.225,0.241,0.258,0.274,0.29,0.307,0.322,0.338,0.352,0.366,0.379,0.391,0.403,0.414,0.425,0.435,0.445,0.454,0.462,0.47,0.477,0.484,0.49,0.496,0.502,0.507,0.511,0.515,0.519,0.523,0.526,0.528,0.531,0.533,0.535,0.536,0.537,0.538,0.539,0.54,0.54,0.54,0.538,0.532,0.522,0.509,0.493,0.475,0.45,0.43,0.41,0.38,0.36,0.33,0.3,0.27,0.25,0.22,0.19,0.17,0.14,0.12,0.1,0.07,0.056,0.04,0.026,0.015,0.007,0.002,0 +PARAM_BROW_L_Y=0,0.002,0.006,0.013,0.023,0.034,0.047,0.061,0.075,0.091,0.107,0.123,0.139,0.155,0.17,0.185,0.198,0.211,0.222,0.231,0.239,0.245,0.249,0.25,0.25,0.25,0.249,0.247,0.246,0.244,0.242,0.24,0.237,0.235,0.231,0.228,0.225,0.221,0.217,0.213,0.209,0.204,0.2,0.195,0.19,0.185,0.18,0.175,0.17,0.164,0.159,0.153,0.148,0.142,0.136,0.131,0.125,0.119,0.114,0.108,0.102,0.097,0.091,0.086,0.08,0.075,0.07,0.065,0.06,0.055,0.05,0.046,0.041,0.037,0.033,0.029,0.025,0.022,0.019,0.015,0.013,0.01,0.008,0.006,0.004,0.003,0.001,0.001,0,0 +PARAM_BROW_R_Y=0,0.002,0.006,0.013,0.023,0.034,0.047,0.061,0.075,0.091,0.107,0.123,0.139,0.155,0.17,0.185,0.198,0.211,0.222,0.231,0.239,0.245,0.249,0.25,0.25,0.25,0.249,0.247,0.246,0.244,0.242,0.24,0.237,0.235,0.231,0.228,0.225,0.221,0.217,0.213,0.209,0.204,0.2,0.195,0.19,0.185,0.18,0.175,0.17,0.164,0.159,0.153,0.148,0.142,0.136,0.131,0.125,0.119,0.114,0.108,0.102,0.097,0.091,0.086,0.08,0.075,0.07,0.065,0.06,0.055,0.05,0.046,0.041,0.037,0.033,0.029,0.025,0.022,0.019,0.015,0.013,0.01,0.008,0.006,0.004,0.003,0.001,0.001,0,0 +PARAM_BROW_ANGLE=0.2,0.2,0.203,0.206,0.21,0.215,0.22,0.227,0.233,0.24,0.247,0.254,0.261,0.268,0.275,0.281,0.287,0.293,0.298,0.302,0.305,0.308,0.309,0.31,0.31,0.31,0.31,0.309,0.31,0.307,0.307,0.306,0.304,0.303,0.302,0.3,0.299,0.297,0.296,0.294,0.292,0.29,0.288,0.286,0.284,0.281,0.279,0.277,0.275,0.272,0.27,0.267,0.265,0.262,0.26,0.257,0.255,0.253,0.25,0.248,0.245,0.243,0.24,0.238,0.235,0.233,0.231,0.229,0.226,0.224,0.222,0.22,0.218,0.216,0.214,0.213,0.211,0.21,0.208,0.207,0.206,0.204,0.203,0.203,0.202,0.2,0.201,0.2,0.2,0.2 +PARAM_BROW_SELECT=-0.5 +PARAM_MOUTH_OPEN_Y=0,0,0,0,0,0.001,0,0.002,0.003,0,0.004,0,0.006,0.006,0.01,0.007,0.01,0.008,0.01,0.009,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.009,0.01,0.01,0.01,0.01,0.01,0.008,0.01,0.01,0.01,0.01,0.007,0.01,0.01,0.01,0.01,0.006,0.01,0.01,0.01,0.01,0.005,0,0,0,0.004,0,0,0,0,0.003,0,0,0,0,0.002,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_MOUTH_OPEN2=0.9,0.9,0.9,0.9,0.9,0.9,0.898,0.896,0.894,0.891,0.887,0.882,0.876,0.87,0.84,0.79,0.71,0.63,0.54,0.46,0.4,0.34,0.31,0.3,0.3,0.3,0.3,0.3,0.301,0.3,0.302,0.3,0.304,0.305,0.306,0.307,0.308,0.309,0.311,0.312,0.314,0.316,0.317,0.319,0.321,0.323,0.326,0.328,0.33,0.333,0.336,0.339,0.341,0.344,0.347,0.351,0.354,0.357,0.361,0.365,0.368,0.372,0.376,0.38,0.52,0.76,0.89,0.891,0.89,0.893,0.894,0.894,0.895,0.9,0.896,0.9,0.897,0.9,0.898,0.9,0.9,0.899,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BODY_Y=0,-0.002,-0.008,-0.017,-0.029,-0.043,-0.06,-0.077,-0.096,-0.116,-0.137,-0.16,-0.18,-0.198,-0.218,-0.236,-0.254,-0.27,-0.284,-0.296,-0.306,-0.314,-0.318,-0.32,-0.319,-0.315,-0.31,-0.302,-0.292,-0.281,-0.268,-0.253,-0.237,-0.22,-0.202,-0.183,-0.163,-0.143,-0.12,-0.1,-0.08,-0.06,-0.04,-0.01,0.007,0.03,0.047,0.067,0.086,0.104,0.12,0.136,0.151,0.164,0.175,0.186,0.194,0.201,0.206,0.209,0.21,0.209,0.207,0.203,0.198,0.192,0.185,0.176,0.168,0.158,0.149,0.138,0.128,0.117,0.106,0.096,0.085,0.075,0.064,0.055,0.046,0.037,0.029,0.022,0.016,0.01,0.006,0.003,0.001,0 +PARAM_BREATH=0.5,0.502,0.507,0.515,0.524,0.537,0.55,0.565,0.581,0.598,0.615,0.633,0.65,0.667,0.684,0.699,0.714,0.728,0.74,0.75,0.758,0.765,0.769,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.769,0.77,0.768,0.77,0.766,0.766,0.765,0.764,0.763,0.761,0.76,0.758,0.757,0.755,0.753,0.751,0.749,0.746,0.743,0.741,0.738,0.735,0.731,0.728,0.724,0.72,0.715,0.709,0.702,0.694,0.686,0.677,0.668,0.658,0.648,0.638,0.627,0.617,0.606,0.596,0.586,0.576,0.566,0.557,0.548,0.54,0.532,0.525,0.519,0.514,0.509,0.505,0.502,0.501,0.5 +PARAM_BOING=0 +PARAM_HAIR_FRONT=0,0,0.002,0.004,0.007,0.011,0.016,0.02,0.026,0.031,0.037,0.043,0.049,0.055,0.061,0.067,0.073,0.078,0.082,0.087,0.091,0.094,0.096,0.098,0.1,0.1,0.082,0.05,0.03,0.008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_R=0,-0.001,-0.005,-0.011,-0.019,-0.029,-0.039,-0.051,-0.063,-0.076,-0.09,-0.103,-0.117,-0.13,-0.143,-0.155,-0.166,-0.177,-0.186,-0.194,-0.201,-0.206,-0.209,-0.21,-0.21,-0.21,-0.209,-0.208,-0.207,-0.205,-0.203,-0.202,-0.199,-0.197,-0.194,-0.192,-0.189,-0.186,-0.182,-0.179,-0.175,-0.172,-0.168,-0.164,-0.16,-0.156,-0.151,-0.147,-0.142,-0.138,-0.133,-0.129,-0.124,-0.119,-0.115,-0.11,-0.105,-0.1,-0.095,-0.091,-0.086,-0.081,-0.077,-0.072,-0.068,-0.063,-0.059,-0.054,-0.05,-0.046,-0.042,-0.038,-0.035,-0.031,-0.028,-0.024,-0.021,-0.018,-0.016,-0.013,-0.011,-0.008,-0.007,-0.005,-0.003,-0.002,-0.001,-0.001,0,0 +PARAM_HAIR_SIDE_L=0,-0.001,-0.004,-0.01,-0.016,-0.024,-0.034,-0.044,-0.054,-0.065,-0.077,-0.089,-0.1,-0.111,-0.123,-0.133,-0.143,-0.152,-0.16,-0.167,-0.172,-0.176,-0.179,-0.18,-0.18,-0.18,-0.179,-0.18,-0.177,-0.176,-0.174,-0.173,-0.171,-0.169,-0.167,-0.164,-0.162,-0.159,-0.156,-0.153,-0.15,-0.147,-0.144,-0.14,-0.137,-0.133,-0.13,-0.126,-0.122,-0.118,-0.114,-0.11,-0.106,-0.102,-0.098,-0.094,-0.09,-0.086,-0.082,-0.078,-0.074,-0.07,-0.066,-0.062,-0.058,-0.054,-0.05,-0.047,-0.043,-0.04,-0.036,-0.033,-0.03,-0.027,-0.024,-0.021,-0.018,-0.016,-0.013,-0.011,-0.009,-0.007,-0.006,-0.004,-0.003,-0.002,0,0,0,0 +PARAM_TWIN_RIBBON_D=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0 +PARAM_WING_DEFORM=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath4.mtn b/public/pio/models/pio/motions/Breath4.mtn new file mode 100644 index 0000000..fa9a742 --- /dev/null +++ b/public/pio/models/pio/motions/Breath4.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0,0.22,0.81,1.72,2.86,4.13,5.5,6.87,8.14,9.28,10.19,10.78,11,8.31,2.5,-4.73,-12.26,-19.12,-24.81,-28.59,-30,-29.62,-28.55,-26.9,-24.77,-22.31,-19.59,-16.8,-13.95,-11.17,-8.52,-6.14,-4.05,-2.33,-1.07,-0.27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.52,0.57,0.63,0.69,0.74,0.79,0.82,0.84,0.846,0.849,0.85,0.85,0.85,0.85,0.85,0.838,0.81,0.76,0.7,0.65,0.59,0.54,0.51,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.52,0.57,0.63,0.69,0.75,0.8,0.83,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.84,0.828,0.8,0.75,0.7,0.64,0.59,0.54,0.51,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,-0.03,-0.1,-0.18,-0.26,-0.34,-0.4,-0.44,-0.46,-0.454,-0.438,-0.41,-0.38,-0.34,-0.3,-0.26,-0.21,-0.17,-0.13,-0.09,-0.06,-0.04,-0.016,-0.004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0 +PARAM_MOUTH_OPEN_Y=0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.5,0.502,0.505,0.509,0.514,0.52,0.526,0.533,0.541,0.549,0.558,0.567,0.576,0.586,0.595,0.604,0.614,0.623,0.632,0.641,0.649,0.657,0.664,0.67,0.676,0.681,0.685,0.688,0.689,0.69,0.69,0.688,0.686,0.684,0.68,0.676,0.672,0.667,0.661,0.655,0.649,0.643,0.636,0.629,0.622,0.614,0.607,0.6,0.592,0.585,0.577,0.57,0.563,0.556,0.55,0.543,0.537,0.531,0.526,0.521,0.516,0.512,0.509,0.506,0.503,0.501,0.5,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0,0.002,0.004,0.007,0.011,0.016,0.021,0.026,0.032,0.039,0.046,0.053,0.06,0.068,0.075,0.082,0.09,0.097,0.104,0.111,0.118,0.124,0.129,0.134,0.139,0.143,0.146,0.148,0.15,0.15,0.15,0.149,0.147,0.145,0.142,0.139,0.136,0.132,0.127,0.123,0.118,0.113,0.107,0.102,0.096,0.09,0.085,0.079,0.073,0.067,0.061,0.055,0.05,0.044,0.039,0.034,0.029,0.025,0.02,0.016,0.013,0.01,0.007,0.004,0.003,0.001,0,0 +PARAM_WING_DEFORM=0,0,-0.002,-0.004,-0.006,-0.01,-0.014,-0.018,-0.023,-0.028,-0.034,-0.04,-0.046,-0.052,-0.059,-0.065,-0.071,-0.078,-0.084,-0.09,-0.096,-0.102,-0.107,-0.112,-0.116,-0.12,-0.124,-0.126,-0.128,-0.13,-0.13,-0.13,-0.129,-0.127,-0.126,-0.123,-0.121,-0.118,-0.114,-0.11,-0.106,-0.102,-0.098,-0.093,-0.088,-0.083,-0.078,-0.073,-0.068,-0.063,-0.058,-0.053,-0.048,-0.043,-0.038,-0.034,-0.029,-0.025,-0.021,-0.018,-0.014,-0.011,-0.008,-0.006,-0.004,-0.002,-0.001,0,0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath5.mtn b/public/pio/models/pio/motions/Breath5.mtn new file mode 100644 index 0000000..668e2bd --- /dev/null +++ b/public/pio/models/pio/motions/Breath5.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0,-0.2,-0.77,-1.66,-2.85,-4.3,-5.96,-7.76,-9.74,-11.81,-13.95,-16.05,-18.19,-20.26,-22.24,-24.04,-25.7,-27.15,-28.34,-29.23,-29.8,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-29.4,-27.79,-25.31,-22.2,-18.74,-15,-11.26,-7.8,-4.69,-2.21,-0.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=0,0.07,0.26,0.55,0.95,1.43,1.99,2.59,3.25,3.94,4.65,5.35,6.06,6.75,7.41,8.01,8.57,9.05,9.45,9.74,9.93,10,9.994,9.976,9.95,9.9,9.85,9.79,9.71,9.62,9.52,9.41,9.29,9.16,9.02,8.87,8.71,8.55,8.37,8.19,8,7.77,7.55,7.32,7.11,6.9,6.7,6.49,6.29,6.09,5.89,5.68,5.48,5.27,5.06,4.86,4.64,4.42,4.2,3.97,3.74,3.5,3.26,3,2.71,2.41,2.08,1.74,1.42,1.1,0.8,0.54,0.32,0.15,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.62,0.73,0.84,0.91,0.94,0.85,0.69,0.58,0.55 +PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.62,0.73,0.84,0.91,0.94,0.85,0.69,0.58,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0,0.002,0.007,0.014,0.025,0.037,0.052,0.067,0.084,0.102,0.121,0.139,0.158,0.176,0.193,0.208,0.223,0.235,0.246,0.253,0.258,0.26,0.259,0.257,0.254,0.25,0.245,0.238,0.231,0.223,0.214,0.204,0.194,0.183,0.171,0.159,0.146,0.133,0.12,0.106,0.093,0.079,0.065,0.051,0.037,0.024,0.01,-0.003,-0.016,-0.029,-0.041,-0.053,-0.064,-0.074,-0.084,-0.093,-0.101,-0.108,-0.115,-0.12,-0.124,-0.127,-0.129,-0.13,-0.127,-0.12,-0.11,-0.096,-0.081,-0.065,-0.049,-0.034,-0.02,-0.01,-0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_EYE_BALL_Y=0,-0.005,-0.019,-0.04,-0.07,-0.11,-0.15,-0.19,-0.24,-0.3,-0.35,-0.4,-0.45,-0.51,-0.56,-0.6,-0.64,-0.68,-0.71,-0.73,-0.745,-0.75,-0.75,-0.75,-0.75,-0.75,-0.75,-0.749,-0.75,-0.748,-0.747,-0.746,-0.75,-0.744,-0.743,-0.741,-0.74,-0.738,-0.737,-0.735,-0.733,-0.73,-0.728,-0.725,-0.723,-0.72,-0.717,-0.713,-0.71,-0.706,-0.702,-0.698,-0.694,-0.689,-0.684,-0.679,-0.674,-0.669,-0.663,-0.657,-0.65,-0.644,-0.637,-0.63,-0.611,-0.57,-0.52,-0.45,-0.38,-0.3,-0.23,-0.16,-0.09,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BROW_L_Y=0,0.002,0.008,0.017,0.029,0.044,0.062,0.08,0.101,0.12,0.14,0.17,0.19,0.21,0.23,0.248,0.266,0.281,0.293,0.302,0.308,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.308,0.305,0.301,0.296,0.289,0.28,0.14,-0.08,-0.28,-0.42,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.479,-0.48,-0.48,-0.478,-0.48,-0.48,-0.477,-0.48,-0.476,-0.48,-0.475,-0.474,-0.47,-0.472,-0.472,-0.471,-0.47,-0.43,-0.35,-0.23,-0.12,-0.04,0,0 +PARAM_BROW_R_Y=0,0.002,0.008,0.017,0.029,0.044,0.062,0.08,0.101,0.12,0.14,0.17,0.19,0.21,0.23,0.248,0.266,0.281,0.293,0.302,0.308,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.31,0.308,0.305,0.301,0.296,0.289,0.28,0.14,-0.08,-0.28,-0.42,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.48,-0.479,-0.48,-0.48,-0.478,-0.48,-0.48,-0.477,-0.48,-0.476,-0.48,-0.475,-0.474,-0.47,-0.472,-0.472,-0.471,-0.47,-0.43,-0.35,-0.23,-0.12,-0.04,0,0 +PARAM_BROW_ANGLE=0.2,0.201,0.205,0.211,0.219,0.229,0.24,0.252,0.265,0.279,0.293,0.307,0.321,0.335,0.348,0.36,0.371,0.381,0.389,0.395,0.399,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.398,0.397,0.394,0.392,0.389,0.385,0.38,-0.53,-0.66,-0.72,-0.75,-0.75,-0.75,-0.75,-0.75,-0.748,-0.747,-0.746,-0.745,-0.743,-0.741,-0.738,-0.736,-0.733,-0.729,-0.725,-0.721,-0.717,-0.712,-0.707,-0.701,-0.695,-0.689,-0.682,-0.674,-0.667,-0.658,-0.649,-0.64,-0.62,-0.58,-0.54,-0.48,-0.43,-0.37,0.2 +PARAM_BROW_SELECT=-0.5,-0.5,-0.5,-0.5,-0.5,-0.498,-0.498,-0.497,-0.5,-0.495,-0.494,-0.492,-0.491,-0.489,-0.488,-0.486,-0.484,-0.482,-0.48,-0.477,-0.475,-0.472,-0.47,-0.467,-0.464,-0.461,-0.458,-0.454,-0.451,-0.447,-0.444,-0.44,-0.436,-0.432,-0.427,-0.423,-0.419,-0.414,-0.409,-0.404,-0.399,-0.394,-0.389,-0.384,-0.378,-0.372,-0.367,-0.361,-0.355,-0.348,-0.342,-0.336,-0.329,-0.322,-0.316,-0.309,-0.302,-0.294,-0.287,-0.28,-0.272,-0.264,-0.256,-0.248,-0.24,-0.232,-0.223,-0.215,-0.206,-0.197,-0.188,-0.179,-0.17,0.2,0.203,0.206,0.208,0.211,0.213,0.216,0.218,0.22,0.222,0.224,0.226,0.228,0.23,0.232,0.233,0.235,0.236,0.238,0.239,0.24,0.241,0.242,0.243,0.244,0.245,0.246,0.25,0.247,0.25,0.248,0.25,0.249,0.25,0.25,0.25,0.25,0.25,-0.5 +PARAM_MOUTH_OPEN_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0.002,0,0,0,0.003,0,0,0,0.004,0,0,0.005,0.01,0.01,0.006,0.01,0.01,0.007,0.01,0.01,0.008,0.01,0.009,0.01,0.01,0.01,0.011,0.01,0.012,0.01,0.013,0.01,0.014,0.01,0.015,0.02,0.016,0.02,0.018,0.018,0.02,0.019,0.02,0.17,0.169,0.165,0.161,0.156,0.153,0.151,0.15,0.23,0.37,0.47,0.5,0.44,0.35,0.26,0.19,0.17,0.24,0.39,0.5,0.54,0.56,0.6,0.72,0.88,0.96,0.89,0.75,0.68,0.75,0.88,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95,0.95 +PARAM_MOUTH_OPEN2=0.9,0.894,0.877,0.85,0.81,0.77,0.72,0.67,0.61,0.55,0.48,0.42,0.35,0.29,0.23,0.18,0.13,0.09,0.05,0.02,0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.001,-0.006,-0.013,-0.022,-0.035,-0.05,-0.067,-0.087,-0.11,-0.13,-0.16,-0.19,-0.22,-0.26,-0.3,-0.34,-0.38,-0.42,-0.47,-0.52,-0.58,-0.63,-0.69,-1,-1,-1,-1,-0.999,-0.998,-1,-0.996,-0.995,-0.994,-0.993,-0.991,-0.99,-0.988,-0.987,-0.985,-0.983,-0.981,-0.98,-0.978,-0.976,-0.974,-0.972,-0.97,-0.968,-0.966,-0.965,-0.963,-0.961,-0.959,-0.957,-0.956,-0.954,-0.952,-0.951,-0.949,-0.948,-0.947,-0.946,-0.944,-0.943,-0.943,-0.942,-0.94,-0.941,-0.94,-0.94,-0.94 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0,-0.03,-0.13,-0.28,-0.47,-0.72,-0.99,-1.29,-1.62,-1.97,-2.32,-2.68,-3.03,-3.38,-3.71,-4.01,-4.28,-4.53,-4.72,-4.87,-4.97,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4.9,-4.63,-4.22,-3.7,-3.12,-2.5,-1.88,-1.3,-0.78,-0.37,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=0,-0.07,-0.26,-0.55,-0.95,-1.43,-1.99,-2.59,-3.25,-3.94,-4.65,-5.35,-6.06,-6.75,-7.41,-8.01,-8.57,-9.05,-9.45,-9.74,-9.93,-10,-9.991,-9.97,-9.93,-9.87,-9.81,-9.74,-9.67,-9.59,-9.51,-9.43,-9.35,-9.28,-9.21,-9.15,-9.1,-9.06,-9.03,-9.007,-9,-9.006,-9.025,-9.05,-9.09,-9.14,-9.19,-9.24,-9.3,-9.36,-9.43,-9.49,-9.56,-9.62,-9.68,-9.74,-9.79,-9.84,-9.89,-9.93,-9.96,-9.98,-9.995,-10,-9.8,-9.26,-8.44,-7.4,-6.25,-5,-3.75,-2.6,-1.56,-0.74,-0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_Y=0 +PARAM_BREATH=0.5,0.497,0.487,0.472,0.453,0.43,0.4,0.37,0.34,0.3,0.27,0.23,0.2,0.16,0.13,0.1,0.07,0.05,0.028,0.013,0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.04,0.08,0.13,0.19,0.25,0.31,0.37,0.42,0.46,0.49,0.5,0.5,0.5,0.505,0.519,0.538,0.56,0.59,0.62,0.65,0.67,0.7,0.72,0.742,0.757,0.767,0.77,0.765,0.75,0.73,0.7,0.67,0.64,0.61,0.58,0.55,0.53,0.514,0.504,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_BOING=0,0.01,0.03,0.06,0.09,0.11,0.13,0.145,0.15,0.15,0.15,0.15,0.15,0.15,0.15,0.11,0.02,-0.11,-0.25,-0.4,-0.56,-0.7,-0.82,-0.91,-0.98,-1,-0.984,-0.94,-0.9,-0.85,-0.81,-0.79,-0.78,-0.796,-0.84,-0.88,-0.93,-0.97,-0.99,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.994,-0.978,-0.95,-0.9,-0.84,-0.76,-0.64,-0.51,-0.38,-0.25,-0.13,-0.02,0.06,0.12,0.14,0.123,0.09,0.04,-0.01,-0.05,-0.09,-0.11,-0.12,-0.111,-0.09,-0.06,-0.04,-0.017,-0.004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0,0.004,0.014,0.03,0.05,0.07,0.1,0.13,0.17,0.2,0.23,0.27,0.31,0.34,0.37,0.41,0.44,0.46,0.49,0.51,0.526,0.539,0.547,0.55,0.549,0.547,0.543,0.537,0.53,0.521,0.511,0.5,0.487,0.473,0.457,0.44,0.421,0.4,0.38,0.36,0.33,0.3,0.27,0.25,0.22,0.2,0.18,0.16,0.138,0.12,0.103,0.088,0.074,0.061,0.049,0.039,0.03,0.022,0.015,0.01,0.006,0.002,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_R=0,0.002,0.009,0.019,0.032,0.048,0.065,0.085,0.11,0.13,0.15,0.17,0.19,0.22,0.24,0.258,0.277,0.295,0.311,0.324,0.335,0.343,0.348,0.35,0.35,0.35,0.349,0.347,0.346,0.344,0.342,0.339,0.336,0.332,0.327,0.323,0.317,0.311,0.304,0.297,0.289,0.28,0.271,0.261,0.25,0.239,0.227,0.216,0.205,0.195,0.184,0.174,0.164,0.155,0.145,0.136,0.127,0.119,0.11,0.102,0.094,0.087,0.08,0.073,0.066,0.06,0.054,0.048,0.043,0.038,0.033,0.028,0.024,0.02,0.017,0.014,0.011,0.008,0.006,0.004,0.003,0.002,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_L=0,-0.001,-0.004,-0.01,-0.016,-0.025,-0.035,-0.047,-0.06,-0.074,-0.089,-0.105,-0.122,-0.14,-0.159,-0.178,-0.198,-0.22,-0.24,-0.26,-0.28,-0.31,-0.33,-0.35,-0.37,-0.39,-0.413,-0.431,-0.447,-0.462,-0.475,-0.488,-0.498,-0.508,-0.516,-0.523,-0.53,-0.535,-0.539,-0.543,-0.546,-0.548,-0.549,-0.55,-0.55,-0.549,-0.546,-0.541,-0.534,-0.525,-0.515,-0.503,-0.49,-0.476,-0.46,-0.444,-0.426,-0.408,-0.389,-0.37,-0.349,-0.329,-0.31,-0.29,-0.267,-0.25,-0.226,-0.21,-0.186,-0.167,-0.148,-0.13,-0.113,-0.096,-0.081,-0.067,-0.053,-0.042,-0.031,-0.022,-0.014,-0.008,-0.004,-0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_TWIN_RIBBON_D=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,-0.002,-0.009,-0.019,-0.032,-0.049,-0.068,-0.09,-0.11,-0.13,-0.16,-0.18,-0.21,-0.23,-0.25,-0.27,-0.291,-0.308,-0.321,-0.331,-0.338,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.34,-0.338,-0.336,-0.333,-0.33,-0.325,-0.32,-0.315,-0.309,-0.302,-0.295,-0.287,-0.279,-0.27,-0.261,-0.252,-0.242,-0.232,-0.222,-0.212,-0.202,-0.191,-0.181,-0.17,-0.159,-0.149,-0.138,-0.128,-0.118,-0.108,-0.098,-0.088,-0.079,-0.07,-0.061,-0.053,-0.045,-0.038,-0.031,-0.025,-0.02,-0.015,-0.01,-0.007,-0.004,-0.002,0,0 +PARAM_WING_DEFORM=0,0.004,0.015,0.032,0.05,0.08,0.12,0.15,0.19,0.23,0.28,0.32,0.37,0.41,0.46,0.5,0.54,0.58,0.62,0.65,0.68,0.7,0.719,0.737,0.754,0.771,0.787,0.802,0.816,0.83,0.843,0.855,0.867,0.878,0.888,0.898,0.907,0.916,0.924,0.932,0.939,0.945,0.952,0.957,0.963,0.967,0.972,0.976,0.979,0.982,0.985,0.988,0.99,0.992,0.994,0.995,0.997,0.998,0.998,0.999,1,1,1,1,0.999,0.995,0.989,0.98,0.97,0.957,0.942,0.926,0.908,0.888,0.87,0.84,0.82,0.79,0.77,0.74,0.71,0.68,0.65,0.62,0.59,0.56,0.53,0.5,0.47,0.44,0.41,0.38,0.35,0.32,0.29,0.26,0.23,0.21,0.18,0.16,0.13,0.11,0.092,0.074,0.058,0.043,0.03,0.02,0.011,0.005,0.001,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath6.mtn b/public/pio/models/pio/motions/Breath6.mtn new file mode 100644 index 0000000..ddef26a --- /dev/null +++ b/public/pio/models/pio/motions/Breath6.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.81,-2.78,-5.18,-7.52,-9.4,-10.6,-11,-10.57,-9.36,-7.46,-5.04,-2.16,0.99,4.31,7.69,11.01,14.16,17.04,19.46,21.36,22.57,23,22.998,22.991,22.979,22.962,22.94,22.91,22.88,22.84,22.79,22.74,22.68,22.61,22.54,22.45,22.37,22.27,22.16,22.04,21.92,21.79,21.64,21.49,21.32,21.15,20.97,20.77,20.57,20.35,20.13,19.88,19.63,19.37,19.09,18.8,18.5,18.19,17.86,17.51,17.16,16.79,16.4,16,15.11,13.43,11.06,8.19,5.09,1.78,-1.5,-4.51,-7.2,-9.33,-10.71,-11.22,-10.86,-9.96,-8.73,-7.3,-5.81,-4.34,-2.95,-1.78,-0.83,-0.22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.47,0.4,0.31,0.22,0.13,0.06,0.02,0,0.04,0.13,0.25,0.37,0.46,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.03,0.1,0.19,0.28,0.37,0.44,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.47,0.4,0.31,0.22,0.13,0.06,0.02,0,0.04,0.13,0.25,0.37,0.46,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.03,0.1,0.19,0.28,0.37,0.44,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.03,0.07,0.11,0.15,0.19,0.23,0.26,0.29,0.311,0.32,0.324,0.327,0.331,0.334,0.338,0.341,0.344,0.347,0.35,0.352,0.355,0.358,0.36,0.363,0.365,0.367,0.369,0.371,0.373,0.375,0.377,0.379,0.38,0.382,0.383,0.385,0.386,0.387,0.389,0.39,0.391,0.392,0.393,0.393,0.394,0.395,0.4,0.396,0.4,0.397,0.4,0.398,0.4,0.399,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.37,0.3,0.21,0.13,0.06,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0 +PARAM_MOUTH_OPEN_Y=0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.499,0.497,0.494,0.49,0.485,0.479,0.472,0.464,0.456,0.447,0.438,0.429,0.42,0.41,0.401,0.392,0.383,0.374,0.366,0.358,0.351,0.345,0.34,0.336,0.333,0.331,0.33,0.33,0.333,0.336,0.34,0.345,0.352,0.359,0.367,0.376,0.385,0.396,0.406,0.417,0.429,0.441,0.453,0.465,0.478,0.491,0.503,0.516,0.529,0.541,0.554,0.566,0.577,0.589,0.6,0.61,0.62,0.63,0.639,0.647,0.654,0.661,0.666,0.671,0.675,0.678,0.679,0.68,0.68,0.68,0.678,0.677,0.675,0.673,0.671,0.668,0.665,0.662,0.658,0.655,0.651,0.647,0.642,0.638,0.633,0.629,0.624,0.619,0.614,0.608,0.603,0.598,0.593,0.587,0.582,0.577,0.572,0.566,0.561,0.556,0.551,0.547,0.542,0.538,0.533,0.529,0.525,0.522,0.518,0.515,0.512,0.509,0.507,0.505,0.503,0.502,0.501,0.5,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0,0,0,0.002,0.003,0.004,0.005,0.007,0.008,0.01,0.012,0.014,0.016,0.019,0.021,0.024,0.027,0.03,0.033,0.036,0.039,0.042,0.045,0.049,0.052,0.055,0.059,0.062,0.066,0.069,0.073,0.076,0.08,0.083,0.087,0.09,0.094,0.097,0.1,0.104,0.107,0.11,0.113,0.116,0.119,0.122,0.125,0.127,0.13,0.132,0.135,0.137,0.139,0.141,0.142,0.144,0.145,0.146,0.148,0.148,0.149,0.15,0.15,0.15,0.15,0.15,0.149,0.148,0.146,0.145,0.143,0.141,0.139,0.136,0.134,0.131,0.128,0.125,0.122,0.118,0.115,0.111,0.108,0.104,0.1,0.096,0.092,0.088,0.084,0.08,0.076,0.071,0.067,0.063,0.059,0.055,0.051,0.047,0.044,0.04,0.036,0.033,0.03,0.026,0.023,0.02,0.018,0.015,0.012,0.01,0.008,0.006,0.005,0.003,0.002,0.001,0.001,0,0 +PARAM_WING_DEFORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.004,0.005,0.008,0.01,0.013,0.017,0.02,0.024,0.028,0.032,0.037,0.042,0.046,0.052,0.057,0.062,0.067,0.073,0.078,0.084,0.089,0.095,0.1,0.106,0.111,0.117,0.122,0.127,0.132,0.137,0.141,0.146,0.15,0.154,0.158,0.162,0.165,0.168,0.171,0.173,0.175,0.177,0.178,0.179,0.18,0.18,0.18,0.18,0.178,0.177,0.176,0.174,0.172,0.169,0.167,0.164,0.161,0.157,0.154,0.15,0.146,0.142,0.138,0.134,0.129,0.124,0.12,0.115,0.11,0.105,0.1,0.096,0.091,0.086,0.081,0.076,0.071,0.066,0.062,0.057,0.052,0.048,0.044,0.04,0.035,0.032,0.028,0.024,0.021,0.018,0.015,0.012,0.01,0.008,0.006,0.004,0.003,0.001,0.001,0,0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath7.mtn b/public/pio/models/pio/motions/Breath7.mtn new file mode 100644 index 0000000..0b39a06 --- /dev/null +++ b/public/pio/models/pio/motions/Breath7.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0 +PARAM_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.07,-0.26,-0.57,-0.98,-1.48,-2.06,-2.71,-3.42,-4.18,-4.97,-5.8,-6.65,-7.52,-8.39,-9.26,-10.12,-10.96,-11.78,-12.57,-13.31,-14,-14.65,-15.23,-15.74,-16.17,-16.52,-16.79,-16.95,-17,-17.01,-17.04,-17.07,-17.11,-17.15,-17.18,-17.201,-17.204,-17.186,-17.14,-17.07,-16.96,-16.81,-16.63,-16.39,-16.12,-15.8,-15.42,-15,-14.48,-13.94,-13.35,-12.73,-12.1,-11.43,-10.73,-10.02,-9.28,-8.51,-7.75,-6.95,-6.15,-5.34,-4.51,-3.68,-2.86,-2.01,-1.16,-0.34,0.51,1.35,2.16,2.98,3.8,4.58,5.37,6.14,6.87,7.61,8.32,8.99,9.65,10.28,10.86,11.43,11.97,12.45,12.91,13.33,13.7,14.04,14.33,14.56,14.75,14.89,14.97,15,15.003,15.011,15.02,15.026,15.03,15.016,14.99,14.95,14.89,14.81,14.7,14.56,14.38,14.17,13.92,13.55,13.01,12.31,11.49,10.59,9.59,8.53,7.44,6.34,5.26,4.22,3.24,2.34,1.57,0.92,0.42,0.11,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.04,0.13,0.24,0.34,0.43,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.46,0.37,0.26,0.16,0.07,0.02,0,0.04,0.13,0.24,0.34,0.43,0.48,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0 +PARAM_MOUTH_OPEN_Y=0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,-0.007,-0.027,-0.06,-0.1,-0.16,-0.22,-0.3,-0.38,-0.47,-0.56,-0.67,-0.77,-0.89,-1,-1.12,-1.24,-1.36,-1.48,-1.61,-1.73,-1.85,-1.97,-2.08,-2.19,-2.3,-2.4,-2.49,-2.58,-2.66,-2.74,-2.8,-2.86,-2.91,-2.95,-2.98,-2.994,-3,-2.996,-2.983,-2.96,-2.93,-2.9,-2.85,-2.8,-2.74,-2.68,-2.61,-2.53,-2.45,-2.36,-2.27,-2.18,-2.07,-1.97,-1.86,-1.75,-1.63,-1.51,-1.39,-1.27,-1.14,-1.02,-0.89,-0.76,-0.62,-0.49,-0.36,-0.23,-0.1,0.03,0.16,0.29,0.42,0.55,0.67,0.79,0.91,1.03,1.14,1.25,1.35,1.45,1.55,1.64,1.73,1.81,1.89,1.96,2.02,2.08,2.13,2.17,2.21,2.24,2.26,2.275,2.279,2.275,2.264,2.246,2.22,2.19,2.15,2.11,2.06,2.01,1.95,1.89,1.83,1.76,1.69,1.62,1.54,1.47,1.39,1.31,1.23,1.15,1.07,0.99,0.91,0.83,0.76,0.68,0.61,0.54,0.47,0.41,0.35,0.3,0.24,0.19,0.15,0.11,0.08,0.05,0.03,0.013,0.003,0 +PARAM_BREATH=0.5 +PARAM_HAIR_SIDE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.007,-0.026,-0.06,-0.09,-0.14,-0.2,-0.26,-0.32,-0.39,-0.46,-0.54,-0.61,-0.68,-0.74,-0.8,-0.86,-0.91,-0.94,-0.97,-0.993,-1,-1,-0.997,-0.993,-0.985,-0.974,-0.959,-0.94,-0.92,-0.88,-0.85,-0.81,-0.78,-0.74,-0.7,-0.66,-0.62,-0.58,-0.54,-0.5,-0.46,-0.42,-0.38,-0.34,-0.31,-0.27,-0.23,-0.2,-0.16,-0.13,-0.1,-0.07,-0.04,-0.01,0.001,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.009,0.03,0.07,0.12,0.17,0.24,0.3,0.36,0.43,0.49,0.54,0.59,0.63,0.66,0.674,0.68,0.677,0.668,0.654,0.634,0.61,0.58,0.55,0.52,0.48,0.44,0.4,0.36,0.32,0.28,0.24,0.21,0.18,0.15,0.13,0.11,0.09,0.073,0.058,0.045,0.034,0.024,0.016,0.01,0.006,0.003,0.001,0 +PARAM_HAIR_BACK=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.004,-0.015,-0.033,-0.06,-0.09,-0.12,-0.16,-0.2,-0.24,-0.29,-0.33,-0.38,-0.43,-0.48,-0.53,-0.58,-0.63,-0.68,-0.72,-0.77,-0.81,-0.84,-0.88,-0.91,-0.93,-0.953,-0.968,-0.977,-0.98,-0.98,-0.981,-0.981,-0.978,-0.973,-0.964,-0.95,-0.932,-0.91,-0.88,-0.84,-0.79,-0.75,-0.7,-0.65,-0.6,-0.56,-0.51,-0.46,-0.42,-0.37,-0.33,-0.28,-0.24,-0.21,-0.17,-0.14,-0.11,-0.08,-0.06,-0.037,-0.021,-0.01,-0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.009,0.03,0.07,0.13,0.19,0.26,0.33,0.41,0.49,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.993,1,1,1,0.998,0.994,0.987,0.977,0.962,0.942,0.91,0.88,0.84,0.79,0.73,0.67,0.61,0.55,0.49,0.44,0.38,0.32,0.27,0.22,0.18,0.14,0.1,0.07,0.05,0.03,0.012,0.003,0 +PARAM_WING_ANGLE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.003,-0.007,-0.012,-0.019,-0.026,-0.034,-0.044,-0.054,-0.065,-0.076,-0.088,-0.1,-0.113,-0.125,-0.137,-0.15,-0.162,-0.174,-0.185,-0.196,-0.206,-0.216,-0.224,-0.231,-0.238,-0.243,-0.247,-0.249,-0.25,-0.249,-0.247,-0.244,-0.239,-0.233,-0.226,-0.218,-0.209,-0.2,-0.19,-0.179,-0.168,-0.156,-0.144,-0.131,-0.118,-0.106,-0.093,-0.08,-0.067,-0.054,-0.041,-0.029,-0.017,-0.005,0.006,0.017,0.027,0.036,0.045,0.053,0.06,0.066,0.071,0.075,0.079,0.08,0.081,0.081,0.08,0.078,0.076,0.074,0.07,0.067,0.063,0.059,0.054,0.049,0.044,0.039,0.033,0.028,0.022,0.016,0.01,0.005,-0.001,-0.007,-0.013,-0.018,-0.023,-0.028,-0.033,-0.038,-0.042,-0.046,-0.049,-0.052,-0.055,-0.057,-0.059,-0.061,-0.061,-0.06,-0.06,-0.061,-0.06,-0.058,-0.056,-0.054,-0.051,-0.049,-0.046,-0.043,-0.039,-0.036,-0.033,-0.029,-0.026,-0.022,-0.019,-0.016,-0.013,-0.01,-0.008,-0.006,-0.004,-0.002,-0.001,0,0 +PARAM_WING_DEFORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.005,0.008,0.013,0.018,0.023,0.03,0.037,0.044,0.052,0.06,0.068,0.077,0.085,0.093,0.102,0.11,0.118,0.126,0.133,0.14,0.147,0.152,0.157,0.162,0.165,0.168,0.169,0.17,0.17,0.168,0.166,0.162,0.158,0.153,0.148,0.142,0.135,0.128,0.121,0.113,0.105,0.096,0.088,0.079,0.07,0.061,0.052,0.043,0.034,0.026,0.017,0.009,0.001,-0.007,-0.015,-0.022,-0.028,-0.034,-0.04,-0.045,-0.049,-0.052,-0.055,-0.057,-0.059,-0.059,-0.059,-0.057,-0.055,-0.052,-0.049,-0.044,-0.04,-0.034,-0.028,-0.022,-0.015,-0.008,0,0.007,0.015,0.023,0.031,0.039,0.047,0.055,0.063,0.071,0.078,0.086,0.093,0.1,0.106,0.112,0.117,0.122,0.126,0.13,0.133,0.136,0.138,0.139,0.14,0.139,0.137,0.135,0.131,0.127,0.122,0.116,0.11,0.103,0.096,0.089,0.081,0.074,0.066,0.058,0.051,0.043,0.036,0.029,0.023,0.018,0.013,0.008,0.005,0.002,0.001,0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Breath8.mtn b/public/pio/models/pio/motions/Breath8.mtn new file mode 100644 index 0000000..f6ef1bb --- /dev/null +++ b/public/pio/models/pio/motions/Breath8.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.11,-0.41,-0.88,-1.51,-2.24,-3.07,-3.98,-4.92,-5.88,-6.84,-7.77,-8.64,-9.46,-10.18,-10.81,-11.31,-11.69,-11.92,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-11.999,-11.998,-12,-11.996,-11.995,-11.993,-11.991,-11.99,-11.987,-11.985,-11.982,-11.979,-11.976,-11.973,-11.969,-11.965,-11.96,-11.955,-11.95,-11.944,-11.939,-11.932,-11.925,-11.918,-11.91,-11.902,-11.894,-11.885,-11.83,-11.69,-11.46,-11.17,-10.82,-10.41,-9.95,-9.45,-8.92,-8.37,-7.79,-7.2,-6.59,-5.99,-5.38,-4.78,-4.2,-3.62,-3.08,-2.56,-2.08,-1.63,-1.23,-0.88,-0.57,-0.33,-0.15,-0.04,0 +PARAM_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.08,0.31,0.69,1.18,1.8,2.51,3.33,4.2,5.15,6.14,7.19,8.25,9.33,10.41,11.47,12.52,13.56,14.53,15.46,16.33,17.13,17.84,18.47,19.01,19.43,19.74,19.94,20,20,20,20.001,20,20,20,20,20,19.999,19.996,19.993,19.988,19.983,19.976,19.967,19.958,19.946,19.932,19.917,19.9,19.88,19.86,19.83,19.81,19.78,19.74,19.71,19.67,19.63,19.58,19.53,19.48,19.42,19.36,19.3,19.23,19.16,19.08,19,18.85,18.56,18.15,17.62,17,16.3,15.51,14.65,13.75,12.79,11.79,10.77,9.74,8.7,7.67,6.66,5.69,4.75,3.88,3.06,2.31,1.66,1.09,0.63,0.29,0.07,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.499,0.498,0.496,0.494,0.491,0.488,0.485,0.482,0.479,0.475,0.471,0.467,0.464,0.46,0.456,0.453,0.449,0.446,0.443,0.44,0.438,0.435,0.433,0.432,0.431,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.4,0.32,0.23,0.14,0.06,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0.04,0.13,0.25,0.37,0.46,0.5 +PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.498,0.496,0.495,0.492,0.49,0.487,0.485,0.482,0.478,0.475,0.472,0.469,0.466,0.462,0.459,0.456,0.454,0.451,0.449,0.446,0.445,0.443,0.442,0.441,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.44,0.41,0.33,0.23,0.14,0.06,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0.04,0.13,0.25,0.37,0.46,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.002,-0.007,-0.016,-0.027,-0.041,-0.057,-0.076,-0.1,-0.12,-0.14,-0.16,-0.19,-0.22,-0.24,-0.27,-0.3,-0.32,-0.35,-0.37,-0.4,-0.42,-0.44,-0.47,-0.486,-0.504,-0.52,-0.535,-0.547,-0.557,-0.564,-0.568,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.57,-0.567,-0.559,-0.546,-0.528,-0.51,-0.48,-0.45,-0.42,-0.39,-0.36,-0.32,-0.28,-0.25,-0.21,-0.18,-0.15,-0.12,-0.09,-0.06,-0.04,-0.024,-0.011,-0.003,0 +PARAM_MOUTH_OPEN_Y=0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.016,0.06,0.13,0.23,0.35,0.48,0.64,0.8,0.98,1.17,1.37,1.56,1.77,1.97,2.18,2.38,2.58,2.77,2.96,3.13,3.29,3.45,3.58,3.7,3.81,3.89,3.95,3.99,4,4,3.999,3.997,3.994,3.99,3.984,3.978,3.97,3.961,3.949,3.937,3.922,3.906,3.887,3.87,3.84,3.82,3.79,3.76,3.73,3.7,3.66,3.62,3.57,3.53,3.48,3.43,3.37,3.31,3.25,3.18,3.11,3.04,2.96,2.88,2.76,2.6,2.4,2.18,1.94,1.68,1.43,1.17,0.93,0.71,0.51,0.33,0.19,0.09,0.02,0 +PARAM_BREATH=0.5,0.5,0.502,0.503,0.506,0.509,0.513,0.517,0.522,0.527,0.533,0.539,0.546,0.552,0.56,0.567,0.575,0.583,0.591,0.599,0.607,0.615,0.623,0.631,0.639,0.647,0.655,0.663,0.67,0.678,0.684,0.691,0.697,0.703,0.708,0.713,0.717,0.721,0.724,0.727,0.728,0.73,0.73,0.73,0.728,0.725,0.721,0.716,0.711,0.704,0.696,0.688,0.679,0.67,0.66,0.649,0.637,0.626,0.614,0.601,0.589,0.576,0.562,0.549,0.536,0.522,0.508,0.495,0.482,0.47,0.459,0.448,0.438,0.429,0.42,0.411,0.404,0.396,0.389,0.383,0.377,0.372,0.367,0.362,0.358,0.355,0.351,0.349,0.346,0.344,0.343,0.342,0.341,0.34,0.34,0.34,0.343,0.347,0.352,0.358,0.365,0.373,0.381,0.39,0.4,0.409,0.419,0.428,0.438,0.447,0.456,0.464,0.472,0.479,0.485,0.49,0.494,0.497,0.499,0.5 +PARAM_HAIR_SIDE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.003,0.01,0.022,0.039,0.058,0.08,0.11,0.13,0.16,0.2,0.23,0.26,0.3,0.33,0.36,0.4,0.43,0.46,0.5,0.52,0.55,0.58,0.6,0.62,0.637,0.651,0.662,0.668,0.67,0.657,0.63,0.59,0.55,0.52,0.505,0.499,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.499,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.496,0.483,0.463,0.44,0.41,0.37,0.33,0.3,0.26,0.21,0.18,0.14,0.11,0.08,0.05,0.03,0.013,0.003,0 +PARAM_HAIR_BACK=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.004,0.016,0.034,0.06,0.09,0.13,0.17,0.21,0.26,0.31,0.36,0.42,0.47,0.53,0.58,0.64,0.69,0.74,0.79,0.83,0.87,0.91,0.94,0.97,0.984,0.996,1,1,1,0.998,0.997,0.996,0.994,0.991,0.988,0.985,0.981,0.977,0.972,0.967,0.961,0.955,0.948,0.941,0.933,0.925,0.916,0.906,0.896,0.885,0.874,0.862,0.849,0.836,0.821,0.807,0.791,0.775,0.758,0.74,0.72,0.69,0.66,0.63,0.6,0.56,0.53,0.49,0.45,0.41,0.37,0.32,0.27,0.22,0.17,0.13,0.09,0.06,0.04,0.016,0.004,0 +PARAM_WING_ANGLE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.002,-0.003,-0.004,-0.006,-0.008,-0.01,-0.012,-0.015,-0.017,-0.02,-0.023,-0.026,-0.029,-0.032,-0.035,-0.038,-0.041,-0.044,-0.047,-0.05,-0.053,-0.056,-0.059,-0.062,-0.064,-0.067,-0.069,-0.071,-0.073,-0.075,-0.076,-0.078,-0.079,-0.079,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.08,-0.079,-0.08,-0.078,-0.077,-0.076,-0.075,-0.073,-0.072,-0.071,-0.069,-0.068,-0.066,-0.065,-0.063,-0.061,-0.059,-0.057,-0.055,-0.053,-0.051,-0.049,-0.047,-0.045,-0.043,-0.041,-0.039,-0.037,-0.035,-0.033,-0.031,-0.029,-0.027,-0.025,-0.023,-0.021,-0.019,-0.017,-0.015,-0.014,-0.012,-0.011,-0.009,-0.008,-0.007,-0.005,-0.004,-0.003,-0.002,-0.002,0,-0.001,0,0,0 +PARAM_WING_DEFORM=0,0,0.003,0.006,0.01,0.016,0.022,0.029,0.036,0.044,0.053,0.061,0.07,0.079,0.087,0.096,0.104,0.111,0.118,0.124,0.13,0.134,0.137,0.139,0.14,0.14,0.137,0.134,0.129,0.123,0.116,0.108,0.1,0.09,0.08,0.069,0.058,0.046,0.034,0.022,0.009,-0.004,-0.017,-0.03,-0.043,-0.056,-0.068,-0.08,-0.092,-0.104,-0.115,-0.126,-0.136,-0.145,-0.154,-0.162,-0.169,-0.175,-0.18,-0.184,-0.187,-0.189,-0.19,-0.19,-0.19,-0.19,-0.188,-0.187,-0.185,-0.183,-0.18,-0.175,-0.17,-0.164,-0.158,-0.153,-0.147,-0.14,-0.134,-0.128,-0.123,-0.117,-0.111,-0.105,-0.099,-0.093,-0.087,-0.082,-0.077,-0.072,-0.067,-0.063,-0.058,-0.054,-0.05,-0.046,-0.042,-0.038,-0.035,-0.032,-0.029,-0.026,-0.023,-0.02,-0.018,-0.016,-0.013,-0.011,-0.01,-0.008,-0.006,-0.005,-0.004,-0.003,-0.002,0,-0.001,0,0,0 +PARAM_RIBBON_DEFORM=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.003,-0.012,-0.026,-0.044,-0.06,-0.09,-0.11,-0.13,-0.16,-0.18,-0.199,-0.216,-0.231,-0.241,-0.248,-0.25,-0.247,-0.238,-0.226,-0.21,-0.191,-0.17,-0.15,-0.13,-0.11,-0.09,-0.066,-0.048,-0.032,-0.019,-0.009,-0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BLUSH=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0.003,0.005,0.008,0.011,0.014,0.018,0.023,0.028,0.033,0.039,0.045,0.051,0.058,0.065,0.072,0.079,0.087,0.094,0.102,0.109,0.117,0.125,0.133,0.141,0.148,0.156,0.163,0.171,0.178,0.185,0.192,0.199,0.205,0.211,0.217,0.222,0.227,0.232,0.236,0.239,0.242,0.245,0.247,0.249,0.25,0.25,0.25,0.249,0.247,0.245,0.242,0.239,0.236,0.232,0.227,0.222,0.217,0.211,0.205,0.199,0.192,0.185,0.178,0.171,0.163,0.156,0.148,0.141,0.133,0.125,0.117,0.109,0.102,0.094,0.087,0.079,0.072,0.065,0.058,0.051,0.045,0.039,0.033,0.028,0.023,0.018,0.014,0.011,0.008,0.005,0.003,0.001,0,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Fail.mtn b/public/pio/models/pio/motions/Fail.mtn new file mode 100644 index 0000000..eb9a29a --- /dev/null +++ b/public/pio/models/pio/motions/Fail.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=-1,-0.74,-0.26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Y=7.26,13.24,24.03,30,28.59,24.81,19.33,12.85,6.15,-0.33,-5.81,-9.59,-11,-10.94,-10.79,-10.54,-10.21,-9.82,-9.37,-8.86,-8.32,-7.74,-7.14,-6.53,-5.89,-5.26,-4.64,-4.03,-3.44,-2.88,-2.34,-1.84,-1.39,-1,-0.66,-0.38,-0.17,-0.04,0,-1.03,-3.8,-7.8,-12.55,-17.45,-22.2,-26.2,-28.97,-30,-27.79,-22.43,-15.88,-9.49,-4.36,-1.1,0,-2.21,-7.57,-14.12,-20.51,-25.64,-28.9,-30,-29.62,-28.55,-26.87,-24.74,-22.2,-19.42,-16.49,-13.51,-10.58,-7.8,-5.26,-3.13,-1.45,-0.38,0 +PARAM_ANGLE_Z=0,0,0,0,0,0,0,0,0,0,0,0,0,0.24,0.88,1.85,3.06,4.4,5.82,7.22,8.53,9.69,10.66,11.39,11.84,12,11.82,11.34,10.61,9.71,8.7,7.63,6.58,5.6,4.74,4.01,3.46,3.12,3,3.07,3.27,3.59,4,4.49,5.05,5.66,6.32,7,7.7,8.41,9.12,9.81,10.49,11.12,11.72,12.27,12.76,13.18,13.53,13.79,13.94,14,13.82,13.32,12.54,11.55,10.36,9.06,7.7,6.3,4.94,3.64,2.45,1.46,0.68,0.18,0 +PARAM_EMOTION=0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.65,0.57,0.569,0.569,0.568,0.57,0.567,0.566,0.57,0.565,0.564,0.56,0.563,0.56,0.561,0.561,0.56,0.559,0.559,0.56,0.558,0.557,0.56,0.556,0.56,0.554,0.554,0.55,0.553,0.552,0.55,0.551,0.55,0,0,0,0,0,0 +PARAM_EYE_L_OPEN=1,0.992,0.978,0.97,0.97,0.97,0.97,0.97,0.971,0.97,0.973,0.973,0.974,0.97,0.976,0.977,0.978,0.979,0.98,0.981,0.982,0.983,0.984,0.985,0.987,0.988,0.989,0.99,0.991,0.992,0.993,0.994,0.995,0.996,0.996,0.997,1,0.998,1,0.999,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0.09,0.23,0.37,0.46,0.5 +PARAM_EYE_R_OPEN=1,0.992,0.978,0.97,0.97,0.97,0.97,0.97,0.971,0.97,0.973,0.973,0.974,0.97,0.976,0.977,0.978,0.979,0.98,0.981,0.982,0.983,0.984,0.985,0.987,0.988,0.989,0.99,0.991,0.992,0.993,0.994,0.995,0.996,0.996,0.997,1,0.998,1,0.999,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0.09,0.23,0.37,0.46,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0,-0.001,-0.003,-0.006,-0.01,-0.015,-0.022,-0.029,-0.037,-0.047,-0.057,-0.068,-0.08,-0.092,-0.106,-0.12,-0.135,-0.15,-0.166,-0.183,-0.2,-0.217,-0.236,-0.254,-0.273,-0.292,-0.312,-0.332,-0.35,-0.372,-0.39,-0.414,-0.43,-0.46,-0.48,-0.5,-0.52,-0.54,-0.56,-0.58,-0.6,-0.623,-0.643,-0.66,-0.683,-0.702,-0.721,-0.74,-0.759,-0.777,-0.794,-0.811,-0.828,-0.844,-0.859,-0.874,-0.888,-0.901,-0.914,-0.926,-0.937,-0.947,-0.957,-0.966,-0.974,-0.98,-0.986,-0.991,-0.995,-0.998,-0.999,-1,-0.82,-0.54,-0.27,-0.08,0 +PARAM_BROW_L_Y=-0.18,-0.34,-0.61,-0.76,-0.76,-0.759,-0.757,-0.754,-0.752,-0.748,-0.744,-0.74,-0.735,-0.73,-0.725,-0.72,-0.714,-0.708,-0.703,-0.697,-0.691,-0.685,-0.679,-0.673,-0.667,-0.662,-0.657,-0.651,-0.646,-0.642,-0.638,-0.634,-0.63,-0.627,-0.625,-0.623,-0.621,-0.62,-0.62,-0.62,-0.62,-0.622,-0.624,-0.626,-0.628,-0.63,-0.633,-0.636,-0.639,-0.642,-0.645,-0.648,-0.651,-0.653,-0.656,-0.659,-0.661,-0.663,-0.665,-0.667,-0.668,-0.669,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.62,-0.5,-0.34,-0.17,-0.05,0 +PARAM_BROW_R_Y=-0.23,-0.43,-0.78,-0.97,-0.97,-0.969,-0.967,-0.964,-0.962,-0.958,-0.954,-0.95,-0.945,-0.94,-0.935,-0.93,-0.924,-0.918,-0.913,-0.907,-0.901,-0.895,-0.889,-0.883,-0.877,-0.872,-0.867,-0.861,-0.856,-0.852,-0.848,-0.844,-0.84,-0.837,-0.835,-0.833,-0.831,-0.83,-0.83,-0.83,-0.83,-0.83,-0.83,-0.831,-0.83,-0.832,-0.83,-0.833,-0.83,-0.834,-0.83,-0.836,-0.836,-0.84,-0.837,-0.84,-0.838,-0.84,-0.839,-0.84,-0.84,-0.84,-0.84,-0.84,-0.84,-0.84,-0.84,-0.839,-0.837,-0.834,-0.83,-0.76,-0.61,-0.41,-0.21,-0.06,0 +PARAM_BROW_L_ANGLE=-0.24,-0.44,-0.8,-1,-1,-0.998,-0.996,-0.993,-0.989,-0.983,-0.978,-0.971,-0.963,-0.955,-0.945,-0.935,-0.924,-0.912,-0.899,-0.885,-0.871,-0.855,-0.839,-0.822,-0.804,-0.785,-0.765,-0.74,-0.72,-0.7,-0.68,-0.65,-0.63,-0.6,-0.58,-0.55,-0.52,-0.49,-0.46,0.44,0.457,0.473,0.488,0.503,0.517,0.53,0.542,0.553,0.564,0.574,0.583,0.592,0.6,0.607,0.613,0.619,0.624,0.628,0.632,0.635,0.637,0.639,0.64,0.64,0.627,0.59,0.54,0.48,0.41,0.33,0.25,0.19,0.12,0.07,0.03,0.01,0 +PARAM_BROW_R_ANGLE=-0.24,-0.44,-0.8,-1,-1,-0.998,-0.996,-0.993,-0.989,-0.984,-0.978,-0.971,-0.964,-0.955,-0.946,-0.936,-0.925,-0.913,-0.901,-0.887,-0.873,-0.858,-0.842,-0.825,-0.807,-0.789,-0.77,-0.749,-0.73,-0.71,-0.68,-0.66,-0.64,-0.61,-0.58,-0.56,-0.53,-0.5,-0.47,0.4,0.43,0.46,0.49,0.51,0.54,0.56,0.58,0.6,0.624,0.642,0.658,0.674,0.688,0.7,0.712,0.722,0.731,0.739,0.745,0.751,0.755,0.758,0.759,0.76,0.745,0.7,0.64,0.57,0.48,0.39,0.3,0.22,0.15,0.08,0.04,0.01,0 +PARAM_EAR_DEFORM=0.18,0.56,0.7,0.65,0.55,0.43,0.3,0.19,0.09,0.02,0,0,0.002,0.005,0.008,0.013,0.018,0.023,0.029,0.036,0.043,0.05,0.058,0.065,0.073,0.08,0.088,0.095,0.102,0.108,0.114,0.12,0.125,0.129,0.133,0.136,0.138,0.14,0.14,0.12,0.06,-0.04,-0.15,-0.28,-0.41,-0.55,-0.67,-0.78,-0.87,-0.94,-0.99,-1,-1,-1,-1,-1,-0.999,-1,-0.997,-0.996,-0.995,-0.994,-0.992,-0.99,-0.988,-0.986,-0.983,-0.98,-0.977,-0.974,-0.97,-0.89,-0.72,-0.48,-0.25,-0.07,0 +PARAM_MOUTH_OPEN_Y=1,1,1,1,0.995,0.982,0.963,0.94,0.92,0.89,0.872,0.857,0.85,0.847,0.845,0.843,0.841,0.84,0.838,0.837,0.836,0.835,0.833,0.832,0.83,0.82,0.813,0.807,0.8,0.794,0.787,0.781,0.775,0.769,0.763,0.757,0.752,0.746,0.74,0.16,0.23,0.35,0.43,0.46,0.38,0.25,0.16,0.13,0.21,0.35,0.44,0.47,0.39,0.24,0.16,0.47,0.58,0.579,0.577,0.574,0.571,0.566,0.561,0.555,0.55,0.544,0.538,0.532,0.526,0.521,0.516,0.511,0.508,0.504,0.502,0.501,0.5 +PARAM_BODY_ANGLE_X=0,-0.79,-2.21,-3,-2.86,-2.49,-1.96,-1.33,-0.67,-0.04,0.49,0.86,1,0.98,0.93,0.85,0.75,0.63,0.51,0.4,0.29,0.19,0.11,0.05,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Y=0,2.63,7.37,10,9.55,8.35,6.62,4.56,2.44,0.38,-1.35,-2.55,-3,-2.94,-2.78,-2.54,-2.24,-1.9,-1.54,-1.19,-0.87,-0.58,-0.34,-0.15,-0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=-0.73,-1.32,-2.4,-3,-2.9,-2.62,-2.22,-1.75,-1.25,-0.78,-0.38,-0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BREATH=0.62,0.72,0.9,1,0.97,0.89,0.78,0.65,0.52,0.39,0.26,0.16,0.07,0.02,0,0.03,0.11,0.22,0.35,0.48,0.61,0.74,0.84,0.93,0.98,1,0.99,0.96,0.92,0.87,0.82,0.76,0.7,0.64,0.6,0.56,0.53,0.507,0.5,0.506,0.521,0.54,0.57,0.6,0.64,0.67,0.7,0.73,0.75,0.766,0.776,0.78,0.77,0.74,0.7,0.65,0.59,0.53,0.46,0.4,0.35,0.31,0.28,0.27,0.275,0.287,0.305,0.33,0.35,0.38,0.41,0.43,0.46,0.474,0.488,0.497,0.5 +PARAM_HAIR_SIDE=0.13,0.41,0.51,0.33,0.03,-0.17,-0.24,-0.13,0.05,0.17,0.21,0.16,0.08,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0,0.001,0.002,0.004,0.006,0.008,0.011,0.014,0.017,0.02,0.024,0.028,0.031,0.035,0.04,0.044,0.048,0.052,0.057,0.061,0.065,0.069,0.074,0.078,0.081,0.085,0.089,0.092,0.095,0.098,0.101,0.103,0.105,0.107,0.108,0.109,0.11,0.11,0.09,0.03,-0.05,-0.15,-0.26,-0.39,-0.5,-0.61,-0.71,-0.8,-0.86,-0.9,-0.91,-0.91,-0.909,-0.907,-0.904,-0.901,-0.896,-0.89,-0.883,-0.875,-0.865,-0.854,-0.842,-0.828,-0.812,-0.795,-0.776,-0.756,-0.73,-0.71,-0.64,-0.5,-0.33,-0.17,-0.05,0 +PARAM_WING_DEFORM=0.26,0.8,1,0.97,0.89,0.77,0.61,0.44,0.26,0.09,-0.08,-0.23,-0.35,-0.44,-0.5,-0.52,-0.506,-0.47,-0.41,-0.35,-0.28,-0.21,-0.14,-0.09,-0.04,0,0.04,0.07,0.09,0.112,0.127,0.139,0.147,0.153,0.156,0.159,0.16,0.16,0.16,0.142,0.09,0.02,-0.07,-0.17,-0.27,-0.38,-0.47,-0.56,-0.63,-0.68,-0.72,-0.73,-0.73,-0.729,-0.727,-0.725,-0.722,-0.718,-0.712,-0.706,-0.698,-0.69,-0.679,-0.668,-0.655,-0.641,-0.626,-0.609,-0.591,-0.571,-0.55,-0.49,-0.39,-0.26,-0.13,-0.04,0 +PARAM_RIBBON_DEFORM=0.06,0.19,0.39,0.58,0.72,0.77,0.72,0.58,0.37,0.13,-0.12,-0.36,-0.57,-0.71,-0.76,-0.69,-0.51,-0.28,-0.04,0.14,0.21,0.16,0.08,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BLUSH=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.07,-0.25,-0.47,-0.68,-0.85,-0.96,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.92,-0.74,-0.5,-0.26,-0.08,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Sleeping.mtn b/public/pio/models/pio/motions/Sleeping.mtn new file mode 100644 index 0000000..d6ebed2 --- /dev/null +++ b/public/pio/models/pio/motions/Sleeping.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10.03,10.13,10.26,10.42,10.58,10.74,10.87,10.97,11,10.79,10.24,9.44,8.49,7.51,6.56,5.76,5.21,5,5.015,5.06,5.13,5.23,5.35,5.49,5.65,5.83,6.04,6.25,6.48,6.73,6.99,7.25,7.53,7.81,8.1,8.4,8.7,9.01,9.31,9.61,9.92,10.22,10.52,10.81,11.1,11.38,11.66,11.92,12.17,12.42,12.65,12.86,13.06,13.25,13.41,13.56,13.69,13.8,13.88,13.95,13.99,14,13.98,13.92,13.83,13.71,13.57,13.41,13.22,13.02,12.82,12.6,12.37,12.14,11.91,11.69,11.47,11.25,11.05,10.85,10.67,10.51,10.36,10.24,10.14,10.06,10.02,10 +PARAM_ANGLE_Y=-8,-8.04,-8.15,-8.32,-8.56,-8.86,-9.21,-9.63,-10.09,-10.59,-11.14,-11.73,-12.35,-12.99,-13.68,-14.38,-15.11,-15.85,-16.6,-17.36,-18.13,-18.9,-19.68,-20.45,-21.19,-21.95,-22.69,-23.4,-24.09,-24.77,-25.41,-26.03,-26.61,-27.15,-27.66,-28.12,-28.54,-28.92,-29.24,-29.5,-29.72,-29.87,-29.97,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-28.52,-24.55,-18.81,-12.01,-4.99,1.81,7.55,11.52,13,12.93,12.72,12.38,11.92,11.34,10.66,9.87,9.01,8.05,7.02,5.91,4.73,3.51,2.23,0.91,-0.43,-1.83,-3.26,-4.68,-6.14,-7.59,-9.04,-10.51,-11.95,-13.38,-14.78,-16.16,-17.5,-18.81,-20.07,-21.27,-22.44,-23.54,-24.55,-25.52,-26.41,-27.2,-27.91,-28.52,-29.04,-29.45,-29.75,-29.94,-30,-29.89,-29.58,-29.08,-28.43,-27.65,-26.73,-25.72,-24.63,-23.49,-22.27,-21.05,-19.79,-18.52,-17.28,-16.07,-14.87,-13.75,-12.68,-11.68,-10.79,-9.99,-9.31,-8.76,-8.35,-8.09,-8 +PARAM_ANGLE_Z=10,10.005,10.018,10.04,10.07,10.11,10.16,10.22,10.28,10.36,10.44,10.53,10.63,10.74,10.85,10.97,11.1,11.24,11.38,11.54,11.69,11.86,12.03,12.21,12.4,12.59,12.79,12.99,13.2,13.42,13.64,13.87,14.11,14.34,14.59,14.84,15.09,15.35,15.61,15.88,16.16,16.43,16.71,17,17.27,17.49,17.66,17.79,17.88,17.94,17.98,17.995,18,17.52,16.23,14.36,12.14,9.86,7.64,5.77,4.48,4,4.02,4.08,4.19,4.33,4.5,4.71,4.95,5.21,5.5,5.81,6.14,6.5,6.87,7.26,7.66,8.06,8.48,8.91,9.34,9.79,10.22,10.66,11.11,11.54,11.97,12.4,12.82,13.22,13.62,14,14.36,14.71,15.05,15.35,15.65,15.91,16.15,16.37,16.55,16.71,16.83,16.93,16.98,17,16.96,16.86,16.71,16.5,16.25,15.96,15.64,15.29,14.93,14.54,14.15,13.75,13.35,12.95,12.57,12.19,11.83,11.49,11.17,10.89,10.63,10.42,10.24,10.11,10.03,10 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06 +PARAM_EYE_R_OPEN=0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=-1 +PARAM_BROW_R_Y=-1 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0 +PARAM_MOUTH_OPEN_Y=0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.789,0.79,0.79,0.788,0.79,0.79,0.787,0.79,0.786,0.79,0.785,0.78,0.784,0.78,0.783,0.78,0.782,0.781,0.78,0.78,0.78,0.779,0.78,0.777,0.777,0.78,0.776,0.78,0.775,0.77,0.774,0.77,0.773,0.77,0.77,0.772,0.77,0.77,0.771,0.77,0.77,0.77,0.77,0.77,0.77,0.77,0.773,0.783,0.796,0.812,0.828,0.844,0.857,0.867,0.87,0.87,0.87,0.87,0.869,0.867,0.864,0.86,0.84,0.79,0.74,0.69,0.64,0.62,0.61,0.619,0.639,0.66,0.69,0.71,0.732,0.745,0.75,0.742,0.722,0.7,0.67,0.656,0.644,0.64,0.642,0.647,0.656,0.666,0.679,0.693,0.708,0.722,0.737,0.751,0.764,0.774,0.783,0.788,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.79 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.5,0.5,0.5,0.498,0.498,0.497,0.495,0.494,0.492,0.49,0.488,0.486,0.483,0.48,0.477,0.474,0.47,0.466,0.462,0.458,0.454,0.449,0.444,0.439,0.433,0.427,0.422,0.415,0.409,0.402,0.395,0.388,0.38,0.372,0.364,0.356,0.347,0.338,0.329,0.32,0.31,0.3,0.29,0.278,0.264,0.25,0.235,0.221,0.209,0.199,0.192,0.19,0.19,0.191,0.193,0.195,0.198,0.202,0.206,0.21,0.215,0.22,0.226,0.232,0.239,0.246,0.253,0.26,0.268,0.276,0.284,0.292,0.301,0.309,0.318,0.326,0.335,0.344,0.353,0.361,0.37,0.379,0.387,0.395,0.404,0.412,0.419,0.427,0.434,0.441,0.448,0.455,0.461,0.467,0.472,0.477,0.482,0.486,0.489,0.492,0.495,0.497,0.499,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0 +PARAM_WING_DEFORM=0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Success.mtn b/public/pio/models/pio/motions/Success.mtn new file mode 100644 index 0000000..d309cc3 --- /dev/null +++ b/public/pio/models/pio/motions/Success.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0,0.95,3.27,6.37,9.5,11.91,13,13.17,13.31,13.44,13.56,13.65,13.73,13.8,13.85,13.9,13.93,13.96,13.974,13.987,13.995,13.999,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,12.97,10.47,7.41,4.43,2.04,0.51,0 +PARAM_ANGLE_Z=0,1.78,6.1,11.86,17.66,22.07,24,24.19,24.36,24.54,24.7,24.85,25,25.14,25.28,25.41,25.53,25.65,25.76,25.87,25.96,26.06,26.15,26.23,26.31,26.38,26.45,26.52,26.58,26.63,26.68,26.73,26.77,26.81,26.84,26.87,26.9,26.93,26.946,26.963,26.976,26.987,26.994,26.999,27,25.01,20.19,14.29,8.54,3.93,0.99,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.52,0.58,0.66,0.74,0.8,0.83,0.831,0.832,0.834,0.835,0.836,0.837,0.838,0.839,0.839,0.84,0.841,0.84,0.843,0.843,0.84,0.844,0.84,0.845,0.85,0.846,0.85,0.847,0.85,0.85,0.848,0.85,0.85,0.85,0.849,0.85,0.85,0.85,0.85,0.85,0.85,0.85,0.85,0.85,0.82,0.76,0.69,0.61,0.55,0.51,0.5 +PARAM_EYE_R_OPEN=0.5,0.52,0.58,0.66,0.74,0.8,0.83,0.832,0.834,0.835,0.837,0.839,0.84,0.842,0.843,0.844,0.845,0.847,0.848,0.849,0.85,0.851,0.852,0.852,0.853,0.85,0.855,0.855,0.86,0.856,0.86,0.857,0.86,0.858,0.86,0.86,0.859,0.86,0.86,0.86,0.86,0.86,0.86,0.86,0.86,0.83,0.77,0.69,0.61,0.55,0.51,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0,-0.08,-0.26,-0.5,-0.74,-0.92,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.93,-0.75,-0.53,-0.32,-0.15,-0.04,0 +PARAM_BROW_L_Y=0,-0.04,-0.15,-0.29,-0.43,-0.54,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.579,-0.58,-0.578,-0.58,-0.577,-0.576,-0.58,-0.574,-0.573,-0.572,-0.571,-0.57,-0.569,-0.567,-0.566,-0.564,-0.562,-0.561,-0.559,-0.557,-0.554,-0.552,-0.55,-0.547,-0.545,-0.542,-0.539,-0.537,-0.533,-0.53,-0.527,-0.524,-0.52,-0.48,-0.38,-0.27,-0.16,-0.07,-0.02,0 +PARAM_BROW_R_Y=0,-0.06,-0.21,-0.4,-0.59,-0.74,-0.8,-0.8,-0.8,-0.8,-0.8,-0.799,-0.798,-0.8,-0.796,-0.795,-0.794,-0.793,-0.791,-0.79,-0.788,-0.786,-0.784,-0.781,-0.779,-0.776,-0.774,-0.771,-0.768,-0.764,-0.761,-0.757,-0.753,-0.749,-0.745,-0.74,-0.736,-0.731,-0.726,-0.72,-0.715,-0.709,-0.703,-0.696,-0.69,-0.63,-0.51,-0.36,-0.21,-0.1,-0.02,0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0 +PARAM_MOUTH_OPEN_Y=0.5,0.46,0.37,0.25,0.13,0.04,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0.002,0,0,0.003,0,0.004,0,0.005,0.01,0.006,0.007,0.01,0.008,0.009,0.01,0.01,0.012,0.013,0.014,0.014,0.016,0.017,0.018,0.019,0.02,0.06,0.14,0.25,0.35,0.43,0.48,0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0,-0.014,-0.05,-0.11,-0.19,-0.28,-0.39,-0.5,-0.61,-0.72,-0.82,-0.92,-1,-1.08,-1.15,-1.22,-1.29,-1.35,-1.41,-1.46,-1.51,-1.56,-1.6,-1.65,-1.68,-1.72,-1.75,-1.78,-1.81,-1.84,-1.86,-1.88,-1.901,-1.919,-1.934,-1.948,-1.959,-1.969,-1.978,-1.985,-1.991,-1.995,-1.998,-1.999,-2,-1.85,-1.5,-1.06,-0.63,-0.29,-0.07,0 +PARAM_BREATH=0.5,0.498,0.491,0.481,0.469,0.455,0.44,0.425,0.411,0.399,0.389,0.382,0.38,0.381,0.385,0.392,0.401,0.411,0.424,0.438,0.452,0.469,0.485,0.502,0.52,0.538,0.555,0.571,0.588,0.602,0.616,0.629,0.639,0.648,0.655,0.659,0.66,0.658,0.652,0.643,0.632,0.618,0.604,0.588,0.572,0.556,0.542,0.528,0.517,0.508,0.502,0.5 +PARAM_HAIR_SIDE=0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,0.75,0.34,-0.04,-0.31,-0.42,-0.23,0.08,0.3,0.37,0.3,0.2,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_BACK=0,0.07,0.21,0.38,0.57,0.73,0.87,0.97,1,0.91,0.77,0.63,0.54,0.5,0.62,0.82,0.96,1,1,1,1,1,1,1,1,1,0.995,0.981,0.96,0.93,0.89,0.85,0.81,0.76,0.7,0.65,0.59,0.54,0.48,0.42,0.37,0.31,0.26,0.21,0.17,0.13,0.09,0.06,0.03,0.016,0.004,0 +PARAM_WING_ANGLE=0,0.02,0.07,0.15,0.22,0.27,0.29,0.286,0.276,0.26,0.24,0.22,0.19,0.16,0.13,0.11,0.08,0.06,0.039,0.023,0.01,0.003,0,0.04,0.12,0.16,0.12,0.04,0,0.03,0.1,0.13,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_WING_DEFORM=0,0.03,0.11,0.21,0.3,0.38,0.41,0.405,0.39,0.37,0.34,0.3,0.27,0.23,0.19,0.15,0.12,0.08,0.06,0.03,0.015,0.004,0,0.04,0.12,0.16,0.12,0.04,0,0.04,0.13,0.17,0.13,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0,0.03,0.1,0.2,0.29,0.36,0.39,0.39,0.39,0.39,0.389,0.388,0.387,0.385,0.384,0.381,0.379,0.376,0.373,0.369,0.365,0.36,0.355,0.35,0.343,0.337,0.33,0.322,0.313,0.304,0.295,0.284,0.274,0.262,0.25,0.234,0.216,0.197,0.178,0.158,0.138,0.118,0.099,0.081,0.064,0.049,0.035,0.023,0.013,0.006,0.002,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Sukebei1.mtn b/public/pio/models/pio/motions/Sukebei1.mtn new file mode 100644 index 0000000..82e2e03 --- /dev/null +++ b/public/pio/models/pio/motions/Sukebei1.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-0.53,-1.47,-2,-1.93,-1.75,-1.49,-1.19,-0.88,-0.59,-0.35,-0.16,-0.04,0,0,0,0,0,0,0,0,0.18,0.7,1.48,2.49,3.68,5.03,6.47,7.97,9.52,11.08,12.61,14.09,15.51,16.8,17.99,19.01,19.84,20.46,20.86,21,21,21,21,21,21,21,21,21,21,21,21,21,20.28,18.34,15.54,12.22,8.78,5.46,2.66,0.72,0 +PARAM_ANGLE_Y=0,4.73,13.27,18,16.35,12.02,5.76,-1.39,-8.81,-15.73,-21.64,-26.15,-29,-30,-28.01,-23.19,-17.29,-11.54,-6.93,-3.99,-3,-3.23,-3.9,-4.9,-6.2,-7.73,-9.47,-11.32,-13.25,-15.24,-17.25,-19.21,-21.12,-22.94,-24.6,-26.13,-27.44,-28.51,-29.31,-29.82,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-28.97,-26.2,-22.2,-17.45,-12.55,-7.8,-3.8,-1.03,0 +PARAM_ANGLE_Z=0,0.006,0.023,0.05,0.09,0.13,0.19,0.25,0.33,0.4,0.49,0.58,0.68,0.77,0.88,0.98,1.09,1.2,1.32,1.43,1.54,1.66,1.77,1.88,1.98,2.09,2.19,2.29,2.39,2.47,2.56,2.64,2.71,2.77,2.83,2.88,2.92,2.96,2.98,2.995,3,3,3,3,3,3,3,3,3,3,3,3,3,2.9,2.62,2.22,1.75,1.25,0.78,0.38,0.1,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.56,0.65,0.73,0.8,0.82,0.82,0.82,0.821,0.82,0.818,0.815,0.81,0.794,0.77,0.73,0.69,0.65,0.61,0.58,0.55,0.52,0.506,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.56,0.65,0.73,0.8,0.82,0.82,0.82,0.821,0.82,0.818,0.815,0.81,0.794,0.77,0.73,0.69,0.65,0.61,0.58,0.55,0.52,0.506,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_EYE_BALL_X=0,0.003,0.007,0.01,0.01,0.01,0.01,0.01,0.009,0.01,0.008,0.007,0.006,0.005,0.003,0.002,0,-0.002,-0.004,-0.006,-0.009,-0.011,-0.014,-0.017,-0.02,-0.024,-0.028,-0.032,-0.036,-0.04,-0.045,-0.05,-0.059,-0.073,-0.091,-0.111,-0.131,-0.15,-0.165,-0.176,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.18,-0.174,-0.157,-0.13,-0.1,-0.08,-0.05,-0.02,-0.006,0 +PARAM_EYE_BALL_Y=0,-0.09,-0.24,-0.33,-0.328,-0.324,-0.317,-0.307,-0.295,-0.281,-0.264,-0.246,-0.226,-0.2,-0.18,-0.16,-0.13,-0.11,-0.08,-0.05,-0.03,0,0.03,0.06,0.08,0.11,0.13,0.16,0.18,0.21,0.23,0.25,0.269,0.282,0.29,0.294,0.295,0.29,0.293,0.291,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.28,0.25,0.21,0.17,0.12,0.08,0.04,0.01,0 +PARAM_BROW_L_Y=0,0,0,0,0,0,0,0,0,-0.12,-0.32,-0.5,-0.63,-0.68,-0.68,-0.677,-0.675,-0.673,-0.671,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.65,-0.59,-0.5,-0.39,-0.28,-0.17,-0.08,-0.02,0 +PARAM_BROW_R_Y=0,0,0,0,0,0,0,0,0,-0.12,-0.32,-0.51,-0.64,-0.69,-0.689,-0.685,-0.681,-0.676,-0.673,-0.671,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.65,-0.59,-0.5,-0.39,-0.28,-0.17,-0.08,-0.02,0 +PARAM_BROW_L_ANGLE=0,-0.16,-0.42,-0.6,-0.66,-0.61,-0.49,-0.3,-0.09,0.14,0.35,0.54,0.66,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.71,0.69,0.62,0.53,0.41,0.3,0.18,0.09,0.02,0 +PARAM_BROW_R_ANGLE=0,-0.16,-0.43,-0.61,-0.67,-0.62,-0.5,-0.31,-0.1,0.13,0.34,0.53,0.65,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.7,0.68,0.61,0.52,0.41,0.29,0.18,0.09,0.02,0 +PARAM_EAR_DEFORM=0,0.08,0.22,0.34,0.43,0.47,0.468,0.46,0.448,0.432,0.41,0.39,0.36,0.32,0.29,0.25,0.2,0.16,0.11,0.06,0,-0.06,-0.11,-0.16,-0.21,-0.26,-0.31,-0.36,-0.41,-0.46,-0.51,-0.56,-0.61,-0.67,-0.72,-0.78,-0.86,-0.92,-0.96,-0.99,-1,-0.997,-0.988,-0.972,-0.95,-0.92,-0.88,-0.84,-0.78,-0.72,-0.65,-0.57,-0.48,-0.39,-0.31,-0.23,-0.16,-0.11,-0.06,-0.03,-0.01,0 +PARAM_MOUTH_OPEN_Y=0.5,0.61,0.8,0.91,0.91,0.91,0.908,0.905,0.9,0.87,0.83,0.79,0.76,0.75,0.75,0.751,0.753,0.755,0.758,0.761,0.765,0.769,0.773,0.778,0.783,0.788,0.792,0.798,0.802,0.807,0.812,0.817,0.821,0.825,0.829,0.832,0.835,0.837,0.839,0.84,0.84,0.84,0.84,0.838,0.836,0.833,0.828,0.821,0.812,0.801,0.787,0.77,0.75,0.72,0.69,0.66,0.62,0.58,0.55,0.52,0.506,0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0,0.97,2.56,3.65,4,3.79,3.24,2.44,1.49,0.51,-0.44,-1.24,-1.79,-2,-1.85,-1.5,-1.06,-0.63,-0.29,-0.07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.6,0.77,0.89,0.93,0.915,0.88,0.82,0.75,0.68,0.61,0.55,0.51,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0.15,0.38,0.55,0.6,0.588,0.55,0.5,0.43,0.35,0.27,0.18,0.09,0,-0.09,-0.16,-0.23,-0.29,-0.33,-0.35,-0.36,-0.353,-0.334,-0.3,-0.27,-0.22,-0.17,-0.12,-0.07,-0.02,0.03,0.08,0.11,0.14,0.163,0.17,0.17,0.167,0.163,0.158,0.152,0.145,0.137,0.129,0.12,0.11,0.101,0.091,0.081,0.072,0.062,0.053,0.044,0.036,0.028,0.022,0.015,0.01,0.006,0.003,0.001,0 +PARAM_WING_DEFORM=0,-0.24,-0.64,-0.91,-1,-0.995,-0.979,-0.95,-0.92,-0.88,-0.83,-0.77,-0.71,-0.65,-0.58,-0.5,-0.43,-0.35,-0.27,-0.19,-0.11,-0.03,0.05,0.12,0.19,0.26,0.33,0.39,0.44,0.49,0.54,0.57,0.6,0.62,0.636,0.64,0.637,0.628,0.613,0.594,0.57,0.54,0.52,0.48,0.45,0.42,0.38,0.34,0.31,0.27,0.23,0.2,0.17,0.14,0.11,0.08,0.06,0.038,0.022,0.01,0.003,0 +PARAM_RIBBON_DEFORM=0,0.07,0.18,0.29,0.36,0.39,0.36,0.29,0.18,0.06,-0.06,-0.18,-0.28,-0.36,-0.4,-0.42,-0.38,-0.29,-0.18,-0.06,0.04,0.13,0.19,0.21,0.195,0.16,0.11,0.07,0.03,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BLUSH=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.007,0.028,0.06,0.1,0.15,0.2,0.26,0.32,0.38,0.43,0.48,0.52,0.55,0.573,0.58,0.58,0.58,0.579,0.577,0.576,0.574,0.571,0.567,0.563,0.558,0.553,0.546,0.539,0.531,0.521,0.511,0.5,0.488,0.475,0.461,0.446,0.43,0.4,0.35,0.29,0.23,0.16,0.1,0.05,0.01,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Sukebei2.mtn b/public/pio/models/pio/motions/Sukebei2.mtn new file mode 100644 index 0000000..8436933 --- /dev/null +++ b/public/pio/models/pio/motions/Sukebei2.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-0.5,-1.63,-3.26,-5.36,-8,-12.01,-14.49,-15.68,-16,-15.24,-13.21,-10.15,-6.31,-2.07,2.44,6.87,11.01,14.67,17.75,20.06,21.51,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,21.58,20.49,18.89,16.93,14.74,12.45,10.13,7.88,5.78,3.88,2.31,1.08,0.28,0 +PARAM_ANGLE_Y=0,5.36,13.95,21.96,27.75,30,30,30,30,30,28.92,26.03,21.68,16.23,10.2,3.79,-2.5,-8.38,-13.59,-17.96,-21.25,-23.3,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-24,-23.54,-22.35,-20.61,-18.46,-16.07,-13.58,-11.05,-8.6,-6.31,-4.24,-2.52,-1.17,-0.3,0 +PARAM_ANGLE_Z=0,1.25,3.25,5.12,6.47,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6.87,6.52,6.01,5.39,4.69,3.96,3.22,2.51,1.84,1.24,0.74,0.34,0.09,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.62,0.73,0.84,0.91,0.94,0.94,0.94,0.94,0.94,0.94,0.85,0.69,0.58,0.55 +PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.62,0.73,0.84,0.91,0.94,0.94,0.94,0.94,0.94,0.94,0.85,0.69,0.58,0.55 +PARAM_EYE_L_OPEN2=-0.94,-0.94,-0.94,-0.94,-0.941,-0.942,-0.94,-0.944,-0.945,-0.946,-0.948,-0.949,-0.951,-0.952,-0.954,-0.956,-0.957,-0.959,-0.961,-0.963,-0.965,-0.967,-0.969,-0.971,-0.973,-0.975,-0.977,-0.979,-0.981,-0.983,-0.984,-0.986,-0.988,-0.989,-0.991,-0.992,-0.994,-0.995,-0.996,-0.997,-1,-0.999,-0.999,-1,-1,-1,-0.999,-0.997,-0.994,-0.991,-0.987,-0.983,-0.978,-0.974,-0.971,-0.967,-0.964,-0.962,-0.961,-0.96 +PARAM_EYE_R_OPEN2=-0.94,-0.94,-0.94,-0.94,-0.941,-0.942,-0.94,-0.944,-0.945,-0.946,-0.948,-0.949,-0.951,-0.952,-0.954,-0.956,-0.957,-0.959,-0.961,-0.963,-0.965,-0.967,-0.969,-0.971,-0.973,-0.975,-0.977,-0.979,-0.981,-0.983,-0.984,-0.986,-0.988,-0.989,-0.991,-0.992,-0.994,-0.995,-0.996,-0.997,-1,-0.999,-0.999,-1,-1,-1,-0.999,-0.997,-0.993,-0.988,-0.983,-0.978,-0.973,-0.968,-0.963,-0.959,-0.955,-0.952,-0.951,-0.95 +PARAM_EYE_BALL_X=0,-0.011,-0.028,-0.044,-0.055,-0.06,-0.06,-0.06,-0.06,-0.06,-0.063,-0.071,-0.083,-0.098,-0.115,-0.133,-0.15,-0.167,-0.181,-0.193,-0.202,-0.208,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.206,-0.196,-0.18,-0.162,-0.14,-0.12,-0.1,-0.08,-0.055,-0.037,-0.022,-0.01,-0.003,0 +PARAM_EYE_BALL_Y=0,-0.12,-0.31,-0.49,-0.62,-0.67,-0.67,-0.67,-0.67,-0.67,-0.652,-0.61,-0.53,-0.45,-0.35,-0.24,-0.14,-0.04,0.04,0.11,0.17,0.2,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.206,0.196,0.18,0.162,0.14,0.12,0.1,0.08,0.055,0.037,0.022,0.01,0.003,0 +PARAM_BROW_L_Y=0,0.11,0.27,0.43,0.55,0.59,0.59,0.59,0.59,0.59,0.56,0.49,0.39,0.26,0.11,-0.05,-0.2,-0.34,-0.47,-0.57,-0.65,-0.7,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.72,-0.67,-0.54,-0.38,-0.23,-0.1,-0.03,0 +PARAM_BROW_R_Y=0,0.1,0.27,0.42,0.54,0.58,0.58,0.58,0.58,0.58,0.55,0.49,0.38,0.25,0.11,-0.05,-0.2,-0.34,-0.46,-0.57,-0.64,-0.69,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.71,-0.66,-0.53,-0.38,-0.22,-0.1,-0.03,0 +PARAM_BROW_ANGLE=0.2,0.15,0.07,0,-0.05,-0.07,-0.07,-0.07,-0.07,-0.07,-0.07,-0.07,-0.07,-0.07,-0.07,-0.07,-0.07,-0.56,-0.62,-0.65,-0.67,-0.678,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,0,0.13,0.19,0.2 +PARAM_BROW_SELECT=-0.5,-0.46,-0.39,-0.33,-0.29,-0.27,-0.27,-0.27,-0.27,-0.27,-0.268,-0.262,-0.252,-0.238,-0.221,-0.202,-0.18,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,0.19,-0.43,-0.48,-0.495,-0.5 +PARAM_MOUTH_OPEN_Y=0 +PARAM_MOUTH_OPEN2=0.9,0.74,0.48,0.24,0.07,0,0,0,0,0,-0.007,-0.03,-0.07,-0.12,-0.18,-0.26,-0.34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0.85,0.88,0.897,0.9 +PARAM_MOUTH_EMO=0,0,0.002,0.005,0.01,0.015,0.022,0.03,0.039,0.049,0.061,0.073,0.087,0.101,0.116,0.133,0.15,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.259,0.26,0.257,0.256,0.254,0.252,0.25,0.19,0.09,0.02,0 +PARAM_CHEEK=0,0,0,0,0,0,0,0,0,0,0.02,0.07,0.15,0.25,0.37,0.49,0.6,0.71,0.81,0.89,0.95,0.99,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.981,0.93,0.86,0.77,0.67,0.57,0.46,0.36,0.26,0.18,0.11,0.05,0.01,0 +PARAM_BODY_ANGLE_X=0,0.34,0.96,1.66,2.35,3,3.67,3.92,3.99,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3.97,3.9,3.78,3.64,3.46,3.25,3.03,2.79,2.54,2.29,2.03,1.77,1.52,1.28,1.05,0.83,0.63,0.45,0.3,0.17,0.08,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=0,1.43,3.72,5.86,7.4,8,8.08,8.02,7.65,7,5.64,4.16,2.58,0.95,-0.65,-2.2,-3.62,-4.89,-5.96,-6.84,-7.48,-7.87,-8,-7.95,-7.8,-7.57,-7.28,-6.91,-6.51,-6.06,-5.59,-5.09,-4.58,-4.06,-3.55,-3.05,-2.55,-2.09,-1.66,-1.26,-0.9,-0.59,-0.34,-0.16,-0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_Y=0,0.03,0.09,0.14,0.18,0.19,0.182,0.16,0.13,0.08,0.03,-0.02,-0.08,-0.14,-0.19,-0.25,-0.3,-0.35,-0.4,-0.43,-0.46,-0.481,-0.49,-0.493,-0.496,-0.498,-0.5,-0.502,-0.504,-0.505,-0.506,-0.507,-0.51,-0.508,-0.51,-0.509,-0.51,-0.51,-0.51,-0.51,-0.51,-0.51,-0.51,-0.51,-0.51,-0.51,-0.5,-0.47,-0.44,-0.39,-0.34,-0.29,-0.23,-0.18,-0.13,-0.09,-0.05,-0.02,-0.006,0 +PARAM_BREATH=0.5,0.59,0.73,0.87,0.96,1,1,1,1,1,0.98,0.93,0.85,0.75,0.63,0.51,0.4,0.29,0.19,0.11,0.05,0.01,0,0.006,0.025,0.05,0.09,0.14,0.19,0.24,0.3,0.36,0.43,0.49,0.56,0.62,0.68,0.74,0.79,0.84,0.89,0.93,0.96,0.98,0.995,1,0.99,0.97,0.93,0.88,0.83,0.78,0.73,0.68,0.63,0.59,0.55,0.52,0.506,0.5 +PARAM_BOING=0,-0.2,-0.57,-0.77,-0.64,-0.31,0.11,0.54,0.87,1,0.9,0.7,0.44,0.18,-0.07,-0.27,-0.4,-0.45,-0.33,-0.15,0.03,0.15,0.2,0.18,0.12,0.04,-0.05,-0.11,-0.13,-0.12,-0.1,-0.07,-0.03,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0,-0.015,-0.05,-0.11,-0.18,-0.25,-0.32,-0.38,-0.42,-0.43,-0.35,-0.14,0.13,0.39,0.6,0.68,0.62,0.47,0.29,0.12,-0.02,-0.11,-0.14,-0.129,-0.1,-0.07,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_R=0,0.03,0.12,0.25,0.4,0.56,0.7,0.83,0.92,0.98,1,0.96,0.86,0.69,0.49,0.26,0.01,-0.23,-0.46,-0.66,-0.83,-0.93,-0.97,-0.93,-0.83,-0.7,-0.54,-0.38,-0.22,-0.07,0.06,0.16,0.23,0.25,0.25,0.25,0.248,0.247,0.244,0.24,0.234,0.228,0.219,0.208,0.195,0.18,0.161,0.141,0.123,0.104,0.087,0.071,0.056,0.042,0.03,0.02,0.011,0.005,0.001,0 +PARAM_HAIR_SIDE_L=0,0.03,0.12,0.25,0.4,0.56,0.7,0.83,0.92,0.98,1,0.96,0.85,0.69,0.48,0.25,0,-0.25,-0.48,-0.69,-0.85,-0.96,-1,-0.987,-0.95,-0.91,-0.85,-0.8,-0.74,-0.69,-0.65,-0.61,-0.59,-0.58,-0.581,-0.585,-0.591,-0.598,-0.606,-0.615,-0.624,-0.632,-0.639,-0.645,-0.649,-0.65,-0.638,-0.61,-0.56,-0.5,-0.44,-0.37,-0.3,-0.23,-0.17,-0.11,-0.07,-0.03,-0.01,0 +PARAM_TWIN_RIBBON_D=0,-0.17,-0.49,-0.66,-0.54,-0.23,0.17,0.57,0.88,1,0.85,0.5,0.06,-0.37,-0.71,-0.93,-1,-0.89,-0.63,-0.32,-0.01,0.24,0.4,0.45,0.4,0.28,0.13,-0.01,-0.12,-0.2,-0.22,-0.217,-0.209,-0.197,-0.181,-0.163,-0.142,-0.12,-0.1,-0.08,-0.057,-0.039,-0.023,-0.011,-0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,-0.013,-0.04,-0.08,-0.11,-0.15,-0.17,-0.193,-0.2,-0.194,-0.178,-0.15,-0.12,-0.08,-0.04,0,0.05,0.09,0.13,0.17,0.2,0.22,0.244,0.256,0.26,0.259,0.257,0.254,0.25,0.244,0.238,0.231,0.223,0.214,0.205,0.196,0.185,0.175,0.164,0.153,0.143,0.131,0.12,0.109,0.099,0.088,0.078,0.068,0.058,0.049,0.041,0.033,0.026,0.019,0.014,0.009,0.005,0.002,0.001,0 +PARAM_WING_DEFORM=0,0.04,0.11,0.21,0.31,0.4,0.47,0.52,0.54,0.539,0.538,0.535,0.531,0.525,0.519,0.512,0.504,0.495,0.486,0.475,0.464,0.453,0.44,0.427,0.414,0.4,0.386,0.371,0.356,0.341,0.325,0.309,0.294,0.278,0.262,0.246,0.231,0.215,0.199,0.184,0.169,0.154,0.14,0.126,0.113,0.1,0.087,0.076,0.065,0.054,0.045,0.036,0.028,0.021,0.015,0.009,0.005,0.002,0.001,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Sukebei3.mtn b/public/pio/models/pio/motions/Sukebei3.mtn new file mode 100644 index 0000000..8953b6a --- /dev/null +++ b/public/pio/models/pio/motions/Sukebei3.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-1.52,-4.1,-6.79,-9.18,-11,-12.79,-14.45,-15.92,-17.28,-18.5,-19.62,-20.62,-21.5,-22.3,-23,-23.62,-24.15,-24.62,-25,-25.32,-25.57,-25.76,-25.9,-25.97,-26,-25.96,-25.85,-25.66,-25.4,-25.09,-24.72,-24.3,-23.84,-23.34,-22.8,-22.23,-21.64,-21.03,-20.4,-19.76,-19.13,-18.49,-17.86,-17.24,-16.62,-16.03,-15.46,-14.92,-14.41,-13.93,-13.49,-13.1,-12.75,-12.45,-12.19,-12,-11.82,-11.65,-11.51,-11.38,-11.27,-11.16,-11.07,-10.99,-10.92,-10.85,-10.79,-10.73,-10.67,-10.62,-10.56,-10.51,-10.45,-10.39,-10.32,-10.25,-10.18,-10.09,-10,-0.26,15.6,26.46,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,29.62,28.55,26.9,24.77,22.31,19.59,16.8,13.95,11.17,8.52,6.14,4.05,2.33,1.07,0.27,0 +PARAM_ANGLE_Y=0,-4.31,-11.27,-17.86,-22.77,-25,-25.63,-26.2,-26.71,-27.17,-27.59,-27.96,-28.29,-28.58,-28.84,-29.07,-29.27,-29.44,-29.58,-29.7,-29.8,-29.87,-29.93,-29.97,-29.99,-30,-29.997,-29.989,-29.975,-29.956,-29.93,-29.9,-29.86,-29.82,-29.77,-29.72,-29.66,-29.59,-29.52,-29.44,-29.36,-29.27,-29.18,-29.07,-28.97,-28.85,-28.73,-28.61,-28.47,-28.33,-28.19,-28.03,-27.87,-27.71,-27.54,-27.36,-27.17,-26.98,-26.78,-26.58,-26.37,-26.15,-25.92,-25.69,-25.45,-25.2,-24.95,-24.69,-24.42,-24.15,-23.86,-23.58,-23.28,-22.98,-22.67,-22.35,-22.02,-21.69,-21.35,-21,-18.9,-15.84,-13.75,-13,-12.85,-12.71,-12.6,-12.49,-12.39,-12.29,-12.2,-12.11,-12.01,-11.9,-11.79,-11.66,-11.52,-11.36,-11.19,-11,-10.65,-10.11,-9.41,-8.57,-7.65,-6.67,-5.68,-4.69,-3.74,-2.84,-2.04,-1.34,-0.77,-0.35,-0.09,0 +PARAM_ANGLE_Z=0,-0.02,-0.09,-0.18,-0.3,-0.44,-0.6,-0.79,-1,-1.26,-1.5,-1.72,-1.92,-2.11,-2.27,-2.42,-2.55,-2.66,-2.75,-2.83,-2.89,-2.94,-2.97,-2.994,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-0.82,2.75,5.2,6,5.981,5.92,5.83,5.71,5.57,5.4,5.2,4.99,4.76,4.52,4.26,4,3.73,3.46,3.18,2.89,2.62,2.35,2.08,1.82,1.56,1.32,1.1,0.89,0.7,0.52,0.37,0.24,0.14,0.06,0.02,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.48,0.38,0.28,0.21,0.18,0.18,0.18,0.18,0.181,0.183,0.186,0.19,0.21,0.26,0.31,0.36,0.41,0.44,0.46,0.472,0.483,0.493,0.502,0.51,0.517,0.523,0.529,0.533,0.537,0.541,0.544,0.546,0.547,0.549,0.549,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.66,0.84,0.96,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.994,0.978,0.95,0.92,0.88,0.84,0.8,0.76,0.72,0.68,0.64,0.61,0.58,0.566,0.554,0.55 +PARAM_EYE_R_OPEN=0.55,0.48,0.38,0.28,0.21,0.18,0.18,0.18,0.18,0.181,0.183,0.186,0.19,0.21,0.26,0.31,0.36,0.41,0.44,0.46,0.472,0.483,0.493,0.502,0.51,0.517,0.523,0.529,0.533,0.537,0.541,0.544,0.546,0.547,0.549,0.549,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.66,0.84,0.96,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.994,0.978,0.95,0.92,0.88,0.84,0.8,0.76,0.72,0.68,0.64,0.61,0.58,0.566,0.554,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0,0,-0.002,-0.004,-0.007,-0.011,-0.016,-0.02,-0.026,-0.031,-0.037,-0.043,-0.049,-0.055,-0.061,-0.067,-0.073,-0.078,-0.082,-0.087,-0.091,-0.094,-0.096,-0.098,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.098,-0.091,-0.08,-0.067,-0.051,-0.033,-0.014,0.004,0.023,0.041,0.057,0.07,0.081,0.088,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.09,0.089,0.086,0.081,0.074,0.067,0.059,0.05,0.042,0.034,0.026,0.018,0.012,0.007,0.003,0.001,0 +PARAM_EYE_BALL_Y=0,-0.002,-0.007,-0.016,-0.028,-0.042,-0.059,-0.078,-0.098,-0.12,-0.14,-0.16,-0.19,-0.21,-0.23,-0.25,-0.28,-0.295,-0.313,-0.33,-0.344,-0.357,-0.367,-0.374,-0.378,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.38,-0.374,-0.358,-0.33,-0.3,-0.26,-0.22,-0.17,-0.13,-0.08,-0.04,0,0.03,0.06,0.074,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.079,0.076,0.072,0.066,0.06,0.052,0.045,0.037,0.03,0.023,0.016,0.011,0.006,0.003,0.001,0 +PARAM_BROW_L_Y=0,-0.15,-0.39,-0.61,-0.78,-0.84,-0.84,-0.84,-0.84,-0.84,-0.84,-0.84,-0.829,-0.8,-0.76,-0.72,-0.68,-0.63,-0.59,-0.55,-0.53,-0.507,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.49,-0.46,-0.42,-0.37,-0.31,-0.25,-0.19,-0.13,-0.08,-0.04,-0.01,0 +PARAM_BROW_R_Y=0,-0.15,-0.4,-0.62,-0.79,-0.85,-0.85,-0.85,-0.85,-0.85,-0.85,-0.85,-0.839,-0.81,-0.77,-0.73,-0.68,-0.64,-0.59,-0.56,-0.53,-0.507,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.49,-0.46,-0.42,-0.37,-0.31,-0.25,-0.19,-0.13,-0.08,-0.04,-0.01,0 +PARAM_BROW_ANGLE=0.2,0.05,-0.18,-0.4,-0.56,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.609,-0.58,-0.54,-0.5,-0.45,-0.41,-0.36,-0.33,-0.3,-0.277,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.27,-0.35,-0.49,-0.59,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,-0.62,0.32,0.316,0.306,0.293,0.278,0.262,0.246,0.232,0.219,0.209,0.202,0.2 +PARAM_BROW_SELECT=-0.5,-0.34,-0.09,0.14,0.31,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.36,0.3,0.21,0.1,-0.56,-0.558,-0.553,-0.547,-0.539,-0.531,-0.523,-0.516,-0.51,-0.504,-0.501,-0.5 +PARAM_MOUTH_OPEN_Y=0 +PARAM_MOUTH_OPEN2=0.9,0.79,0.62,0.46,0.35,0.3,0.301,0.305,0.311,0.32,0.332,0.345,0.361,0.379,0.399,0.42,0.45,0.48,0.487,0.49,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.98,-0.91,-0.8,-0.67,-0.51,-0.34,-0.16,0.02,0.19,0.36,0.51,0.64,0.75,0.83,0.88,0.9 +PARAM_MOUTH_EMO=0,0,0.002,0.005,0.008,0.013,0.019,0.025,0.033,0.042,0.052,0.062,0.074,0.087,0.1,0.114,0.13,0.146,0.162,0.18,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.247,0.238,0.224,0.206,0.19,0.16,0.14,0.12,0.09,0.07,0.051,0.034,0.019,0.009,0.002,0 +PARAM_CHEEK=0,0,0,0,0.006,0.03,0.08,0.14,0.21,0.29,0.37,0.45,0.54,0.62,0.7,0.77,0.84,0.89,0.94,0.97,0.99,1,1,0.999,0.998,0.996,0.994,0.992,0.99,0.987,0.985,0.983,0.98,0.978,0.976,0.974,0.972,0.971,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.97,0.958,0.92,0.87,0.8,0.72,0.63,0.54,0.45,0.36,0.28,0.2,0.13,0.08,0.03,0.01,0 +PARAM_BODY_ANGLE_X=0,0.36,0.93,1.46,1.85,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1.999,1.996,1.99,1.982,1.973,1.961,1.946,1.929,1.91,1.89,1.87,1.84,1.81,1.78,1.75,1.71,1.67,1.63,1.59,1.55,1.5,1.45,1.4,1.34,1.28,1.22,1.16,1.09,1.03,0.96,0.88,0.81,0.73,0.65,0.56,0.48,0.39,0.29,0.2,0.1,0,-0.1,-0.21,-0.32,-0.43,-0.55,-0.66,-0.78,-0.91,-1.03,-1.16,-1.29,-1.43,-1.57,-1.71,-1.85,-2,-2.81,-3.98,-4.75,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4.97,-4.87,-4.72,-4.53,-4.28,-4.01,-3.71,-3.38,-3.03,-2.68,-2.32,-1.97,-1.62,-1.29,-0.99,-0.72,-0.47,-0.28,-0.13,-0.03,0 +PARAM_BODY_ANGLE_Z=0,0.89,2.32,3.66,4.62,5,4.94,4.77,4.51,4.19,3.82,3.42,2.99,2.56,2.12,1.71,1.31,0.95,0.63,0.37,0.17,0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_Y=0,0,-0.003,-0.006,-0.011,-0.017,-0.024,-0.032,-0.04,-0.05,-0.06,-0.071,-0.082,-0.094,-0.106,-0.118,-0.131,-0.144,-0.157,-0.17,-0.183,-0.196,-0.208,-0.22,-0.232,-0.244,-0.255,-0.266,-0.276,-0.285,-0.294,-0.302,-0.309,-0.315,-0.32,-0.324,-0.327,-0.329,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.33,-0.2,0.01,0.15,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.199,0.195,0.189,0.181,0.171,0.16,0.148,0.135,0.121,0.107,0.093,0.079,0.065,0.052,0.04,0.029,0.019,0.011,0.005,0.001,0 +PARAM_BREATH=0.5,0.59,0.73,0.87,0.96,1,0.998,0.991,0.981,0.968,0.951,0.932,0.91,0.89,0.86,0.83,0.8,0.77,0.74,0.71,0.68,0.65,0.62,0.59,0.56,0.53,0.5,0.47,0.44,0.42,0.4,0.379,0.362,0.347,0.336,0.327,0.322,0.32,0.32,0.32,0.32,0.321,0.322,0.323,0.324,0.326,0.327,0.329,0.331,0.333,0.335,0.338,0.34,0.343,0.346,0.35,0.353,0.357,0.361,0.365,0.37,0.374,0.379,0.384,0.39,0.395,0.401,0.407,0.414,0.42,0.427,0.434,0.441,0.449,0.457,0.465,0.473,0.482,0.491,0.5,0.57,0.68,0.76,0.78,0.779,0.776,0.772,0.767,0.76,0.752,0.743,0.733,0.722,0.711,0.699,0.687,0.674,0.661,0.648,0.635,0.622,0.609,0.597,0.585,0.573,0.562,0.551,0.541,0.533,0.524,0.517,0.511,0.507,0.503,0.501,0.5 +PARAM_BOING=0,0.17,0.43,0.68,0.86,0.93,0.82,0.54,0.18,-0.18,-0.46,-0.57,-0.51,-0.37,-0.2,-0.04,0.1,0.18,0.21,0.203,0.184,0.16,0.12,0.09,0.06,0.03,0.008,0,0,0,-0.001,0,-0.002,0,0,-0.003,0,0,-0.004,0,0,-0.005,-0.01,-0.01,-0.006,-0.01,-0.01,-0.01,-0.007,-0.01,-0.01,-0.01,-0.01,-0.01,-0.008,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.009,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,-0.01,0.1,0.27,0.43,0.54,0.59,0.52,0.36,0.14,-0.09,-0.25,-0.32,-0.309,-0.28,-0.24,-0.19,-0.13,-0.08,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0 +PARAM_HAIR_SIDE_R=0 +PARAM_HAIR_SIDE_L=0 +PARAM_TWIN_RIBBON_D=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.24,0.64,0.91,1,0.89,0.62,0.29,-0.03,-0.29,-0.45,-0.51,-0.492,-0.45,-0.38,-0.3,-0.21,-0.13,-0.06,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0 +PARAM_WING_DEFORM=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch Dere1.mtn b/public/pio/models/pio/motions/Touch Dere1.mtn new file mode 100644 index 0000000..a6d97f5 --- /dev/null +++ b/public/pio/models/pio/motions/Touch Dere1.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.38,1.4,2.97,4.94,7.13,9.5,11.87,14.06,16.03,17.6,18.62,19,18.94,18.76,18.46,18.06,17.55,16.96,16.27,15.51,14.67,13.77,12.79,11.78,10.7,9.59,8.43,7.27,6.05,4.85,3.61,2.39,1.15,-0.05,-1.27,-2.43,-3.59,-4.7,-5.78,-6.79,-7.77,-8.67,-9.51,-10.27,-10.96,-11.55,-12.06,-12.46,-12.76,-12.94,-13,-12.84,-12.4,-11.73,-10.9,-9.94,-8.89,-7.77,-6.65,-5.51,-4.44,-3.42,-2.48,-1.65,-0.97,-0.45,-0.12,0 +PARAM_ANGLE_Y=0,-0.56,-2.06,-4.38,-7.28,-10.51,-14,-17.49,-20.72,-23.63,-25.94,-27.44,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-28,-27.65,-26.71,-25.26,-23.47,-21.4,-19.14,-16.73,-14.33,-11.87,-9.56,-7.36,-5.33,-3.55,-2.08,-0.96,-0.25,0 +PARAM_ANGLE_Z=0,0.08,0.29,0.62,1.05,1.54,2.08,2.64,3.21,3.77,4.3,4.77,5.19,5.53,5.79,5.95,6,5.96,5.86,5.7,5.48,5.22,4.9,4.54,4.14,3.72,3.26,2.78,2.27,1.75,1.21,0.67,0.13,-0.43,-0.99,-1.53,-2.07,-2.6,-3.12,-3.61,-4.09,-4.54,-4.96,-5.35,-5.71,-6.03,-6.31,-6.55,-6.74,-6.88,-6.97,-7,-6.91,-6.68,-6.32,-5.87,-5.35,-4.79,-4.18,-3.58,-2.97,-2.39,-1.84,-1.33,-0.89,-0.52,-0.24,-0.06,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55 +PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0,-0.001,-0.005,-0.011,-0.018,-0.026,-0.035,-0.044,-0.052,-0.059,-0.065,-0.069,-0.07,-0.07,-0.069,-0.067,-0.065,-0.063,-0.06,-0.056,-0.053,-0.048,-0.044,-0.039,-0.034,-0.028,-0.023,-0.017,-0.011,-0.005,0.001,0.007,0.013,0.019,0.025,0.031,0.037,0.043,0.048,0.054,0.059,0.064,0.068,0.073,0.076,0.08,0.083,0.085,0.087,0.089,0.09,0.09,0.089,0.086,0.081,0.075,0.069,0.062,0.054,0.046,0.038,0.031,0.024,0.017,0.011,0.007,0.003,0.001,0 +PARAM_EYE_BALL_Y=0,0.006,0.021,0.04,0.07,0.11,0.14,0.18,0.21,0.24,0.27,0.282,0.29,0.293,0.295,0.297,0.3,0.302,0.304,0.306,0.308,0.31,0.311,0.313,0.314,0.316,0.317,0.318,0.319,0.321,0.322,0.322,0.323,0.324,0.32,0.326,0.326,0.33,0.327,0.33,0.328,0.33,0.33,0.329,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.33,0.326,0.315,0.298,0.28,0.25,0.23,0.2,0.17,0.14,0.11,0.09,0.06,0.04,0.025,0.011,0.003,0 +PARAM_BROW_L_Y=0,0,0,0,0,0,0.01,0.03,0.06,0.09,0.12,0.14,0.154,0.16,0.158,0.152,0.144,0.132,0.117,0.101,0.083,0.063,0.04,0.02,0,-0.02,-0.04,-0.061,-0.08,-0.098,-0.113,-0.127,-0.139,-0.149,-0.156,-0.16,-0.163,-0.165,-0.167,-0.168,-0.169,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.168,-0.164,-0.157,-0.148,-0.138,-0.126,-0.113,-0.099,-0.085,-0.071,-0.057,-0.044,-0.032,-0.022,-0.013,-0.006,-0.002,0 +PARAM_BROW_R_Y=0,0,0,0,0,0,0.01,0.03,0.06,0.09,0.12,0.14,0.154,0.16,0.158,0.152,0.144,0.132,0.117,0.101,0.083,0.063,0.04,0.02,0,-0.02,-0.04,-0.061,-0.08,-0.098,-0.113,-0.127,-0.139,-0.149,-0.156,-0.16,-0.163,-0.165,-0.167,-0.168,-0.169,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.17,-0.168,-0.164,-0.157,-0.148,-0.138,-0.126,-0.113,-0.099,-0.085,-0.071,-0.057,-0.044,-0.032,-0.022,-0.013,-0.006,-0.002,0 +PARAM_BROW_ANGLE=0.2,0.205,0.218,0.24,0.27,0.29,0.33,0.36,0.38,0.41,0.43,0.445,0.45,0.45,0.449,0.448,0.446,0.444,0.442,0.439,0.435,0.432,0.428,0.424,0.419,0.414,0.409,0.404,0.399,0.393,0.387,0.381,0.375,0.368,0.362,0.356,0.349,0.343,0.336,0.329,0.322,0.316,0.309,0.303,0.296,0.29,0.283,0.277,0.271,0.265,0.259,0.254,0.248,0.243,0.238,0.233,0.229,0.224,0.22,0.217,0.213,0.21,0.208,0.205,0.204,0.202,0.201,0.2,0.2 +PARAM_BROW_SELECT=-0.5 +PARAM_MOUTH_OPEN_Y=0 +PARAM_MOUTH_OPEN2=0.9,0.89,0.86,0.81,0.75,0.68,0.59,0.49,0.39,0.28,0.17,0.06,-0.05,-0.16,-0.26,-0.36,-0.45,-0.52,-0.58,-0.63,-0.66,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.67,-0.666,-0.653,-0.634,-0.61,-0.57,-0.53,-0.49,-0.44,-0.38,-0.33,-0.27,-0.2,-0.14,-0.07,0,0.07,0.14,0.21,0.28,0.35,0.41,0.48,0.53,0.59,0.65,0.7,0.74,0.78,0.82,0.85,0.87,0.886,0.896,0.9 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0,0.003,0.01,0.022,0.038,0.059,0.08,0.11,0.14,0.17,0.2,0.24,0.28,0.32,0.36,0.4,0.43,0.47,0.51,0.55,0.59,0.62,0.65,0.68,0.71,0.73,0.752,0.768,0.78,0.787,0.79,0.79,0.79,0.79,0.79,0.79,0.79,0.788,0.787,0.784,0.782,0.778,0.774,0.768,0.762,0.754,0.746,0.735,0.724,0.711,0.696,0.68,0.65,0.62,0.58,0.53,0.48,0.42,0.37,0.31,0.26,0.2,0.16,0.11,0.07,0.04,0.02,0.005,0 +PARAM_BODY_ANGLE_X=0,-0.019,-0.07,-0.14,-0.23,-0.33,-0.43,-0.54,-0.64,-0.74,-0.82,-0.89,-0.95,-0.99,-1,-0.992,-0.97,-0.93,-0.88,-0.83,-0.76,-0.68,-0.6,-0.51,-0.41,-0.32,-0.22,-0.12,-0.01,0.09,0.19,0.29,0.39,0.48,0.57,0.65,0.72,0.79,0.85,0.9,0.94,0.97,0.994,1,0.995,0.98,0.96,0.93,0.89,0.84,0.8,0.74,0.69,0.63,0.57,0.51,0.45,0.39,0.33,0.27,0.22,0.18,0.13,0.09,0.06,0.04,0.016,0.004,0 +PARAM_BODY_ANGLE_Z=0,0.04,0.14,0.28,0.46,0.66,0.87,1.08,1.28,1.47,1.65,1.79,1.9,1.97,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1.99,1.96,1.91,1.85,1.78,1.69,1.59,1.48,1.37,1.26,1.14,1.01,0.89,0.78,0.66,0.55,0.45,0.35,0.26,0.19,0.12,0.07,0.03,0.01,0 +PARAM_BODY_Y=0,0.004,0.014,0.029,0.049,0.07,0.1,0.12,0.15,0.18,0.2,0.22,0.242,0.258,0.27,0.277,0.28,0.277,0.268,0.255,0.236,0.21,0.19,0.16,0.13,0.1,0.07,0.03,0,-0.04,-0.07,-0.11,-0.14,-0.17,-0.2,-0.23,-0.25,-0.27,-0.294,-0.309,-0.32,-0.328,-0.33,-0.328,-0.324,-0.316,-0.306,-0.295,-0.281,-0.266,-0.249,-0.232,-0.214,-0.196,-0.177,-0.158,-0.139,-0.121,-0.103,-0.086,-0.07,-0.055,-0.042,-0.03,-0.02,-0.011,-0.005,-0.001,0 +PARAM_BREATH=0.5,0.501,0.505,0.511,0.519,0.529,0.541,0.554,0.568,0.584,0.601,0.619,0.637,0.656,0.676,0.695,0.714,0.734,0.753,0.771,0.789,0.806,0.822,0.836,0.849,0.861,0.871,0.879,0.885,0.889,0.89,0.885,0.871,0.85,0.82,0.79,0.75,0.71,0.67,0.63,0.58,0.54,0.5,0.46,0.43,0.39,0.37,0.34,0.325,0.314,0.31,0.312,0.317,0.324,0.334,0.346,0.359,0.374,0.389,0.405,0.421,0.436,0.451,0.464,0.476,0.486,0.493,0.498,0.5 +PARAM_BOING=0 +PARAM_HAIR_FRONT=0 +PARAM_HAIR_SIDE_R=0 +PARAM_HAIR_SIDE_L=0 +PARAM_TWIN_RIBBON_D=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0,-0.001,-0.002,-0.004,-0.006,-0.008,-0.011,-0.014,-0.017,-0.021,-0.024,-0.028,-0.032,-0.036,-0.04,-0.043,-0.047,-0.051,-0.055,-0.058,-0.062,-0.065,-0.068,-0.07,-0.073,-0.075,-0.077,-0.078,-0.079,-0.08,-0.08,-0.08,-0.08,-0.078,-0.077,-0.076,-0.074,-0.072,-0.07,-0.068,-0.065,-0.062,-0.059,-0.056,-0.053,-0.05,-0.047,-0.044,-0.04,-0.037,-0.034,-0.031,-0.028,-0.025,-0.022,-0.019,-0.016,-0.014,-0.011,-0.009,-0.007,-0.005,-0.004,-0.002,-0.001,-0.001,0,0 +PARAM_WING_DEFORM=0,-0.009,-0.03,-0.07,-0.12,-0.18,-0.24,-0.3,-0.37,-0.43,-0.49,-0.55,-0.6,-0.64,-0.67,-0.684,-0.69,-0.687,-0.676,-0.66,-0.64,-0.61,-0.58,-0.54,-0.5,-0.46,-0.41,-0.36,-0.31,-0.26,-0.21,-0.16,-0.1,-0.05,0,0.05,0.1,0.14,0.18,0.22,0.26,0.29,0.32,0.35,0.364,0.378,0.387,0.39,0.387,0.38,0.368,0.353,0.334,0.31,0.29,0.26,0.24,0.21,0.18,0.15,0.13,0.1,0.08,0.06,0.037,0.022,0.01,0.003,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch Dere2.mtn b/public/pio/models/pio/motions/Touch Dere2.mtn new file mode 100644 index 0000000..45be4d6 --- /dev/null +++ b/public/pio/models/pio/motions/Touch Dere2.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-0.12,-0.47,-1.02,-1.72,-2.58,-3.54,-4.6,-5.73,-6.91,-8.11,-9.35,-10.57,-11.76,-12.94,-14.03,-15.06,-16.01,-16.86,-17.59,-18.18,-18.63,-18.9,-19,-18.98,-18.9,-18.78,-18.62,-18.42,-18.19,-17.92,-17.62,-17.29,-16.94,-16.56,-16.17,-15.75,-15.33,-14.89,-14.43,-13.97,-13.51,-13.03,-12.56,-12.09,-11.62,-11.16,-10.69,-10.25,-9.81,-9.38,-8.97,-8.58,-8.21,-7.86,-7.54,-7.23,-6.97,-6.72,-6.51,-6.33,-6.19,-6.09,-6.02,-6,-6,-6,-6,-6,-6,-5.81,-5.32,-4.67,-3.9,-3.11,-2.32,-1.58,-0.95,-0.45,-0.12,0 +PARAM_ANGLE_Y=0,-0.19,-0.74,-1.61,-2.72,-4.08,-5.59,-7.26,-9.04,-10.92,-12.81,-14.76,-16.69,-18.57,-20.43,-22.16,-23.78,-25.28,-26.62,-27.77,-28.71,-29.41,-29.85,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-29.04,-26.62,-23.34,-19.51,-15.53,-11.6,-7.88,-4.75,-2.23,-0.6,0 +PARAM_ANGLE_Z=0,-0.013,-0.05,-0.11,-0.18,-0.27,-0.37,-0.48,-0.6,-0.73,-0.85,-0.98,-1.11,-1.24,-1.36,-1.48,-1.59,-1.69,-1.77,-1.85,-1.91,-1.96,-1.99,-2,-1.996,-1.985,-1.967,-1.94,-1.91,-1.87,-1.83,-1.79,-1.74,-1.68,-1.62,-1.56,-1.5,-1.43,-1.37,-1.3,-1.23,-1.15,-1.08,-1.01,-0.94,-0.86,-0.79,-0.72,-0.65,-0.59,-0.52,-0.46,-0.4,-0.34,-0.29,-0.24,-0.19,-0.15,-0.11,-0.08,-0.05,-0.03,-0.013,-0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.551,0.55,0.55,0.55,0.55,0.55,0.552,0.55,0.55,0.55,0.553,0.55,0.55,0.55,0.554,0.55,0.55,0.555,0.56,0.56,0.556,0.56,0.56,0.557,0.56,0.56,0.558,0.56,0.559,0.56,0.56,0.56,0.56,0.561,0.56,0.562,0.56,0.563,0.564,0.56,0.565,0.57,0.566,0.57,0.567,0.568,0.57,0.569,0.57,0.63,0.73,0.82,0.88,0.91,0.898,0.87,0.83,0.78,0.74,0.69,0.64,0.61,0.58,0.557,0.55 +PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.551,0.55,0.55,0.55,0.55,0.55,0.552,0.55,0.55,0.55,0.553,0.55,0.55,0.55,0.554,0.55,0.55,0.555,0.56,0.56,0.556,0.56,0.56,0.557,0.56,0.56,0.558,0.56,0.559,0.56,0.56,0.56,0.56,0.561,0.56,0.562,0.56,0.563,0.564,0.56,0.565,0.57,0.566,0.57,0.567,0.568,0.57,0.569,0.57,0.63,0.73,0.82,0.88,0.91,0.898,0.87,0.83,0.78,0.74,0.69,0.64,0.61,0.58,0.557,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0,0.001,0.005,0.011,0.019,0.029,0.039,0.051,0.063,0.076,0.09,0.103,0.117,0.13,0.143,0.155,0.166,0.177,0.186,0.194,0.201,0.206,0.209,0.21,0.21,0.208,0.206,0.204,0.201,0.197,0.193,0.188,0.182,0.177,0.171,0.164,0.158,0.151,0.144,0.136,0.129,0.121,0.114,0.106,0.098,0.091,0.083,0.076,0.069,0.062,0.055,0.048,0.042,0.036,0.03,0.025,0.02,0.016,0.012,0.008,0.005,0.003,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_EYE_BALL_Y=0,0.003,0.013,0.028,0.047,0.07,0.1,0.13,0.16,0.19,0.22,0.26,0.29,0.32,0.36,0.39,0.42,0.45,0.47,0.49,0.51,0.525,0.535,0.54,0.543,0.546,0.549,0.551,0.554,0.556,0.558,0.56,0.562,0.564,0.565,0.567,0.568,0.569,0.571,0.572,0.573,0.574,0.574,0.575,0.58,0.576,0.577,0.58,0.58,0.578,0.58,0.58,0.579,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.58,0.561,0.51,0.45,0.38,0.3,0.22,0.15,0.09,0.04,0.01,0 +PARAM_BROW_L_Y=0,0,-0.002,-0.005,-0.009,-0.014,-0.019,-0.024,-0.03,-0.036,-0.043,-0.049,-0.056,-0.062,-0.068,-0.074,-0.079,-0.084,-0.089,-0.093,-0.096,-0.098,-0.099,-0.1,-0.1,-0.1,-0.099,-0.098,-0.097,-0.095,-0.094,-0.092,-0.09,-0.087,-0.085,-0.083,-0.08,-0.077,-0.074,-0.071,-0.068,-0.065,-0.062,-0.059,-0.055,-0.052,-0.049,-0.046,-0.042,-0.039,-0.036,-0.033,-0.03,-0.027,-0.024,-0.021,-0.019,-0.016,-0.014,-0.011,-0.009,-0.008,-0.006,-0.004,-0.003,-0.002,0,-0.001,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BROW_R_Y=0,0,-0.002,-0.005,-0.009,-0.014,-0.019,-0.024,-0.03,-0.036,-0.043,-0.049,-0.056,-0.062,-0.068,-0.074,-0.079,-0.084,-0.089,-0.093,-0.096,-0.098,-0.099,-0.1,-0.1,-0.1,-0.099,-0.098,-0.097,-0.095,-0.094,-0.092,-0.09,-0.087,-0.085,-0.083,-0.08,-0.077,-0.074,-0.071,-0.068,-0.065,-0.062,-0.059,-0.055,-0.052,-0.049,-0.046,-0.042,-0.039,-0.036,-0.033,-0.03,-0.027,-0.024,-0.021,-0.019,-0.016,-0.014,-0.011,-0.009,-0.008,-0.006,-0.004,-0.003,-0.002,0,-0.001,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BROW_ANGLE=0.2,-0.3,-0.298,-0.294,-0.287,-0.278,-0.267,-0.255,-0.241,-0.226,-0.211,-0.195,-0.179,-0.164,-0.148,-0.134,-0.12,-0.108,-0.097,-0.088,-0.08,-0.075,-0.071,-0.07,-0.07,-0.07,-0.07,-0.07,-0.071,-0.07,-0.07,-0.073,-0.073,-0.07,-0.074,-0.075,-0.076,-0.08,-0.078,-0.079,-0.08,-0.08,-0.081,-0.082,-0.083,-0.084,-0.085,-0.086,-0.087,-0.088,-0.089,-0.09,-0.091,-0.09,-0.093,-0.094,-0.094,-0.095,-0.1,-0.097,-0.097,-0.1,-0.098,-0.1,-0.099,-0.1,-0.1,-0.1,-0.1,-0.1,0.4,0.393,0.375,0.35,0.32,0.29,0.26,0.23,0.216,0.204,0.2 +PARAM_BROW_SELECT=-0.5,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,-0.14,-0.22,-0.29,-0.35,-0.39,-0.43,-0.46,-0.478,-0.491,-0.498,-0.5 +PARAM_MOUTH_OPEN_Y=0 +PARAM_MOUTH_OPEN2=0.9,0.86,0.75,0.63,0.5,0.4,0.34,0.32,0.34,0.39,0.46,0.53,0.58,0.6,0.592,0.57,0.54,0.51,0.47,0.44,0.41,0.39,0.375,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.37,0.85,0.861,0.871,0.879,0.885,0.891,0.894,0.897,0.899,0.9,0.9 +PARAM_MOUTH_EMO=0.01,0.01,0.014,0.019,0.026,0.035,0.046,0.059,0.073,0.09,0.108,0.127,0.148,0.17,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.25,0.04,0.033,0.027,0.023,0.019,0.016,0.013,0.012,0.011,0.01,0.01 +PARAM_CHEEK=0,0.006,0.025,0.05,0.09,0.14,0.19,0.24,0.3,0.36,0.43,0.49,0.56,0.62,0.68,0.74,0.79,0.84,0.89,0.93,0.96,0.98,0.995,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.97,0.89,0.78,0.65,0.52,0.39,0.26,0.16,0.07,0.02,0 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BODY_Y=0 +PARAM_BREATH=0.5,0.497,0.488,0.475,0.457,0.44,0.41,0.39,0.36,0.33,0.3,0.27,0.24,0.21,0.18,0.15,0.13,0.1,0.083,0.065,0.05,0.039,0.032,0.03,0.034,0.045,0.063,0.09,0.12,0.15,0.19,0.23,0.27,0.32,0.37,0.42,0.46,0.51,0.56,0.6,0.64,0.68,0.71,0.74,0.77,0.785,0.796,0.8,0.796,0.786,0.771,0.751,0.73,0.71,0.68,0.65,0.63,0.6,0.58,0.56,0.538,0.522,0.51,0.503,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_BOING=0,-0.002,-0.01,-0.021,-0.035,-0.053,-0.073,-0.09,-0.12,-0.14,-0.17,-0.19,-0.22,-0.24,-0.27,-0.29,-0.31,-0.329,-0.346,-0.361,-0.373,-0.382,-0.388,-0.39,-0.386,-0.375,-0.358,-0.33,-0.31,-0.27,-0.24,-0.2,-0.15,-0.11,-0.06,-0.02,0.03,0.08,0.12,0.17,0.21,0.24,0.28,0.3,0.33,0.345,0.356,0.36,0.355,0.343,0.325,0.3,0.28,0.25,0.22,0.18,0.15,0.12,0.09,0.07,0.05,0.027,0.012,0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0 +PARAM_HAIR_SIDE_R=0 +PARAM_HAIR_SIDE_L=0 +PARAM_TWIN_RIBBON_D=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0.003,0.011,0.025,0.042,0.06,0.09,0.11,0.14,0.17,0.2,0.23,0.26,0.28,0.31,0.34,0.36,0.39,0.41,0.426,0.44,0.451,0.458,0.46,0.459,0.456,0.451,0.445,0.437,0.429,0.419,0.408,0.396,0.384,0.371,0.358,0.345,0.332,0.318,0.305,0.292,0.28,0.268,0.256,0.246,0.236,0.227,0.219,0.213,0.207,0.203,0.201,0.2,0.206,0.221,0.24,0.27,0.31,0.34,0.37,0.41,0.44,0.46,0.474,0.48,0.474,0.457,0.43,0.4,0.36,0.31,0.27,0.22,0.18,0.14,0.1,0.06,0.04,0.017,0.004,0 +PARAM_WING_DEFORM=0,0.005,0.02,0.04,0.07,0.11,0.15,0.19,0.24,0.29,0.34,0.39,0.44,0.49,0.54,0.58,0.63,0.67,0.7,0.73,0.76,0.775,0.786,0.79,0.777,0.74,0.69,0.62,0.54,0.45,0.35,0.26,0.17,0.08,0,-0.07,-0.12,-0.16,-0.19,-0.2,-0.184,-0.14,-0.08,0,0.09,0.19,0.28,0.37,0.45,0.51,0.56,0.59,0.6,0.58,0.52,0.44,0.33,0.21,0.08,-0.05,-0.17,-0.28,-0.36,-0.42,-0.44,-0.434,-0.419,-0.39,-0.36,-0.33,-0.29,-0.25,-0.2,-0.16,-0.12,-0.09,-0.06,-0.03,-0.016,-0.004,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch Dere3.mtn b/public/pio/models/pio/motions/Touch Dere3.mtn new file mode 100644 index 0000000..8d2b14d --- /dev/null +++ b/public/pio/models/pio/motions/Touch Dere3.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.18,0.68,1.45,2.44,3.59,4.86,6.16,7.49,8.79,10.03,11.13,12.11,12.91,13.5,13.87,14,14,13.998,13.996,13.994,13.99,13.985,13.978,13.971,13.962,13.952,13.941,13.928,13.913,13.897,13.879,13.859,13.84,13.81,13.79,13.76,13.73,13.7,13.66,13.63,13.59,13.55,13.51,13.46,13.41,13.36,13.3,13.25,13.19,13.12,13.06,12.99,12.92,12.84,12.76,12.68,12.59,12.5,12.41,12.31,12.21,12.11,12,11.74,11.26,10.59,9.79,8.89,7.92,6.91,5.9,4.88,3.92,3.01,2.18,1.45,0.85,0.39,0.1,0 +PARAM_ANGLE_Y=0,0.14,0.53,1.14,1.92,2.82,3.82,4.84,5.89,6.9,7.88,8.75,9.52,10.15,10.61,10.9,11,10.983,10.93,10.85,10.74,10.59,10.43,10.23,10.02,9.78,9.52,9.25,8.95,8.64,8.32,7.99,7.65,7.29,6.93,6.56,6.19,5.81,5.43,5.04,4.67,4.29,3.92,3.54,3.17,2.81,2.46,2.12,1.79,1.47,1.17,0.88,0.61,0.35,0.11,-0.11,-0.31,-0.48,-0.64,-0.76,-0.87,-0.94,-0.98,-1,-0.987,-0.95,-0.9,-0.84,-0.76,-0.68,-0.6,-0.51,-0.42,-0.34,-0.26,-0.19,-0.13,-0.07,-0.03,-0.01,0 +PARAM_ANGLE_Z=0,0.25,0.95,2.04,3.44,5.08,6.89,8.77,10.7,12.59,14.43,16.1,17.61,18.89,19.89,20.61,21,21.25,21.47,21.68,21.87,22.03,22.18,22.32,22.43,22.54,22.63,22.71,22.77,22.83,22.87,22.91,22.94,22.96,22.977,22.988,22.995,22.999,23,23,23,22.8,22.23,21.33,20.19,18.79,17.22,15.5,13.66,11.72,9.76,7.75,5.76,3.81,1.89,0.1,-1.58,-3.12,-4.5,-5.7,-6.67,-7.39,-7.84,-8,-7.9,-7.63,-7.22,-6.71,-6.11,-5.47,-4.78,-4.09,-3.39,-2.73,-2.1,-1.52,-1.01,-0.59,-0.28,-0.07,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.511,0.54,0.59,0.64,0.69,0.74,0.79,0.82,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.829,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.828,0.83,0.83,0.83,0.83,0.83,0.827,0.83,0.83,0.83,0.83,0.826,0.83,0.83,0.83,0.825,0.82,0.82,0.82,0.824,0.82,0.82,0.823,0.82,0.82,0.822,0.82,0.82,0.821,0.82,0.82,0.809,0.78,0.75,0.71,0.67,0.62,0.58,0.55,0.52,0.506,0.5 +PARAM_EYE_R_OPEN=0.5,0.511,0.54,0.59,0.64,0.69,0.74,0.79,0.82,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.829,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.828,0.83,0.83,0.83,0.83,0.83,0.827,0.83,0.83,0.83,0.83,0.826,0.83,0.83,0.83,0.825,0.82,0.82,0.82,0.824,0.82,0.82,0.823,0.82,0.82,0.822,0.82,0.82,0.821,0.82,0.82,0.809,0.78,0.75,0.71,0.67,0.62,0.58,0.55,0.52,0.506,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0,-0.02,-0.07,-0.15,-0.24,-0.34,-0.43,-0.51,-0.56,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.561,-0.51,-0.45,-0.38,-0.3,-0.22,-0.15,-0.09,-0.04,-0.01,0 +PARAM_BROW_L_Y=0 +PARAM_BROW_R_Y=0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0,-0.01,-0.04,-0.08,-0.13,-0.18,-0.24,-0.3,-0.35,-0.41,-0.45,-0.49,-0.52,-0.543,-0.55,-0.55,-0.55,-0.55,-0.55,-0.55,-0.55,-0.55,-0.549,-0.55,-0.55,-0.548,-0.55,-0.546,-0.546,-0.55,-0.544,-0.543,-0.542,-0.541,-0.54,-0.539,-0.538,-0.536,-0.535,-0.533,-0.532,-0.53,-0.528,-0.526,-0.524,-0.521,-0.519,-0.517,-0.514,-0.511,-0.509,-0.506,-0.503,-0.499,-0.496,-0.493,-0.489,-0.485,-0.481,-0.477,-0.473,-0.469,-0.465,-0.46,-0.449,-0.431,-0.4,-0.37,-0.34,-0.3,-0.26,-0.22,-0.19,-0.15,-0.11,-0.08,-0.06,-0.03,-0.015,-0.004,0 +PARAM_MOUTH_OPEN_Y=0.5,0.488,0.45,0.41,0.35,0.29,0.23,0.19,0.15,0.14,0.141,0.143,0.147,0.152,0.158,0.166,0.175,0.184,0.194,0.205,0.217,0.23,0.242,0.256,0.269,0.283,0.297,0.311,0.325,0.339,0.353,0.367,0.38,0.393,0.406,0.418,0.43,0.441,0.451,0.461,0.469,0.477,0.484,0.489,0.494,0.497,0.499,0.5,0.496,0.485,0.467,0.44,0.42,0.39,0.36,0.33,0.3,0.27,0.25,0.22,0.205,0.191,0.183,0.18,0.184,0.195,0.211,0.232,0.26,0.28,0.31,0.34,0.36,0.39,0.42,0.44,0.459,0.476,0.489,0.497,0.5 +PARAM_BODY_ANGLE_X=0,-0.03,-0.1,-0.21,-0.35,-0.51,-0.69,-0.88,-1.07,-1.26,-1.43,-1.59,-1.73,-1.84,-1.93,-1.98,-2,-1.999,-1.994,-1.987,-1.977,-1.964,-1.949,-1.931,-1.911,-1.89,-1.86,-1.84,-1.81,-1.78,-1.75,-1.71,-1.68,-1.64,-1.6,-1.56,-1.52,-1.48,-1.44,-1.4,-1.35,-1.31,-1.26,-1.22,-1.17,-1.12,-1.08,-1.03,-0.98,-0.94,-0.89,-0.84,-0.8,-0.75,-0.71,-0.66,-0.62,-0.57,-0.53,-0.49,-0.45,-0.41,-0.37,-0.34,-0.3,-0.27,-0.24,-0.21,-0.18,-0.15,-0.13,-0.1,-0.08,-0.063,-0.047,-0.033,-0.021,-0.012,-0.005,-0.001,0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.499,0.497,0.492,0.487,0.48,0.473,0.464,0.454,0.444,0.433,0.423,0.411,0.4,0.389,0.377,0.366,0.356,0.346,0.337,0.328,0.321,0.314,0.308,0.303,0.3,0.297,0.295,0.293,0.292,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.292,0.297,0.305,0.315,0.328,0.342,0.358,0.374,0.392,0.41,0.428,0.446,0.463,0.481,0.497,0.512,0.526,0.538,0.549,0.558,0.565,0.569,0.57,0.569,0.567,0.563,0.559,0.553,0.548,0.542,0.536,0.53,0.524,0.518,0.513,0.509,0.505,0.502,0.501,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,-0.002,-0.009,-0.02,-0.034,-0.05,-0.069,-0.09,-0.11,-0.13,-0.15,-0.17,-0.194,-0.213,-0.229,-0.243,-0.255,-0.263,-0.268,-0.27,-0.269,-0.268,-0.265,-0.261,-0.256,-0.251,-0.245,-0.238,-0.23,-0.221,-0.212,-0.203,-0.193,-0.182,-0.172,-0.161,-0.149,-0.138,-0.126,-0.114,-0.102,-0.091,-0.079,-0.067,-0.055,-0.044,-0.033,-0.022,-0.011,-0.001,0.009,0.018,0.027,0.036,0.044,0.051,0.057,0.063,0.068,0.072,0.076,0.078,0.079,0.08,0.079,0.076,0.072,0.067,0.061,0.055,0.048,0.041,0.034,0.027,0.021,0.015,0.01,0.006,0.003,0.001,0 +PARAM_WING_DEFORM=0,-0.004,-0.017,-0.036,-0.06,-0.09,-0.13,-0.16,-0.2,-0.24,-0.28,-0.32,-0.35,-0.39,-0.42,-0.44,-0.462,-0.477,-0.487,-0.49,-0.489,-0.486,-0.481,-0.474,-0.465,-0.455,-0.443,-0.43,-0.415,-0.4,-0.383,-0.365,-0.347,-0.327,-0.307,-0.287,-0.27,-0.24,-0.22,-0.2,-0.18,-0.16,-0.13,-0.11,-0.09,-0.07,-0.05,-0.03,-0.009,0.01,0.028,0.046,0.062,0.078,0.092,0.106,0.118,0.128,0.138,0.146,0.152,0.156,0.159,0.16,0.158,0.153,0.144,0.134,0.122,0.109,0.096,0.082,0.068,0.055,0.042,0.03,0.02,0.012,0.006,0.001,0 +PARAM_RIBBON_DEFORM=0 +PARAM_BLUSH=0,0.004,0.016,0.034,0.06,0.09,0.12,0.15,0.19,0.23,0.26,0.3,0.33,0.36,0.39,0.41,0.434,0.448,0.457,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.46,0.459,0.46,0.46,0.46,0.46,0.458,0.46,0.46,0.457,0.46,0.456,0.46,0.46,0.454,0.454,0.45,0.453,0.45,0.451,0.451,0.45,0.45,0.448,0.447,0.446,0.446,0.445,0.443,0.442,0.441,0.44,0.433,0.418,0.39,0.37,0.33,0.3,0.26,0.22,0.18,0.15,0.11,0.08,0.05,0.03,0.015,0.004,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch Dere4.mtn b/public/pio/models/pio/motions/Touch Dere4.mtn new file mode 100644 index 0000000..9ac252f --- /dev/null +++ b/public/pio/models/pio/motions/Touch Dere4.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,1.25,4.29,8,11.62,14.53,16.37,17,16.63,15.6,13.98,11.92,9.46,6.78,3.94,1.06,-1.78,-4.46,-6.92,-8.98,-10.6,-11.63,-12,-11.94,-11.77,-11.5,-11.14,-10.72,-10.22,-9.66,-9.07,-8.45,-7.79,-7.12,-6.43,-5.74,-5.06,-4.4,-3.75,-3.14,-2.55,-2.01,-1.52,-1.09,-0.71,-0.41,-0.19,-0.05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Y=0,1.54,5.3,9.89,14.36,17.95,20.23,21,20.47,18.97,16.62,13.64,10.07,6.19,2.09,-2.09,-6.19,-10.07,-13.64,-16.62,-18.97,-20.47,-21,-20.89,-20.59,-20.12,-19.5,-18.75,-17.88,-16.91,-15.88,-14.78,-13.63,-12.46,-11.25,-10.04,-8.86,-7.7,-6.56,-5.49,-4.47,-3.51,-2.66,-1.9,-1.25,-0.72,-0.33,-0.08,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=0,1.18,4.04,7.53,10.94,13.67,15.41,16,15.75,15.04,13.92,12.49,10.8,8.95,6.99,5.01,3.05,1.2,-0.49,-1.92,-3.04,-3.75,-4,-3.98,-3.92,-3.83,-3.71,-3.57,-3.41,-3.22,-3.02,-2.82,-2.6,-2.37,-2.14,-1.91,-1.69,-1.47,-1.25,-1.05,-0.85,-0.67,-0.51,-0.36,-0.24,-0.14,-0.06,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_EMOTION=-1,-0.7,-0.698,-0.697,-0.695,-0.694,-0.693,-0.692,-0.692,-0.69,-0.691,-0.69,-0.69,-0.69,-0.69,-0.691,-0.694,-0.698,-0.701,-0.705,-0.707,-0.709,-0.71,-0.709,-0.708,-0.705,-0.702,-0.699,-0.695,-0.692,-0.689,-0.686,-0.683,-0.682,-0.68,-0.68,-0.68,-0.68,-0.682,-0.683,-0.685,-0.687,-0.689,-0.692,-0.695,-0.698,-0.702,-0.706,-0.71,-0.94,-0.945,-0.95,-0.955,-0.959,-0.963,-0.967,-0.971,-0.974,-0.977,-0.98,-0.983,-0.985,-0.988,-0.99,-0.992,-0.993,-0.995,-0.996,-0.997,-1,-0.999,-0.999,-1,-1,-1 +PARAM_EYE_L_OPEN=0.55,0,0,0,0,0,0,0,0,0,0.001,0,0,0.002,0,0,0.003,0,0,0.004,0,0.006,0.006,0.01,0.007,0.01,0.009,0.009,0.01,0.011,0.011,0.012,0.013,0.01,0.015,0.016,0.017,0.018,0.019,0.02,0.021,0.022,0.023,0.024,0.025,0.026,0.028,0.029,0.03,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55 +PARAM_EYE_R_OPEN=0.55,0,0,0,0,0,0,0,0,0,0.001,0,0,0.002,0,0,0.003,0,0,0.004,0,0.006,0.006,0.01,0.007,0.01,0.009,0.009,0.01,0.011,0.011,0.012,0.013,0.01,0.015,0.016,0.017,0.018,0.019,0.02,0.021,0.022,0.023,0.024,0.025,0.026,0.028,0.029,0.03,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55 +PARAM_EYE_L_OPEN2=-1,-1,-1,-1,-1,-0.999,-1,-0.998,-1,-0.996,-0.996,-0.995,-0.994,-0.993,-0.992,-0.991,-0.99,-0.989,-0.987,-0.986,-0.985,-0.984,-0.983,-0.981,-0.98,-0.979,-0.978,-0.976,-0.975,-0.974,-0.973,-0.972,-0.971,-0.97,-0.969,-0.968,-0.967,-0.966,-0.965,-0.96,-0.963,-0.963,-0.96,-0.962,-0.96,-0.961,-0.96,-0.96,-0.96,-0.96,-0.96,-0.96,-0.962,-0.963,-0.964,-0.966,-0.968,-0.97,-0.973,-0.975,-0.977,-0.98,-0.982,-0.984,-0.987,-0.989,-0.991,-0.993,-0.995,-0.996,-0.998,-0.999,-0.999,-1,-1 +PARAM_EYE_R_OPEN2=-1,-1,-1,-1,-1,-0.999,-1,-0.998,-1,-0.996,-0.996,-0.995,-0.994,-0.993,-0.992,-0.991,-0.99,-0.989,-0.987,-0.986,-0.985,-0.984,-0.983,-0.981,-0.98,-0.979,-0.978,-0.976,-0.975,-0.974,-0.973,-0.972,-0.971,-0.97,-0.969,-0.968,-0.967,-0.966,-0.965,-0.96,-0.963,-0.963,-0.96,-0.962,-0.96,-0.961,-0.96,-0.96,-0.96,-0.96,-0.96,-0.96,-0.962,-0.963,-0.964,-0.966,-0.968,-0.97,-0.973,-0.975,-0.977,-0.98,-0.982,-0.984,-0.987,-0.989,-0.991,-0.993,-0.995,-0.996,-0.998,-0.999,-0.999,-1,-1 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0,0,0,0,0,0,0,-0.017,-0.05,-0.1,-0.15,-0.19,-0.23,-0.25,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.241,-0.19,-0.14,-0.08,-0.04,-0.01,0 +PARAM_BROW_R_Y=0,0,0,0,0,0,0,-0.017,-0.05,-0.1,-0.15,-0.19,-0.23,-0.25,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.241,-0.19,-0.14,-0.08,-0.04,-0.01,0 +PARAM_BROW_ANGLE=0.2,-0.29,-0.29,-0.29,-0.29,-0.29,-0.29,-0.311,-0.36,-0.41,-0.47,-0.53,-0.57,-0.6,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,0,0.07,0.12,0.16,0.18,0.196,0.2 +PARAM_BROW_SELECT=-0.5,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.209,0.21,0.21,0.21,0.208,0.21,0.21,0.207,0.21,0.21,0.206,0.21,0.205,0.2,0.204,0.2,0.203,0.2,0.202,0.201,0.2,0.2,0.199,0.2,0.197,0.197,0.196,0.2,0.194,0.194,0.193,0.192,0.191,0.19,0.19,0.188,0.187,0.186,0.185,0.184,0.183,0.182,0.181,0.18,0.179,0.177,0.176,0.175,0.174,0.173,0.171,0.17,-0.22,-0.31,-0.39,-0.44,-0.47,-0.494,-0.5 +PARAM_MOUTH_OPEN_Y=0 +PARAM_MOUTH_OPEN2=0.9,0.83,0.67,0.48,0.28,0.13,0.03,0,0,0,0,0,0,0,0,0,0,0,-0.008,-0.03,-0.08,-0.15,-0.24,-0.37,-0.97,-0.97,-0.97,-0.97,-0.968,-0.968,-0.966,-0.965,-0.964,-0.962,-0.96,-0.958,-0.956,-0.953,-0.95,-0.947,-0.944,-0.941,-0.937,-0.933,-0.929,-0.925,-0.92,-0.915,-0.91,-0.69,-0.43,-0.28,-0.22,-0.2,-0.27,-0.39,-0.46,-0.49,-0.43,-0.32,-0.23,-0.16,-0.13,-0.21,-0.33,-0.41,-0.44,-0.42,-0.33,-0.18,0,0.39,0.69,0.85,0.9 +PARAM_MOUTH_EMO=0,0.16,0.16,0.162,0.163,0.164,0.165,0.166,0.167,0.168,0.169,0.169,0.17,0.171,0.172,0.173,0.17,0.175,0.176,0.177,0.177,0.178,0.179,0.18,0.25,0.25,0.25,0.25,0.25,0.25,0.249,0.25,0.248,0.25,0.247,0.246,0.25,0.244,0.243,0.242,0.241,0.24,0.239,0.238,0.236,0.235,0.233,0.232,0.23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0,0.1,0.37,0.76,1.21,1.68,2.11,2.48,2.76,2.94,3,2.89,2.59,2.15,1.62,1.02,0.39,-0.24,-0.85,-1.42,-1.94,-2.37,-2.71,-2.92,-3,-2.9,-2.66,-2.33,-1.95,-1.55,-1.16,-0.79,-0.48,-0.22,-0.06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=0,0.14,0.5,1.02,1.62,2.23,2.81,3.3,3.68,3.92,4,3.92,3.73,3.44,3.08,2.68,2.26,1.84,1.43,1.05,0.71,0.42,0.2,0.05,0,0,0,0,0,0,0,0,0,0,0,0,-0.019,-0.07,-0.16,-0.27,-0.41,-0.56,-0.73,-0.9,-1.09,-1.28,-1.48,-1.67,-1.86,-2.04,-2.22,-2.38,-2.53,-2.66,-2.78,-2.87,-2.94,-2.98,-3,-2.96,-2.86,-2.69,-2.48,-2.23,-1.96,-1.68,-1.39,-1.12,-0.85,-0.61,-0.4,-0.23,-0.11,-0.03,0 +PARAM_BODY_Y=0,-0.011,-0.04,-0.08,-0.13,-0.17,-0.22,-0.26,-0.29,-0.304,-0.31,-0.307,-0.3,-0.288,-0.272,-0.254,-0.23,-0.21,-0.18,-0.16,-0.13,-0.1,-0.07,-0.03,0,0.04,0.07,0.09,0.113,0.128,0.139,0.148,0.153,0.157,0.159,0.16,0.157,0.148,0.135,0.119,0.101,0.082,0.064,0.046,0.031,0.018,0.008,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BREATH=0.5,0.517,0.56,0.63,0.7,0.78,0.85,0.91,0.96,0.99,1,0.987,0.95,0.9,0.84,0.77,0.7,0.62,0.55,0.48,0.42,0.37,0.33,0.31,0.3,0.316,0.36,0.41,0.47,0.54,0.6,0.66,0.71,0.75,0.78,0.79,0.788,0.783,0.773,0.76,0.744,0.72,0.7,0.67,0.64,0.61,0.58,0.54,0.5,0.45,0.41,0.37,0.33,0.31,0.29,0.269,0.258,0.252,0.25,0.253,0.262,0.276,0.294,0.31,0.34,0.36,0.38,0.41,0.43,0.449,0.466,0.481,0.491,0.498,0.5 +PARAM_BOING=0,0.04,0.13,0.23,0.35,0.45,0.53,0.59,0.61,0.53,0.34,0.1,-0.13,-0.31,-0.43,-0.47,-0.42,-0.31,-0.17,-0.02,0.09,0.14,0.08,-0.01,-0.08,-0.1,-0.08,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0,-0.03,-0.1,-0.19,-0.28,-0.37,-0.44,-0.48,-0.5,-0.47,-0.4,-0.3,-0.18,-0.06,0.06,0.18,0.27,0.35,0.4,0.42,0.406,0.37,0.31,0.24,0.17,0.09,0,-0.07,-0.14,-0.19,-0.23,-0.26,-0.27,-0.261,-0.24,-0.2,-0.16,-0.11,-0.07,-0.03,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_R=0,0.02,0.09,0.18,0.28,0.39,0.48,0.57,0.63,0.68,0.69,0.69,0.692,0.69,0.69,0.69,0.686,0.68,0.66,0.61,0.54,0.46,0.37,0.27,0.16,0.06,-0.04,-0.14,-0.23,-0.3,-0.37,-0.41,-0.44,-0.45,-0.441,-0.42,-0.37,-0.32,-0.26,-0.2,-0.13,-0.05,0.02,0.08,0.14,0.19,0.24,0.26,0.27,0.261,0.24,0.2,0.16,0.12,0.08,0.05,0.02,0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_L=0,-0.014,-0.05,-0.11,-0.18,-0.25,-0.32,-0.39,-0.45,-0.5,-0.54,-0.58,-0.6,-0.608,-0.611,-0.61,-0.611,-0.61,-0.599,-0.57,-0.52,-0.45,-0.38,-0.3,-0.21,-0.13,-0.05,0.03,0.11,0.17,0.22,0.26,0.28,0.29,0.285,0.27,0.25,0.22,0.18,0.15,0.11,0.06,0.02,-0.01,-0.05,-0.08,-0.1,-0.115,-0.12,-0.116,-0.105,-0.089,-0.072,-0.053,-0.036,-0.021,-0.01,-0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_TWIN_RIBBON_D=0,0.021,0.07,0.15,0.24,0.34,0.42,0.5,0.55,0.59,0.6,0.58,0.51,0.41,0.28,0.14,-0.01,-0.16,-0.3,-0.43,-0.53,-0.6,-0.62,-0.59,-0.51,-0.39,-0.25,-0.11,0.02,0.13,0.22,0.27,0.29,0.271,0.23,0.18,0.13,0.08,0.04,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,-0.004,-0.016,-0.035,-0.06,-0.09,-0.12,-0.16,-0.2,-0.24,-0.27,-0.31,-0.35,-0.38,-0.41,-0.44,-0.454,-0.466,-0.47,-0.47,-0.468,-0.466,-0.463,-0.459,-0.454,-0.449,-0.443,-0.436,-0.428,-0.42,-0.412,-0.403,-0.393,-0.384,-0.373,-0.362,-0.351,-0.34,-0.329,-0.317,-0.305,-0.293,-0.28,-0.268,-0.255,-0.243,-0.23,-0.218,-0.205,-0.193,-0.181,-0.169,-0.157,-0.145,-0.133,-0.122,-0.111,-0.101,-0.091,-0.081,-0.071,-0.062,-0.054,-0.046,-0.038,-0.031,-0.025,-0.02,-0.015,-0.01,-0.007,-0.004,-0.002,0,0 +PARAM_WING_DEFORM=0,0.006,0.025,0.05,0.09,0.14,0.19,0.24,0.3,0.36,0.42,0.48,0.53,0.58,0.63,0.67,0.7,0.714,0.72,0.719,0.717,0.714,0.709,0.703,0.696,0.687,0.678,0.667,0.656,0.644,0.631,0.617,0.603,0.588,0.572,0.555,0.538,0.521,0.503,0.485,0.467,0.448,0.429,0.41,0.391,0.372,0.353,0.334,0.314,0.295,0.277,0.258,0.24,0.222,0.204,0.187,0.171,0.154,0.139,0.124,0.109,0.095,0.082,0.07,0.059,0.048,0.039,0.03,0.022,0.016,0.01,0.006,0.003,0.001,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch Dere5.mtn b/public/pio/models/pio/motions/Touch Dere5.mtn new file mode 100644 index 0000000..b8c50d4 --- /dev/null +++ b/public/pio/models/pio/motions/Touch Dere5.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,1.97,6.22,11.51,17.02,22.04,26.2,28.97,30,30,30,30,30,30,30,30,30,30,30,29.96,29.73,29.21,28.33,27.05,25.41,23.45,20.66,17.93,15.17,12.48,9.99,7.62,5.48,3.66,2.12,0.97,0.26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Y=0,0.92,2.9,5.37,7.94,10.29,12.23,13.52,14,13.97,13.89,13.75,13.55,13.27,12.93,12.54,12.08,11.57,11,10.08,9.01,7.93,6.86,5.87,4.98,4.22,3.35,2.59,1.88,1.26,0.72,0.26,-0.14,-0.45,-0.69,-0.87,-0.97,-1,-0.993,-0.975,-0.94,-0.91,-0.86,-0.8,-0.74,-0.68,-0.61,-0.54,-0.47,-0.41,-0.34,-0.28,-0.22,-0.17,-0.12,-0.08,-0.04,-0.02,-0.005,0 +PARAM_ANGLE_Z=0,-0.59,-1.86,-3.45,-5.1,-6.61,-7.86,-8.69,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-8.7,-7.9,-6.66,-5.1,-3.37,-1.5,0.37,2.1,3.66,4.9,5.7,6,5.96,5.85,5.67,5.43,5.15,4.82,4.45,4.08,3.67,3.26,2.84,2.44,2.04,1.66,1.31,0.99,0.71,0.46,0.27,0.12,0.03,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.39,0.22,0.1,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.067,0.087,0.12,0.16,0.2,0.25,0.29,0.33,0.37,0.4,0.423,0.43,0.43,0.43,0.429,0.428,0.426,0.424,0.422,0.419,0.416,0.412,0.407,0.402,0.396,0.39,0.31,0.19,0.11,0.08,0.18,0.35,0.46,0.5 +PARAM_EYE_R_OPEN=0.5,0.39,0.22,0.1,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.067,0.087,0.12,0.16,0.2,0.25,0.29,0.33,0.37,0.4,0.423,0.43,0.43,0.43,0.429,0.428,0.426,0.424,0.422,0.419,0.416,0.412,0.407,0.402,0.396,0.39,0.31,0.19,0.11,0.08,0.18,0.35,0.46,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-0.999,-0.998,-0.995,-0.991,-0.987,-0.983,-0.978,-0.972,-0.966,-0.961,-0.955,-0.948,-0.942,-0.937,-0.931,-0.925,-0.92,-0.915,-0.911,-0.908,-0.905,-0.903,-0.902,-0.901,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.74,-0.48,-0.24,-0.07,0 +PARAM_BROW_R_Y=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-1,-0.998,-0.996,-0.994,-0.991,-0.988,-0.984,-0.979,-0.975,-0.97,-0.965,-0.959,-0.954,-0.948,-0.942,-0.936,-0.93,-0.924,-0.919,-0.914,-0.911,-0.908,-0.905,-0.903,-0.902,-0.901,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.74,-0.48,-0.24,-0.07,0 +PARAM_BROW_L_ANGLE=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.999,-1,-0.998,-0.997,-0.996,-0.995,-0.993,-0.992,-0.99,-0.97,-0.91,-0.83,-0.73,-0.62,-0.49,-0.37,-0.26,-0.15,-0.07,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BROW_R_ANGLE=0,-0.07,-0.21,-0.38,-0.57,-0.73,-0.87,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.999,-1,-0.998,-0.997,-0.996,-0.995,-0.993,-0.992,-0.99,-0.97,-0.91,-0.83,-0.73,-0.62,-0.49,-0.37,-0.26,-0.15,-0.07,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_EAR_DEFORM=0,0.04,0.13,0.24,0.35,0.44,0.49,0.51,0.509,0.505,0.499,0.49,0.479,0.464,0.446,0.42,0.4,0.37,0.34,0.3,0.26,0.22,0.17,0.12,0.06,0,-0.06,-0.13,-0.19,-0.24,-0.29,-0.34,-0.38,-0.42,-0.45,-0.47,-0.485,-0.49,-0.487,-0.478,-0.463,-0.443,-0.42,-0.39,-0.36,-0.33,-0.3,-0.27,-0.23,-0.2,-0.17,-0.14,-0.11,-0.08,-0.06,-0.038,-0.022,-0.01,-0.003,0 +PARAM_MOUTH_OPEN_Y=0.5,0.53,0.6,0.68,0.77,0.85,0.91,0.95,0.97,0.91,0.81,0.74,0.72,0.732,0.76,0.8,0.84,0.87,0.88,0.877,0.867,0.852,0.832,0.81,0.78,0.75,0.71,0.68,0.64,0.61,0.59,0.57,0.545,0.529,0.517,0.507,0.502,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_BODY_ANGLE_X=0,0.03,0.11,0.22,0.35,0.48,0.61,0.74,0.84,0.93,0.98,1,0.994,0.979,0.95,0.92,0.89,0.84,0.79,0.74,0.69,0.63,0.57,0.5,0.43,0.37,0.3,0.24,0.18,0.14,0.1,0.07,0.05,0.029,0.016,0.007,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Y=0,0.13,0.45,0.89,1.4,1.93,2.45,2.95,3.37,3.7,3.92,4,3.98,3.92,3.82,3.69,3.54,3.37,3.18,2.97,2.75,2.51,2.26,2.01,1.74,1.47,1.19,0.95,0.74,0.56,0.41,0.29,0.19,0.12,0.06,0.03,0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=0,-0.46,-1.45,-2.69,-3.97,-5.14,-6.11,-6.76,-7,-7,-7,-7,-7,-7,-7,-6.94,-6.79,-6.56,-6.26,-5.92,-5.53,-5.1,-4.64,-4.15,-3.64,-3.11,-2.54,-2.06,-1.62,-1.24,-0.93,-0.66,-0.45,-0.28,-0.15,-0.06,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BREATH=0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0.04,0.1,0.15,0.19,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.21,0.209,0.207,0.206,0.203,0.2,0.197,0.193,0.189,0.185,0.18,0.175,0.17,0.164,0.158,0.153,0.147,0.142,0.136,0.131,0.125,0.12,0.114,0.108,0.101,0.094,0.087,0.08,0.072,0.065,0.057,0.049,0.042,0.035,0.029,0.023,0.017,0.012,0.008,0.005,0.002,0.001,0 +PARAM_WING_DEFORM=0,0.12,0.32,0.51,0.64,0.69,0.65,0.54,0.39,0.21,0.03,-0.14,-0.31,-0.45,-0.57,-0.64,-0.67,-0.65,-0.59,-0.5,-0.39,-0.27,-0.14,-0.01,0.11,0.22,0.31,0.37,0.42,0.43,0.42,0.39,0.34,0.28,0.21,0.14,0.06,-0.03,-0.11,-0.18,-0.25,-0.31,-0.36,-0.39,-0.4,-0.395,-0.381,-0.36,-0.33,-0.3,-0.26,-0.22,-0.18,-0.14,-0.1,-0.07,-0.04,-0.02,-0.005,0 +PARAM_RIBBON_DEFORM=0,0.08,0.2,0.31,0.39,0.42,0.37,0.25,0.11,-0.03,-0.14,-0.22,-0.24,-0.21,-0.14,-0.06,0.03,0.09,0.14,0.15,0.139,0.11,0.08,0.04,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BLUSH=0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch Dere6.mtn b/public/pio/models/pio/motions/Touch Dere6.mtn new file mode 100644 index 0000000..961690b --- /dev/null +++ b/public/pio/models/pio/motions/Touch Dere6.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.6,2.07,4.08,6.18,7.93,9,9.47,9.76,9.92,9.99,10.004,10,10,9.995,9.977,9.94,9.88,9.78,9.66,9.49,9.28,9.03,8.73,8.39,8,7.44,6.76,5.95,5.08,4.19,3.29,2.43,1.66,0.98,0.46,0.12,0 +PARAM_ANGLE_Y=0,1.65,5.75,11.4,17.41,22.56,26,27.79,28.93,29.6,29.91,30,30,29.3,27.43,24.61,21.08,17.17,13.01,8.93,5.12,1.75,-1.09,-3.22,-4.54,-5,-4.9,-4.63,-4.22,-3.7,-3.12,-2.5,-1.88,-1.3,-0.78,-0.37,-0.1,0 +PARAM_ANGLE_Z=0,-0.06,-0.22,-0.47,-0.78,-1.13,-1.5,-1.87,-2.22,-2.53,-2.78,-2.94,-3,-2.84,-2.41,-1.77,-0.96,-0.07,0.88,1.82,2.69,3.46,4.11,4.59,4.9,5,4.9,4.63,4.22,3.7,3.12,2.5,1.88,1.3,0.78,0.37,0.1,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.64,0.78,0.88,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.903,0.884,0.85,0.82,0.77,0.73,0.69,0.64,0.61,0.58,0.557,0.55 +PARAM_EYE_R_OPEN=0.55,0.64,0.78,0.88,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.903,0.884,0.85,0.82,0.77,0.73,0.69,0.64,0.61,0.58,0.557,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0,-0.06,-0.15,-0.21,-0.23,-0.23,-0.228,-0.225,-0.221,-0.216,-0.21,-0.203,-0.196,-0.188,-0.18,-0.17,-0.161,-0.151,-0.141,-0.131,-0.12,-0.11,-0.099,-0.089,-0.079,-0.069,-0.06,-0.05,-0.042,-0.034,-0.027,-0.02,-0.014,-0.009,-0.005,-0.002,-0.001,0 +PARAM_BROW_R_Y=0,-0.06,-0.15,-0.21,-0.23,-0.23,-0.228,-0.225,-0.221,-0.216,-0.21,-0.203,-0.196,-0.188,-0.18,-0.17,-0.161,-0.151,-0.141,-0.131,-0.12,-0.11,-0.099,-0.089,-0.079,-0.069,-0.06,-0.05,-0.042,-0.034,-0.027,-0.02,-0.014,-0.009,-0.005,-0.002,-0.001,0 +PARAM_BROW_ANGLE=0.2,0.11,-0.03,-0.13,-0.16,-0.159,-0.156,-0.152,-0.145,-0.138,-0.129,-0.118,-0.107,-0.094,-0.081,-0.067,-0.052,-0.036,-0.021,-0.004,0.012,0.028,0.044,0.061,0.076,0.092,0.107,0.121,0.134,0.147,0.158,0.169,0.178,0.185,0.192,0.196,0.199,0.2 +PARAM_BROW_SELECT=-0.5 +PARAM_MOUTH_OPEN_Y=0,0.92,0.89,0.81,0.72,0.63,0.56,0.52,0.5,0.5,0.5,0.5,0.5,0.5,0.514,0.55,0.61,0.68,0.74,0.81,0.87,0.9,0.92,0.04,0.033,0.028,0.023,0.018,0.014,0.011,0.008,0.006,0.004,0.003,0.001,0.001,0,0 +PARAM_MOUTH_OPEN2=0.9,-0.98,-0.98,-0.98,-0.98,-0.98,-0.98,-0.98,-0.979,-0.98,-0.98,-0.978,-0.98,-0.977,-0.98,-0.976,-0.98,-0.974,-0.974,-0.973,-0.972,-0.971,-0.97,0.83,0.842,0.852,0.861,0.868,0.875,0.881,0.885,0.89,0.893,0.896,0.897,0.899,0.9,0.9 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0,-0.15,-0.52,-1,-1.48,-1.85,-2,-2,-2,-2,-2,-2,-2,-1.94,-1.78,-1.54,-1.24,-0.9,-0.54,-0.19,0.13,0.42,0.66,0.85,0.96,1,0.98,0.93,0.84,0.74,0.62,0.5,0.38,0.26,0.16,0.07,0.02,0 +PARAM_BODY_ANGLE_Z=0,0.38,1.29,2.5,3.71,4.62,5,5,5,5,5,5,5,4.86,4.49,3.92,3.22,2.43,1.6,0.79,0.02,-0.65,-1.22,-1.64,-1.91,-2,-1.96,-1.85,-1.69,-1.48,-1.25,-1,-0.75,-0.52,-0.31,-0.15,-0.04,0 +PARAM_BODY_Y=0,0.019,0.07,0.14,0.21,0.28,0.33,0.36,0.382,0.394,0.399,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.392,0.37,0.34,0.3,0.25,0.2,0.15,0.1,0.06,0.03,0.01,0 +PARAM_BREATH=0.5,0.512,0.55,0.59,0.65,0.71,0.77,0.82,0.85,0.87,0.884,0.889,0.89,0.888,0.882,0.873,0.861,0.846,0.829,0.81,0.79,0.77,0.74,0.72,0.7,0.67,0.65,0.63,0.61,0.587,0.568,0.551,0.537,0.524,0.514,0.506,0.502,0.5 +PARAM_BOING=0,0.02,0.07,0.14,0.2,0.25,0.28,0.29,0.25,0.17,0.06,-0.04,-0.12,-0.17,-0.19,-0.176,-0.14,-0.1,-0.05,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0,-0.019,-0.07,-0.14,-0.23,-0.32,-0.41,-0.48,-0.53,-0.55,-0.54,-0.51,-0.47,-0.41,-0.34,-0.27,-0.19,-0.12,-0.04,0.03,0.09,0.15,0.2,0.23,0.25,0.26,0.255,0.241,0.22,0.19,0.16,0.13,0.1,0.07,0.04,0.02,0.005,0 +PARAM_HAIR_SIDE_R=0,0.007,0.025,0.05,0.08,0.11,0.13,0.16,0.19,0.204,0.216,0.22,0.214,0.197,0.17,0.14,0.1,0.06,0.01,-0.03,-0.07,-0.12,-0.15,-0.19,-0.21,-0.233,-0.246,-0.25,-0.241,-0.22,-0.19,-0.15,-0.11,-0.07,-0.04,-0.02,-0.005,0 +PARAM_HAIR_SIDE_L=0,0.013,0.04,0.09,0.14,0.19,0.24,0.29,0.33,0.36,0.38,0.39,0.382,0.36,0.32,0.28,0.22,0.16,0.1,0.04,-0.02,-0.08,-0.13,-0.18,-0.22,-0.25,-0.264,-0.27,-0.261,-0.24,-0.2,-0.16,-0.12,-0.08,-0.05,-0.02,-0.006,0 +PARAM_TWIN_RIBBON_D=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0.013,0.05,0.09,0.14,0.2,0.25,0.3,0.35,0.38,0.4,0.41,0.408,0.402,0.393,0.381,0.366,0.349,0.33,0.31,0.29,0.27,0.24,0.22,0.2,0.17,0.15,0.13,0.11,0.087,0.069,0.052,0.037,0.024,0.014,0.006,0.002,0 +PARAM_WING_DEFORM=0,0.03,0.1,0.2,0.31,0.43,0.55,0.66,0.75,0.82,0.87,0.89,0.886,0.873,0.853,0.83,0.79,0.76,0.72,0.67,0.63,0.58,0.53,0.48,0.43,0.38,0.33,0.28,0.23,0.19,0.15,0.11,0.08,0.05,0.03,0.014,0.004,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch1.mtn b/public/pio/models/pio/motions/Touch1.mtn new file mode 100644 index 0000000..870260d --- /dev/null +++ b/public/pio/models/pio/motions/Touch1.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-0.36,-0.93,-1.46,-1.85,-2,-1.52,-0.23,1.64,3.86,6.14,8.36,10.23,11.52,12,11.76,11.12,10.13,8.88,7.5,6,4.5,3.12,1.88,0.88,0.24,0,0,0,0,0,0,0,0,0,0,0,0,0.79,2.92,6.02,9.71,13.55,17.31,20.55,22.91,24,24.33,24.65,24.95,25.25,25.54,25.82,26.08,26.33,26.58,26.81,27.03,27.24,27.45,27.65,27.83,28.01,28.18,28.34,28.48,28.63,28.76,28.89,29.01,29.12,29.22,29.32,29.41,29.49,29.56,29.63,29.7,29.75,29.8,29.84,29.88,29.91,29.94,29.96,29.979,29.991,29.998,30,30,29.96,29.85,29.65,29.36,28.99,28.52,27.95,27.28,26.5,25.6,24.6,23.47,22.22,20.87,19.36,17.71,15.93,14,11.67,9.55,7.65,5.93,4.44,3.14,2.03,1.17,0.53,0.14,0 +PARAM_ANGLE_Y=0,5.36,13.95,21.96,27.75,30,28.66,25.06,19.86,13.69,7.31,1.14,-4.06,-7.66,-9,-8.66,-7.75,-6.34,-4.58,-2.62,-0.5,1.62,3.58,5.34,6.75,7.66,8,7.984,7.9,7.73,7.43,6.99,6.38,5.56,4.56,3.3,1.81,0,-2.71,-6.37,-10.64,-15.17,-19.55,-23.62,-26.94,-29.18,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-29.04,-26.62,-23.34,-19.51,-15.53,-11.6,-7.88,-4.75,-2.23,-0.6,0 +PARAM_ANGLE_Z=0,-1.07,-2.79,-4.39,-5.55,-6,-5.69,-4.86,-3.66,-2.24,-0.76,0.66,1.86,2.69,3,2.94,2.78,2.53,2.22,1.87,1.5,1.13,0.78,0.47,0.22,0.06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.007,0.027,0.06,0.1,0.16,0.22,0.3,0.38,0.47,0.57,0.68,0.79,0.91,1.04,1.17,1.3,1.44,1.58,1.71,1.86,2,2.14,2.29,2.42,2.56,2.7,2.83,2.96,3.09,3.21,3.32,3.43,3.53,3.62,3.7,3.78,3.84,3.9,3.94,3.97,3.993,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3.87,3.55,3.11,2.6,2.07,1.55,1.05,0.63,0.3,0.08,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.552,0.554,0.557,0.56,0.562,0.565,0.567,0.569,0.57,0.57,0.01,0.007,0.005,0.003,0.002,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.92,0.907,0.87,0.83,0.77,0.71,0.66,0.61,0.58,0.56,0.55 +PARAM_EYE_R_OPEN=0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.55,0.552,0.554,0.557,0.56,0.562,0.565,0.567,0.569,0.57,0.57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.92,0.907,0.87,0.83,0.77,0.71,0.66,0.61,0.58,0.56,0.55 +PARAM_EYE_L_OPEN2=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0.1,0.094,0.08,0.063,0.044,0.028,0.014,0.004,0,-0.001,-0.002,-0.003,-0.004,-0.005,-0.006,-0.01,-0.008,-0.009,-0.009,-0.01,-0.01,-0.012,-0.012,-0.01,-0.013,-0.01,-0.014,-0.01,-0.015,-0.02,-0.016,-0.02,-0.017,-0.02,-0.02,-0.018,-0.02,-0.02,-0.02,-0.02,-0.019,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,0.2,0.53,0.71,0.81,0.86,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,-0.96,-0.969,-0.977,-0.983,-0.988,-0.992,-0.995,-0.998,-0.999,-1,-1 +PARAM_EYE_R_OPEN2=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0.1,0.094,0.08,0.063,0.044,0.028,0.014,0.004,0,-0.001,-0.002,-0.003,-0.004,-0.005,-0.006,-0.01,-0.008,-0.009,-0.009,-0.01,-0.01,-0.012,-0.012,-0.01,-0.013,-0.01,-0.014,-0.01,-0.015,-0.02,-0.016,-0.02,-0.017,-0.02,-0.02,-0.018,-0.02,-0.02,-0.02,-0.02,-0.019,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,-0.02,0.2,0.53,0.71,0.81,0.86,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,-0.98,-0.985,-0.988,-0.992,-0.994,-0.996,-0.998,-0.999,-0.999,-1,-1 +PARAM_EYE_BALL_X=0,0.03,0.07,0.12,0.15,0.16,0.159,0.156,0.151,0.145,0.137,0.128,0.119,0.108,0.097,0.086,0.074,0.063,0.052,0.041,0.032,0.023,0.015,0.009,0.004,0.001,0,0,0,0,0,0,0,0,0,0,0,0,-0.06,-0.16,-0.25,-0.31,-0.34,-0.29,-0.2,-0.14,-0.12,-0.12,-0.122,-0.125,-0.128,-0.133,-0.138,-0.144,-0.151,-0.159,-0.167,-0.176,-0.185,-0.195,-0.206,-0.216,-0.227,-0.238,-0.25,-0.261,-0.273,-0.285,-0.297,-0.309,-0.32,-0.332,-0.343,-0.354,-0.364,-0.375,-0.385,-0.394,-0.403,-0.411,-0.419,-0.426,-0.432,-0.437,-0.442,-0.445,-0.448,-0.449,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.45,-0.436,-0.4,-0.35,-0.29,-0.23,-0.17,-0.12,-0.07,-0.03,-0.01,0 +PARAM_EYE_BALL_Y=0,-0.014,-0.04,-0.06,-0.074,-0.08,-0.079,-0.078,-0.076,-0.072,-0.069,-0.064,-0.059,-0.054,-0.048,-0.043,-0.037,-0.032,-0.026,-0.021,-0.016,-0.011,-0.008,-0.004,-0.002,-0.001,0,0,0,0,0,0,0,0,0,0,0,0,0.015,0.05,0.09,0.15,0.21,0.3,0.35,0.37,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.38,0.368,0.34,0.3,0.25,0.2,0.15,0.1,0.06,0.03,0.01,0 +PARAM_BROW_L_Y=0,0.09,0.24,0.38,0.48,0.52,0.5,0.44,0.36,0.26,0.16,0.07,-0.02,-0.08,-0.1,-0.103,-0.105,-0.106,-0.108,-0.109,-0.11,-0.111,-0.112,-0.114,-0.115,-0.117,-0.12,-0.125,-0.134,-0.144,-0.157,-0.171,-0.186,-0.203,-0.221,-0.24,-0.259,-0.28,-0.31,-0.35,-0.4,-0.45,-0.49,-0.54,-0.58,-0.6,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.68,-0.79,-0.89,-0.96,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.99,-0.96,-0.88,-0.77,-0.64,-0.51,-0.38,-0.26,-0.16,-0.07,-0.02,0 +PARAM_BROW_R_Y=0,0.09,0.24,0.38,0.48,0.52,0.5,0.45,0.37,0.27,0.18,0.08,0,-0.06,-0.09,-0.098,-0.104,-0.109,-0.114,-0.118,-0.121,-0.125,-0.128,-0.132,-0.137,-0.143,-0.15,-0.161,-0.173,-0.187,-0.203,-0.22,-0.239,-0.259,-0.28,-0.3,-0.33,-0.35,-0.38,-0.43,-0.47,-0.52,-0.57,-0.61,-0.65,-0.67,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.68,-0.74,-0.83,-0.91,-0.98,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.97,-0.89,-0.78,-0.65,-0.52,-0.39,-0.26,-0.16,-0.07,-0.02,0 +PARAM_BROW_ANGLE=0.2,0.198,0.192,0.182,0.169,0.154,0.136,0.116,0.1,0.07,0.05,0.03,0,-0.02,-0.05,-0.07,-0.1,-0.12,-0.14,-0.158,-0.176,-0.191,-0.204,-0.215,-0.223,-0.228,-0.23,-0.227,-0.22,-0.21,-0.199,-0.187,-0.175,-0.164,-0.154,-0.147,-0.142,-0.14,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.58,-0.52,-0.43,-0.35,-0.28,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.26,-0.245,-0.21,-0.16,-0.1,-0.04,0.02,0.08,0.13,0.17,0.19,0.2 +PARAM_BROW_SELECT=-0.5,-0.5,-0.5,-0.498,-0.496,-0.494,-0.492,-0.489,-0.485,-0.481,-0.477,-0.472,-0.467,-0.461,-0.455,-0.448,-0.441,-0.434,-0.426,-0.417,-0.408,-0.399,-0.389,-0.379,-0.368,-0.357,-0.345,-0.333,-0.321,-0.308,-0.294,-0.281,-0.267,-0.252,-0.237,-0.222,-0.206,-0.19,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.18,0.16,0.1,0.03,-0.06,-0.15,-0.24,-0.32,-0.39,-0.45,-0.49,-0.5 +PARAM_MOUTH_OPEN_Y=0 +PARAM_MOUTH_OPEN2=0.9,0.74,0.49,0.25,0.08,0,-0.013,-0.026,-0.038,-0.05,-0.06,-0.071,-0.08,-0.089,-0.098,-0.106,-0.113,-0.12,-0.127,-0.133,-0.138,-0.144,-0.148,-0.153,-0.157,-0.161,-0.164,-0.167,-0.169,-0.172,-0.174,-0.175,-0.177,-0.178,-0.18,-0.18,-0.18,-0.18,-0.174,-0.157,-0.13,-0.1,-0.08,-0.05,-0.02,-0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.06,0.21,0.41,0.61,0.77,0.86,0.89,0.9,0.902,0.901,0.9 +PARAM_MOUTH_EMO=0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.13,0.131,0.13,0.13,0.132,0.13,0.13,0.133,0.13,0.13,0.134,0.13,0.135,0.14,0.136,0.14,0.137,0.138,0.14,0.139,0.14,0.14,0.141,0.142,0.14,0.144,0.145,0.145,0.146,0.147,0.148,0.149,0.15,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.435,0.444,0.452,0.458,0.46,0.11,0.112,0.115,0.117,0.119,0.12 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0,-0.72,-1.86,-2.93,-3.7,-4,-3.83,-3.37,-2.7,-1.91,-1.09,-0.3,0.37,0.83,1,0.98,0.93,0.84,0.74,0.62,0.5,0.38,0.26,0.16,0.07,0.02,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0.004,0.01,0.018,0.027,0.038,0.051,0.066,0.082,0.1,0.12,0.14,0.16,0.18,0.21,0.23,0.26,0.29,0.31,0.34,0.37,0.4,0.43,0.46,0.49,0.51,0.54,0.57,0.6,0.63,0.66,0.69,0.71,0.74,0.77,0.79,0.82,0.84,0.86,0.88,0.9,0.918,0.934,0.949,0.962,0.973,0.982,0.99,0.996,0.999,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.97,0.89,0.78,0.65,0.52,0.39,0.26,0.16,0.07,0.02,0 +PARAM_BODY_ANGLE_Z=0,1.25,3.25,5.12,6.47,7,6.69,5.86,4.66,3.24,1.76,0.34,-0.86,-1.69,-2,-1.96,-1.85,-1.69,-1.48,-1.25,-1,-0.75,-0.52,-0.31,-0.15,-0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_Y=0,0.04,0.12,0.18,0.23,0.25,0.248,0.244,0.236,0.226,0.214,0.2,0.185,0.169,0.152,0.134,0.116,0.098,0.081,0.065,0.05,0.036,0.024,0.014,0.006,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0.005,0.009,0.014,0.02,0.027,0.034,0.043,0.052,0.062,0.073,0.084,0.096,0.108,0.121,0.135,0.149,0.163,0.177,0.192,0.207,0.222,0.237,0.252,0.268,0.283,0.298,0.313,0.328,0.343,0.357,0.371,0.385,0.399,0.412,0.424,0.436,0.447,0.458,0.468,0.477,0.486,0.493,0.5,0.506,0.511,0.515,0.518,0.519,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.52,0.503,0.46,0.4,0.34,0.27,0.2,0.14,0.08,0.04,0.01,0 +PARAM_BREATH=0.5,0.59,0.73,0.87,0.96,1,0.97,0.9,0.79,0.67,0.53,0.41,0.3,0.23,0.2,0.203,0.212,0.225,0.242,0.26,0.28,0.3,0.318,0.335,0.348,0.357,0.36,0.355,0.341,0.322,0.3,0.28,0.26,0.23,0.217,0.203,0.193,0.19,0.19,0.191,0.193,0.195,0.198,0.202,0.206,0.21,0.216,0.221,0.227,0.233,0.24,0.247,0.254,0.262,0.27,0.278,0.287,0.295,0.304,0.313,0.321,0.33,0.339,0.348,0.357,0.366,0.375,0.384,0.392,0.401,0.409,0.417,0.425,0.433,0.44,0.447,0.454,0.46,0.466,0.472,0.477,0.481,0.486,0.489,0.492,0.495,0.497,0.499,0.5,0.5,0.497,0.489,0.477,0.461,0.442,0.42,0.4,0.37,0.35,0.32,0.29,0.27,0.25,0.229,0.213,0.201,0.193,0.19,0.2,0.22,0.26,0.3,0.34,0.38,0.42,0.45,0.48,0.494,0.5 +PARAM_BOING=0,-0.04,-0.06,0.02,0.14,0.25,0.34,0.37,0.21,-0.05,-0.23,-0.29,-0.19,-0.02,0.09,0.13,0.1,0.05,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0,-0.03,-0.1,-0.19,-0.28,-0.35,-0.38,-0.33,-0.22,-0.08,0.07,0.18,0.23,0.2,0.13,0.05,-0.04,-0.11,-0.14,-0.11,-0.07,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_R=0,-0.04,-0.13,-0.26,-0.39,-0.48,-0.52,-0.47,-0.35,-0.21,-0.06,0.08,0.19,0.26,0.29,0.26,0.21,0.14,0.06,0,-0.06,-0.1,-0.11,-0.08,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_L=0,0.02,0.08,0.16,0.23,0.29,0.31,0.26,0.16,0.03,-0.11,-0.23,-0.34,-0.4,-0.43,-0.4,-0.32,-0.23,-0.14,-0.05,0.02,0.07,0.09,0.07,0.03,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_TWIN_RIBBON_D=0,0.07,0.23,0.43,0.63,0.79,0.89,0.92,0.79,0.47,0.04,-0.38,-0.7,-0.83,-0.79,-0.68,-0.53,-0.36,-0.18,0,0.17,0.31,0.42,0.49,0.52,0.49,0.43,0.32,0.21,0.08,-0.03,-0.14,-0.2,-0.23,-0.222,-0.2,-0.17,-0.13,-0.1,-0.06,-0.03,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,-0.1,-0.26,-0.4,-0.51,-0.55,-0.55,-0.548,-0.546,-0.543,-0.539,-0.534,-0.528,-0.521,-0.513,-0.504,-0.494,-0.483,-0.471,-0.458,-0.444,-0.428,-0.411,-0.393,-0.374,-0.35,-0.33,-0.31,-0.28,-0.26,-0.23,-0.2,-0.17,-0.14,-0.11,-0.07,-0.04,0,0.05,0.1,0.16,0.22,0.27,0.32,0.36,0.39,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.45,0.53,0.6,0.65,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.67,0.65,0.59,0.52,0.44,0.35,0.26,0.18,0.11,0.05,0.01,0 +PARAM_WING_DEFORM=0,-0.07,-0.19,-0.3,-0.38,-0.41,-0.409,-0.405,-0.399,-0.391,-0.381,-0.369,-0.356,-0.341,-0.326,-0.309,-0.291,-0.273,-0.255,-0.236,-0.217,-0.198,-0.179,-0.16,-0.142,-0.124,-0.107,-0.09,-0.075,-0.061,-0.048,-0.036,-0.025,-0.017,-0.01,-0.004,-0.001,0,-0.03,-0.13,-0.26,-0.42,-0.58,-0.74,-0.87,-0.97,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.97,-0.89,-0.78,-0.65,-0.52,-0.39,-0.26,-0.16,-0.07,-0.02,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch2.mtn b/public/pio/models/pio/motions/Touch2.mtn new file mode 100644 index 0000000..4ba0ff1 --- /dev/null +++ b/public/pio/models/pio/motions/Touch2.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.3,1.03,2,2.97,3.7,4,3.71,2.99,2.12,1.27,0.58,0.15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Y=0,5.78,16.22,22,18.09,8.61,-4,-16.61,-26.09,-30,-28.61,-26.11,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.73,-24.23,-22.91,-20.86,-18.29,-15.45,-12.36,-9.28,-6.43,-3.86,-1.82,-0.49,0 +PARAM_ANGLE_Z=0,1.45,2,-0.35,-6.07,-13.06,-19.88,-25.35,-28.82,-30,-29.03,-27.44,-26.35,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-26,-25.67,-24.75,-23.29,-21.44,-19.24,-16.83,-14.29,-11.71,-9.17,-6.76,-4.56,-2.71,-1.25,-0.33,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.482,0.45,0.434,0.427,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.429,0.433,0.439,0.446,0.455,0.464,0.473,0.481,0.489,0.495,0.499,0.5 +PARAM_EYE_R_OPEN=0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.6,0.76,0.86,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.9,0.8,0.64,0.54,0.5,0.5,0.5,0.5 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0,0,0,0,0,0.012,0.05,0.09,0.15,0.21,0.27,0.31,0.35,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.36,0.357,0.348,0.334,0.315,0.29,0.27,0.24,0.21,0.18,0.15,0.13,0.1,0.08,0.05,0.036,0.021,0.009,0.002,0 +PARAM_BROW_L_Y=0,0.49,0.67,0.6,0.42,0.19,-0.05,-0.23,-0.3,-0.299,-0.297,-0.294,-0.29,-0.284,-0.278,-0.27,-0.262,-0.253,-0.243,-0.233,-0.222,-0.211,-0.199,-0.187,-0.175,-0.163,-0.15,-0.137,-0.125,-0.113,-0.101,-0.089,-0.078,-0.067,-0.057,-0.047,-0.038,-0.03,-0.022,-0.016,-0.01,-0.006,-0.003,-0.001,0 +PARAM_BROW_R_Y=0,0.49,0.67,0.6,0.42,0.18,-0.06,-0.24,-0.31,-0.309,-0.307,-0.304,-0.299,-0.294,-0.287,-0.279,-0.271,-0.262,-0.252,-0.241,-0.23,-0.218,-0.206,-0.193,-0.181,-0.168,-0.155,-0.142,-0.129,-0.117,-0.104,-0.092,-0.08,-0.069,-0.058,-0.048,-0.039,-0.031,-0.023,-0.016,-0.011,-0.006,-0.003,-0.001,0 +PARAM_BROW_L_ANGLE=0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.79,0.62,0.43,0.27,0.13,0.03,0 +PARAM_BROW_R_ANGLE=0,0.24,0.64,0.91,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.93,0.79,0.62,0.43,0.27,0.13,0.03,0 +PARAM_EAR_DEFORM=0,0.08,0.23,0.31,0.22,0,-0.29,-0.59,-0.81,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.9,-0.893,-0.876,-0.85,-0.81,-0.77,-0.72,-0.67,-0.61,-0.55,-0.48,-0.42,-0.35,-0.29,-0.23,-0.18,-0.13,-0.09,-0.05,-0.02,-0.006,0 +PARAM_MOUTH_OPEN_Y=0.5,0.59,0.73,0.87,0.96,1,1,1,1,1,1,1,1,1,1,0.986,0.95,0.91,0.86,0.83,0.818,0.82,0.826,0.834,0.842,0.848,0.85,0.832,0.8,0.783,0.777,0.797,0.83,0.85,0.86,0.86,0.858,0.853,0.842,0.826,0.8,0.71,0.6,0.52,0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0,0.73,1.92,2.73,3,2.71,2.01,1.08,0.15,-0.55,-0.84,-0.69,-0.45,-0.23,-0.06,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=0,0,0,0,0,0,0,0,-0.23,-0.77,-1.5,-2.23,-2.77,-3,-2.96,-2.86,-2.69,-2.47,-2.22,-1.94,-1.65,-1.35,-1.06,-0.78,-0.53,-0.31,-0.14,-0.04,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BREATH=0.5,0.54,0.63,0.75,0.87,0.96,1,0.93,0.79,0.62,0.43,0.27,0.13,0.03,0,0.011,0.04,0.08,0.14,0.2,0.26,0.32,0.39,0.44,0.49,0.54,0.57,0.59,0.6,0.599,0.595,0.59,0.583,0.574,0.565,0.556,0.546,0.537,0.528,0.52,0.513,0.508,0.504,0.501,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0,-0.03,-0.12,-0.25,-0.4,-0.56,-0.7,-0.83,-0.92,-0.98,-1,-0.97,-0.87,-0.74,-0.58,-0.42,-0.26,-0.13,-0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_WING_ANGLE=0,0.013,0.04,0.09,0.13,0.16,0.17,0.157,0.12,0.07,0.01,-0.05,-0.11,-0.16,-0.2,-0.21,-0.209,-0.207,-0.203,-0.198,-0.192,-0.185,-0.176,-0.168,-0.158,-0.149,-0.138,-0.128,-0.117,-0.106,-0.096,-0.085,-0.075,-0.064,-0.055,-0.046,-0.037,-0.029,-0.022,-0.016,-0.01,-0.006,-0.003,-0.001,0 +PARAM_WING_DEFORM=0,0.24,0.64,0.91,1,0.93,0.75,0.48,0.16,-0.16,-0.48,-0.75,-0.93,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.991,-0.97,-0.93,-0.87,-0.81,-0.74,-0.66,-0.58,-0.5,-0.42,-0.34,-0.26,-0.19,-0.13,-0.07,-0.03,-0.01,0 +PARAM_RIBBON_DEFORM=0,0,0,0,0,0,0,0.15,0.4,0.57,0.63,0.51,0.31,0.12,-0.01,-0.06,-0.053,-0.035,-0.017,-0.005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BLUSH=0,0.012,0.04,0.09,0.15,0.2,0.25,0.3,0.33,0.35,0.36,0.359,0.356,0.352,0.345,0.338,0.329,0.318,0.307,0.295,0.281,0.267,0.252,0.237,0.222,0.206,0.19,0.174,0.158,0.142,0.127,0.112,0.097,0.084,0.07,0.058,0.047,0.036,0.027,0.019,0.013,0.007,0.003,0.001,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch3.mtn b/public/pio/models/pio/motions/Touch3.mtn new file mode 100644 index 0000000..2343777 --- /dev/null +++ b/public/pio/models/pio/motions/Touch3.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0 +PARAM_ANGLE_Y=0,7.88,22.12,30,27.93,22.52,14.7,5.77,-3.51,-12.16,-19.55,-25.19,-28.75,-30,-28.69,-25.19,-20.12,-14.1,-7.9,-1.88,3.19,6.69,8,7.84,7.41,6.77,5.96,5.07,4.12,3.18,2.31,1.54,0.89,0.41,0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=0 +PARAM_EMOTION=-1,-0.5,-0.515,-0.52,-0.519,-0.516,-0.512,-0.508,-0.503,-0.499,-0.495,-0.492,-0.491,-0.49,-0.49,-0.493,-0.496,-0.5,-0.505,-0.509,-0.513,-0.517,-0.52,-0.522,-0.524,-0.526,-0.528,-0.529,-0.531,-0.532,-0.533,-0.535,-0.536,-0.537,-0.539,-0.54,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.95,-0.953,-0.957,-0.962,-0.967,-0.972,-0.977,-0.982,-0.987,-0.991,-0.995,-0.998,-0.999,-1 +PARAM_EYE_L_OPEN=0.55,0.549,0.544,0.537,0.528,0.517,0.503,0.488,0.471,0.454,0.434,0.41,0.39,0.37,0.35,0.32,0.3,0.28,0.25,0.23,0.21,0.19,0.16,0.14,0.123,0.104,0.086,0.07,0.054,0.041,0.029,0.019,0.011,0.005,0.001,0,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.037,0.03,0.02,0.01,0.003,0,0.91,0.88,0.82,0.74,0.66,0.6,0.56,0.55 +PARAM_EYE_R_OPEN=0.55,0.549,0.544,0.537,0.528,0.517,0.503,0.488,0.471,0.454,0.434,0.41,0.39,0.37,0.35,0.32,0.3,0.28,0.25,0.23,0.21,0.19,0.16,0.14,0.123,0.104,0.086,0.07,0.054,0.041,0.029,0.019,0.011,0.005,0.001,0,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.037,0.03,0.02,0.01,0.003,0,0.91,0.88,0.82,0.74,0.66,0.6,0.56,0.55 +PARAM_EYE_L_OPEN2=-0.92,-0.92,-0.92,-0.922,-0.923,-0.925,-0.927,-0.929,-0.931,-0.934,-0.937,-0.94,-0.943,-0.946,-0.949,-0.953,-0.956,-0.96,-0.963,-0.966,-0.97,-0.973,-0.976,-0.979,-0.982,-0.985,-0.987,-0.99,-0.992,-0.994,-0.996,-0.997,-0.998,-0.999,-1,-1,-0.11,-0.08,-0.06,-0.03,-0.013,0.005,0.022,0.036,0.049,0.06,0.07,0.078,0.085,0.091,0.095,0.098,0.099,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.15,0.29,0.47,0.64,0.78,0.83,-1,-1,-1,-1,-1,-1,-1,-1 +PARAM_EYE_R_OPEN2=-0.91,-0.91,-0.91,-0.912,-0.914,-0.915,-0.918,-0.92,-0.923,-0.926,-0.929,-0.932,-0.936,-0.939,-0.943,-0.947,-0.951,-0.955,-0.958,-0.962,-0.966,-0.97,-0.973,-0.977,-0.98,-0.983,-0.986,-0.989,-0.991,-0.993,-0.995,-0.997,-0.998,-0.999,-1,-1,-0.11,-0.08,-0.06,-0.03,-0.013,0.005,0.022,0.036,0.049,0.06,0.07,0.078,0.085,0.091,0.095,0.098,0.099,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.15,0.29,0.47,0.64,0.78,0.83,-1,-1,-1,-1,-1,-1,-1,-1 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0,-0.17,-0.47,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.62,-0.56,-0.47,-0.37,-0.27,-0.17,-0.08,-0.02,0 +PARAM_BROW_R_Y=0,-0.17,-0.47,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.64,-0.62,-0.56,-0.47,-0.37,-0.27,-0.17,-0.08,-0.02,0 +PARAM_BROW_ANGLE=-0.53,-0.53,-0.53,-0.532,-0.533,-0.534,-0.536,-0.538,-0.541,-0.543,-0.546,-0.549,-0.553,-0.556,-0.56,-0.564,-0.567,-0.571,-0.575,-0.58,-0.584,-0.588,-0.592,-0.597,-0.601,-0.605,-0.609,-0.613,-0.617,-0.621,-0.625,-0.629,-0.632,-0.636,-0.639,-0.642,-0.645,-0.648,-0.65,-0.652,-0.654,-0.656,-0.657,-0.659,-0.659,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.66,-0.653,-0.636,-0.61,-0.58,-0.53,-0.17,-0.06,0.02,0.09,0.13,0.16,0.18,0.196,0.2 +PARAM_BROW_SELECT=0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,-0.19,-0.29,-0.36,-0.41,-0.44,-0.47,-0.487,-0.497,-0.5 +PARAM_MOUTH_OPEN_Y=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.08,0.2,0.31,0.39,0.42,0.38,0.3,0.26,0.31,0.39,0.44,0.46,0.44,0.37,0.28,0.18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_MOUTH_OPEN2=0.9,0.66,0.24,0,0,0,0,0,0,0,0,0,0,0,-0.004,-0.018,-0.04,-0.08,-0.12,-0.18,-0.25,-0.33,-0.43,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.63,-0.26,-0.06,0,-0.009,-0.04,-0.09,-0.17,-0.28,-0.43,-1,-0.983,-0.93,-0.86,-0.76,-0.64,-0.51,-0.37,-0.22,-0.07,0.08,0.23,0.37,0.5,0.61,0.71,0.79,0.85,0.89,0.9 +PARAM_MOUTH_EMO=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.23,0.233,0.236,0.239,0.242,0.244,0.245,0.247,0.248,0.25,0.25,0.25,0.25,0.24,0.22,0.202,0.184,0.167,0.15,0.135,0.121,0.107,0.094,0.082,0.071,0.061,0.052,0.043,0.035,0.028,0.022,0.017,0.012,0.009,0.005,0.003,0.001,0,0,0.47,0.47,0.47,0.47,0.47,0.47,0.469,0.47,0.47,0.468,0.47,0.466,0.466,0.465,0.46,0.463,0.462,0.461,0.46,0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Z=0,1.58,4.42,6,5.62,4.63,3.2,1.56,-0.14,-1.73,-3.08,-4.12,-4.77,-5,-4.76,-4.11,-3.18,-2.07,-0.93,0.18,1.11,1.76,2,1.96,1.85,1.69,1.49,1.27,1.03,0.8,0.58,0.39,0.22,0.1,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_Y=0 +PARAM_BREATH=0.5,0.63,0.87,1,0.998,0.99,0.979,0.964,0.945,0.92,0.9,0.87,0.84,0.81,0.78,0.75,0.71,0.68,0.64,0.61,0.57,0.54,0.5,0.47,0.44,0.41,0.38,0.35,0.33,0.31,0.287,0.271,0.258,0.248,0.242,0.24,0.244,0.255,0.272,0.3,0.32,0.35,0.39,0.43,0.47,0.5,0.55,0.58,0.62,0.66,0.69,0.72,0.75,0.78,0.794,0.808,0.817,0.82,0.818,0.814,0.806,0.796,0.784,0.77,0.754,0.737,0.719,0.699,0.68,0.66,0.64,0.621,0.601,0.583,0.566,0.55,0.536,0.524,0.514,0.506,0.502,0.5 +PARAM_BOING=0,0.18,0.46,0.73,0.92,1,0.88,0.58,0.18,-0.23,-0.53,-0.65,-0.48,-0.21,0.04,0.22,0.29,0.26,0.17,0.06,-0.05,-0.14,-0.17,-0.157,-0.13,-0.08,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0,0.18,0.51,0.69,0.59,0.35,0.06,-0.23,-0.46,-0.6,-0.65,-0.59,-0.43,-0.22,-0.01,0.15,0.21,0.18,0.09,-0.01,-0.12,-0.21,-0.24,-0.222,-0.18,-0.12,-0.06,-0.02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_R=0,0.13,0.38,0.51,0.48,0.41,0.31,0.2,0.08,-0.03,-0.13,-0.2,-0.24,-0.26,-0.245,-0.21,-0.15,-0.08,-0.01,0.06,0.12,0.16,0.17,0.167,0.157,0.144,0.127,0.108,0.087,0.068,0.049,0.033,0.019,0.009,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_L=0,0.13,0.38,0.51,0.48,0.41,0.31,0.2,0.08,-0.03,-0.13,-0.2,-0.24,-0.26,-0.245,-0.21,-0.15,-0.08,-0.01,0.06,0.12,0.16,0.17,0.167,0.157,0.144,0.127,0.108,0.087,0.068,0.049,0.033,0.019,0.009,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_TWIN_RIBBON_D=0,0.22,0.6,0.82,0.71,0.44,0.1,-0.22,-0.48,-0.64,-0.7,-0.65,-0.54,-0.36,-0.17,0.04,0.23,0.39,0.51,0.59,0.62,0.612,0.59,0.56,0.51,0.46,0.4,0.34,0.28,0.22,0.16,0.11,0.06,0.03,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.002,-0.006,-0.014,-0.025,-0.037,-0.052,-0.069,-0.086,-0.106,-0.126,-0.15,-0.17,-0.19,-0.21,-0.23,-0.25,-0.269,-0.285,-0.3,-0.313,-0.325,-0.335,-0.344,-0.352,-0.358,-0.364,-0.368,-0.372,-0.375,-0.377,-0.378,-0.379,-0.38,-0.38,-0.372,-0.352,-0.32,-0.28,-0.24,-0.19,-0.14,-0.1,-0.06,-0.03,-0.008,0 +PARAM_WING_DEFORM=0,0.26,0.74,1,0.991,0.97,0.93,0.87,0.81,0.74,0.67,0.59,0.51,0.43,0.35,0.28,0.21,0.15,0.1,0.06,0.03,0.007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.007,-0.025,-0.05,-0.09,-0.14,-0.18,-0.23,-0.29,-0.34,-0.38,-0.43,-0.47,-0.49,-0.513,-0.52,-0.519,-0.517,-0.512,-0.506,-0.496,-0.484,-0.469,-0.451,-0.43,-0.4,-0.37,-0.34,-0.3,-0.26,-0.05,0.24,0.49,0.67,0.74,0.725,0.69,0.62,0.55,0.46,0.37,0.28,0.19,0.12,0.05,0.01,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch4.mtn b/public/pio/models/pio/motions/Touch4.mtn new file mode 100644 index 0000000..e6b5031 --- /dev/null +++ b/public/pio/models/pio/motions/Touch4.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,0.45,1.51,2.94,4.62,6.42,8.31,10.17,12,14.13,16.1,17.86,19.48,20.94,22.28,23.48,24.54,25.5,26.35,27.09,27.75,28.31,28.77,29.17,29.48,29.71,29.87,29.97,30,29.85,29.41,28.71,27.77,26.65,25.31,23.82,22.24,20.51,18.7,16.89,15,13.11,11.3,9.49,7.76,6.18,4.69,3.35,2.23,1.29,0.59,0.15,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Y=0,-0.26,-0.85,-1.63,-2.52,-3.44,-4.36,-5.22,-6,-6.86,-7.65,-8.35,-8.99,-9.57,-10.09,-10.56,-10.97,-11.33,-11.66,-11.94,-12.18,-12.39,-12.56,-12.7,-12.81,-12.9,-12.96,-12.99,-13,-12.93,-12.75,-12.44,-12.03,-11.55,-10.97,-10.32,-9.64,-8.89,-8.1,-7.32,-6.5,-5.68,-4.9,-4.11,-3.36,-2.68,-2.03,-1.45,-0.97,-0.56,-0.25,-0.07,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=0,0.83,2.63,4.88,7.23,9.39,11.21,12.46,13,13.14,13.27,13.38,13.48,13.57,13.64,13.71,13.76,13.81,13.86,13.89,13.92,13.94,13.96,13.974,13.985,13.992,13.997,13.999,14,13.91,13.65,13.23,12.66,11.99,11.19,10.29,9.34,8.3,7.22,6.13,5,3.87,2.78,1.7,0.66,-0.29,-1.19,-1.99,-2.66,-3.23,-3.65,-3.91,-4,-4,-3.71,-2.99,-2.12,-1.27,-0.58,-0.15,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.94,0.91,0.84,0.76,0.67,0.61,0.56,0.55 +PARAM_EYE_R_OPEN=0.55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.94,0.91,0.84,0.76,0.67,0.61,0.56,0.55 +PARAM_EYE_L_OPEN2=-1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.116,0.16,0.22,0.3,0.39,0.49,0.59,0.68,0.76,0.82,0.86,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,0.88,-0.94,-0.96,-0.975,-0.986,-0.993,-0.997,-0.999,-1 +PARAM_EYE_R_OPEN2=-1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.115,0.16,0.22,0.3,0.38,0.48,0.58,0.66,0.74,0.81,0.85,0.87,0.873,0.875,0.877,0.878,0.879,0.88,0.88,0.88,0.88,0.88,0.88,0.88,-0.96,-0.973,-0.984,-0.991,-0.995,-0.998,-1,-1 +PARAM_EYE_BALL_X=0,-0.011,-0.04,-0.07,-0.1,-0.13,-0.15,-0.171,-0.18,-0.184,-0.188,-0.191,-0.194,-0.197,-0.199,-0.201,-0.203,-0.204,-0.206,-0.207,-0.208,-0.208,-0.21,-0.209,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.21,-0.195,-0.16,-0.11,-0.07,-0.03,-0.01,0 +PARAM_EYE_BALL_Y=0,0.009,0.028,0.05,0.08,0.11,0.13,0.15,0.17,0.186,0.2,0.213,0.224,0.234,0.243,0.251,0.258,0.264,0.27,0.274,0.278,0.281,0.284,0.286,0.287,0.289,0.289,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.29,0.27,0.22,0.15,0.09,0.04,0.01,0 +PARAM_BROW_L_Y=0,-0.05,-0.16,-0.3,-0.44,-0.57,-0.67,-0.74,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.77,-0.71,-0.58,-0.41,-0.24,-0.11,-0.03,0 +PARAM_BROW_R_Y=0,-0.05,-0.17,-0.31,-0.45,-0.59,-0.7,-0.77,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.74,-0.6,-0.42,-0.25,-0.12,-0.03,0 +PARAM_BROW_ANGLE=0.2,-0.58,-0.59,-0.598,-0.603,-0.607,-0.609,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.61,-0.55,-0.41,-0.23,-0.06,0.08,0.17,0.2 +PARAM_BROW_SELECT=-0.5,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.43,0.36,0.2,-0.01,-0.21,-0.36,-0.47,-0.5 +PARAM_MOUTH_OPEN_Y=0 +PARAM_MOUTH_OPEN2=0.9,0.85,0.73,0.59,0.45,0.31,0.2,0.13,0.1,0.1,0.102,0.105,0.109,0.114,0.12,0.128,0.136,0.145,0.155,0.166,0.178,0.191,0.204,0.218,0.233,0.249,0.266,0.283,0.301,0.319,0.338,0.358,0.378,0.4,0.42,0.44,0.46,0.49,0.51,0.53,0.55,0.58,0.6,0.63,0.65,0.67,0.7,0.72,0.75,0.77,0.8,0.82,0.85,0.87,0.89,0.903,0.906,0.906,0.903,0.901,0.9 +PARAM_MOUTH_EMO=0,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.26,0.259,0.26,0.26,0.26,0.26,0.26,0.26,0.258,0.26,0.26,0.26,0.26,0.257,0.26,0.26,0.26,0.256,0.26,0.26,0.26,0.255,0.25,0.25,0.254,0.25,0.25,0.253,0.25,0.25,0.252,0.25,0.25,0.251,0.25,0.25,0,0,0,0,0,0,0,0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BODY_Y=0,0.002,0.006,0.014,0.024,0.036,0.05,0.067,0.084,0.103,0.123,0.14,0.17,0.19,0.21,0.23,0.25,0.27,0.291,0.309,0.327,0.343,0.357,0.369,0.38,0.389,0.395,0.399,0.4,0.398,0.392,0.383,0.37,0.355,0.338,0.318,0.3,0.27,0.25,0.23,0.2,0.17,0.15,0.13,0.1,0.08,0.063,0.045,0.03,0.017,0.008,0.002,0,0,0,0,0,0,0,0,0 +PARAM_BREATH=0.5,0.498,0.492,0.483,0.47,0.455,0.437,0.42,0.39,0.37,0.35,0.32,0.29,0.27,0.24,0.21,0.19,0.16,0.14,0.11,0.09,0.072,0.054,0.038,0.025,0.014,0.007,0.002,0,0.003,0.01,0.021,0.037,0.056,0.08,0.1,0.13,0.16,0.19,0.22,0.25,0.28,0.31,0.34,0.37,0.4,0.42,0.44,0.463,0.479,0.49,0.497,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_BOING=0 +PARAM_HAIR_FRONT=0,-0.03,-0.11,-0.21,-0.3,-0.38,-0.41,-0.34,-0.18,0.03,0.23,0.38,0.49,0.52,0.47,0.33,0.17,0.01,-0.11,-0.19,-0.22,-0.206,-0.17,-0.14,-0.1,-0.06,-0.03,-0.008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_R=0,0.02,0.07,0.15,0.24,0.33,0.41,0.49,0.54,0.58,0.59,0.58,0.56,0.52,0.48,0.43,0.39,0.36,0.33,0.316,0.31,0.31,0.312,0.314,0.316,0.317,0.319,0.32,0.32,0.318,0.314,0.306,0.296,0.284,0.27,0.254,0.238,0.22,0.201,0.182,0.162,0.143,0.124,0.106,0.088,0.071,0.056,0.042,0.03,0.02,0.011,0.005,0.001,0,0,0,0,0,0,0,0 +PARAM_HAIR_SIDE_L=0,-0.03,-0.09,-0.19,-0.3,-0.41,-0.52,-0.61,-0.68,-0.72,-0.74,-0.727,-0.69,-0.65,-0.59,-0.53,-0.48,-0.43,-0.4,-0.38,-0.37,-0.388,-0.43,-0.47,-0.52,-0.57,-0.61,-0.63,-0.64,-0.637,-0.628,-0.613,-0.593,-0.57,-0.54,-0.51,-0.48,-0.44,-0.4,-0.36,-0.32,-0.29,-0.25,-0.21,-0.18,-0.14,-0.11,-0.08,-0.06,-0.039,-0.022,-0.01,-0.003,0,0,0,0,0,0,0,0 +PARAM_TWIN_RIBBON_D=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0 +PARAM_WING_DEFORM=0,-0.009,-0.03,-0.07,-0.12,-0.18,-0.24,-0.31,-0.38,-0.45,-0.53,-0.6,-0.67,-0.74,-0.8,-0.86,-0.91,-0.94,-0.97,-0.993,-1,-1,-1,-1,-0.998,-0.996,-0.993,-0.99,-0.985,-0.979,-0.972,-0.963,-0.953,-0.941,-0.927,-0.911,-0.893,-0.874,-0.85,-0.83,-0.8,-0.76,-0.7,-0.62,-0.54,-0.45,-0.36,-0.28,-0.2,-0.13,-0.08,-0.03,-0.01,0,0,0,0,0,0,0,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch5.mtn b/public/pio/models/pio/motions/Touch5.mtn new file mode 100644 index 0000000..da841df --- /dev/null +++ b/public/pio/models/pio/motions/Touch5.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-0.24,-0.88,-1.85,-3.06,-4.4,-5.82,-7.22,-8.53,-9.69,-10.66,-11.39,-11.84,-12,-11.88,-11.55,-11.06,-10.46,-9.77,-9.04,-8.28,-7.52,-6.77,-6.06,-5.42,-4.85,-4.36,-4,-3.67,-3.35,-3.06,-2.78,-2.53,-2.29,-2.06,-1.85,-1.66,-1.48,-1.31,-1.16,-1.02,-0.89,-0.77,-0.67,-0.57,-0.48,-0.4,-0.33,-0.27,-0.22,-0.17,-0.13,-0.1,-0.07,-0.05,-0.028,-0.015,-0.007,-0.002,0 +PARAM_ANGLE_Y=0,-0.34,-1.25,-2.64,-4.39,-6.35,-8.46,-10.57,-12.59,-14.44,-16.07,-17.4,-18.39,-19,-19.5,-19.89,-20.2,-20.45,-20.63,-20.77,-20.87,-20.93,-20.97,-21,-21.005,-21.01,-21.002,-21,-20.93,-20.73,-20.42,-20,-19.49,-18.89,-18.21,-17.46,-16.67,-15.81,-14.93,-14.01,-13.06,-12.09,-11.11,-10.13,-9.17,-8.21,-7.27,-6.36,-5.48,-4.63,-3.85,-3.11,-2.44,-1.84,-1.3,-0.85,-0.49,-0.22,-0.06,0 +PARAM_ANGLE_Z=0,-0.16,-0.59,-1.23,-2.04,-2.93,-3.88,-4.82,-5.69,-6.46,-7.11,-7.59,-7.9,-8,-7.79,-7.24,-6.45,-5.46,-4.37,-3.22,-2.07,-0.94,0.11,1.06,1.84,2.46,2.86,3,2.9,2.61,2.17,1.61,0.95,0.22,-0.52,-1.28,-2.02,-2.73,-3.36,-3.92,-4.38,-4.72,-4.93,-5,-4.94,-4.76,-4.48,-4.13,-3.72,-3.27,-2.8,-2.32,-1.86,-1.42,-1.02,-0.67,-0.39,-0.18,-0.04,0 +PARAM_EMOTION=-1 +PARAM_EYE_L_OPEN=0.55,0.549,0.546,0.542,0.537,0.532,0.526,0.52,0.514,0.51,0.506,0.503,0.501,0.5,0.5,0.5,0.5,0.501,0.5,0.502,0.503,0.504,0.505,0.506,0.507,0.509,0.51,0.511,0.513,0.514,0.516,0.517,0.519,0.521,0.522,0.524,0.526,0.527,0.529,0.53,0.532,0.534,0.535,0.537,0.538,0.539,0.541,0.542,0.543,0.544,0.545,0.546,0.547,0.55,0.548,0.549,0.55,0.55,0.55,0.55 +PARAM_EYE_R_OPEN=0.55,0.549,0.546,0.542,0.537,0.532,0.526,0.52,0.514,0.51,0.506,0.503,0.501,0.5,0.5,0.5,0.5,0.501,0.5,0.502,0.503,0.504,0.505,0.506,0.507,0.509,0.51,0.511,0.513,0.514,0.516,0.517,0.519,0.521,0.522,0.524,0.526,0.527,0.529,0.53,0.532,0.534,0.535,0.537,0.538,0.539,0.541,0.542,0.543,0.544,0.545,0.546,0.547,0.55,0.548,0.549,0.55,0.55,0.55,0.55 +PARAM_EYE_L_OPEN2=-1 +PARAM_EYE_R_OPEN2=-1 +PARAM_EYE_BALL_X=0,0,0.004,0.008,0.013,0.018,0.024,0.03,0.036,0.04,0.044,0.047,0.049,0.05,0.049,0.047,0.043,0.038,0.033,0.028,0.023,0.018,0.013,0.009,0.005,0.002,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_EYE_BALL_Y=0,0.002,0.009,0.019,0.033,0.048,0.067,0.086,0.107,0.13,0.15,0.17,0.19,0.21,0.23,0.253,0.27,0.283,0.295,0.304,0.311,0.317,0.322,0.325,0.327,0.329,0.33,0.33,0.329,0.326,0.321,0.314,0.306,0.297,0.286,0.274,0.262,0.248,0.235,0.22,0.205,0.19,0.175,0.159,0.144,0.129,0.114,0.1,0.086,0.073,0.061,0.049,0.038,0.029,0.02,0.013,0.008,0.003,0.001,0 +PARAM_BROW_L_Y=0,-0.002,-0.009,-0.018,-0.031,-0.044,-0.058,-0.072,-0.085,-0.097,-0.107,-0.114,-0.118,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.118,-0.117,-0.114,-0.111,-0.108,-0.104,-0.1,-0.095,-0.09,-0.085,-0.08,-0.075,-0.069,-0.064,-0.058,-0.052,-0.047,-0.042,-0.036,-0.031,-0.026,-0.022,-0.018,-0.014,-0.01,-0.007,-0.005,-0.003,-0.001,0,0 +PARAM_BROW_R_Y=0,-0.002,-0.007,-0.015,-0.026,-0.037,-0.049,-0.062,-0.073,-0.084,-0.093,-0.101,-0.107,-0.11,-0.113,-0.115,-0.116,-0.118,-0.119,-0.119,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.12,-0.118,-0.117,-0.114,-0.111,-0.108,-0.104,-0.1,-0.095,-0.09,-0.085,-0.08,-0.075,-0.069,-0.064,-0.058,-0.052,-0.047,-0.042,-0.036,-0.031,-0.026,-0.022,-0.018,-0.014,-0.01,-0.007,-0.005,-0.003,-0.001,0,0 +PARAM_BROW_ANGLE=0.2,0.205,0.22,0.24,0.27,0.3,0.33,0.36,0.39,0.42,0.44,0.456,0.466,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.47,0.469,0.467,0.463,0.457,0.451,0.443,0.434,0.425,0.414,0.403,0.392,0.38,0.368,0.355,0.343,0.33,0.318,0.306,0.293,0.282,0.27,0.26,0.25,0.24,0.231,0.224,0.217,0.211,0.206,0.203,0.201,0.2 +PARAM_BROW_SELECT=-0.5 +PARAM_MOUTH_OPEN_Y=0,0.91,0.904,0.887,0.86,0.83,0.79,0.75,0.72,0.68,0.65,0.62,0.606,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.601,0.604,0.609,0.616,0.624,0.633,0.644,0.656,0.669,0.682,0.697,0.712,0.727,0.742,0.758,0.774,0.789,0.804,0.819,0.833,0.846,0.859,0.871,0.882,0.891,0.9,0.907,0.912,0.917,0.919,0.92,0 +PARAM_MOUTH_OPEN2=0.9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.999,-1,-1,-0.998,-1,-1,-0.997,-1,-0.996,-1,-0.995,-0.994,-0.99,-0.993,-0.99,-0.991,-0.991,-0.99,-0.989,-0.99,-0.987,-0.986,-0.985,-0.984,-0.983,-0.982,-0.981,-0.98,-0.979,-0.978,-0.977,-0.976,-0.974,-0.973,-0.972,-0.97,-0.969,-0.968,-0.966,-0.965,-0.963,-0.962,-0.96,-0.959,-0.957,-0.955,-0.954,-0.952,-0.95,0.9 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0,-0.02,-0.07,-0.15,-0.25,-0.37,-0.49,-0.6,-0.71,-0.81,-0.89,-0.95,-0.99,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.987,-0.95,-0.9,-0.83,-0.74,-0.65,-0.56,-0.46,-0.37,-0.28,-0.2,-0.13,-0.08,-0.04,-0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BODY_ANGLE_Z=0,-0.04,-0.16,-0.33,-0.56,-0.83,-1.12,-1.42,-1.72,-2.02,-2.3,-2.57,-2.8,-3,-3.23,-3.41,-3.55,-3.67,-3.76,-3.84,-3.89,-3.93,-3.96,-3.98,-3.991,-3.997,-4,-4,-4,-3.997,-3.992,-3.981,-3.963,-3.94,-3.9,-3.86,-3.8,-3.73,-3.64,-3.54,-3.43,-3.3,-3.16,-3,-2.79,-2.56,-2.31,-2.05,-1.79,-1.53,-1.28,-1.04,-0.82,-0.61,-0.43,-0.28,-0.16,-0.07,-0.02,0 +PARAM_BODY_Y=0,-0.007,-0.026,-0.06,-0.09,-0.13,-0.17,-0.22,-0.26,-0.29,-0.32,-0.34,-0.355,-0.36,-0.352,-0.33,-0.3,-0.26,-0.21,-0.17,-0.12,-0.08,-0.04,0,0.03,0.06,0.074,0.08,0.077,0.069,0.057,0.042,0.024,0.004,-0.017,-0.04,-0.06,-0.078,-0.095,-0.11,-0.123,-0.132,-0.138,-0.14,-0.138,-0.133,-0.126,-0.116,-0.104,-0.091,-0.078,-0.065,-0.052,-0.04,-0.029,-0.019,-0.011,-0.005,-0.001,0 +PARAM_BREATH=0.5,0.494,0.479,0.46,0.43,0.4,0.36,0.33,0.3,0.27,0.25,0.234,0.224,0.22,0.22,0.22,0.22,0.22,0.22,0.22,0.22,0.22,0.22,0.22,0.22,0.221,0.22,0.222,0.22,0.223,0.22,0.224,0.225,0.23,0.227,0.228,0.229,0.23,0.232,0.233,0.235,0.236,0.238,0.24,0.245,0.256,0.271,0.29,0.31,0.33,0.36,0.38,0.41,0.43,0.449,0.466,0.481,0.491,0.498,0.5 +PARAM_BOING=0 +PARAM_HAIR_FRONT=0 +PARAM_HAIR_SIDE_R=0,-0.007,-0.026,-0.06,-0.09,-0.13,-0.17,-0.22,-0.26,-0.29,-0.32,-0.34,-0.355,-0.36,-0.353,-0.33,-0.3,-0.26,-0.21,-0.16,-0.1,-0.04,0.01,0.06,0.11,0.15,0.18,0.21,0.225,0.23,0.23,0.227,0.224,0.219,0.213,0.206,0.198,0.19,0.18,0.17,0.16,0.149,0.138,0.126,0.115,0.104,0.092,0.081,0.07,0.06,0.05,0.04,0.032,0.024,0.017,0.011,0.006,0.003,0.001,0 +PARAM_HAIR_SIDE_L=0,0.007,0.025,0.05,0.09,0.12,0.17,0.2,0.24,0.27,0.3,0.32,0.336,0.34,0.333,0.313,0.28,0.24,0.19,0.14,0.09,0.03,-0.02,-0.07,-0.11,-0.15,-0.19,-0.21,-0.225,-0.23,-0.23,-0.227,-0.224,-0.219,-0.213,-0.206,-0.198,-0.19,-0.18,-0.17,-0.16,-0.149,-0.138,-0.126,-0.115,-0.104,-0.092,-0.081,-0.07,-0.06,-0.05,-0.04,-0.032,-0.024,-0.017,-0.011,-0.006,-0.003,-0.001,0 +PARAM_TWIN_RIBBON_D=0,0.007,0.026,0.05,0.09,0.13,0.17,0.21,0.25,0.28,0.31,0.33,0.345,0.35,0.338,0.3,0.25,0.18,0.1,0.01,-0.08,-0.17,-0.27,-0.35,-0.43,-0.5,-0.55,-0.6,-0.62,-0.63,-0.628,-0.622,-0.612,-0.599,-0.583,-0.564,-0.54,-0.52,-0.49,-0.47,-0.44,-0.41,-0.38,-0.35,-0.32,-0.28,-0.25,-0.22,-0.19,-0.16,-0.14,-0.11,-0.09,-0.07,-0.047,-0.031,-0.018,-0.008,-0.002,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0.003,0.013,0.028,0.048,0.07,0.1,0.13,0.16,0.2,0.24,0.27,0.31,0.35,0.39,0.42,0.46,0.49,0.53,0.56,0.59,0.61,0.63,0.647,0.659,0.667,0.67,0.668,0.663,0.654,0.643,0.629,0.612,0.592,0.57,0.55,0.52,0.5,0.47,0.44,0.41,0.38,0.35,0.32,0.29,0.26,0.23,0.2,0.17,0.15,0.12,0.1,0.08,0.058,0.041,0.027,0.016,0.007,0.002,0 +PARAM_WING_DEFORM=0,0.002,0.009,0.02,0.035,0.052,0.073,0.1,0.12,0.15,0.17,0.2,0.23,0.26,0.28,0.31,0.34,0.36,0.39,0.41,0.428,0.446,0.461,0.473,0.482,0.488,0.49,0.489,0.485,0.479,0.47,0.46,0.447,0.433,0.418,0.401,0.382,0.363,0.343,0.32,0.3,0.28,0.26,0.23,0.21,0.19,0.17,0.15,0.127,0.108,0.089,0.072,0.057,0.043,0.03,0.02,0.011,0.005,0.001,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/Touch6.mtn b/public/pio/models/pio/motions/Touch6.mtn new file mode 100644 index 0000000..08f0ce1 --- /dev/null +++ b/public/pio/models/pio/motions/Touch6.mtn @@ -0,0 +1,53 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=0,-5.36,-13.95,-21.96,-27.75,-30,-25.49,-14.55,0,14.55,25.49,30,25.87,15.84,2.5,-10.84,-20.87,-25,-21.54,-13.14,-2.88,7.13,15.17,20.27,22,20.03,15.78,10.49,4.98,-0.04,-4.2,-6.97,-8,-7.55,-6.38,-4.69,-2.75,-0.74,1.13,2.74,3.96,4.73,5,4.94,4.77,4.51,4.19,3.82,3.42,2.99,2.56,2.12,1.71,1.31,0.95,0.63,0.37,0.17,0.04,0 +PARAM_ANGLE_Y=0,0.82,2.22,3.69,5,6,6.81,7.36,7.71,7.91,7.98,8,7.991,7.93,7.75,7.41,6.85,6,4.68,3.19,1.79,0.6,-0.29,-0.83,-1,-0.93,-0.79,-0.62,-0.43,-0.27,-0.13,-0.03,0,-0.31,-1.12,-2.29,-3.63,-5.03,-6.32,-7.43,-8.28,-8.81,-9,-8.89,-8.58,-8.12,-7.54,-6.88,-6.15,-5.38,-4.61,-3.82,-3.07,-2.36,-1.71,-1.14,-0.67,-0.31,-0.08,0 +PARAM_ANGLE_Z=0,-1.79,-4.65,-7.32,-9.25,-10,-9.02,-6.65,-3.5,-0.35,2.02,3,2.62,1.71,0.5,-0.71,-1.62,-2,-1.56,-0.49,0.82,2.1,3.13,3.78,4,3.28,1.72,-0.22,-2.24,-4.08,-5.61,-6.62,-7,-6.62,-5.63,-4.2,-2.56,-0.86,0.73,2.08,3.12,3.77,4,3.95,3.82,3.61,3.35,3.06,2.73,2.39,2.05,1.7,1.37,1.05,0.76,0.51,0.3,0.14,0.04,0 +PARAM_EMOTION=-1,-0.47,-0.471,-0.475,-0.48,-0.487,-0.493,-0.5,-0.505,-0.509,-0.51,-0.51,-0.51,-0.51,-0.51,-0.509,-0.51,-0.508,-0.507,-0.51,-0.505,-0.504,-0.503,-0.503,-0.502,-0.501,-0.499,-0.498,-0.497,-0.496,-0.495,-0.494,-0.493,-0.492,-0.491,-0.49,-0.489,-0.488,-0.487,-0.486,-0.49,-0.484,-0.484,-0.483,-0.48,-0.482,-0.48,-0.481,-0.48,-0.48,-0.48,-0.48,-0.481,-0.485,-0.492,-0.501,-0.512,-0.525,-0.54,-1 +PARAM_EYE_L_OPEN=0.55,0.02,0.019,0.019,0.018,0.02,0.017,0.016,0.02,0.015,0.01,0.014,0.013,0.01,0.012,0.01,0.011,0.01,0.01,0.01,0.009,0.01,0.008,0.01,0.01,0.007,0.01,0.006,0.01,0.01,0.005,0,0,0.004,0,0,0.003,0,0,0,0.002,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0.55 +PARAM_EYE_R_OPEN=0.55,0.02,0.019,0.019,0.018,0.02,0.017,0.016,0.02,0.015,0.01,0.014,0.013,0.01,0.012,0.01,0.011,0.01,0.01,0.01,0.009,0.01,0.008,0.01,0.01,0.007,0.01,0.006,0.01,0.01,0.005,0,0,0.004,0,0,0.003,0,0,0,0.002,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0.55 +PARAM_EYE_L_OPEN2=-1,-1,-1,-1,-1,-0.999,-1,-0.998,-0.997,-1,-0.995,-0.994,-0.993,-0.992,-0.991,-0.99,-0.989,-0.987,-0.986,-0.985,-0.983,-0.982,-0.981,-0.979,-0.978,-0.976,-0.975,-0.973,-0.972,-0.97,-0.969,-0.967,-0.966,-0.964,-0.963,-0.961,-0.96,-0.958,-0.957,-0.956,-0.954,-0.953,-0.952,-0.951,-0.949,-0.948,-0.947,-0.946,-0.945,-0.944,-0.944,-0.943,-0.94,-0.942,-0.94,-0.941,-0.94,-0.94,-0.94,-0.94 +PARAM_EYE_R_OPEN2=-1,-1,-1,-1,-1,-0.999,-1,-0.998,-0.997,-1,-0.995,-0.994,-0.993,-0.992,-0.991,-0.99,-0.989,-0.987,-0.986,-0.985,-0.983,-0.982,-0.981,-0.979,-0.978,-0.976,-0.975,-0.973,-0.972,-0.97,-0.969,-0.967,-0.966,-0.964,-0.963,-0.961,-0.96,-0.958,-0.957,-0.956,-0.954,-0.953,-0.952,-0.951,-0.949,-0.948,-0.947,-0.946,-0.945,-0.944,-0.944,-0.943,-0.94,-0.942,-0.94,-0.941,-0.94,-0.94,-0.94,-0.94 +PARAM_EYE_BALL_X=0 +PARAM_EYE_BALL_Y=0 +PARAM_BROW_L_Y=0,-0.008,-0.03,-0.06,-0.1,-0.13,-0.17,-0.2,-0.22,-0.235,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.24,-0.224,-0.19,-0.15,-0.1,-0.06,-0.03,-0.01,0 +PARAM_BROW_R_Y=0,-0.008,-0.03,-0.06,-0.09,-0.13,-0.16,-0.19,-0.21,-0.225,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.23,-0.215,-0.18,-0.14,-0.1,-0.06,-0.03,-0.01,0 +PARAM_BROW_ANGLE=0.2,0.195,0.183,0.164,0.14,0.12,0.102,0.084,0.071,0.063,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.06,0.069,0.089,0.11,0.14,0.16,0.182,0.195,0.2 +PARAM_BROW_SELECT=-0.5 +PARAM_MOUTH_OPEN_Y=0,0.91,0.896,0.86,0.8,0.74,0.67,0.61,0.55,0.51,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.53,0.6,0.69,0.78,0.85,0.89,0.91,0 +PARAM_MOUTH_OPEN2=0.9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0.9 +PARAM_MOUTH_EMO=0 +PARAM_CHEEK=0 +PARAM_BODY_ANGLE_X=0,-0.54,-1.39,-2.2,-2.77,-3,-2.83,-2.38,-1.73,-0.98,-0.21,0.51,1.13,1.6,1.9,2,1.9,1.66,1.33,0.95,0.55,0.16,-0.21,-0.52,-0.78,-0.94,-1,-0.997,-0.989,-0.977,-0.96,-0.94,-0.91,-0.88,-0.85,-0.82,-0.78,-0.74,-0.7,-0.66,-0.61,-0.57,-0.52,-0.48,-0.43,-0.39,-0.34,-0.3,-0.26,-0.22,-0.18,-0.15,-0.12,-0.09,-0.06,-0.04,-0.023,-0.011,-0.003,0 +PARAM_BODY_ANGLE_Z=0,1.25,3.25,5.12,6.47,7,6.93,6.73,6.43,6.08,5.69,5.29,4.91,4.56,4.26,4,3.7,3.44,3.21,3.01,2.83,2.67,2.52,2.38,2.25,2.12,2,1.87,1.75,1.63,1.51,1.4,1.3,1.19,1.1,1.01,0.92,0.83,0.76,0.68,0.61,0.55,0.48,0.43,0.37,0.32,0.28,0.23,0.2,0.16,0.13,0.1,0.08,0.056,0.039,0.025,0.014,0.006,0.002,0 +PARAM_BODY_Y=0,0.05,0.13,0.2,0.25,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.27,0.269,0.268,0.267,0.265,0.264,0.262,0.26,0.257,0.253,0.248,0.243,0.236,0.228,0.22,0.211,0.202,0.192,0.182,0.171,0.16,0.149,0.138,0.126,0.115,0.104,0.093,0.082,0.072,0.062,0.052,0.043,0.035,0.027,0.021,0.015,0.01,0.005,0.002,0.001,0 +PARAM_BREATH=0.5,0.56,0.66,0.75,0.81,0.84,0.73,0.57,0.41,0.29,0.25,0.35,0.52,0.67,0.79,0.83,0.73,0.57,0.41,0.3,0.26,0.3,0.4,0.53,0.66,0.76,0.8,0.794,0.78,0.76,0.73,0.7,0.66,0.62,0.59,0.55,0.51,0.48,0.44,0.42,0.39,0.375,0.364,0.36,0.362,0.367,0.374,0.384,0.396,0.409,0.422,0.435,0.448,0.46,0.471,0.481,0.489,0.495,0.499,0.5 +PARAM_BOING=0,0.04,0.14,0.27,0.39,0.49,0.53,0.46,0.29,0.08,-0.13,-0.29,-0.39,-0.43,-0.37,-0.22,-0.03,0.15,0.3,0.39,0.42,0.37,0.26,0.13,0,-0.11,-0.18,-0.2,-0.15,-0.06,0.02,0.08,0.1,0.08,0.04,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_HAIR_FRONT=0,0.13,0.34,0.53,0.68,0.73,0.62,0.34,0,-0.34,-0.6,-0.77,-0.83,-0.69,-0.36,0.08,0.53,0.86,1,0.89,0.62,0.29,-0.03,-0.29,-0.45,-0.51,-0.46,-0.35,-0.21,-0.07,0.06,0.16,0.23,0.26,0.252,0.23,0.2,0.16,0.11,0.06,0.01,-0.04,-0.08,-0.11,-0.13,-0.14,-0.137,-0.13,-0.12,-0.108,-0.094,-0.079,-0.064,-0.05,-0.037,-0.025,-0.015,-0.007,-0.002,0 +PARAM_HAIR_SIDE_R=0,0.05,0.16,0.29,0.42,0.53,0.6,0.62,0.59,0.52,0.43,0.35,0.28,0.23,0.22,0.25,0.31,0.39,0.47,0.54,0.58,0.59,0.56,0.51,0.44,0.36,0.27,0.14,0.07,0.03,0.01,0,0.002,0.008,0.017,0.029,0.041,0.055,0.069,0.081,0.093,0.102,0.108,0.11,0.109,0.105,0.099,0.091,0.082,0.072,0.062,0.051,0.041,0.031,0.023,0.015,0.009,0.004,0.001,0 +PARAM_HAIR_SIDE_L=0,0.04,0.13,0.25,0.36,0.46,0.52,0.55,0.56,0.566,0.569,0.57,0.57,0.57,0.57,0.53,0.44,0.33,0.22,0.13,0.08,0.06,0.068,0.09,0.12,0.16,0.19,0.23,0.26,0.28,0.295,0.3,0.291,0.27,0.23,0.18,0.13,0.08,0.02,-0.03,-0.08,-0.12,-0.14,-0.15,-0.148,-0.143,-0.135,-0.124,-0.112,-0.098,-0.084,-0.07,-0.056,-0.043,-0.031,-0.02,-0.012,-0.005,-0.001,0 +PARAM_TWIN_RIBBON_D=0,0.05,0.18,0.33,0.49,0.61,0.68,0.71,0.62,0.44,0.21,-0.03,-0.25,-0.43,-0.55,-0.6,-0.52,-0.34,-0.11,0.11,0.29,0.4,0.44,0.38,0.24,0.06,-0.12,-0.28,-0.42,-0.51,-0.54,-0.51,-0.44,-0.35,-0.24,-0.12,-0.01,0.1,0.19,0.27,0.31,0.33,0.327,0.319,0.305,0.288,0.27,0.24,0.22,0.19,0.16,0.14,0.11,0.09,0.06,0.04,0.025,0.011,0.003,0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,-0.05,-0.18,-0.36,-0.53,-0.66,-0.71,-0.67,-0.56,-0.41,-0.23,-0.05,0.13,0.3,0.44,0.56,0.63,0.66,0.648,0.61,0.56,0.5,0.42,0.33,0.24,0.14,0.05,-0.04,-0.12,-0.18,-0.23,-0.27,-0.28,-0.279,-0.276,-0.27,-0.263,-0.255,-0.245,-0.233,-0.221,-0.208,-0.193,-0.179,-0.163,-0.148,-0.132,-0.117,-0.101,-0.087,-0.072,-0.059,-0.047,-0.035,-0.025,-0.017,-0.01,-0.004,-0.001,0 +PARAM_WING_DEFORM=0,-0.08,-0.26,-0.5,-0.74,-0.92,-1,-0.994,-0.975,-0.95,-0.91,-0.86,-0.81,-0.75,-0.69,-0.62,-0.55,-0.48,-0.41,-0.33,-0.26,-0.19,-0.12,-0.05,0.01,0.07,0.12,0.16,0.2,0.24,0.26,0.275,0.28,0.279,0.276,0.27,0.263,0.255,0.245,0.233,0.221,0.208,0.193,0.179,0.163,0.148,0.132,0.117,0.101,0.087,0.072,0.059,0.047,0.035,0.025,0.017,0.01,0.004,0.001,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_HAT=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_EMOTION=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_BUST=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 \ No newline at end of file diff --git a/public/pio/models/pio/motions/WakeUp.mtn b/public/pio/models/pio/motions/WakeUp.mtn new file mode 100644 index 0000000..5821b6c --- /dev/null +++ b/public/pio/models/pio/motions/WakeUp.mtn @@ -0,0 +1,46 @@ +# Live2D Animator Motion Data +$fps=30 + +$fadein=0 + +$fadeout=0 + +PARAM_ANGLE_X=10,9.54,8.55,7.31,6.03,4.86,3.89,3.24,3,3.007,3.027,3.06,3.1,3.16,3.22,3.3,3.38,3.47,3.56,3.67,3.77,3.89,4,4.12,4.24,4.36,4.48,4.61,4.73,4.85,4.97,5.08,5.19,5.3,5.4,5.49,5.58,5.66,5.74,5.8,5.86,5.91,5.95,5.98,5.994,6,5.92,5.72,5.41,5.03,4.59,4.1,3.59,3.07,2.54,2.05,1.58,1.14,0.76,0.45,0.21,0.05,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Y=-8,-6.49,-3.23,0.83,5.05,8.9,12.09,14.21,15,14.998,14.993,14.984,14.971,14.954,14.93,14.9,14.87,14.83,14.78,14.73,14.67,14.6,14.53,14.44,14.35,14.25,14.14,14.02,13.89,13.75,13.6,13.45,13.28,13.09,12.9,12.7,12.49,12.26,12.02,11.77,11.5,11.23,10.94,10.64,10.33,10,9.53,8.95,8.27,7.54,6.76,5.96,5.15,4.36,3.58,2.85,2.18,1.57,1.04,0.6,0.28,0.07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_ANGLE_Z=10,8.82,6.27,3.09,-0.21,-3.22,-5.72,-7.38,-8,-7.999,-7.996,-7.99,-7.981,-7.969,-7.954,-7.934,-7.91,-7.88,-7.85,-7.81,-7.76,-7.71,-7.66,-7.59,-7.52,-7.45,-7.36,-7.27,-7.17,-7.06,-6.94,-6.81,-6.68,-6.53,-6.38,-6.21,-6.04,-5.85,-5.66,-5.46,-5.24,-5.02,-4.78,-4.53,-4.27,-4,-3.54,-2.87,-2.01,-1.03,0.03,1.16,2.32,3.47,4.61,5.69,6.69,7.61,8.42,9.07,9.57,9.89,10,9.19,7.81,6.35,5.03,4,2.98,2.16,1.5,0.99,0.62,0.35,0.18,0.07,0.02,0 +PARAM_EMOTION=0 +PARAM_EYE_L_OPEN=0.06,0.08,0.14,0.21,0.28,0.34,0.39,0.43,0.44,0.44,0.44,0.44,0.439,0.438,0.44,0.436,0.435,0.434,0.432,0.431,0.43,0.428,0.427,0.425,0.423,0.422,0.42,0.419,0.417,0.415,0.414,0.412,0.411,0.409,0.408,0.407,0.406,0.404,0.403,0.403,0.402,0.4,0.401,0.4,0.4,0.4,0.59,0.64,0.69,0.73,0.76,0.79,0.807,0.82,0.828,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.819,0.79,0.75,0.7,0.65,0.6,0.56,0.53,0.507,0.5 +PARAM_EYE_R_OPEN=0.05,0.08,0.13,0.2,0.27,0.34,0.39,0.43,0.44,0.44,0.44,0.44,0.439,0.438,0.44,0.436,0.435,0.434,0.432,0.431,0.43,0.428,0.427,0.425,0.423,0.422,0.42,0.419,0.417,0.415,0.414,0.412,0.411,0.409,0.408,0.407,0.406,0.404,0.403,0.403,0.402,0.4,0.401,0.4,0.4,0.4,0.59,0.64,0.69,0.73,0.76,0.79,0.807,0.82,0.828,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.83,0.819,0.79,0.75,0.7,0.65,0.6,0.56,0.53,0.507,0.5 +PARAM_EYE_BALL_X=0,0.004,0.014,0.026,0.039,0.05,0.06,0.067,0.07,0.071,0.072,0.073,0.074,0.075,0.076,0.076,0.077,0.078,0.08,0.08,0.08,0.081,0.08,0.083,0.083,0.084,0.08,0.086,0.086,0.087,0.09,0.088,0.089,0.09,0.091,0.092,0.092,0.093,0.09,0.095,0.096,0.096,0.097,0.098,0.099,0.1,0.102,0.105,0.109,0.113,0.118,0.122,0.125,0.128,0.129,0.13,0.13,0.13,0.13,0.13,0.13,0.128,0.127,0.125,0.122,0.119,0.115,0.11,0.101,0.089,0.074,0.058,0.042,0.028,0.016,0.007,0.002,0 +PARAM_EYE_BALL_Y=-1,-0.97,-0.89,-0.79,-0.7,-0.61,-0.53,-0.48,-0.46,-0.457,-0.455,-0.452,-0.45,-0.448,-0.446,-0.444,-0.442,-0.44,-0.438,-0.437,-0.435,-0.434,-0.433,-0.431,-0.43,-0.429,-0.428,-0.427,-0.426,-0.425,-0.425,-0.424,-0.42,-0.423,-0.42,-0.422,-0.42,-0.42,-0.421,-0.42,-0.42,-0.42,-0.42,-0.42,-0.42,-0.42,-0.429,-0.45,-0.49,-0.53,-0.58,-0.62,-0.66,-0.7,-0.73,-0.75,-0.769,-0.785,-0.798,-0.808,-0.816,-0.821,-0.825,-0.828,-0.829,-0.83,-0.83,-0.83,-0.8,-0.73,-0.62,-0.49,-0.37,-0.25,-0.14,-0.07,-0.02,0 +PARAM_BROW_L_Y=-1,-0.99,-0.97,-0.94,-0.91,-0.88,-0.85,-0.83,-0.81,-0.794,-0.778,-0.763,-0.749,-0.735,-0.722,-0.709,-0.698,-0.686,-0.675,-0.665,-0.655,-0.646,-0.637,-0.629,-0.621,-0.613,-0.607,-0.6,-0.594,-0.589,-0.584,-0.579,-0.575,-0.571,-0.567,-0.564,-0.561,-0.559,-0.557,-0.555,-0.553,-0.552,-0.551,-0.55,-0.55,-0.55,-0.561,-0.59,-0.63,-0.68,-0.73,-0.78,-0.82,-0.85,-0.873,-0.88,-0.88,-0.88,-0.88,-0.88,-0.879,-0.876,-0.872,-0.867,-0.859,-0.849,-0.836,-0.82,-0.78,-0.69,-0.59,-0.46,-0.34,-0.23,-0.13,-0.06,-0.02,0 +PARAM_BROW_R_Y=-1,-0.988,-0.96,-0.93,-0.9,-0.87,-0.84,-0.819,-0.81,-0.806,-0.802,-0.799,-0.795,-0.792,-0.789,-0.786,-0.783,-0.78,-0.778,-0.775,-0.773,-0.771,-0.769,-0.767,-0.765,-0.764,-0.762,-0.761,-0.759,-0.758,-0.757,-0.756,-0.755,-0.754,-0.754,-0.753,-0.75,-0.752,-0.75,-0.751,-0.75,-0.75,-0.75,-0.75,-0.75,-0.75,-0.759,-0.78,-0.81,-0.85,-0.89,-0.93,-0.96,-0.98,-0.995,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-0.97,-0.88,-0.75,-0.6,-0.44,-0.3,-0.17,-0.08,-0.02,0 +PARAM_BROW_L_ANGLE=0 +PARAM_BROW_R_ANGLE=0 +PARAM_EAR_DEFORM=0,0.02,0.07,0.13,0.19,0.24,0.29,0.32,0.33,0.33,0.33,0.328,0.327,0.325,0.323,0.32,0.318,0.315,0.311,0.308,0.304,0.299,0.295,0.29,0.285,0.28,0.274,0.269,0.263,0.257,0.251,0.244,0.238,0.231,0.225,0.218,0.211,0.204,0.197,0.19,0.183,0.176,0.169,0.161,0.154,0.147,0.14,0.133,0.126,0.119,0.112,0.105,0.099,0.092,0.086,0.079,0.073,0.067,0.061,0.056,0.05,0.045,0.04,0.035,0.031,0.026,0.022,0.019,0.015,0.012,0.01,0.007,0.005,0.003,0.002,0.001,0,0 +PARAM_MOUTH_OPEN_Y=0.79,0.79,0.79,0.788,0.786,0.784,0.782,0.779,0.776,0.773,0.769,0.765,0.76,0.756,0.751,0.745,0.74,0.734,0.729,0.722,0.716,0.71,0.703,0.697,0.69,0.683,0.676,0.669,0.662,0.655,0.648,0.641,0.634,0.626,0.62,0.612,0.606,0.599,0.592,0.586,0.579,0.573,0.567,0.561,0.555,0.55,0.545,0.54,0.535,0.531,0.527,0.523,0.52,0.517,0.515,0.512,0.51,0.509,0.507,0.506,0.504,0.503,0.502,0.502,0.5,0.501,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 +PARAM_BODY_ANGLE_X=0 +PARAM_BODY_ANGLE_Y=0 +PARAM_BODY_ANGLE_Z=0 +PARAM_BREATH=0.5,0.514,0.55,0.58,0.62,0.66,0.69,0.712,0.72,0.719,0.717,0.714,0.71,0.704,0.698,0.69,0.682,0.673,0.664,0.653,0.643,0.631,0.62,0.608,0.596,0.584,0.572,0.559,0.547,0.535,0.523,0.512,0.501,0.49,0.48,0.471,0.462,0.454,0.446,0.44,0.434,0.429,0.425,0.422,0.421,0.42,0.42,0.421,0.422,0.424,0.426,0.428,0.431,0.433,0.436,0.44,0.443,0.447,0.45,0.454,0.458,0.461,0.465,0.469,0.472,0.476,0.479,0.482,0.485,0.488,0.491,0.493,0.495,0.497,0.498,0.499,0.5,0.5 +PARAM_HAIR_SIDE=0 +PARAM_HAIR_BACK=0 +PARAM_WING_ANGLE=0,0.009,0.027,0.05,0.07,0.1,0.114,0.126,0.13,0.13,0.13,0.13,0.129,0.13,0.127,0.126,0.125,0.124,0.123,0.121,0.12,0.118,0.116,0.114,0.112,0.11,0.108,0.106,0.104,0.101,0.099,0.096,0.094,0.091,0.089,0.086,0.083,0.08,0.078,0.075,0.072,0.069,0.066,0.064,0.061,0.058,0.055,0.052,0.05,0.047,0.044,0.041,0.039,0.036,0.034,0.031,0.029,0.026,0.024,0.022,0.02,0.018,0.016,0.014,0.012,0.01,0.009,0.007,0.006,0.005,0.004,0.003,0.002,0,0.001,0,0,0 +PARAM_WING_DEFORM=0,0.016,0.05,0.09,0.14,0.18,0.21,0.23,0.24,0.24,0.24,0.239,0.238,0.236,0.235,0.233,0.231,0.229,0.226,0.224,0.221,0.218,0.214,0.211,0.207,0.203,0.2,0.195,0.191,0.187,0.182,0.178,0.173,0.168,0.163,0.158,0.154,0.148,0.143,0.138,0.133,0.128,0.123,0.117,0.112,0.107,0.102,0.097,0.092,0.086,0.082,0.077,0.072,0.067,0.062,0.058,0.053,0.049,0.045,0.04,0.037,0.033,0.029,0.026,0.022,0.019,0.016,0.014,0.011,0.009,0.007,0.005,0.004,0.002,0.001,0.001,0,0 +PARAM_RIBBON_DEFORM=0,0,0,0,0,0.014,0.05,0.1,0.14,0.18,0.19,0.11,-0.02,-0.11,-0.14,-0.08,0.03,0.1,0.12,0.09,0.03,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PARAM_BLUSH=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0.005,0.012,0.02,0.03,0.042,0.056,0.071,0.087,0.104,0.121,0.14,0.159,0.178,0.198,0.217,0.237,0.256,0.275,0.293,0.31,0.327,0.343,0.358,0.371,0.383,0.394,0.403,0.41,0.416,0.419,0.42,0.416,0.406,0.39,0.37,0.35,0.32,0.29,0.26,0.23,0.2,0.17,0.14,0.11,0.08,0.06,0.04,0.023,0.011,0.003,0 +VISIBLE:PSD=1 +VISIBLE:PARTS_01_RIBBON=1 +VISIBLE:PARTS_01_FACE_001=1 +VISIBLE:PARTS_01_EYE_001=1 +VISIBLE:PARTS_01_EYE_BALL_001=1 +VISIBLE:PARTS_01_BROW_001=1 +VISIBLE:PARTS_01_MOUTH_001=1 +VISIBLE:PARTS_01_NOSE_001=1 +VISIBLE:PARTS_01_EAR_001=1 +VISIBLE:PARTS_01_HAIR_FRONT_001=1 +VISIBLE:PARTS_01_HAIR_SIDE_001=1 +VISIBLE:PARTS_01_HAIR_BACK_001=1 +VISIBLE:PARTS_01_BODY=1 +VISIBLE:PARTS_01_WING=1 +VISIBLE:PARTS_01_HAT=1 \ No newline at end of file diff --git a/public/pio/models/pio/textures/default-costume.png b/public/pio/models/pio/textures/default-costume.png new file mode 100644 index 0000000..a77c514 Binary files /dev/null and b/public/pio/models/pio/textures/default-costume.png differ diff --git a/public/pio/models/pio/textures/pajamas-costume.png b/public/pio/models/pio/textures/pajamas-costume.png new file mode 100644 index 0000000..4e171fd Binary files /dev/null and b/public/pio/models/pio/textures/pajamas-costume.png differ diff --git a/public/pio/models/pio/textures/school-costume.png b/public/pio/models/pio/textures/school-costume.png new file mode 100644 index 0000000..f23adb2 Binary files /dev/null and b/public/pio/models/pio/textures/school-costume.png differ diff --git a/public/pio/static/avatar.jpg b/public/pio/static/avatar.jpg new file mode 100644 index 0000000..348baa2 Binary files /dev/null and b/public/pio/static/avatar.jpg differ diff --git a/public/pio/static/l2d.js b/public/pio/static/l2d.js new file mode 100644 index 0000000..817c4fb --- /dev/null +++ b/public/pio/static/l2d.js @@ -0,0 +1 @@ +!function(t){function i(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,i),o.l=!0,o.exports}var e={};i.m=t,i.c=e,i.d=function(t,e,r){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,i){return Object.prototype.hasOwnProperty.call(t,i)},i.p="",i(i.s=4)}([function(t,i,e){"use strict";function r(){this.live2DModel=null,this.modelMatrix=null,this.eyeBlink=null,this.physics=null,this.pose=null,this.debugMode=!1,this.initialized=!1,this.updating=!1,this.alpha=1,this.accAlpha=0,this.lipSync=!1,this.lipSyncValue=0,this.accelX=0,this.accelY=0,this.accelZ=0,this.dragX=0,this.dragY=0,this.startTimeMSec=null,this.mainMotionManager=new h,this.expressionManager=new h,this.motions={},this.expressions={},this.isTexLoaded=!1}function o(){AMotion.prototype.constructor.call(this),this.paramList=new Array}function n(){this.id="",this.type=-1,this.value=null}function s(){this.nextBlinkTime=null,this.stateStartTime=null,this.blinkIntervalMsec=null,this.eyeState=g.STATE_FIRST,this.blinkIntervalMsec=4e3,this.closingMotionMsec=100,this.closedMotionMsec=50,this.openingMotionMsec=150,this.closeIfZero=!0,this.eyeID_L="PARAM_EYE_L_OPEN",this.eyeID_R="PARAM_EYE_R_OPEN"}function _(){this.tr=new Float32Array(16),this.identity()}function a(t,i){_.prototype.constructor.call(this),this.width=t,this.height=i}function h(){MotionQueueManager.prototype.constructor.call(this),this.currentPriority=null,this.reservePriority=null,this.super=MotionQueueManager.prototype}function l(){this.physicsList=new Array,this.startTimeMSec=UtSystem.getUserTimeMSec()}function $(){this.lastTime=0,this.lastModel=null,this.partsGroups=new Array}function u(t){this.paramIndex=-1,this.partsIndex=-1,this.link=null,this.id=t}function p(){this.EPSILON=.01,this.faceTargetX=0,this.faceTargetY=0,this.faceX=0,this.faceY=0,this.faceVX=0,this.faceVY=0,this.lastTimeSec=0}function f(){_.prototype.constructor.call(this),this.screenLeft=null,this.screenRight=null,this.screenTop=null,this.screenBottom=null,this.maxLeft=null,this.maxRight=null,this.maxTop=null,this.maxBottom=null,this.max=Number.MAX_VALUE,this.min=0}function c(){}var d=0;r.prototype.getModelMatrix=function(){return this.modelMatrix},r.prototype.setAlpha=function(t){t>.999&&(t=1),t<.001&&(t=0),this.alpha=t},r.prototype.getAlpha=function(){return this.alpha},r.prototype.isInitialized=function(){return this.initialized},r.prototype.setInitialized=function(t){this.initialized=t},r.prototype.isUpdating=function(){return this.updating},r.prototype.setUpdating=function(t){this.updating=t},r.prototype.getLive2DModel=function(){return this.live2DModel},r.prototype.setLipSync=function(t){this.lipSync=t},r.prototype.setLipSyncValue=function(t){this.lipSyncValue=t},r.prototype.setAccel=function(t,i,e){this.accelX=t,this.accelY=i,this.accelZ=e},r.prototype.setDrag=function(t,i){this.dragX=t,this.dragY=i},r.prototype.getMainMotionManager=function(){return this.mainMotionManager},r.prototype.getExpressionManager=function(){return this.expressionManager},r.prototype.loadModelData=function(t,i){var e=c.getPlatformManager();this.debugMode&&e.log("Load model : "+t);var r=this;e.loadLive2DModel(t,function(t){if(r.live2DModel=t,r.live2DModel.saveParam(),0!=Live2D.getError())return void console.error("Error : Failed to loadModelData().");r.modelMatrix=new a(r.live2DModel.getCanvasWidth(),r.live2DModel.getCanvasHeight()),r.modelMatrix.setWidth(2),r.modelMatrix.setCenterPosition(0,0),i(r.live2DModel)})},r.prototype.loadTexture=function(t,i,e){d++;var r=c.getPlatformManager();this.debugMode&&r.log("Load Texture : "+i);var o=this;r.loadTexture(this.live2DModel,t,i,function(){d--,0==d&&(o.isTexLoaded=!0),"function"==typeof e&&e()})},r.prototype.loadMotion=function(t,i,e){var r=c.getPlatformManager();this.debugMode&&r.log("Load Motion : "+i);var o=null,n=this;r.loadBytes(i,function(i){o=Live2DMotion.loadMotion(i),null!=t&&(n.motions[t]=o),e(o)})},r.prototype.loadExpression=function(t,i,e){var r=c.getPlatformManager();this.debugMode&&r.log("Load Expression : "+i);var n=this;r.loadBytes(i,function(i){null!=t&&(n.expressions[t]=o.loadJson(i)),"function"==typeof e&&e()})},r.prototype.loadPose=function(t,i){var e=c.getPlatformManager();this.debugMode&&e.log("Load Pose : "+t);var r=this;try{e.loadBytes(t,function(t){r.pose=$.load(t),"function"==typeof i&&i()})}catch(t){console.warn(t)}},r.prototype.loadPhysics=function(t){var i=c.getPlatformManager();this.debugMode&&i.log("Load Physics : "+t);var e=this;try{i.loadBytes(t,function(t){e.physics=l.load(t)})}catch(t){console.warn(t)}},r.prototype.hitTestSimple=function(t,i,e){if(null===this.live2DModel)return!1;var r=this.live2DModel.getDrawDataIndex(t);if(r<0)return!1;for(var o=this.live2DModel.getTransformedPoints(r),n=this.live2DModel.getCanvasWidth(),s=0,_=this.live2DModel.getCanvasHeight(),a=0,h=0;hs&&(s=l),$<_&&(_=$),$>a&&(a=$)}var u=this.modelMatrix.invertTransformX(i),p=this.modelMatrix.invertTransformY(e);return n<=u&&u<=s&&_<=p&&p<=a},r.prototype.hitTestSimpleCustom=function(t,i,e,r){return null!==this.live2DModel&&(e>=t[0]&&e<=i[0]&&r<=t[1]&&r>=i[1])},o.prototype=new AMotion,o.EXPRESSION_DEFAULT="DEFAULT",o.TYPE_SET=0,o.TYPE_ADD=1,o.TYPE_MULT=2,o.loadJson=function(t){var i=new o,e=c.getPlatformManager(),r=e.jsonParseFromBytes(t);if(i.setFadeIn(parseInt(r.fade_in)>0?parseInt(r.fade_in):1e3),i.setFadeOut(parseInt(r.fade_out)>0?parseInt(r.fade_out):1e3),null==r.params)return i;var s=r.params,_=s.length;i.paramList=[];for(var a=0;a<_;a++){var h=s[a],l=h.id.toString(),$=parseFloat(h.val),u=o.TYPE_ADD,p=null!=h.calc?h.calc.toString():"add";if((u="add"===p?o.TYPE_ADD:"mult"===p?o.TYPE_MULT:"set"===p?o.TYPE_SET:o.TYPE_ADD)==o.TYPE_ADD){var f=null==h.def?0:parseFloat(h.def);$-=f}else if(u==o.TYPE_MULT){var f=null==h.def?1:parseFloat(h.def);0==f&&(f=1),$/=f}var d=new n;d.id=l,d.type=u,d.value=$,i.paramList.push(d)}return i},o.prototype.updateParamExe=function(t,i,e,r){for(var n=this.paramList.length-1;n>=0;--n){var s=this.paramList[n];s.type==o.TYPE_ADD?t.addToParamFloat(s.id,s.value,e):s.type==o.TYPE_MULT?t.multParamFloat(s.id,s.value,e):s.type==o.TYPE_SET&&t.setParamFloat(s.id,s.value,e)}},s.prototype.calcNextBlink=function(){return UtSystem.getUserTimeMSec()+Math.random()*(2*this.blinkIntervalMsec-1)},s.prototype.setInterval=function(t){this.blinkIntervalMsec=t},s.prototype.setEyeMotion=function(t,i,e){this.closingMotionMsec=t,this.closedMotionMsec=i,this.openingMotionMsec=e},s.prototype.updateParam=function(t){var i,e=UtSystem.getUserTimeMSec(),r=0;switch(this.eyeState){case g.STATE_CLOSING:r=(e-this.stateStartTime)/this.closingMotionMsec,r>=1&&(r=1,this.eyeState=g.STATE_CLOSED,this.stateStartTime=e),i=1-r;break;case g.STATE_CLOSED:r=(e-this.stateStartTime)/this.closedMotionMsec,r>=1&&(this.eyeState=g.STATE_OPENING,this.stateStartTime=e),i=0;break;case g.STATE_OPENING:r=(e-this.stateStartTime)/this.openingMotionMsec,r>=1&&(r=1,this.eyeState=g.STATE_INTERVAL,this.nextBlinkTime=this.calcNextBlink()),i=r;break;case g.STATE_INTERVAL:this.nextBlinkTime=t)&&(!(this.currentPriority>=t)&&(this.reservePriority=t,!0))},h.prototype.setReservePriority=function(t){this.reservePriority=t},h.prototype.updateParam=function(t){var i=MotionQueueManager.prototype.updateParam.call(this,t);return this.isFinished()&&(this.currentPriority=0),i},h.prototype.startMotionPrio=function(t,i){return i==this.reservePriority&&(this.reservePriority=0),this.currentPriority=i,this.startMotion(t,!1)},l.load=function(t){for(var i=new l,e=c.getPlatformManager(),r=e.jsonParseFromBytes(t),o=r.physics_hair,n=o.length,s=0;s=0)break;r=n,o=t.getPartsOpacity(s),o+=e/.5,o>1&&(o=1)}}r<0&&(r=0,o=1);for(var n=0;n.15&&(a=1-.15/(1-o)),h>a&&(h=a),t.setPartsOpacity(s,h)}}},$.prototype.copyOpacityOtherParts=function(t,i){for(var e=0;eo)&&(l*=o/u,$*=o/u,u=o),this.faceVX+=l,this.faceVY+=$;var f=.5*(Math.sqrt(o*o+16*o*_-8*o*_)-o),c=Math.sqrt(this.faceVX*this.faceVX+this.faceVY*this.faceVY);c>f&&(this.faceVX*=f/c,this.faceVY*=f/c),this.faceX+=this.faceVX,this.faceY+=this.faceVY}},f.prototype=new _,f.prototype.getMaxScale=function(){return this.max},f.prototype.getMinScale=function(){return this.min},f.prototype.setMaxScale=function(t){this.max=t},f.prototype.setMinScale=function(t){this.min=t},f.prototype.isMaxScale=function(){return this.getScaleX()==this.max},f.prototype.isMinScale=function(){return this.getScaleX()==this.min},f.prototype.adjustTranslate=function(t,i){this.tr[0]*this.maxLeft+(this.tr[12]+t)>this.screenLeft&&(t=this.screenLeft-this.tr[0]*this.maxLeft-this.tr[12]),this.tr[0]*this.maxRight+(this.tr[12]+t)this.screenBottom&&(i=this.screenBottom-this.tr[5]*this.maxBottom-this.tr[13]);var e=[1,0,0,0,0,1,0,0,0,0,1,0,t,i,0,1];_.mul(e,this.tr,this.tr)},f.prototype.adjustScale=function(t,i,e){var r=e*this.tr[0];r0&&(e=this.min/this.tr[0]):r>this.max&&this.tr[0]>0&&(e=this.max/this.tr[0]);var o=[1,0,0,0,0,1,0,0,0,0,1,0,t,i,0,1],n=[e,0,0,0,0,e,0,0,0,0,1,0,0,0,0,1],s=[1,0,0,0,0,1,0,0,0,0,1,0,-t,-i,0,1];_.mul(s,this.tr,this.tr),_.mul(n,this.tr,this.tr),_.mul(o,this.tr,this.tr)},f.prototype.setScreenRect=function(t,i,e,r){this.screenLeft=t,this.screenRight=i,this.screenTop=r,this.screenBottom=e},f.prototype.setMaxScreenRect=function(t,i,e,r){this.maxLeft=t,this.maxRight=i,this.maxTop=r,this.maxBottom=e},f.prototype.getScreenLeft=function(){return this.screenLeft},f.prototype.getScreenRight=function(){return this.screenRight},f.prototype.getScreenBottom=function(){return this.screenBottom},f.prototype.getScreenTop=function(){return this.screenTop},f.prototype.getMaxLeft=function(){return this.maxLeft},f.prototype.getMaxRight=function(){return this.maxRight},f.prototype.getMaxBottom=function(){return this.maxBottom},f.prototype.getMaxTop=function(){return this.maxTop},c.platformManager=null,c.getPlatformManager=function(){return c.platformManager},c.setPlatformManager=function(t){c.platformManager=t},t.exports={L2DTargetPoint:p,Live2DFramework:c,L2DViewMatrix:f,L2DPose:$,L2DPartsParam:u,L2DPhysics:l,L2DMotionManager:h,L2DModelMatrix:a,L2DMatrix44:_,EYE_STATE:g,L2DEyeBlink:s,L2DExpressionParam:n,L2DExpressionMotion:o,L2DBaseModel:r}},function(t,i,e){"use strict";var r={DEBUG_LOG:!1,DEBUG_MOUSE_LOG:!1,DEBUG_DRAW_HIT_AREA:!1,DEBUG_DRAW_ALPHA_MODEL:!1,VIEW_MAX_SCALE:2,VIEW_MIN_SCALE:.8,VIEW_LOGICAL_LEFT:-1,VIEW_LOGICAL_RIGHT:1,VIEW_LOGICAL_MAX_LEFT:-2,VIEW_LOGICAL_MAX_RIGHT:2,VIEW_LOGICAL_MAX_BOTTOM:-2,VIEW_LOGICAL_MAX_TOP:2,PRIORITY_NONE:0,PRIORITY_IDLE:1,PRIORITY_SLEEPY:2,PRIORITY_NORMAL:3,PRIORITY_FORCE:4,MOTION_GROUP_IDLE:"idle",MOTION_GROUP_SLEEPY:"sleepy",MOTION_GROUP_TAP_BODY:"tap_body",MOTION_GROUP_FLICK_HEAD:"flick_head",MOTION_GROUP_PINCH_IN:"pinch_in",MOTION_GROUP_PINCH_OUT:"pinch_out",MOTION_GROUP_SHAKE:"shake",HIT_AREA_HEAD:"head",HIT_AREA_BODY:"body"};t.exports=r},function(t,i,e){"use strict";function r(t){n=t}function o(){return n}Object.defineProperty(i,"__esModule",{value:!0}),i.setContext=r,i.getContext=o;var n=void 0},function(t,i,e){"use strict";function r(){}r.matrixStack=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],r.depth=0,r.currentMatrix=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],r.tmp=new Array(16),r.reset=function(){this.depth=0},r.loadIdentity=function(){for(var t=0;t<16;t++)this.currentMatrix[t]=t%5==0?1:0},r.push=function(){var t=(this.depth,16*(this.depth+1));this.matrixStack.lengthe.left&&i.y>e.top)return i;var o=t.x-i.x,n=t.y-i.y,s=r(o,n);i.xat.frameBuffers.length&&(this.curFrameNo=this.getMaskRenderTexture()),this.tmpModelToViewMatrix=new R,this.tmpMatrix2=new R,this.tmpMatrixForMask=new R,this.tmpMatrixForDraw=new R,this.CHANNEL_COLORS=new Array;var i=new A;i=new A,i.r=0,i.g=0,i.b=0,i.a=1,this.CHANNEL_COLORS.push(i),i=new A,i.r=1,i.g=0,i.b=0,i.a=0,this.CHANNEL_COLORS.push(i),i=new A,i.r=0,i.g=1,i.b=0,i.a=0,this.CHANNEL_COLORS.push(i),i=new A,i.r=0,i.g=0,i.b=1,i.a=0,this.CHANNEL_COLORS.push(i);for(var e=0;eG._$T7){t._$NP|=i._$4s;throw new lt("_$gi _$C _$li , _$n0 _$_ version _$li ( SDK : "+G._$T7+" < _$f0 : "+r+" )@_$SS#loadModel()\n")}var h=o._$nP();if(r>=G._$s7){var l=o._$9T(),$=o._$9T();if(-30584!=l||-30584!=$)throw t._$NP|=i._$0s,new lt("_$gi _$C _$li , _$0 _$6 _$Ui.")}t._$KS(h);var u=t.getModelContext();u.setDrawParam(t.getDrawParam()),u.init()}catch(t){_._$Rb(t)}},i.prototype._$KS=function(t){this._$MT=t},i.prototype.getModelImpl=function(){return null==this._$MT&&(this._$MT=new p,this._$MT._$zP()),this._$MT},i.prototype.getCanvasWidth=function(){return null==this._$MT?0:this._$MT.getCanvasWidth()},i.prototype.getCanvasHeight=function(){return null==this._$MT?0:this._$MT.getCanvasHeight()},i.prototype.getParamFloat=function(t){return"number"!=typeof t&&(t=this._$5S.getParamIndex(u.getID(t))),this._$5S.getParamFloat(t)},i.prototype.setParamFloat=function(t,i,e){"number"!=typeof t&&(t=this._$5S.getParamIndex(u.getID(t))),arguments.length<3&&(e=1),this._$5S.setParamFloat(t,this._$5S.getParamFloat(t)*(1-e)+i*e)},i.prototype.addToParamFloat=function(t,i,e){"number"!=typeof t&&(t=this._$5S.getParamIndex(u.getID(t))),arguments.length<3&&(e=1),this._$5S.setParamFloat(t,this._$5S.getParamFloat(t)+i*e)},i.prototype.multParamFloat=function(t,i,e){"number"!=typeof t&&(t=this._$5S.getParamIndex(u.getID(t))),arguments.length<3&&(e=1),this._$5S.setParamFloat(t,this._$5S.getParamFloat(t)*(1+(i-1)*e))},i.prototype.getParamIndex=function(t){return this._$5S.getParamIndex(u.getID(t))},i.prototype.loadParam=function(){this._$5S.loadParam()},i.prototype.saveParam=function(){this._$5S.saveParam()},i.prototype.init=function(){this._$5S.init()},i.prototype.update=function(){this._$5S.update()},i.prototype._$Rs=function(){return _._$li("_$60 _$PT _$Rs()"),-1},i.prototype._$Ds=function(t){_._$li("_$60 _$PT _$SS#_$Ds() \n")},i.prototype._$K2=function(){},i.prototype.draw=function(){},i.prototype.getModelContext=function(){return this._$5S},i.prototype._$s2=function(){return this._$NP},i.prototype._$P7=function(t,i,e,r){var o=-1,n=0,s=this;if(0!=e)if(1==t.length){var _=t[0],a=0!=s.getParamFloat(_),h=i[0],l=s.getPartsOpacity(h),$=e/r;a?(l+=$)>1&&(l=1):(l-=$)<0&&(l=0),s.setPartsOpacity(h,l)}else{for(var u=0;u=0)break;o=u;var h=i[u];n=s.getPartsOpacity(h),n+=e/r,n>1&&(n=1)}}o<0&&(console.log("No _$wi _$q0/ _$U default[%s]",t[0]),o=0,n=1,s.loadParam(),s.setParamFloat(t[o],n),s.saveParam());for(var u=0;u.15&&(f=1-.15/(1-n)),c>f&&(c=f),s.setPartsOpacity(h,c)}}}else for(var u=0;u=this._$5S._$aS.length)return null;var i=this._$5S._$aS[t];return null!=i&&i.getType()==W._$wb&&i instanceof $t?i.getIndexArray():null},e.CHANNEL_COUNT=4,e.RENDER_TEXTURE_USE_MIPMAP=!1,e.NOT_USED_FRAME=-100,e.prototype._$L7=function(){if(this.tmpModelToViewMatrix&&(this.tmpModelToViewMatrix=null),this.tmpMatrix2&&(this.tmpMatrix2=null),this.tmpMatrixForMask&&(this.tmpMatrixForMask=null),this.tmpMatrixForDraw&&(this.tmpMatrixForDraw=null),this.tmpBoundsOnModel&&(this.tmpBoundsOnModel=null),this.CHANNEL_COLORS){for(var t=this.CHANNEL_COLORS.length-1;t>=0;--t)this.CHANNEL_COLORS.splice(t,1);this.CHANNEL_COLORS=[]}this.releaseShader()},e.prototype.releaseShader=function(){for(var t=at.frameBuffers.length,i=0;i0){var n=i.gl.getParameter(i.gl.FRAMEBUFFER_BINDING),s=new Array(4);s[0]=0,s[1]=0,s[2]=i.gl.canvas.width,s[3]=i.gl.canvas.height,i.gl.viewport(0,0,at.clippingMaskBufferSize,at.clippingMaskBufferSize),this.setupLayoutBounds(e),i.gl.bindFramebuffer(i.gl.FRAMEBUFFER,at.frameBuffers[this.curFrameNo].framebuffer),i.gl.clearColor(0,0,0,0),i.gl.clear(i.gl.COLOR_BUFFER_BIT);for(var r=0;rr?e:r,n=o,s=o,_=0,a=0,h=i.clippedDrawContextList.length,l=0;l_&&(_=S),v>a&&(a=v)}}if(n==o)i.allClippedDrawRect.x=0,i.allClippedDrawRect.y=0,i.allClippedDrawRect.width=0,i.allClippedDrawRect.height=0,i.isUsing=!1;else{var L=_-n,M=a-s;i.allClippedDrawRect.x=n,i.allClippedDrawRect.y=s,i.allClippedDrawRect.width=L,i.allClippedDrawRect.height=M,i.isUsing=!0}},e.prototype.setupLayoutBounds=function(t){var i=t/e.CHANNEL_COUNT,r=t%e.CHANNEL_COUNT;i=~~i,r=~~r;for(var o=0,n=0;n=1)return 1;var p=r,f=p*p;return l*(p*f)+$*f+u*p+0},s.prototype._$a0=function(){},s.prototype.setFadeIn=function(t){this._$dP=t},s.prototype.setFadeOut=function(t){this._$eo=t},s.prototype._$pT=function(t){this._$V0=t},s.prototype.getFadeOut=function(){return this._$eo},s.prototype._$4T=function(){return this._$eo},s.prototype._$mT=function(){return this._$V0},s.prototype.getDurationMSec=function(){return-1},s.prototype.getLoopDurationMSec=function(){return-1},s.prototype.updateParam=function(t,i){if(i._$AT&&!i._$9L){var e=w.getUserTimeMSec();if(i._$z2<0){i._$z2=e,i._$bs=e;var r=this.getDurationMSec();i._$Do<0&&(i._$Do=r<=0?-1:i._$z2+r)}var o=this._$V0;o=o*(0==this._$dP?1:ht._$r2((e-i._$bs)/this._$dP))*(0==this._$eo||i._$Do<0?1:ht._$r2((i._$Do-e)/this._$eo)),0<=o&&o<=1||console.log("### assert!! ### "),this.updateParamExe(t,e,o,i),i._$Do>0&&i._$Do0?console.log("\n"):e%8==0&&e>0&&console.log(" "),console.log("%02X ",255&t[e]);console.log("\n")},_._$nr=function(t,i,e){console.log("%s\n",t);for(var r=i.length,o=0;o=0;--r){this._$lL[r]._$oP(t,this)}this._$oo(t,e),this._$M2=this._$Yb(),this._$9b=(this._$M2-this._$ks)/e,this._$ks=this._$M2}for(var r=this._$qP.length-1;r>=0;--r){this._$qP[r]._$YS(t,this)}this._$iT=i},f.prototype._$oo=function(t,i){i<.033&&(i=.033);var e=1/i;this.p1.vx=(this.p1.x-this.p1._$s0)*e,this.p1.vy=(this.p1.y-this.p1._$70)*e,this.p1.ax=(this.p1.vx-this.p1._$7L)*e,this.p1.ay=(this.p1.vy-this.p1._$HL)*e,this.p1.fx=this.p1.ax*this.p1._$p,this.p1.fy=this.p1.ay*this.p1._$p,this.p1._$xT();var r,o,n=-Math.atan2(this.p1.y-this.p2.y,this.p1.x-this.p2.x),s=Math.cos(n),_=Math.sin(n),a=9.8*this.p2._$p,h=this._$Db*Lt._$bS,l=a*Math.cos(n-h);r=l*_,o=l*s;var $=-this.p1.fx*_*_,u=-this.p1.fy*_*s,p=-this.p2.vx*this._$L2,f=-this.p2.vy*this._$L2;this.p2.fx=r+$+p,this.p2.fy=o+u+f,this.p2.ax=this.p2.fx/this.p2._$p,this.p2.ay=this.p2.fy/this.p2._$p,this.p2.vx+=this.p2.ax*i,this.p2.vy+=this.p2.ay*i,this.p2.x+=this.p2.vx*i,this.p2.y+=this.p2.vy*i;var c=Math.sqrt((this.p1.x-this.p2.x)*(this.p1.x-this.p2.x)+(this.p1.y-this.p2.y)*(this.p1.y-this.p2.y));this.p2.x=this.p1.x+this._$Fo*(this.p2.x-this.p1.x)/c,this.p2.y=this.p1.y+this._$Fo*(this.p2.y-this.p1.y)/c,this.p2.vx=(this.p2.x-this.p2._$s0)*e,this.p2.vy=(this.p2.y-this.p2._$70)*e,this.p2._$xT()},c.prototype._$xT=function(){this._$s0=this.x,this._$70=this.y,this._$7L=this.vx,this._$HL=this.vy},d.prototype._$oP=function(t,i){},g.prototype=new d,g.prototype._$oP=function(t,i){var e=this.scale*t.getParamFloat(this._$wL),r=i.getPhysicsPoint1();switch(this._$tL){default:case f.Src.SRC_TO_X:r.x=r.x+(e-r.x)*this._$V0;break;case f.Src.SRC_TO_Y:r.y=r.y+(e-r.y)*this._$V0;break;case f.Src.SRC_TO_G_ANGLE:var o=i._$qr();o+=(e-o)*this._$V0,i._$pr(o)}},y.prototype._$YS=function(t,i){},T.prototype=new y,T.prototype._$YS=function(t,i){switch(this._$YP){default:case f.Target.TARGET_FROM_ANGLE:t.setParamFloat(this._$wL,this.scale*i._$5r(),this._$V0);break;case f.Target.TARGET_FROM_ANGLE_V:t.setParamFloat(this._$wL,this.scale*i._$Cs(),this._$V0)}},f.Src=function(){},f.Src.SRC_TO_X="SRC_TO_X",f.Src.SRC_TO_Y="SRC_TO_Y",f.Src.SRC_TO_G_ANGLE="SRC_TO_G_ANGLE",f.Target=function(){},f.Target.TARGET_FROM_ANGLE="TARGET_FROM_ANGLE",f.Target.TARGET_FROM_ANGLE_V="TARGET_FROM_ANGLE_V",P.prototype.init=function(t){this._$fL=t._$fL,this._$gL=t._$gL,this._$B0=t._$B0,this._$z0=t._$z0,this._$qT=t._$qT,this.reflectX=t.reflectX,this.reflectY=t.reflectY},P.prototype._$F0=function(t){this._$fL=t._$_T(),this._$gL=t._$_T(),this._$B0=t._$_T(),this._$z0=t._$_T(),this._$qT=t._$_T(),t.getFormatVersion()>=G.LIVE2D_FORMAT_VERSION_V2_10_SDK2&&(this.reflectX=t._$po(),this.reflectY=t._$po())},P.prototype._$e=function(){};var It=function(){};It._$ni=function(t,i,e,r,o,n,s,_,a){var h=s*n-_*o;if(0==h)return null;var l,$=((t-e)*n-(i-r)*o)/h;return l=0!=o?(t-e-$*s)/o:(i-r-$*_)/n,isNaN(l)&&(l=(t-e-$*s)/o,isNaN(l)&&(l=(i-r-$*_)/n),isNaN(l)&&(console.log("a is NaN @UtVector#_$ni() "),console.log("v1x : "+o),console.log("v1x != 0 ? "+(0!=o)))),null==a?new Array(l,$):(a[0]=l,a[1]=$,a)},S.prototype._$8P=function(){return this.x+.5*this.width},S.prototype._$6P=function(){return this.y+.5*this.height},S.prototype._$EL=function(){return this.x+this.width},S.prototype._$5T=function(){return this.y+this.height},S.prototype._$jL=function(t,i,e,r){this.x=t,this.y=i,this.width=e,this.height=r},S.prototype._$jL=function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},S.prototype.contains=function(t,i){return this.x<=this.x&&this.y<=this.y&&this.x<=this.x+this.width&&this.y<=this.y+this.height},S.prototype.expand=function(t,i){this.x-=t,this.y-=i,this.width+=2*t,this.height+=2*i},v._$Z2=function(t,i,e,r){var o=i._$Q2(t,e),n=t._$vs(),s=t._$Tr();if(i._$zr(n,s,o),o<=0)return r[n[0]];if(1==o){var _=r[n[0]],a=r[n[1]],h=s[0];return _+(a-_)*h|0}if(2==o){var _=r[n[0]],a=r[n[1]],l=r[n[2]],$=r[n[3]],h=s[0],u=s[1],p=_+(a-_)*h|0,f=l+($-l)*h|0;return p+(f-p)*u|0}if(3==o){var c=r[n[0]],d=r[n[1]],g=r[n[2]],y=r[n[3]],m=r[n[4]],T=r[n[5]],P=r[n[6]],S=r[n[7]],h=s[0],u=s[1],v=s[2],_=c+(d-c)*h|0,a=g+(y-g)*h|0,l=m+(T-m)*h|0,$=P+(S-P)*h|0,p=_+(a-_)*u|0,f=l+($-l)*u|0;return p+(f-p)*v|0}if(4==o){var L=r[n[0]],M=r[n[1]],E=r[n[2]],A=r[n[3]],I=r[n[4]],w=r[n[5]],x=r[n[6]],O=r[n[7]],D=r[n[8]],R=r[n[9]],b=r[n[10]],F=r[n[11]],C=r[n[12]],N=r[n[13]],B=r[n[14]],U=r[n[15]],h=s[0],u=s[1],v=s[2],G=s[3],c=L+(M-L)*h|0,d=E+(A-E)*h|0,g=I+(w-I)*h|0,y=x+(O-x)*h|0,m=D+(R-D)*h|0,T=b+(F-b)*h|0,P=C+(N-C)*h|0,S=B+(U-B)*h|0,_=c+(d-c)*u|0,a=g+(y-g)*u|0,l=m+(T-m)*u|0,$=P+(S-P)*u|0,p=_+(a-_)*v|0,f=l+($-l)*v|0;return p+(f-p)*G|0}for(var Y=1<=G._$T7?(this.clipID=t._$nP(),this.clipIDList=this.convertClipIDForV2_11(this.clipID)):this.clipIDList=[],this._$MS(this._$Lb)},M.prototype.getClipIDList=function(){return this.clipIDList},M.prototype.init=function(t){},M.prototype._$Nr=function(t,i){if(i._$IS[0]=!1,i._$Us=v._$Z2(t,this._$GS,i._$IS,this._$Lb),at._$Zs);else if(i._$IS[0])return;i._$7s=v._$br(t,this._$GS,i._$IS,this._$mS)},M.prototype._$2b=function(t,i){},M.prototype.getDrawDataID=function(){return this._$gP},M.prototype._$j2=function(t){this._$gP=t},M.prototype.getOpacity=function(t,i){return i._$7s},M.prototype._$zS=function(t,i){return i._$Us},M.prototype._$MS=function(t){for(var i=t.length-1;i>=0;--i){var e=t[i];eM._$R2&&(M._$R2=e)}},M.prototype.getTargetBaseDataID=function(){return this._$dr},M.prototype._$gs=function(t){this._$dr=t},M.prototype._$32=function(){return null!=this._$dr&&this._$dr!=yt._$2o()},M.prototype.preDraw=function(t,i,e){},M.prototype.draw=function(t,i,e){},M.prototype.getType=function(){},M.prototype._$B2=function(t,i,e){},E._$ps=32,E.CLIPPING_PROCESS_NONE=0,E.CLIPPING_PROCESS_OVERWRITE_ALPHA=1,E.CLIPPING_PROCESS_MULTIPLY_ALPHA=2,E.CLIPPING_PROCESS_DRAW=3,E.CLIPPING_PROCESS_CLEAR_ALPHA=4,E.prototype.setChannelFlagAsColor=function(t,i){this.CHANNEL_COLORS[t]=i},E.prototype.getChannelFlagAsColor=function(t){return this.CHANNEL_COLORS[t]},E.prototype._$ZT=function(){},E.prototype._$Uo=function(t,i,e,r,o,n,s){},E.prototype._$Rs=function(){return-1},E.prototype._$Ds=function(t){},E.prototype.setBaseColor=function(t,i,e,r){t<0?t=0:t>1&&(t=1),i<0?i=0:i>1&&(i=1),e<0?e=0:e>1&&(e=1),r<0?r=0:r>1&&(r=1),this._$lT=t,this._$C0=i,this._$tT=e,this._$WL=r},E.prototype._$WP=function(t){this.culling=t},E.prototype.setMatrix=function(t){for(var i=0;i<16;i++)this.matrix4x4[i]=t[i]},E.prototype._$IT=function(){return this.matrix4x4},E.prototype.setPremultipliedAlpha=function(t){this.premultipliedAlpha=t},E.prototype.isPremultipliedAlpha=function(){return this.premultipliedAlpha},E.prototype.setAnisotropy=function(t){this.anisotropy=t},E.prototype.getAnisotropy=function(){return this.anisotropy},E.prototype.getClippingProcess=function(){return this.clippingProcess},E.prototype.setClippingProcess=function(t){this.clippingProcess=t},E.prototype.setClipBufPre_clipContextForMask=function(t){this.clipBufPre_clipContextMask=t},E.prototype.getClipBufPre_clipContextMask=function(){return this.clipBufPre_clipContextMask},E.prototype.setClipBufPre_clipContextForDraw=function(t){this.clipBufPre_clipContextDraw=t},E.prototype.getClipBufPre_clipContextDraw=function(){return this.clipBufPre_clipContextDraw},I._$ur=-2,I._$c2=1,I._$_b=2,I.prototype._$F0=function(t){this._$kP=t._$nP(),this._$dr=t._$nP()},I.prototype.readV2_opacity=function(t){t.getFormatVersion()>=G.LIVE2D_FORMAT_VERSION_V2_10_SDK2&&(this._$mS=t._$Tb())},I.prototype.init=function(t){},I.prototype._$Nr=function(t,i){},I.prototype.interpolateOpacity=function(t,i,e,r){null==this._$mS?e.setInterpolatedOpacity(1):e.setInterpolatedOpacity(v._$br(t,i,r,this._$mS))},I.prototype._$2b=function(t,i){},I.prototype._$nb=function(t,i,e,r,o,n,s){},I.prototype.getType=function(){},I.prototype._$gs=function(t){this._$dr=t},I.prototype._$a2=function(t){this._$kP=t},I.prototype.getTargetBaseDataID=function(){return this._$dr},I.prototype.getBaseDataID=function(){return this._$kP},I.prototype._$32=function(){return null!=this._$dr&&this._$dr!=yt._$2o()},w._$W2=0,w._$CS=w._$W2,w._$Mo=function(){return!0},w._$XP=function(t){try{for(var i=getTimeMSec();getTimeMSec()-i=t.length)return!1;for(var o=i;o=0;--e){var r=this._$Ob[e].getParamIndex(i);if(r==x._$ds&&(r=t.getParamIndex(this._$Ob[e].getParamID())),t._$Xb(r))return!0}return!1},D.prototype._$Q2=function(t,i){for(var e,r,o=this._$Ob.length,n=t._$v2(),s=0,_=0;_U._$Qb&&console.log("err 23245\n");for(var o=this._$Ob.length,n=1,s=1,_=0,a=0;a=0;--n)e[n]=o[n]}else this.mult_fast(t,i,e,r)},R.prototype.mult_fast=function(t,i,e,r){r?(e[0]=t[0]*i[0]+t[4]*i[1]+t[8]*i[2],e[4]=t[0]*i[4]+t[4]*i[5]+t[8]*i[6],e[8]=t[0]*i[8]+t[4]*i[9]+t[8]*i[10],e[12]=t[0]*i[12]+t[4]*i[13]+t[8]*i[14]+t[12],e[1]=t[1]*i[0]+t[5]*i[1]+t[9]*i[2],e[5]=t[1]*i[4]+t[5]*i[5]+t[9]*i[6],e[9]=t[1]*i[8]+t[5]*i[9]+t[9]*i[10],e[13]=t[1]*i[12]+t[5]*i[13]+t[9]*i[14]+t[13],e[2]=t[2]*i[0]+t[6]*i[1]+t[10]*i[2],e[6]=t[2]*i[4]+t[6]*i[5]+t[10]*i[6],e[10]=t[2]*i[8]+t[6]*i[9]+t[10]*i[10],e[14]=t[2]*i[12]+t[6]*i[13]+t[10]*i[14]+t[14],e[3]=e[7]=e[11]=0,e[15]=1):(e[0]=t[0]*i[0]+t[4]*i[1]+t[8]*i[2]+t[12]*i[3],e[4]=t[0]*i[4]+t[4]*i[5]+t[8]*i[6]+t[12]*i[7],e[8]=t[0]*i[8]+t[4]*i[9]+t[8]*i[10]+t[12]*i[11],e[12]=t[0]*i[12]+t[4]*i[13]+t[8]*i[14]+t[12]*i[15],e[1]=t[1]*i[0]+t[5]*i[1]+t[9]*i[2]+t[13]*i[3],e[5]=t[1]*i[4]+t[5]*i[5]+t[9]*i[6]+t[13]*i[7],e[9]=t[1]*i[8]+t[5]*i[9]+t[9]*i[10]+t[13]*i[11],e[13]=t[1]*i[12]+t[5]*i[13]+t[9]*i[14]+t[13]*i[15],e[2]=t[2]*i[0]+t[6]*i[1]+t[10]*i[2]+t[14]*i[3],e[6]=t[2]*i[4]+t[6]*i[5]+t[10]*i[6]+t[14]*i[7],e[10]=t[2]*i[8]+t[6]*i[9]+t[10]*i[10]+t[14]*i[11],e[14]=t[2]*i[12]+t[6]*i[13]+t[10]*i[14]+t[14]*i[15],e[3]=t[3]*i[0]+t[7]*i[1]+t[11]*i[2]+t[15]*i[3],e[7]=t[3]*i[4]+t[7]*i[5]+t[11]*i[6]+t[15]*i[7],e[11]=t[3]*i[8]+t[7]*i[9]+t[11]*i[10]+t[15]*i[11],e[15]=t[3]*i[12]+t[7]*i[13]+t[11]*i[14]+t[15]*i[15])},R.prototype.translate=function(t,i,e){this.m[12]=this.m[0]*t+this.m[4]*i+this.m[8]*e+this.m[12],this.m[13]=this.m[1]*t+this.m[5]*i+this.m[9]*e+this.m[13],this.m[14]=this.m[2]*t+this.m[6]*i+this.m[10]*e+this.m[14],this.m[15]=this.m[3]*t+this.m[7]*i+this.m[11]*e+this.m[15]},R.prototype.scale=function(t,i,e){this.m[0]*=t,this.m[4]*=i,this.m[8]*=e,this.m[1]*=t,this.m[5]*=i,this.m[9]*=e,this.m[2]*=t,this.m[6]*=i,this.m[10]*=e,this.m[3]*=t,this.m[7]*=i,this.m[11]*=e},R.prototype.rotateX=function(t){var i=Lt.fcos(t),e=Lt._$9(t),r=this.m[4];this.m[4]=r*i+this.m[8]*e,this.m[8]=r*-e+this.m[8]*i,r=this.m[5],this.m[5]=r*i+this.m[9]*e,this.m[9]=r*-e+this.m[9]*i,r=this.m[6],this.m[6]=r*i+this.m[10]*e,this.m[10]=r*-e+this.m[10]*i,r=this.m[7],this.m[7]=r*i+this.m[11]*e,this.m[11]=r*-e+this.m[11]*i},R.prototype.rotateY=function(t){var i=Lt.fcos(t),e=Lt._$9(t),r=this.m[0];this.m[0]=r*i+this.m[8]*-e,this.m[8]=r*e+this.m[8]*i,r=this.m[1],this.m[1]=r*i+this.m[9]*-e,this.m[9]=r*e+this.m[9]*i,r=m[2],this.m[2]=r*i+this.m[10]*-e,this.m[10]=r*e+this.m[10]*i,r=m[3],this.m[3]=r*i+this.m[11]*-e,this.m[11]=r*e+this.m[11]*i},R.prototype.rotateZ=function(t){var i=Lt.fcos(t),e=Lt._$9(t),r=this.m[0];this.m[0]=r*i+this.m[4]*e,this.m[4]=r*-e+this.m[4]*i,r=this.m[1],this.m[1]=r*i+this.m[5]*e,this.m[5]=r*-e+this.m[5]*i,r=this.m[2],this.m[2]=r*i+this.m[6]*e,this.m[6]=r*-e+this.m[6]*i,r=this.m[3],this.m[3]=r*i+this.m[7]*e,this.m[7]=r*-e+this.m[7]*i},b.prototype=new et,b._$tP=new Object,b._$27=function(){b._$tP.clear()},b.getID=function(t){var i=b._$tP[t];return null==i&&(i=new b(t),b._$tP[t]=i),i},b.prototype._$3s=function(){return new b},F._$kS=-1,F._$pS=0,F._$hb=1,F.STATE_IDENTITY=0,F._$gb=1,F._$fo=2,F._$go=4,F.prototype.transform=function(t,i,e){var r,o,n,s,_,a,h=0,l=0;switch(this._$hi){default:return;case F._$go|F._$fo|F._$gb:for(r=this._$7,o=this._$H,n=this._$k,s=this._$f,_=this._$g,a=this._$w;--e>=0;){var $=t[h++],u=t[h++];i[l++]=r*$+o*u+n,i[l++]=s*$+_*u+a}return;case F._$go|F._$fo:for(r=this._$7,o=this._$H,s=this._$f,_=this._$g;--e>=0;){var $=t[h++],u=t[h++];i[l++]=r*$+o*u,i[l++]=s*$+_*u}return;case F._$go|F._$gb:for(o=this._$H,n=this._$k,s=this._$f,a=this._$w;--e>=0;){var $=t[h++];i[l++]=o*t[h++]+n,i[l++]=s*$+a}return;case F._$go:for(o=this._$H,s=this._$f;--e>=0;){var $=t[h++];i[l++]=o*t[h++],i[l++]=s*$}return;case F._$fo|F._$gb:for(r=this._$7,n=this._$k,_=this._$g,a=this._$w;--e>=0;)i[l++]=r*t[h++]+n,i[l++]=_*t[h++]+a;return;case F._$fo:for(r=this._$7,_=this._$g;--e>=0;)i[l++]=r*t[h++],i[l++]=_*t[h++];return;case F._$gb:for(n=this._$k,a=this._$w;--e>=0;)i[l++]=t[h++]+n,i[l++]=t[h++]+a;return;case F.STATE_IDENTITY:return void(t==i&&h==l||w._$jT(t,h,i,l,2*e))}},F.prototype.update=function(){0==this._$H&&0==this._$f?1==this._$7&&1==this._$g?0==this._$k&&0==this._$w?(this._$hi=F.STATE_IDENTITY,this._$Z=F._$pS):(this._$hi=F._$gb,this._$Z=F._$hb):0==this._$k&&0==this._$w?(this._$hi=F._$fo,this._$Z=F._$kS):(this._$hi=F._$fo|F._$gb,this._$Z=F._$kS):0==this._$7&&0==this._$g?0==this._$k&&0==this._$w?(this._$hi=F._$go,this._$Z=F._$kS):(this._$hi=F._$go|F._$gb,this._$Z=F._$kS):0==this._$k&&0==this._$w?(this._$hi=F._$go|F._$fo,this._$Z=F._$kS):(this._$hi=F._$go|F._$fo|F._$gb,this._$Z=F._$kS)},F.prototype._$RT=function(t){this._$IT(t);var i=t[0],e=t[2],r=t[1],o=t[3],n=Math.sqrt(i*i+r*r),s=i*o-e*r;0==n?at._$so&&console.log("affine._$RT() / rt==0"):(t[0]=n,t[1]=s/n,t[2]=(r*o+i*e)/s,t[3]=Math.atan2(r,i))},F.prototype._$ho=function(t,i,e,r){var o=new Float32Array(6),n=new Float32Array(6);t._$RT(o),i._$RT(n);var s=new Float32Array(6);s[0]=o[0]+(n[0]-o[0])*e,s[1]=o[1]+(n[1]-o[1])*e,s[2]=o[2]+(n[2]-o[2])*e,s[3]=o[3]+(n[3]-o[3])*e,s[4]=o[4]+(n[4]-o[4])*e,s[5]=o[5]+(n[5]-o[5])*e,r._$CT(s)},F.prototype._$CT=function(t){var i=Math.cos(t[3]),e=Math.sin(t[3]);this._$7=t[0]*i,this._$f=t[0]*e,this._$H=t[1]*(t[2]*i-e),this._$g=t[1]*(t[2]*e+i),this._$k=t[4],this._$w=t[5],this.update()},F.prototype._$IT=function(t){t[0]=this._$7,t[1]=this._$f,t[2]=this._$H,t[3]=this._$g,t[4]=this._$k,t[5]=this._$w},C.prototype=new s,C._$cs="VISIBLE:",C._$ar="LAYOUT:",C._$Co=0,C._$D2=[],C._$1T=1,C.loadMotion=function(t){var i=new C,e=[0],r=t.length;i._$yT=0;for(var o=0;o=0){var a=new B;O.startsWith(t,s,C._$cs)?(a._$RP=B._$hs,a._$4P=new String(t,s,_-s)):O.startsWith(t,s,C._$ar)?(a._$4P=new String(t,s+7,_-s-7),O.startsWith(t,s+7,"ANCHOR_X")?a._$RP=B._$xs:O.startsWith(t,s+7,"ANCHOR_Y")?a._$RP=B._$us:O.startsWith(t,s+7,"SCALE_X")?a._$RP=B._$qs:O.startsWith(t,s+7,"SCALE_Y")?a._$RP=B._$Ys:O.startsWith(t,s+7,"X")?a._$RP=B._$ws:O.startsWith(t,s+7,"Y")&&(a._$RP=B._$Ns)):(a._$RP=B._$Fr,a._$4P=new String(t,s,_-s)),i.motions.push(a);var h=0;for(C._$D2.clear(),o=_+1;o0){C._$D2.push(l),h++;var $=e[0];if($i._$yT&&(i._$yT=h)}}}else{for(var s=o,_=-1;o=0)for(_==s+4&&"f"==t[s+1]&&"p"==t[s+2]&&"s"==t[s+3]&&(u=!0),o=_+1;o0&&u&&5=l?l-1:s];t.setParamFloat($,u)}else if(B._$ws<=h._$RP&&h._$RP<=B._$Ys);else{var p=t.getParamFloat($),f=h._$I0[s>=l?l-1:s],c=h._$I0[s+1>=l?l-1:s+1],d=f+(c-f)*_,g=p+(d-p)*e;t.setParamFloat($,g)}}s>=this._$yT&&(this._$E?(r._$z2=i,this.loopFadeIn&&(r._$bs=i)):r._$9L=!0)},C.prototype._$r0=function(){return this._$E},C.prototype._$aL=function(t){this._$E=t},C.prototype.isLoopFadeIn=function(){return this.loopFadeIn},C.prototype.setLoopFadeIn=function(t){this.loopFadeIn=t},N.prototype.clear=function(){this.size=0},N.prototype.add=function(t){if(this._$P.length<=this.size){var i=new Float32Array(2*this.size);w._$jT(this._$P,0,i,0,this.size),this._$P=i}this._$P[this.size++]=t},N.prototype._$BL=function(){var t=new Float32Array(this.size);return w._$jT(this._$P,0,t,0,this.size),t},B._$Fr=0,B._$hs=1,B._$ws=100,B._$Ns=101,B._$xs=102,B._$us=103,B._$qs=104,B._$Ys=105,U._$Ms=1,U._$Qs=2,U._$i2=0,U._$No=2,U._$do=U._$Ms,U._$Ls=!0,U._$1r=5,U._$Qb=65,U._$J=1e-4,U._$FT=.001,U._$Ss=3,G._$o7=6,G._$S7=7,G._$s7=8,G._$77=9,G.LIVE2D_FORMAT_VERSION_V2_10_SDK2=10,G.LIVE2D_FORMAT_VERSION_V2_11_SDK2_1=11,G._$T7=G.LIVE2D_FORMAT_VERSION_V2_11_SDK2_1,G._$Is=-2004318072,G._$h0=0,G._$4L=23,G._$7P=33,G._$uT=function(t){console.log("_$bo :: _$6 _$mo _$E0 : %d\n",t)},G._$9o=function(t){if(t<40)return G._$uT(t),null;if(t<50)return G._$uT(t),null;if(t<60)return G._$uT(t),null;if(t<100)switch(t){case 65:return new Z;case 66:return new D;case 67:return new x;case 68:return new z;case 69:return new P;case 70:return new $t;default:return G._$uT(t),null}else if(t<150)switch(t){case 131:return new st;case 133:return new tt;case 136:return new p;case 137:return new ot;case 142:return new j}return G._$uT(t),null},Y._$HP=0,Y._$_0=!0;Y._$V2=-1,Y._$W0=-1,Y._$jr=!1,Y._$ZS=!0,Y._$tr=-1e6,Y._$lr=1e6,Y._$is=32,Y._$e=!1,Y.prototype.getDrawDataIndex=function(t){for(var i=this._$aS.length-1;i>=0;--i)if(null!=this._$aS[i]&&this._$aS[i].getDrawDataID()==t)return i;return-1},Y.prototype.getDrawData=function(t){if(t instanceof b){if(null==this._$Bo){this._$Bo=new Object;for(var i=this._$aS.length,e=0;e0&&this.release();for(var t=this._$Ri.getModelImpl(),i=t._$Xr(),r=i.length,o=new Array,n=new Array,s=0;s=0)&&(this._$3S.push(m),this._$db.push(n[s]),o[s]=null,y=!0)}}if(!y)break}var P=t._$E2();if(null!=P){var S=P._$1s();if(null!=S)for(var v=S.length,s=0;s=0;i--)this._$Js[i]=Y._$jr;return this._$QT=!1,Y._$e&&_.dump("_$eL"),!1},Y.prototype.preDraw=function(t){null!=this.clipManager&&(t._$ZT(),this.clipManager.setupClip(this,t))},Y.prototype.draw=function(t){if(null==this._$Ws)return void _._$li("call _$Ri.update() before _$Ri.draw() ");var i=this._$Ws.length;t._$ZT();for(var e=0;e=0;--i)if(this._$pb[i]==t)return i;return this._$02(t,0,Y._$tr,Y._$lr)},Y.prototype._$BS=function(t){return this.getBaseDataIndex(t)},Y.prototype.getBaseDataIndex=function(t){for(var i=this._$3S.length-1;i>=0;--i)if(null!=this._$3S[i]&&this._$3S[i].getBaseDataID()==t)return i;return-1},Y.prototype._$UT=function(t,i){var e=new Float32Array(i);return w._$jT(t,0,e,0,t.length),e},Y.prototype._$02=function(t,i,e,r){if(this._$qo>=this._$pb.length){var o=this._$pb.length,n=new Array(2*o);w._$jT(this._$pb,0,n,0,o),this._$pb=n,this._$_2=this._$UT(this._$_2,2*o),this._$vr=this._$UT(this._$vr,2*o),this._$Rr=this._$UT(this._$Rr,2*o),this._$Or=this._$UT(this._$Or,2*o);var s=new Array;w._$jT(this._$Js,0,s,0,o),this._$Js=s}return this._$pb[this._$qo]=t,this._$_2[this._$qo]=i,this._$vr[this._$qo]=i,this._$Rr[this._$qo]=e,this._$Or[this._$qo]=r,this._$Js[this._$qo]=Y._$ZS,this._$qo++},Y.prototype._$Zo=function(t,i){this._$3S[t]=i},Y.prototype.setParamFloat=function(t,i){ithis._$Or[t]&&(i=this._$Or[t]),this._$_2[t]=i},Y.prototype.loadParam=function(){var t=this._$_2.length;t>this._$fs.length&&(t=this._$fs.length),w._$jT(this._$fs,0,this._$_2,0,t)},Y.prototype.saveParam=function(){var t=this._$_2.length;t>this._$fs.length&&(this._$fs=new Float32Array(t)),w._$jT(this._$_2,0,this._$fs,0,t)},Y.prototype._$v2=function(){return this._$co},Y.prototype._$WS=function(){return this._$QT},Y.prototype._$Xb=function(t){return this._$Js[t]==Y._$ZS},Y.prototype._$vs=function(){return this._$Es},Y.prototype._$Tr=function(){return this._$ZP},Y.prototype.getBaseData=function(t){return this._$3S[t]},Y.prototype.getParamFloat=function(t){return this._$_2[t]},Y.prototype.getParamMax=function(t){return this._$Or[t]},Y.prototype.getParamMin=function(t){return this._$Rr[t]},Y.prototype.setPartsOpacity=function(t,i){this._$Hr[t].setPartsOpacity(i)},Y.prototype.getPartsOpacity=function(t){return this._$Hr[t].getPartsOpacity()},Y.prototype.getPartsDataIndex=function(t){for(var i=this._$F2.length-1;i>=0;--i)if(null!=this._$F2[i]&&this._$F2[i]._$p2()==t)return i;return-1},Y.prototype._$q2=function(t){return this._$db[t]},Y.prototype._$C2=function(t){return this._$8b[t]},Y.prototype._$Bb=function(t){return this._$Hr[t]},Y.prototype._$5s=function(t,i){for(var e=this._$Ws.length,r=t,o=0;o0;)n+=i;return r},k._$C=function(t){var i=null,e=null;try{i=t instanceof Array?t:new _$Xs(t,8192),e=new _$js;for(var r,o=new Int8Array(1e3);(r=i.read(o))>0;)e.write(o,0,r);return e._$TS()}finally{null!=t&&t.close(),null!=e&&(e.flush(),e.close())}},V.prototype._$T2=function(){return w.getUserTimeMSec()+Math._$10()*(2*this._$Br-1)},V.prototype._$uo=function(t){this._$Br=t},V.prototype._$QS=function(t,i,e){this._$Dr=t,this._$Cb=i,this._$mr=e},V.prototype._$7T=function(t){var i,e=w.getUserTimeMSec(),r=0;switch(this._$_L){case STATE_CLOSING:r=(e-this._$bb)/this._$Dr,r>=1&&(r=1,this._$_L=wt.STATE_CLOSED,this._$bb=e),i=1-r;break;case STATE_CLOSED:r=(e-this._$bb)/this._$Cb,r>=1&&(this._$_L=wt.STATE_OPENING,this._$bb=e),i=0;break;case STATE_OPENING:r=(e-this._$bb)/this._$mr,r>=1&&(r=1,this._$_L=wt.STATE_INTERVAL,this._$12=this._$T2()),i=r;break;case STATE_INTERVAL:this._$12.9?at.EXPAND_W:0;this.gl.drawElements(a,e,r,o,n,h,this.transform,_)}},X.prototype._$Rs=function(){throw new Error("_$Rs")},X.prototype._$Ds=function(t){throw new Error("_$Ds")},X.prototype._$K2=function(){for(var t=0;t=0;--i){var e=t[i];eW._$R2&&(W._$R2=e)}},W._$or=function(){return W._$52},W._$Pr=function(){return W._$R2},W.prototype._$F0=function(t){this._$gP=t._$nP(),this._$dr=t._$nP(),this._$GS=t._$nP(),this._$qb=t._$6L(),this._$Lb=t._$cS(),this._$mS=t._$Tb(),t.getFormatVersion()>=G._$T7?(this.clipID=t._$nP(),this.clipIDList=this.convertClipIDForV2_11(this.clipID)):this.clipIDList=null,W._$Sb(this._$Lb)},W.prototype.getClipIDList=function(){return this.clipIDList},W.prototype._$Nr=function(t,i){if(i._$IS[0]=!1,i._$Us=v._$Z2(t,this._$GS,i._$IS,this._$Lb),at._$Zs);else if(i._$IS[0])return;i._$7s=v._$br(t,this._$GS,i._$IS,this._$mS)},W.prototype._$2b=function(t){},W.prototype.getDrawDataID=function(){return this._$gP},W.prototype._$j2=function(t){this._$gP=t},W.prototype.getOpacity=function(t,i){return i._$7s},W.prototype._$zS=function(t,i){return i._$Us},W.prototype.getTargetBaseDataID=function(){return this._$dr},W.prototype._$gs=function(t){this._$dr=t},W.prototype._$32=function(){return null!=this._$dr&&this._$dr!=yt._$2o()},W.prototype.getType=function(){},j._$42=0,j.prototype._$1b=function(){return this._$3S},j.prototype.getDrawDataList=function(){return this._$aS},j.prototype._$F0=function(t){this._$NL=t._$nP(),this._$aS=t._$nP(),this._$3S=t._$nP()},j.prototype._$kr=function(t){t._$Zo(this._$3S),t._$xo(this._$aS),this._$3S=null,this._$aS=null},q.prototype=new i,q.loadModel=function(t){var e=new q;return i._$62(e,t),e},q.loadModel=function(t){var e=new q;return i._$62(e,t),e},q._$to=function(){return new q},q._$er=function(t){var i=new _$5("../_$_r/_$t0/_$Ri/_$_P._$d");if(0==i.exists())throw new _$ls("_$t0 _$_ _$6 _$Ui :: "+i._$PL());for(var e=["../_$_r/_$t0/_$Ri/_$_P.512/_$CP._$1","../_$_r/_$t0/_$Ri/_$_P.512/_$vP._$1","../_$_r/_$t0/_$Ri/_$_P.512/_$EP._$1","../_$_r/_$t0/_$Ri/_$_P.512/_$pP._$1"],r=q.loadModel(i._$3b()),o=0;o=0){var h=new B;O.startsWith(t,_,J._$cs)?(h._$RP=B._$hs,h._$4P=O.createString(t,_,a-_)):O.startsWith(t,_,J._$ar)?(h._$4P=O.createString(t,_+7,a-_-7),O.startsWith(t,_+7,"ANCHOR_X")?h._$RP=B._$xs:O.startsWith(t,_+7,"ANCHOR_Y")?h._$RP=B._$us:O.startsWith(t,_+7,"SCALE_X")?h._$RP=B._$qs:O.startsWith(t,_+7,"SCALE_Y")?h._$RP=B._$Ys:O.startsWith(t,_+7,"X")?h._$RP=B._$ws:O.startsWith(t,_+7,"Y")&&(h._$RP=B._$Ns)):(h._$RP=B._$Fr,h._$4P=O.createString(t,_,a-_)),i.motions.push(h);var l=0,$=[];for(o=a+1;o0){$.push(u),l++;var p=e[0];if(pi._$yT&&(i._$yT=l)}}}else{for(var _=o,a=-1;o=0)for(a==_+4&&"f"==Q(t,_+1)&&"p"==Q(t,_+2)&&"s"==Q(t,_+3)&&(f=!0),o=a+1;o0&&f&&5=l?l-1:s];t.setParamFloat($,u)}else if(B._$ws<=h._$RP&&h._$RP<=B._$Ys);else{var p,f=t.getParamIndex($),c=t.getModelContext(),d=c.getParamMax(f),g=c.getParamMin(f),y=.4*(d-g),m=c.getParamFloat(f),T=h._$I0[s>=l?l-1:s],P=h._$I0[s+1>=l?l-1:s+1];p=Ty||T>P&&T-P>y?T:T+(P-T)*_;var S=m+(p-m)*e;t.setParamFloat($,S)}}s>=this._$yT&&(this._$E?(r._$z2=i,this.loopFadeIn&&(r._$bs=i)):r._$9L=!0),this._$eP=e},J.prototype._$r0=function(){return this._$E},J.prototype._$aL=function(t){this._$E=t},J.prototype._$S0=function(){return this._$D0},J.prototype._$U0=function(t){this._$D0=t},J.prototype.isLoopFadeIn=function(){return this.loopFadeIn},J.prototype.setLoopFadeIn=function(t){this.loopFadeIn=t},N.prototype.clear=function(){this.size=0},N.prototype.add=function(t){if(this._$P.length<=this.size){var i=new Float32Array(2*this.size);w._$jT(this._$P,0,i,0,this.size),this._$P=i}this._$P[this.size++]=t},N.prototype._$BL=function(){var t=new Float32Array(this.size);return w._$jT(this._$P,0,t,0,this.size),t},B._$Fr=0,B._$hs=1,B._$ws=100,B._$Ns=101,B._$xs=102,B._$us=103,B._$qs=104,B._$Ys=105,Z.prototype=new I,Z._$gT=new Array,Z.prototype._$zP=function(){this._$GS=new D,this._$GS._$zP()},Z.prototype._$F0=function(t){I.prototype._$F0.call(this,t),this._$A=t._$6L(),this._$o=t._$6L(),this._$GS=t._$nP(),this._$Eo=t._$nP(),I.prototype.readV2_opacity.call(this,t)},Z.prototype.init=function(t){var i=new K(this),e=(this._$o+1)*(this._$A+1);return null!=i._$Cr&&(i._$Cr=null),i._$Cr=new Float32Array(2*e),null!=i._$hr&&(i._$hr=null),this._$32()?i._$hr=new Float32Array(2*e):i._$hr=null,i},Z.prototype._$Nr=function(t,i){var e=i;if(this._$GS._$Ur(t)){var r=this._$VT(),o=Z._$gT;o[0]=!1,v._$Vr(t,this._$GS,o,r,this._$Eo,e._$Cr,0,2),i._$Ib(o[0]),this.interpolateOpacity(t,this._$GS,i,o)}},Z.prototype._$2b=function(t,i){var e=i;if(e._$hS(!0),this._$32()){var r=this.getTargetBaseDataID();if(e._$8r==I._$ur&&(e._$8r=t.getBaseDataIndex(r)),e._$8r<0)at._$so&&_._$li("_$L _$0P _$G :: %s",r),e._$hS(!1);else{var o=t.getBaseData(e._$8r),n=t._$q2(e._$8r);if(null!=o&&n._$yo()){var s=n.getTotalScale();e.setTotalScale_notForClient(s);var a=n.getTotalOpacity();e.setTotalOpacity(a*e.getInterpolatedOpacity()),o._$nb(t,n,e._$Cr,e._$hr,this._$VT(),0,2),e._$hS(!0)}else e._$hS(!1)}}else e.setTotalOpacity(e.getInterpolatedOpacity())},Z.prototype._$nb=function(t,i,e,r,o,n,s){var _=i,a=null!=_._$hr?_._$hr:_._$Cr;Z.transformPoints_sdk2(e,r,o,n,s,a,this._$o,this._$A)},Z.transformPoints_sdk2=function(i,e,r,o,n,s,_,a){for(var h,l,$,u=r*n,p=0,f=0,c=0,d=0,g=0,y=0,m=!1,T=o;T=1){var b=s[2*(0+a*M)],F=s[2*(0+a*M)+1],C=p-2*c+1*g,N=f-2*d+1*y,x=p+3*g,O=f+3*y,D=p-2*c+3*g,R=f-2*d+3*y,B=.5*(v- -2),U=.5*(L-1);B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else{var G=0|S;G==a&&(G=a-1);var B=.5*(v- -2),U=S-G,Y=G/a,k=(G+1)/a,b=s[2*(0+G*M)],F=s[2*(0+G*M)+1],x=s[2*(0+(G+1)*M)],O=s[2*(0+(G+1)*M)+1],C=p-2*c+Y*g,N=f-2*d+Y*y,D=p-2*c+k*g,R=f-2*d+k*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(1<=v)if(L<=0){var D=s[2*(_+0*M)],R=s[2*(_+0*M)+1],x=p+3*c,O=f+3*d,C=p+1*c-2*g,N=f+1*d-2*y,b=p+3*c-2*g,F=f+3*d-2*y,B=.5*(v-1),U=.5*(L- -2);B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(L>=1){var C=s[2*(_+a*M)],N=s[2*(_+a*M)+1],b=p+3*c+1*g,F=f+3*d+1*y,D=p+1*c+3*g,R=f+1*d+3*y,x=p+3*c+3*g,O=f+3*d+3*y,B=.5*(v-1),U=.5*(L-1);B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else{var G=0|S;G==a&&(G=a-1);var B=.5*(v-1),U=S-G,Y=G/a,k=(G+1)/a,C=s[2*(_+G*M)],N=s[2*(_+G*M)+1],D=s[2*(_+(G+1)*M)],R=s[2*(_+(G+1)*M)+1],b=p+3*c+Y*g,F=f+3*d+Y*y,x=p+3*c+k*g,O=f+3*d+k*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(L<=0){var V=0|P;V==_&&(V=_-1);var B=P-V,U=.5*(L- -2),X=V/_,z=(V+1)/_,D=s[2*(V+0*M)],R=s[2*(V+0*M)+1],x=s[2*(V+1+0*M)],O=s[2*(V+1+0*M)+1],C=p+X*c-2*g,N=f+X*d-2*y,b=p+z*c-2*g,F=f+z*d-2*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else if(L>=1){var V=0|P;V==_&&(V=_-1);var B=P-V,U=.5*(L-1),X=V/_,z=(V+1)/_,C=s[2*(V+a*M)],N=s[2*(V+a*M)+1],b=s[2*(V+1+a*M)],F=s[2*(V+1+a*M)+1],D=p+X*c+3*g,R=f+X*d+3*y,x=p+z*c+3*g,O=f+z*d+3*y;B+U<=1?(e[T]=C+(b-C)*B+(D-C)*U,e[T+1]=N+(F-N)*B+(R-N)*U):(e[T]=x+(D-x)*(1-B)+(b-x)*(1-U),e[T+1]=O+(R-O)*(1-B)+(F-O)*(1-U))}else t.err.printf("_$li calc : %.4f , %.4f\t\t\t\t\t@@BDBoxGrid\n",v,L);else e[T]=p+v*c+L*g,e[T+1]=f+v*d+L*y}else l=P-(0|P),$=S-(0|S),h=2*((0|P)+(0|S)*(_+1)),l+$<1?(e[T]=s[h]*(1-l-$)+s[h+2]*l+s[h+2*(_+1)]*$,e[T+1]=s[h+1]*(1-l-$)+s[h+3]*l+s[h+2*(_+1)+1]*$):(e[T]=s[h+2*(_+1)+2]*(l-1+$)+s[h+2*(_+1)]*(1-l)+s[h+2]*(1-$),e[T+1]=s[h+2*(_+1)+3]*(l-1+$)+s[h+2*(_+1)+1]*(1-l)+s[h+3]*(1-$))}},Z.prototype.transformPoints_sdk1=function(t,i,e,r,o,n,s){for(var _,a,h,l,$,u,p,f=i,c=this._$o,d=this._$A,g=o*s,y=null!=f._$hr?f._$hr:f._$Cr,m=n;m1&&(_=1),a<0?a=0:a>1&&(a=1),_*=c,a*=d,h=0|_,l=0|a,h>c-1&&(h=c-1),l>d-1&&(l=d-1),u=_-h,p=a-l,$=2*(h+l*(c+1))):(_=e[m]*c,a=e[m+1]*d,u=_-(0|_),p=a-(0|a),$=2*((0|_)+(0|a)*(c+1))),u+p<1?(r[m]=y[$]*(1-u-p)+y[$+2]*u+y[$+2*(c+1)]*p,r[m+1]=y[$+1]*(1-u-p)+y[$+3]*u+y[$+2*(c+1)+1]*p):(r[m]=y[$+2*(c+1)+2]*(u-1+p)+y[$+2*(c+1)]*(1-u)+y[$+2]*(1-p),r[m+1]=y[$+2*(c+1)+3]*(u-1+p)+y[$+2*(c+1)+1]*(1-u)+y[$+3]*(1-p))},Z.prototype._$VT=function(){return(this._$o+1)*(this._$A+1)},Z.prototype.getType=function(){return I._$_b},K.prototype=new _t,tt._$42=0,tt.prototype._$zP=function(){this._$3S=new Array,this._$aS=new Array},tt.prototype._$F0=function(t){this._$g0=t._$8L(),this.visible=t._$8L(),this._$NL=t._$nP(),this._$3S=t._$nP(),this._$aS=t._$nP()},tt.prototype.init=function(t){var i=new it(this);return i.setPartsOpacity(this.isVisible()?1:0),i},tt.prototype._$6o=function(t){if(null==this._$3S)throw new Error("_$3S _$6 _$Wo@_$6o");this._$3S.push(t)},tt.prototype._$3o=function(t){if(null==this._$aS)throw new Error("_$aS _$6 _$Wo@_$3o");this._$aS.push(t)},tt.prototype._$Zo=function(t){this._$3S=t},tt.prototype._$xo=function(t){this._$aS=t},tt.prototype.isVisible=function(){return this.visible},tt.prototype._$uL=function(){return this._$g0},tt.prototype._$KP=function(t){this.visible=t},tt.prototype._$ET=function(t){this._$g0=t},tt.prototype.getBaseData=function(){return this._$3S},tt.prototype.getDrawData=function(){return this._$aS},tt.prototype._$p2=function(){return this._$NL},tt.prototype._$ob=function(t){this._$NL=t},tt.prototype.getPartsID=function(){return this._$NL},tt.prototype._$MP=function(t){this._$NL=t},it.prototype=new $,it.prototype.getPartsOpacity=function(){return this._$VS},it.prototype.setPartsOpacity=function(t){this._$VS=t},et._$L7=function(){u._$27(),yt._$27(),b._$27(),l._$27()},et.prototype.toString=function(){return this.id},rt.prototype._$F0=function(t){},ot.prototype._$1s=function(){return this._$4S},ot.prototype._$zP=function(){this._$4S=new Array},ot.prototype._$F0=function(t){this._$4S=t._$nP()},ot.prototype._$Ks=function(t){this._$4S.push(t)},nt.tr=new gt,nt._$50=new gt,nt._$Ti=new Array(0,0),nt._$Pi=new Array(0,0),nt._$B=new Array(0,0),nt.prototype._$lP=function(t,i,e,r){this.viewport=new Array(t,i,e,r)},nt.prototype._$bL=function(){this.context.save();var t=this.viewport;null!=t&&(this.context.beginPath(),this.context._$Li(t[0],t[1],t[2],t[3]),this.context.clip())},nt.prototype._$ei=function(){this.context.restore()},nt.prototype.drawElements=function(t,i,e,r,o,n,s,a){try{o!=this._$Qo&&(this._$Qo=o,this.context.globalAlpha=o);for(var h=i.length,l=t.width,$=t.height,u=this.context,p=this._$xP,f=this._$uP,c=this._$6r,d=this._$3r,g=nt.tr,y=nt._$Ti,m=nt._$Pi,T=nt._$B,P=0;P.02?nt.expandClip(t,i,e,r,l,$,u,p,f,c):nt.clipWithTransform(t,null,o,n,s,_,a,h)},nt.expandClip=function(t,i,e,r,o,n,s,_,a,h){var l=s-o,$=_-n,u=a-o,p=h-n,f=l*p-$*u>0?e:-e,c=-$,d=l,g=a-s,y=h-_,m=-y,T=g,P=Math.sqrt(g*g+y*y),S=-p,v=u,L=Math.sqrt(u*u+p*p),M=o-f*c/r,E=n-f*d/r,A=s-f*c/r,I=_-f*d/r,w=s-f*m/P,x=_-f*T/P,O=a-f*m/P,D=h-f*T/P,R=o+f*S/L,b=n+f*v/L,F=a+f*S/L,C=h+f*v/L,N=nt._$50;return null!=i._$P2(N)&&(nt.clipWithTransform(t,N,M,E,A,I,w,x,O,D,F,C,R,b),!0)},nt.clipWithTransform=function(t,i,e,r,o,n,s,a){if(arguments.length<7)return void _._$li("err : @LDGL.clip()");if(!(arguments[1]instanceof gt))return void _._$li("err : a[0] is _$6 LDTransform @LDGL.clip()");var h=nt._$B,l=i,$=arguments;if(t.beginPath(),l){l._$PS($[2],$[3],h),t.moveTo(h[0],h[1]);for(var u=4;u<$.length;u+=2)l._$PS($[u],$[u+1],h),t.lineTo(h[0],h[1])}else{t.moveTo($[2],$[3]);for(var u=4;u<$.length;u+=2)t.lineTo($[u],$[u+1])}t.clip()},nt.createCanvas=function(t,i){var e=document.createElement("canvas");return e.setAttribute("width",t),e.setAttribute("height",i),e||_._$li("err : "+e),e},nt.dumpValues=function(){for(var t="",i=0;i1?1:.5-.5*Math.cos(t*Lt.PI_F)},lt._$fr=-1,lt.prototype.toString=function(){return this._$ib},$t.prototype=new W,$t._$42=0,$t._$Os=30,$t._$ms=0,$t._$ns=1,$t._$_s=2,$t._$gT=new Array,$t.prototype._$_S=function(t){this._$LP=t},$t.prototype.getTextureNo=function(){return this._$LP},$t.prototype._$ZL=function(){return this._$Qi},$t.prototype._$H2=function(){return this._$JP},$t.prototype.getNumPoints=function(){return this._$d0},$t.prototype.getType=function(){return W._$wb},$t.prototype._$B2=function(t,i,e){var r=i,o=null!=r._$hr?r._$hr:r._$Cr;switch(U._$do){default:case U._$Ms:throw new Error("_$L _$ro ");case U._$Qs:for(var n=this._$d0-1;n>=0;--n)o[n*U._$No+4]=e}},$t.prototype._$zP=function(){this._$GS=new D,this._$GS._$zP()},$t.prototype._$F0=function(t){W.prototype._$F0.call(this,t),this._$LP=t._$6L(),this._$d0=t._$6L(),this._$Yo=t._$6L();var i=t._$nP();this._$BP=new Int16Array(3*this._$Yo);for(var e=3*this._$Yo-1;e>=0;--e)this._$BP[e]=i[e];if(this._$Eo=t._$nP(),this._$Qi=t._$nP(),t.getFormatVersion()>=G._$s7){if(this._$JP=t._$6L(),0!=this._$JP){if(0!=(1&this._$JP)){var r=t._$6L();null==this._$5P&&(this._$5P=new Object),this._$5P._$Hb=parseInt(r)}0!=(this._$JP&$t._$Os)?this._$6s=(this._$JP&$t._$Os)>>1:this._$6s=$t._$ms,0!=(32&this._$JP)&&(this.culling=!1)}}else this._$JP=0},$t.prototype.init=function(t){var i=new ut(this),e=this._$d0*U._$No,r=this._$32();switch(null!=i._$Cr&&(i._$Cr=null),i._$Cr=new Float32Array(e),null!=i._$hr&&(i._$hr=null),i._$hr=r?new Float32Array(e):null,U._$do){default:case U._$Ms:if(U._$Ls)for(var o=this._$d0-1;o>=0;--o){var n=o<<1;this._$Qi[n+1]=1-this._$Qi[n+1]}break;case U._$Qs:for(var o=this._$d0-1;o>=0;--o){var n=o<<1,s=o*U._$No,_=this._$Qi[n],a=this._$Qi[n+1];i._$Cr[s]=_,i._$Cr[s+1]=a,i._$Cr[s+4]=0,r&&(i._$hr[s]=_,i._$hr[s+1]=a,i._$hr[s+4]=0)}}return i},$t.prototype._$Nr=function(t,i){var e=i;if(this!=e._$GT()&&console.log("### assert!! ### "),this._$GS._$Ur(t)&&(W.prototype._$Nr.call(this,t,e),!e._$IS[0])){var r=$t._$gT;r[0]=!1,v._$Vr(t,this._$GS,r,this._$d0,this._$Eo,e._$Cr,U._$i2,U._$No)}},$t.prototype._$2b=function(t,i){try{this!=i._$GT()&&console.log("### assert!! ### ");var e=!1;i._$IS[0]&&(e=!0);var r=i;if(!e&&(W.prototype._$2b.call(this,t),this._$32())){var o=this.getTargetBaseDataID();if(r._$8r==W._$ur&&(r._$8r=t.getBaseDataIndex(o)),r._$8r<0)at._$so&&_._$li("_$L _$0P _$G :: %s",o);else{var n=t.getBaseData(r._$8r),s=t._$q2(r._$8r);null==n||s._$x2()?r._$AT=!1:(n._$nb(t,s,r._$Cr,r._$hr,this._$d0,U._$i2,U._$No),r._$AT=!0),r.baseOpacity=s.getTotalOpacity()}}}catch(t){throw t}},$t.prototype.draw=function(t,i,e){if(this!=e._$GT()&&console.log("### assert!! ### "),!e._$IS[0]){var r=e,o=this._$LP;o<0&&(o=1);var n=this.getOpacity(i,r)*e._$VS*e.baseOpacity,s=null!=r._$hr?r._$hr:r._$Cr;t.setClipBufPre_clipContextForDraw(e.clipBufPre_clipContext),t._$WP(this.culling),t._$Uo(o,3*this._$Yo,this._$BP,s,this._$Qi,n,this._$6s,r)}},$t.prototype.dump=function(){console.log(" _$yi( %d ) , _$d0( %d ) , _$Yo( %d ) \n",this._$LP,this._$d0,this._$Yo),console.log(" _$Oi _$di = { ");for(var t=0;tstartMotion() / start _$K _$3 (m%d)\n",r,e._$sr));if(null==t)return-1;e=new dt,e._$w0=t,this.motions.push(e);var n=e._$sr;return this._$eb&&_._$Ji("MotionQueueManager[size:%2d]->startMotion() / new _$w0 (m%d)\n",r,n),n},ct.prototype.updateParam=function(t){try{for(var i=!1,e=0;eupdateParam() / _$T0 _$w0 (m%d)\n",this.motions.length-1,r._$sr),this.motions.splice(e,1),e--)):(this.motions=this.motions.splice(e,1),e--)}else this.motions.splice(e,1),e--}return i}catch(t){return _._$li(t),!0}},ct.prototype.isFinished=function(t){if(arguments.length>=1){for(var i=0;i.9&&at.EXPAND_W,this.gl);if(null==this.gl)throw new Error("gl is null");var h=1*this._$C0*n,l=1*this._$tT*n,$=1*this._$WL*n,u=this._$lT*n;if(null!=this.clipBufPre_clipContextMask){a.frontFace(a.CCW),a.useProgram(this.shaderProgram),this._$vS=Tt(a,this._$vS,r),this._$no=Pt(a,this._$no,e),a.enableVertexAttribArray(this.a_position_Loc),a.vertexAttribPointer(this.a_position_Loc,2,a.FLOAT,!1,0,0),this._$NT=Tt(a,this._$NT,o),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,this.textures[t]),a.uniform1i(this.s_texture0_Loc,1),a.enableVertexAttribArray(this.a_texCoord_Loc),a.vertexAttribPointer(this.a_texCoord_Loc,2,a.FLOAT,!1,0,0),a.uniformMatrix4fv(this.u_matrix_Loc,!1,this.getClipBufPre_clipContextMask().matrixForMask);var p=this.getClipBufPre_clipContextMask().layoutChannelNo,f=this.getChannelFlagAsColor(p);a.uniform4f(this.u_channelFlag,f.r,f.g,f.b,f.a);var c=this.getClipBufPre_clipContextMask().layoutBounds;a.uniform4f(this.u_baseColor_Loc,2*c.x-1,2*c.y-1,2*c._$EL()-1,2*c._$5T()-1),a.uniform1i(this.u_maskFlag_Loc,!0)}else if(null!=this.getClipBufPre_clipContextDraw()){a.useProgram(this.shaderProgramOff),this._$vS=Tt(a,this._$vS,r),this._$no=Pt(a,this._$no,e),a.enableVertexAttribArray(this.a_position_Loc_Off),a.vertexAttribPointer(this.a_position_Loc_Off,2,a.FLOAT,!1,0,0),this._$NT=Tt(a,this._$NT,o),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,this.textures[t]),a.uniform1i(this.s_texture0_Loc_Off,1),a.enableVertexAttribArray(this.a_texCoord_Loc_Off),a.vertexAttribPointer(this.a_texCoord_Loc_Off,2,a.FLOAT,!1,0,0),a.uniformMatrix4fv(this.u_clipMatrix_Loc_Off,!1,this.getClipBufPre_clipContextDraw().matrixForDraw),a.uniformMatrix4fv(this.u_matrix_Loc_Off,!1,this.matrix4x4),a.activeTexture(a.TEXTURE2),a.bindTexture(a.TEXTURE_2D,at.fTexture[this.glno]),a.uniform1i(this.s_texture1_Loc_Off,2);var p=this.getClipBufPre_clipContextDraw().layoutChannelNo,f=this.getChannelFlagAsColor(p);a.uniform4f(this.u_channelFlag_Loc_Off,f.r,f.g,f.b,f.a),a.uniform4f(this.u_baseColor_Loc_Off,h,l,$,u)}else a.useProgram(this.shaderProgram),this._$vS=Tt(a,this._$vS,r),this._$no=Pt(a,this._$no,e),a.enableVertexAttribArray(this.a_position_Loc),a.vertexAttribPointer(this.a_position_Loc,2,a.FLOAT,!1,0,0),this._$NT=Tt(a,this._$NT,o),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,this.textures[t]),a.uniform1i(this.s_texture0_Loc,1),a.enableVertexAttribArray(this.a_texCoord_Loc),a.vertexAttribPointer(this.a_texCoord_Loc,2,a.FLOAT,!1,0,0),a.uniformMatrix4fv(this.u_matrix_Loc,!1,this.matrix4x4),a.uniform4f(this.u_baseColor_Loc,h,l,$,u),a.uniform1i(this.u_maskFlag_Loc,!1);this.culling?this.gl.enable(a.CULL_FACE):this.gl.disable(a.CULL_FACE),this.gl.enable(a.BLEND);var d,g,y,m;if(null!=this.clipBufPre_clipContextMask)d=a.ONE,g=a.ONE_MINUS_SRC_ALPHA,y=a.ONE,m=a.ONE_MINUS_SRC_ALPHA;else switch(s){case $t._$ms:d=a.ONE,g=a.ONE_MINUS_SRC_ALPHA,y=a.ONE,m=a.ONE_MINUS_SRC_ALPHA;break;case $t._$ns:d=a.ONE,g=a.ONE,y=a.ZERO,m=a.ONE;break;case $t._$_s:d=a.DST_COLOR,g=a.ONE_MINUS_SRC_ALPHA,y=a.ZERO,m=a.ONE}a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(d,g,y,m),this.anisotropyExt&&a.texParameteri(a.TEXTURE_2D,this.anisotropyExt.TEXTURE_MAX_ANISOTROPY_EXT,this.maxAnisotropy);var T=e.length;a.drawElements(a.TRIANGLES,T,a.UNSIGNED_SHORT,0),a.bindTexture(a.TEXTURE_2D,null)}},mt.prototype._$Rs=function(){throw new Error("_$Rs")},mt.prototype._$Ds=function(t){throw new Error("_$Ds")},mt.prototype._$K2=function(){for(var t=0;t=48){var r=G._$9o(t);return null!=r?(r._$F0(this),r):null}switch(t){case 1:return this._$bT();case 10:return new n(this._$6L(),!0);case 11:return new S(this._$mP(),this._$mP(),this._$mP(),this._$mP());case 12:return new S(this._$_T(),this._$_T(),this._$_T(),this._$_T());case 13:return new L(this._$mP(),this._$mP());case 14:return new L(this._$_T(),this._$_T());case 15:for(var o=this._$3L(),e=new Array(o),s=0;s>7-this._$hL++&1)},St.prototype._$zT=function(){0!=this._$hL&&(this._$hL=0)},vt.prototype._$wP=function(t,i,e){for(var r=0;rMath.PI;)e-=2*Math.PI;return e},Lt._$9=function(t){return Math.sin(t)},Lt.fcos=function(t){return Math.cos(t)},Mt.prototype._$u2=function(){return this._$IS[0]},Mt.prototype._$yo=function(){return this._$AT&&!this._$IS[0]},Mt.prototype._$GT=function(){return this._$e0},Et._$W2=0,Et.SYSTEM_INFO=null,Et.USER_AGENT=navigator.userAgent,Et.isIPhone=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isIPhone},Et.isIOS=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isIPhone||Et.SYSTEM_INFO._isIPad},Et.isAndroid=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isAndroid},Et.getOSVersion=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO.version},Et.getOS=function(){return Et.SYSTEM_INFO||Et.setup(),Et.SYSTEM_INFO._isIPhone||Et.SYSTEM_INFO._isIPad?"iOS":Et.SYSTEM_INFO._isAndroid?"Android":"_$Q0 OS"},Et.setup=function(){function t(t,i){for(var e=t.substring(i).split(/[ _,;\.]/),r=0,o=0;o<=2&&!isNaN(e[o]);o++){var n=parseInt(e[o]);if(n<0||n>999){_._$li("err : "+n+" @UtHtml5.setup()"),r=0;break}r+=n*Math.pow(1e3,2-o)}return r}var i,e=Et.USER_AGENT,r=Et.SYSTEM_INFO={userAgent:e};if((i=e.indexOf("iPhone OS "))>=0)r.os="iPhone",r._isIPhone=!0,r.version=t(e,i+"iPhone OS ".length);else if((i=e.indexOf("iPad"))>=0){if((i=e.indexOf("CPU OS"))<0)return void _._$li(" err : "+e+" @UtHtml5.setup()");r.os="iPad",r._isIPad=!0,r.version=t(e,i+"CPU OS ".length)}else(i=e.indexOf("Android"))>=0?(r.os="Android",r._isAndroid=!0,r.version=t(e,i+"Android ".length)):(r.os="-",r.version=-1)},window.UtSystem=w,window.UtDebug=_,window.LDTransform=gt,window.LDGL=nt,window.Live2D=at,window.Live2DModelWebGL=ft,window.Live2DModelJS=q,window.Live2DMotion=J,window.MotionQueueManager=ct,window.PhysicsHair=f,window.AMotion=s,window.PartsDataID=l,window.DrawDataID=b,window.BaseDataID=yt,window.ParamID=u,at.init();var At=!1}()}).call(i,e(7))},function(t,i){t.exports={import:function(){throw new Error("System.import cannot be used indirectly")}}},function(t,i,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(){this.models=[],this.count=-1,this.reloadFlg=!1,Live2D.init(),n.Live2DFramework.setPlatformManager(new _.default)}Object.defineProperty(i,"__esModule",{value:!0}),i.default=o;var n=e(0),s=e(9),_=r(s),a=e(10),h=r(a),l=e(1),$=r(l);o.prototype.createModel=function(){var t=new h.default;return this.models.push(t),t},o.prototype.changeModel=function(t,i){if(this.reloadFlg){this.reloadFlg=!1;this.releaseModel(0,t),this.createModel(),this.models[0].load(t,i)}},o.prototype.getModel=function(t){return t>=this.models.length?null:this.models[t]},o.prototype.releaseModel=function(t,i){this.models.length<=t||(this.models[t].release(i),delete this.models[t],this.models.splice(t,1))},o.prototype.numModels=function(){return this.models.length},o.prototype.setDrag=function(t,i){for(var e=0;e0){r.expressions={};for(var t=0;t { + const el = document.createElement(tag); + options.class && (el.className = options.class); + + return el; + }, + // 随机内容 + rand: (arr) => { + return arr[Math.floor(Math.random() * arr.length + 1) - 1]; + }, + // 是否为移动设备 + isMobile: () => { + let ua = window.navigator.userAgent.toLowerCase(); + ua = ua.indexOf("mobile") || ua.indexOf("android") || ua.indexOf("ios"); + + return window.innerWidth < 500 || ua !== -1; + } + } + + const elements = { + home: tools.create("span", { class: "pio-home" }), + skin: tools.create("span", { class: "pio-skin" }), + info: tools.create("span", { class: "pio-info" }), + night: tools.create("span", { class: "pio-night" }), + close: tools.create("span", { class: "pio-close" }), + + dialog: tools.create("div", { class: "pio-dialog" }), + show: tools.create("div", { class: "pio-show" }) + }; + + current.body.appendChild(elements.dialog); + current.body.appendChild(elements.show); + + /* - 方法 */ + const modules = { + // 更换模型 + idol: () => { + current.idol < (prop.model.length - 1) ? current.idol++ : current.idol = 0; + + return current.idol; + }, + // 创建对话框方法 + message: (text, options = {}) => { + const { dialog } = elements; + + if (text.constructor === Array) { + dialog.innerText = tools.rand(text); + } + else if (text.constructor === String) { + dialog[options.html ? "innerHTML" : "innerText"] = text; + } + else { + dialog.innerText = "输入内容出现问题了 X_X"; + } + + dialog.classList.add("active"); + + current.timeout = clearTimeout(current.timeout) || undefined; + current.timeout = setTimeout(() => { + dialog.classList.remove("active"); + }, options.time || 3000); + }, + // 移除方法 + destroy: () => { + that.initHidden(); + localStorage.setItem("posterGirl", "0"); + } + }; + + this.destroy = modules.destroy; + this.message = modules.message; + + /* - 提示操作 */ + const action = { + // 欢迎 + welcome: () => { + if (document.referrer && document.referrer.includes(current.root)) { + const referrer = document.createElement("a"); + referrer.href = document.referrer; + + if (prop.content.referer) { + modules.message(prop.content.referer.replace(/%t/, `“${referrer.hostname}”`)); + } + else { + modules.message(`欢迎来自 “${referrer.hostname}” 的朋友!`); + } + } + else if (prop.tips) { + let text, hour = new Date().getHours(); + + if (hour > 22 || hour <= 5) { + text = "你是夜猫子呀?这么晚还不睡觉,明天起的来嘛"; + } + else if (hour > 5 && hour <= 8) { + text = "早上好!"; + } + else if (hour > 8 && hour <= 11) { + text = "上午好!工作顺利嘛,不要久坐,多起来走动走动哦!"; + } + else if (hour > 11 && hour <= 14) { + text = "中午了,工作了一个上午,现在是午餐时间!"; + } + else if (hour > 14 && hour <= 17) { + text = "午后很容易犯困呢,今天的运动目标完成了吗?"; + } + else if (hour > 17 && hour <= 19) { + text = "傍晚了!窗外夕阳的景色很美丽呢,最美不过夕阳红~"; + } + else if (hour > 19 && hour <= 21) { + text = "晚上好,今天过得怎么样?"; + } + else if (hour > 21 && hour <= 23) { + text = "已经这么晚了呀,早点休息吧,晚安~"; + } + else{ + text = "奇趣保罗说:这个是无法被触发的吧,哈哈"; + } + + modules.message(text); + } + else { + modules.message(prop.content.welcome || "欢迎来到本站!"); + } + }, + // 触摸 + touch: () => { + current.canvas.onclick = () => { + modules.message(prop.content.touch || ["你在干什么?", "再摸我就报警了!", "HENTAI!", "不可以这样欺负我啦!"]); + }; + }, + // 右侧按钮 + buttons: () => { + // 返回首页 - 使用 Swup 无刷新跳转 + elements.home.onclick = () => { + // 检查 Swup 是否可用 + if (typeof window !== 'undefined' && window.swup) { + try { + // 使用 Swup 进行无刷新跳转 + window.swup.navigate('/'); + } catch (error) { + console.error('Swup navigation failed:', error); + // 降级到普通跳转 + location.href = current.root; + } + } else { + // Swup 不可用时使用普通跳转 + location.href = current.root; + } + }; + elements.home.onmouseover = () => { + modules.message(prop.content.home || "点击这里回到首页!"); + }; + current.menu.appendChild(elements.home); + + // 更换模型 + if (prop.model && prop.model.length > 1) { + elements.skin.onclick = () => { + loadlive2d("pio", prop.model[modules.idol()]); + + prop.content.skin && modules.message(prop.content.skin[1] || "新衣服真漂亮~"); + }; + elements.skin.onmouseover = () => { + prop.content.skin && modules.message(prop.content.skin[0] || "想看看我的新衣服吗?"); + }; + current.menu.appendChild(elements.skin); + } + + // 关于我 + elements.info.onclick = () => { + window.open(prop.content.link || "https://paugram.com/coding/add-poster-girl-with-plugin.html"); + }; + elements.info.onmouseover = () => { + modules.message("想了解更多关于我的信息吗?"); + }; + current.menu.appendChild(elements.info); + + // 夜间模式 + if (prop.night) { + elements.night.onclick = () => { + typeof prop.night === "function" ? prop.night() : eval(prop.night); + }; + elements.night.onmouseover = () => { + modules.message("夜间点击这里可以保护眼睛呢"); + }; + current.menu.appendChild(elements.night); + } + + // 关闭看板娘 + elements.close.onclick = () => { + modules.destroy(); + }; + elements.close.onmouseover = () => { + modules.message(prop.content.close || "QWQ 下次再见吧~"); + }; + current.menu.appendChild(elements.close); + }, + // 自定义选择器 + custom: () => { + prop.content.custom.forEach((item) => { + const el = document.querySelectorAll(item.selector); + + if (!el.length) return; + + for (let i = 0; i < el.length; i++) { + if (item.type === "read") { + el[i].onmouseover = (ev) => { + const text = ev.currentTarget.title || ev.currentTarget.innerText; + modules.message("想阅读 %t 吗?".replace(/%t/, "“" + text + "”")); + } + } + else if (item.type === "link") { + el[i].onmouseover = (ev) => { + const text = ev.currentTarget.title || ev.currentTarget.innerText; + modules.message("想了解一下 %t 吗?".replace(/%t/, "“" + text + "”")); + } + } + else if (item.text) { + el[i].onmouseover = () => { + modules.message(t.text); + } + } + } + }); + } + }; + + /* - 运行 */ + const begin = { + static: () => { + current.body.classList.add("static"); + }, + fixed: () => { + action.touch(); + action.buttons(); + }, + draggable: () => { + action.touch(); + action.buttons(); + + const body = current.body; + + const location = { + x: 0, + y: 0 + }; + + const mousedown = (ev) => { + const { offsetLeft, offsetTop } = ev.currentTarget; + + location.x = ev.clientX - offsetLeft; + location.y = ev.clientY - offsetTop; + + document.addEventListener("mousemove", mousemove); + document.addEventListener("mouseup", mouseup); + }; + + const mousemove = (ev) => { + body.classList.add("active"); + body.classList.remove("right"); + + body.style.left = (ev.clientX - location.x) + "px"; + body.style.top = (ev.clientY - location.y) + "px"; + body.style.bottom = "auto"; + } + + const mouseup = () => { + body.classList.remove("active"); + document.removeEventListener("mousemove", mousemove); + } + + body.onmousedown = mousedown; + } + }; + + // 运行 + this.init = (noModel) => { + // 未隐藏 + 非手机版,出现操作功能 + if (!(prop.hidden && tools.isMobile())) { + if (!noModel) { + action.welcome(); + loadlive2d("pio", prop.model[0]); + } + + switch (prop.mode) { + case "static": begin.static(); break; + case "fixed": begin.fixed(); break; + case "draggable": begin.draggable(); break; + } + + prop.content.custom && action.custom(); + } + }; + + // 隐藏状态 + this.initHidden = () => { + // ! 清除预设好的间距 + if (prop.mode === "draggable") { + current.body.style.top = null; + current.body.style.left = null; + current.body.style.bottom = null; + } + + current.body.classList.add("hidden"); + elements.dialog.classList.remove("active"); + + elements.show.onclick = () => { + current.body.classList.remove("hidden"); + localStorage.setItem("posterGirl", "1"); + + that.init(); + } + } + + localStorage.getItem("posterGirl") === "0" ? this.initHidden() : this.init(); +}; + +// 请保留版权说明 +if (window.console && window.console.log) { + console.log("%c Pio %c https://paugram.com ","color: #fff; margin: 1em 0; padding: 5px 0; background: #673ab7;","margin: 1em 0; padding: 5px 0; background: #efefef;"); +} diff --git a/scripts/build-with-pagefind.cjs b/scripts/build-with-pagefind.cjs new file mode 100644 index 0000000..7baa70c --- /dev/null +++ b/scripts/build-with-pagefind.cjs @@ -0,0 +1,83 @@ +/* This is a script to build the site with Pagefind */ + +const { execSync } = require('child_process'); +const { existsSync } = require('fs'); +const { join } = require('path'); + +// Detect the platform +function detectPlatform() { + // Check environment variables + if (process.env.VERCEL) { + return 'vercel'; + } + if (process.env.CF_PAGES) { + return 'cloudflare'; + } + if (process.env.NETLIFY) { + return 'netlify'; + } + if (process.env.GITHUB_ACTIONS) { + return 'github'; + } + + // Check if specific directories exist + if (existsSync('.vercel')) { + return 'vercel'; + } + + // Default to standard dist directory + return 'default'; +} + +// Get Pagefind output directory +function getPagefindOutputDir(platform) { + const outputDirs = { + vercel: '.vercel/output/static', + cloudflare: 'dist', + netlify: 'dist', + github: 'dist', + default: 'dist' + }; + + return outputDirs[platform] || 'dist'; +} + +// Main function +function main() { + const platform = detectPlatform(); + const outputDir = getPagefindOutputDir(platform); + + console.log(`🚀 Detected deployment platform: ${platform}`); + console.log(`📁 Pagefind output directory: ${outputDir}`); + + try { + // Run Astro build + console.log('🔨 Running Astro build...'); + execSync(`npx astro build`.trim(), { + stdio: 'inherit', + cwd: process.cwd() // Ensure in the correct directory + }); + + // Check if output directory exists + if (!existsSync(outputDir)) { + console.error(`❌ Output directory does not exist: ${outputDir}`); + process.exit(1); + } + + // Run Pagefind + console.log(`🔍 Running Pagefind search index generation...`); + execSync(`npx pagefind --site ${outputDir}`, { + stdio: 'inherit', + cwd: process.cwd() // Ensure in the correct directory + }); + + console.log('✅ Build completed!'); + console.log(`📊 Search index generated at: ${outputDir}/pagefind/`); + + } catch (error) { + console.error('❌ Build failed:', error.message); + process.exit(1); + } +} + +main(); diff --git a/scripts/compile-inline-stylus.cjs b/scripts/compile-inline-stylus.cjs new file mode 100644 index 0000000..5b12422 --- /dev/null +++ b/scripts/compile-inline-stylus.cjs @@ -0,0 +1,86 @@ +/* This is a script to compile inline Stylus */ + +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +// Recursively list files under a directory +function walk(dir) { + const res = []; + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const e of entries) { + const full = path.join(dir, e.name); + if (e.isDirectory()) res.push(...walk(full)); + else res.push(full); + } + return res; +} + +const srcDir = path.resolve('src'); +if (!fs.existsSync(srcDir)) { + console.error('No src directory found.'); + process.exit(1); +} + +const files = walk(srcDir); + +const styleBlockRe = /]*lang=["']stylus["'][^>]*>([\s\S]*?)<\/style>/ig; +const npxCmd = process.platform === 'win32' ? 'npx.cmd' : 'npx'; +const outNull = process.platform === 'win32' ? 'nul' : '/dev/null'; + +let failed = false; + +function compileStylusContent(content, tmpPath) { + fs.writeFileSync(tmpPath, content, 'utf8'); + try { + execSync(`${npxCmd} stylus "${tmpPath}" -o ${outNull}`, { stdio: 'pipe' }); + fs.unlinkSync(tmpPath); + return { ok: true }; + } catch (err) { + const msg = err.stderr ? err.stderr.toString() : err.message; + // keep temp file for debugging + return { ok: false, error: msg }; + } +} + +// Check .styl files +const stylFiles = files.filter(f => f.endsWith('.styl')); +for (const f of stylFiles) { + const content = fs.readFileSync(f, 'utf8'); + const tmp = f + '.tmp.styl'; + const r = compileStylusContent(content, tmp); + if (r.ok) console.log(`${f}: OK`); + else { + failed = true; + console.error(`${f}: ERROR\n${r.error}`); + } +} + +// Check inline + + \ No newline at end of file diff --git a/src/components/backwardButton.astro b/src/components/backwardButton.astro new file mode 100644 index 0000000..555c4ae --- /dev/null +++ b/src/components/backwardButton.astro @@ -0,0 +1,45 @@ +--- +import { getParentLink } from "@utils/navigation"; +import { url } from "@utils/url"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +interface Props { + currentPath?: string; + href?: string; + text?: string; +} + +const { currentPath, href, text } = Astro.props; + +let targetUrl = href; +let targetText = text; + +if (currentPath && !targetUrl) { + const parentLink = getParentLink(currentPath); + if (parentLink) { + targetUrl = url(parentLink.url); + targetText = `${i18n(I18nKey.backTo)} ${parentLink.name}`; + } +} + +// 如果既没有传入 href,也没能根据 currentPath 找到父级菜单,则不渲染 +if (!targetUrl) { + return null; +} +--- + +
    \ No newline at end of file diff --git a/src/components/banner.astro b/src/components/banner.astro new file mode 100644 index 0000000..addacb6 --- /dev/null +++ b/src/components/banner.astro @@ -0,0 +1,364 @@ +--- +import type { SiteConfig } from "@/types/config"; +import { BANNER_HEIGHT_EXTEND } from "@constants/constants"; +import TypewriterText from "@components/common/typewriterText.astro"; +import ImageWrapper from "@components/common/imageWrapper.astro"; + + +interface Props { + config: SiteConfig["wallpaper"]; + isHomePage: boolean; + class?: string; +} + +const { config, isHomePage, class: className } = Astro.props; + +// 获取当前设备类型的图片源 +const getImageSources = () => { + const toArray = (src: any) => [src || []].flat(); + const { src } = config; + const isObj = src && typeof src === "object" && !Array.isArray(src); + const desktop = toArray(isObj ? (src as any).desktop : src); + const mobile = toArray(isObj ? (src as any).mobile : src); + return { + desktop: desktop.length > 0 ? desktop : mobile, + mobile: mobile.length > 0 ? mobile : desktop, + }; +} + +const imageSources = getImageSources(); + +// 轮播配置 +const carouselConfig = config.carousel; +const isCarouselEnabled = imageSources.desktop.length > 1 || imageSources.mobile.length > 1; +const carouselInterval = carouselConfig?.interval || 6 + +// 样式配置 +const showHomeText = config.banner?.homeText?.enable && isHomePage; +const showWaves = config.banner?.waves?.enable; +const isPerformanceMode = config.banner?.waves?.performanceMode; +--- + + + + + \ No newline at end of file diff --git a/src/components/common/DropdownItem.svelte b/src/components/common/DropdownItem.svelte new file mode 100644 index 0000000..5711545 --- /dev/null +++ b/src/components/common/DropdownItem.svelte @@ -0,0 +1,45 @@ + + + \ No newline at end of file diff --git a/src/components/common/DropdownPanel.svelte b/src/components/common/DropdownPanel.svelte new file mode 100644 index 0000000..98de681 --- /dev/null +++ b/src/components/common/DropdownPanel.svelte @@ -0,0 +1,23 @@ + + +
    + {#if children} + {@render children()} + {/if} +
    \ No newline at end of file diff --git a/src/components/common/buttonLink.astro b/src/components/common/buttonLink.astro new file mode 100644 index 0000000..6b9cf20 --- /dev/null +++ b/src/components/common/buttonLink.astro @@ -0,0 +1,43 @@ +--- +interface Props { + badge?: string; + url?: string; + label?: string; +} +const { badge, url, label } = Astro.props; +--- + + + + \ No newline at end of file diff --git a/src/components/common/buttonTag.astro b/src/components/common/buttonTag.astro new file mode 100644 index 0000000..f54c552 --- /dev/null +++ b/src/components/common/buttonTag.astro @@ -0,0 +1,14 @@ +--- +interface Props { + size?: string; + dot?: boolean; + href?: string; + label?: string; +} +const { dot, href, label }: Props = Astro.props; +--- + + + {dot &&
    } + +
    \ No newline at end of file diff --git a/src/components/common/icon.astro b/src/components/common/icon.astro new file mode 100644 index 0000000..59b81a4 --- /dev/null +++ b/src/components/common/icon.astro @@ -0,0 +1,181 @@ +--- +// 可靠的图标组件 +// 提供加载状态管理和错误处理 + +export interface Props { + icon: string; + class?: string; + style?: string; + size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl"; + color?: string; + fallback?: string; // 备用图标或文本 + loading?: "lazy" | "eager"; +} + +const { + icon, + class: className = "", + style = "", + size = "md", + color, + fallback = "●", + loading = "lazy", +} = Astro.props; + +// 尺寸映射 +const sizeClasses = { + xs: "text-xs", + sm: "text-sm", + md: "text-base", + lg: "text-lg", + xl: "text-xl", + "2xl": "text-2xl", +}; + +const sizeClass = sizeClasses[size] || sizeClasses.md; +const colorStyle = color ? `color: ${color};` : ""; +const combinedStyle = `${colorStyle}${style}`; +const combinedClass = `${sizeClass} ${className}`.trim(); + +// 生成唯一ID +const iconId = `icon-${Math.random().toString(36).substr(2, 9)}`; +--- + + + + + {fallback} + + + + + + + + + \ No newline at end of file diff --git a/src/components/common/iconifyLoader.astro b/src/components/common/iconifyLoader.astro new file mode 100644 index 0000000..dda7c92 --- /dev/null +++ b/src/components/common/iconifyLoader.astro @@ -0,0 +1,266 @@ +--- +// 全局Iconify加载器组件 +// 在页面头部加载,确保图标库尽早可用 + +export interface Props { + preloadIcons?: string[]; // 需要预加载的图标列表 + timeout?: number; // 加载超时时间 + retryCount?: number; // 重试次数 +} + +const { preloadIcons = [], timeout = 10000, retryCount = 3 } = Astro.props; +--- + + + + + + \ No newline at end of file diff --git a/src/components/common/imageWrapper.astro b/src/components/common/imageWrapper.astro new file mode 100644 index 0000000..70b2eff --- /dev/null +++ b/src/components/common/imageWrapper.astro @@ -0,0 +1,61 @@ +--- +import type { ImageMetadata } from "astro"; +import { Image } from "astro:assets"; +import path from "node:path"; + +import { url } from "@utils/url"; + + +interface Props { + id?: string; + src: string; + class?: string; + alt?: string; + position?: string; + basePath?: string; + style?: string; + loading?: "lazy" | "eager"; + decoding?: "async" | "auto" | "sync"; +} + +const { id, src, alt, position = "center", basePath = "/", style, loading = "lazy", decoding = "async" } = Astro.props; +const className = Astro.props.class; + +const isLocal = !( + src.startsWith("/") || + src.startsWith("http") || + src.startsWith("https") || + src.startsWith("data:") +); +const isPublic = src.startsWith("/"); + +// TODO temporary workaround for images dynamic import +// https://github.com/withastro/astro/issues/3373 +// biome-ignore lint/suspicious/noImplicitAnyLet: +let img; +if (isLocal) { + const files = import.meta.glob("../../**", { + import: "default", + }); + let normalizedPath = path + .normalize(path.join("../../", basePath, src)) + .replace(/\\/g, "/"); + const file = files[normalizedPath]; + if (!file) { + console.error( + `\n[ERROR] Image file not found: ${normalizedPath.replace("../../", "src/")}`, + ); + } else { + img = await file(); + } +} + +const imageClass = "w-full h-full object-cover"; +const imageStyle = `object-position: ${position}`; +--- + +
    +
    + {isLocal && img && {alt} + {!isLocal && {alt} +
    \ No newline at end of file diff --git a/src/components/common/markdown.astro b/src/components/common/markdown.astro new file mode 100644 index 0000000..dcb6d40 --- /dev/null +++ b/src/components/common/markdown.astro @@ -0,0 +1,16 @@ +--- +// 只加载基础的等宽字体,减少加载时间 +import "@fontsource-variable/jetbrains-mono"; + + +interface Props { + class: string; +} +const className = Astro.props.class; +--- + +
    + + + +
    \ No newline at end of file diff --git a/src/components/common/passwordProtection.astro b/src/components/common/passwordProtection.astro new file mode 100644 index 0000000..099faab --- /dev/null +++ b/src/components/common/passwordProtection.astro @@ -0,0 +1,285 @@ +--- +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import CryptoJS from 'crypto-js'; + + +interface Props { + isEncrypted?: boolean; + password?: string; +} + +const { isEncrypted = false, password = "" } = Astro.props; + +let encryptedContent = ""; +if (isEncrypted) { + const html = await Astro.slots.render('default'); + encryptedContent = CryptoJS.AES.encrypt(html, password).toString(); +} +--- + +{!isEncrypted ? ( + +) : ( +
    +
    +
    + + + +
    +

    {i18n(I18nKey.passwordProtectedTitle)}

    +

    {i18n(I18nKey.passwordProtectedDescription)}

    +
    +
    + + +
    + +
    + +
    +
    + + + + +)} + + \ No newline at end of file diff --git a/src/components/common/typewriterText.astro b/src/components/common/typewriterText.astro new file mode 100644 index 0000000..66225da --- /dev/null +++ b/src/components/common/typewriterText.astro @@ -0,0 +1,154 @@ +--- +export interface Props { + text: string | string[]; + speed?: number; + deleteSpeed?: number; + pauseTime?: number; + class?: string; +} + +const { + text, + speed = 100, + deleteSpeed = 50, + pauseTime = 2000, + class: className = "", +} = Astro.props; +const textData = Array.isArray(text) ? JSON.stringify(text) : text; +--- + + + + + + \ No newline at end of file diff --git a/src/components/configCarrier.astro b/src/components/configCarrier.astro new file mode 100644 index 0000000..e20ebba --- /dev/null +++ b/src/components/configCarrier.astro @@ -0,0 +1,13 @@ +--- +import { siteConfig } from "@/config"; +--- + + +
    +
    \ No newline at end of file diff --git a/src/components/data/projectCard.astro b/src/components/data/projectCard.astro new file mode 100644 index 0000000..0ac833e --- /dev/null +++ b/src/components/data/projectCard.astro @@ -0,0 +1,179 @@ +--- +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +export interface Props { + project: { + id: string; + title: string; + description: string; + image?: string; + category: string; + techStack: string[]; + status: "completed" | "in-progress" | "planned"; + demoUrl?: string; + sourceUrl?: string; + startDate: string; + endDate?: string; + featured?: boolean; + tags?: string[]; + }; + size?: "small" | "medium" | "large"; + showImage?: boolean; + maxTechStack?: number; +} + +const { + project, + size = "medium", + showImage = true, + maxTechStack = 4, +} = Astro.props; + +// 状态样式映射 +const getStatusStyle = (status: string) => { + switch (status) { + case "completed": + return "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400"; + case "in-progress": + return "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400"; + case "planned": + return "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"; + default: + return "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"; + } +}; + +// 状态文本映射 +const getStatusText = (status: string) => { + switch (status) { + case "completed": + return i18n(I18nKey.projectsCompleted); + case "in-progress": + return i18n(I18nKey.projectsInProgress); + case "planned": + return i18n(I18nKey.projectsPlanned); + default: + return status; + } +}; + +// 尺寸样式映射 +const getSizeClasses = (size: string) => { + switch (size) { + case "small": + return { + container: "p-4", + title: "text-lg", + description: "text-sm line-clamp-2", + tech: "text-xs", + links: "text-sm", + }; + case "large": + return { + container: "p-6", + title: "text-xl", + description: "text-base line-clamp-3", + tech: "text-sm", + links: "text-base", + }; + default: // medium + return { + container: "p-5", + title: "text-lg", + description: "text-sm line-clamp-2", + tech: "text-xs", + links: "text-sm", + }; + } +}; + +const sizeClasses = getSizeClasses(size); +--- + +
    + + {showImage && project.image && ( +
    + {project.title} +
    + )} + +
    + +
    +

    + {project.title} +

    + + {getStatusText(project.status)} + +
    + + {project.category && ( +
    + + {project.category} + +
    + )} + +

    + {project.description} +

    + + {project.techStack && project.techStack.length > 0 && ( +
    + {project.techStack.slice(0, maxTechStack).map((tech) => ( + + {tech} + + ))} + {project.techStack.length > maxTechStack && ( + + +{project.techStack.length - maxTechStack} + + )} +
    + )} + + {project.tags && project.tags.length > 0 && ( +
    + {project.tags.map((tag) => ( + + #{tag} + + ))} +
    + )} + +
    + {project.demoUrl && ( + + {i18n(I18nKey.projectsDemo)} + + )} + {project.sourceUrl && ( + + {i18n(I18nKey.projectsSource)} + + )} +
    +
    +
    diff --git a/src/components/data/skillCard.astro b/src/components/data/skillCard.astro new file mode 100644 index 0000000..14bd8d8 --- /dev/null +++ b/src/components/data/skillCard.astro @@ -0,0 +1,219 @@ +--- +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import Icon from "@components/common/icon.astro"; + + +export interface Props { + skill: { + id: string; + name: string; + description: string; + icon?: string; + category: string; + level: "beginner" | "intermediate" | "advanced" | "expert"; + experience: string | { years: number; months: number }; + relatedProjects?: string[]; + certifications?: string[]; + color?: string; + }; + size?: "small" | "medium" | "large"; + showProgress?: boolean; + showIcon?: boolean; +} + +const { + skill, + size = "medium", + showProgress = true, + showIcon = true, +} = Astro.props; + +// 技能等级颜色映射 +const getLevelColor = (level: string) => { + switch (level) { + case "expert": + return "bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400"; + case "advanced": + return "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400"; + case "intermediate": + return "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400"; + case "beginner": + return "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400"; + default: + return "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"; + } +}; + +// 技能等级文本映射 +const getLevelText = (level: string) => { + switch (level) { + case "expert": + return i18n(I18nKey.skillsExpert); + case "advanced": + return i18n(I18nKey.skillsAdvanced); + case "intermediate": + return i18n(I18nKey.skillsIntermediate); + case "beginner": + return i18n(I18nKey.skillsBeginner); + default: + return level; + } +}; + +// 技能等级进度条宽度 +const getLevelWidth = (level: string) => { + switch (level) { + case "expert": + return "100%"; + case "advanced": + return "80%"; + case "intermediate": + return "60%"; + case "beginner": + return "40%"; + default: + return "20%"; + } +}; + +// 尺寸样式映射 +const getSizeClasses = (size: string) => { + switch (size) { + case "small": + return { + container: "p-4", + icon: "w-8 h-8", + iconText: "text-lg", + title: "text-base", + description: "text-xs line-clamp-2", + badge: "text-xs", + progress: "h-1.5", + }; + case "large": + return { + container: "p-6", + icon: "w-14 h-14", + iconText: "text-3xl", + title: "text-xl", + description: "text-sm line-clamp-3", + badge: "text-sm", + progress: "h-3", + }; + default: // medium + return { + container: "p-5", + icon: "w-10 h-10", + iconText: "text-xl", + title: "text-lg", + description: "text-sm line-clamp-2", + badge: "text-xs", + progress: "h-2", + }; + } +}; + +const sizeClasses = getSizeClasses(size); +const skillColor = skill.color || "#3B82F6"; + +// 经验展示文本 +const getExperienceText = (experience: Props["skill"]["experience"]) => { + if (typeof experience === "string") return experience; + const yearsText = `${experience.years}${i18n(I18nKey.skillYears)}`; + const monthsText = + experience.months > 0 + ? ` ${experience.months}${i18n(I18nKey.skillMonths)}` + : ""; + return `${yearsText}${monthsText}`; +}; +--- + +
    +
    +
    + + {showIcon && skill.icon && ( +
    + +
    + )} +
    + +
    +

    + {skill.name} +

    + + {getLevelText(skill.level)} + +
    + + {skill.category && ( +
    + + {skill.category} + +
    + )} + +

    + {skill.description} +

    + + {showProgress && ( +
    +
    + {i18n(I18nKey.skillExperience)} + {getExperienceText(skill.experience)} +
    +
    +
    +
    +
    + )} + + {skill.certifications && skill.certifications.length > 0 && ( +
    +
    + {skill.certifications.map((cert) => ( + + 🏆 {cert} + + ))} +
    +
    + )} + + {skill.relatedProjects && skill.relatedProjects.length > 0 && ( +
    + {i18n(I18nKey.skillsProjects)}: {skill.relatedProjects.length} +
    + )} +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/components/data/timelineItem.astro b/src/components/data/timelineItem.astro new file mode 100644 index 0000000..056364f --- /dev/null +++ b/src/components/data/timelineItem.astro @@ -0,0 +1,372 @@ +--- +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import Icon from "@components/common/icon.astro"; + + +export interface Props { + item: { + id: string; + title: string; + description: string; + type: "education" | "work" | "project" | "achievement"; + startDate: string; + endDate?: string; + location?: string; + organization?: string; + position?: string; + skills?: string[]; + achievements?: string[]; + links?: { + name: string; + url: string; + type: "certificate" | "project" | "other"; + }[]; + icon?: string; + color?: string; + featured?: boolean; + }; + showTimeline?: boolean; + size?: "small" | "medium" | "large"; + layout?: "card" | "timeline"; +} + +const { + item, + showTimeline = true, + size = "medium", + layout = "timeline", +} = Astro.props; + +// 类型图标映射 +const getTypeIcon = (type: string) => { + switch (type) { + case "education": + return "material-symbols:school"; + case "work": + return "material-symbols:work"; + case "project": + return "material-symbols:code"; + case "achievement": + return "material-symbols:emoji-events"; + default: + return "material-symbols:event"; + } +}; + +// 类型颜色映射 +const getTypeColor = (type: string) => { + switch (type) { + case "education": + return "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"; + case "work": + return "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400"; + case "project": + return "bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400"; + case "achievement": + return "bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400"; + default: + return "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"; + } +}; + +// 类型文本映射 +const getTypeText = (type: string) => { + switch (type) { + case "education": + return i18n(I18nKey.timelineEducation); + case "work": + return i18n(I18nKey.timelineWork); + case "project": + return i18n(I18nKey.timelineProject); + case "achievement": + return i18n(I18nKey.timelineAchievement); + default: + return type; + } +}; + +// 链接图标映射 +const getLinkIcon = (type: string) => { + switch (type) { + case "certificate": + return "🏆"; + case "project": + return "📑"; + case "other": + return "🔗"; + default: + return "🔗"; + } +}; + +// 格式化日期 +const formatDate = (dateString: string) => { + const date = new Date(dateString); + return date.toLocaleDateString("zh-CN", { year: "numeric", month: "long" }); +}; + +// 计算持续时间 +const getDuration = (startDate: string, endDate?: string) => { + const start = new Date(startDate); + const end = endDate ? new Date(endDate) : new Date(); + const diffTime = Math.abs(end.getTime() - start.getTime()); + const diffMonths = Math.ceil(diffTime / (1000 * 60 * 60 * 24 * 30)); + + if (diffMonths < 12) { + return `${diffMonths} ${i18n(I18nKey.timelineMonths)}`; + } else { + const years = Math.floor(diffMonths / 12); + const months = diffMonths % 12; + if (months === 0) { + return `${years} ${i18n(I18nKey.timelineYears)}`; + } else { + return `${years} ${i18n(I18nKey.timelineYears)} ${months} ${i18n(I18nKey.timelineMonths)}`; + } + } +}; + +// 尺寸样式映射 +const getSizeClasses = (size: string) => { + switch (size) { + case "small": + return { + container: "p-4", + node: "w-8 h-8", + nodeIcon: "text-lg", + title: "text-lg", + meta: "text-xs", + description: "text-sm", + badge: "text-xs", + }; + case "large": + return { + container: "p-8", + node: "w-16 h-16", + nodeIcon: "text-2xl", + title: "text-2xl", + meta: "text-base", + description: "text-base", + badge: "text-sm", + }; + default: // medium + return { + container: "p-6", + node: "w-12 h-12", + nodeIcon: "text-xl", + title: "text-xl", + meta: "text-sm", + description: "text-sm", + badge: "text-xs", + }; + } +}; + +const sizeClasses = getSizeClasses(size); +const itemColor = item.color || "#3B82F6"; +--- + +{layout === 'timeline' ? ( + +
    + + {showTimeline && ( +
    + +
    + )} + +
    +
    + +
    +
    +

    + {item.title} + {item.featured && ( + + )} +

    + {item.organization && ( +
    + {item.organization} {item.position && `• ${item.position}`} +
    + )} +
    + + {getTypeText(item.type)} + +
    + +
    +
    + {formatDate(item.startDate)} - {item.endDate ? formatDate(item.endDate) : i18n(I18nKey.timelinePresent)} +
    +
    +
    {getDuration(item.startDate, item.endDate)}
    + {item.location && ( + <> +
    +
    📍 {item.location}
    + + )} +
    + +

    + {item.description} +

    + + {item.achievements && item.achievements.length > 0 && ( +
    +

    + {i18n(I18nKey.timelineAchievements)} +

    +
      + {item.achievements.map((achievement) => ( +
    • + + {achievement} +
    • + ))} +
    +
    + )} + + {item.skills && item.skills.length > 0 && ( +
    +
    + {item.skills.map((skill) => ( + + {skill} + + ))} +
    +
    + )} + + {item.links && item.links.length > 0 && ( +
    + {item.links.map((link) => ( + + {getLinkIcon(link.type)} + {link.name} + + ))} +
    + )} +
    +
    +
    +) : ( + +
    +
    + +
    +
    + +
    +
    +
    +

    + {item.title} + {item.featured && ( + + )} +

    + + {getTypeText(item.type)} + +
    + {item.organization && ( +
    + {item.organization} {item.position && `• ${item.position}`} +
    + )} + {item.location && ( +
    + 📍 {item.location} +
    + )} +
    +
    + +
    + {formatDate(item.startDate)} - {item.endDate ? formatDate(item.endDate) : i18n(I18nKey.timelinePresent)} ({getDuration(item.startDate, item.endDate)}) +
    + +

    + {item.description} +

    + + {item.achievements && item.achievements.length > 0 && ( +
    +

    + {i18n(I18nKey.timelineAchievements)} +

    +
      + {item.achievements.slice(0, 3).map((achievement) => ( +
    • + + {achievement} +
    • + ))} + {item.achievements.length > 3 && ( +
    • + ... 还有 {item.achievements.length - 3} 项成就 +
    • + )} +
    +
    + )} + +
    + {item.skills && item.skills.length > 0 && ( +
    + {item.skills.slice(0, 3).map((skill) => ( + + {skill} + + ))} + {item.skills.length > 3 && ( + + +{item.skills.length - 3} + + )} +
    + )} + {item.links && item.links.length > 0 && ( +
    + {item.links.slice(0, 2).map((link) => ( + + {getLinkIcon(link.type)} {link.name} + + ))} +
    + )} +
    +
    +
    +)} \ No newline at end of file diff --git a/src/components/fontLoader.astro b/src/components/fontLoader.astro new file mode 100644 index 0000000..64fa4f5 --- /dev/null +++ b/src/components/fontLoader.astro @@ -0,0 +1,75 @@ +--- +import { siteConfig } from "@/config"; + + +// Get all fonts from config +const fontConfig = siteConfig.font || {}; +const fonts = Object.entries(fontConfig).map(([id, font]) => ( + {id, ...font} +)); + +// Generate font-family strings +const selectedFontFamilies = fonts + .filter(font => font && font.family) + .map(font => `"${font.family}"`); + +const fallbacks = "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif"; +const customFontFamily = selectedFontFamilies.join(", "); +const finalFontFamily = customFontFamily ? `${customFontFamily}, ${fallbacks}` : fallbacks; +--- + + +{ + fonts.map((font) => { + const isCss = font.src.endsWith('.css') || font.src.includes('fonts.googleapis.com') || font.src.includes('unpkg.com'); + if (isCss) { + // If it's a Google Font, we can append &display=swap if it's not already there + let fontSrc = font.src; + if (fontSrc.includes('fonts.googleapis.com') && !fontSrc.includes('display=')) { + fontSrc += (fontSrc.includes('?') ? '&' : '?') + 'display=swap'; + } + return ( + <> + + + + ); + } else if (font.src) { + // Assume it's a font file (ttf, woff, woff2, etc.) + return ( + <> + + \ No newline at end of file diff --git a/src/components/musicPlayer.svelte b/src/components/musicPlayer.svelte new file mode 100644 index 0000000..03016e1 --- /dev/null +++ b/src/components/musicPlayer.svelte @@ -0,0 +1,796 @@ + + + + +{#if musicPlayerConfig.enable} +{#if showError} +
    +
    + + {errorMessage} + +
    +
    +{/if} + +
    + {#if showPlaylist} +
    +
    +

    {i18n(Key.playlist)}

    + +
    +
    + {#each playlist as song, index} +
    playSong(index)} + onkeydown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + playSong(index); + } + }} + role="button" + tabindex="0" + aria-label="播放 {song.title} - {song.artist}"> +
    + {#if index === currentIndex && isPlaying} + + {:else if index === currentIndex} + + {:else} + + {/if} +
    + +
    + {song.title} +
    +
    +
    + {song.title} +
    + +
    +
    + {/each} +
    +
    + {/if} + +
    { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + toggleCollapse(); + } + }} + role="button" + tabindex="0" + aria-label={i18n(Key.musicExpand)}> + {#if isLoading} + + {:else if isPlaying} +
    +
    +
    +
    +
    + {:else} + + {/if} +
    + +
    +
    +
    + 封面 +
    +
    +
    {currentSong.title}
    +
    {currentSong.artist}
    +
    + {formatTime(currentTime)} / {formatTime(duration)} +
    +
    +
    + + +
    +
    +
    +
    { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + const rect = progressBar?.getBoundingClientRect(); + if (rect) { + const percent = 0.5; + const newTime = percent * duration; + if (audio) { + audio.currentTime = newTime; + currentTime = newTime; + } + } + } + }} + role="slider" + tabindex="0" + aria-label={i18n(Key.musicProgress)} + aria-valuemin="0" + aria-valuemax="100" + aria-valuenow={duration > 0 ? (currentTime / duration * 100) : 0}> +
    +
    +
    +
    +
    + + + + + + + +
    +
    + +
    { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + if (e.key === 'Enter') toggleMute(); + } + }} + role="slider" + tabindex="0" + aria-label={i18n(Key.musicVolume)} + aria-valuemin="0" + aria-valuemax="100" + aria-valuenow={volume * 100}> +
    +
    +
    + +
    +
    +
    + +{/if} \ No newline at end of file diff --git a/src/components/navbar.astro b/src/components/navbar.astro new file mode 100644 index 0000000..13f1b9c --- /dev/null +++ b/src/components/navbar.astro @@ -0,0 +1,171 @@ +--- +import { Icon } from "astro-icon/components"; + +import { navbarConfig, siteConfig } from "@/config"; +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset, type NavbarLink } from "@/types/config"; +import { url } from "@utils/url"; +import { getNavbarTransparentModeForWallpaperMode, getDefaultWallpaperMode } from "@utils/wallpaper"; +import NavLinks from "@components/navbar/navLinks.astro"; +import NavMenu from "@components/navbar/navMenu.svelte"; +import Search from "@components/navbar/search.svelte"; +import Translator from "@components/navbar/translator.svelte"; +import DisplaySettings from "@components/navbar/displaySettings.svelte"; +import LightDarkSwitch from "@components/navbar/lightDarkSwitch.svelte"; +import WallpaperSwitch from "@components/navbar/wallpaperSwitch.svelte"; + + +const className = Astro.props.class; + +// 获取导航栏透明模式配置 - 根据当前壁纸模式读取正确的配置 +const navbarTransparentMode = getNavbarTransparentModeForWallpaperMode(getDefaultWallpaperMode()); + +// 检查是否为首页 +const isHomePage = Astro.url.pathname === "/" || Astro.url.pathname === ""; + +let links: NavbarLink[] = navbarConfig.links.map( + (item: NavbarLink | LinkPreset): NavbarLink => { + if (typeof item === "number") { + return LinkPresets[item]; + } + return item; + }, +); +--- + + + + + +{import.meta.env.PROD && } \ No newline at end of file diff --git a/src/components/navbar/displaySettings.svelte b/src/components/navbar/displaySettings.svelte new file mode 100644 index 0000000..a826d47 --- /dev/null +++ b/src/components/navbar/displaySettings.svelte @@ -0,0 +1,139 @@ + + +
    + +
    +
    +
    +
    + {i18n(I18nKey.themeColor)} + +
    +
    +
    + {hue} +
    +
    +
    +
    + +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/src/components/navbar/lightDarkSwitch.svelte b/src/components/navbar/lightDarkSwitch.svelte new file mode 100644 index 0000000..214e6cb --- /dev/null +++ b/src/components/navbar/lightDarkSwitch.svelte @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/src/components/navbar/navLinks.astro b/src/components/navbar/navLinks.astro new file mode 100644 index 0000000..2a68224 --- /dev/null +++ b/src/components/navbar/navLinks.astro @@ -0,0 +1,30 @@ +--- +import { Icon } from "astro-icon/components"; + +import { type NavbarLink } from "@/types/config"; +import { url } from "@utils/url"; + + +interface Props { + link: NavbarLink; + class?: string; +} + +const { link, class: className } = Astro.props; +--- + + \ No newline at end of file diff --git a/src/components/navbar/navMenu.svelte b/src/components/navbar/navMenu.svelte new file mode 100644 index 0000000..76b9721 --- /dev/null +++ b/src/components/navbar/navMenu.svelte @@ -0,0 +1,69 @@ + + + \ No newline at end of file diff --git a/src/components/navbar/search.svelte b/src/components/navbar/search.svelte new file mode 100644 index 0000000..6b5f52d --- /dev/null +++ b/src/components/navbar/search.svelte @@ -0,0 +1,285 @@ + + + + + + + + + + + +
    + + +
    + + {#each result as item} + handleResultClick(e, item.url)} + class="transition first-of-type:mt-2 lg:first-of-type:mt-0 group block + rounded-xl text-lg px-3 py-2 hover:bg-(--btn-plain-bg-hover) active:bg-(--btn-plain-bg-active)"> +
    + {item.meta.title} +
    +
    + {@html item.excerpt} +
    +
    + {/each} +
    + + \ No newline at end of file diff --git a/src/components/navbar/translator.svelte b/src/components/navbar/translator.svelte new file mode 100644 index 0000000..7e80622 --- /dev/null +++ b/src/components/navbar/translator.svelte @@ -0,0 +1,153 @@ + + +{#if siteConfig.translate?.enable} +
    + + + +
    + +
    + 选择语言 / Select Language +
    +
    + {#each languages as lang} + changeLanguage(lang.code)} + class="gap-3 p-2! h-auto!" + isLast={false} + > + {lang.icon} + {lang.name} + {#if currentLanguage === lang.code} + + {/if} + + {/each} +
    +
    +
    +
    +{/if} + + \ No newline at end of file diff --git a/src/components/navbar/wallpaperSwitch.svelte b/src/components/navbar/wallpaperSwitch.svelte new file mode 100644 index 0000000..cbb6cf7 --- /dev/null +++ b/src/components/navbar/wallpaperSwitch.svelte @@ -0,0 +1,106 @@ + + + + + diff --git a/src/components/pagination.astro b/src/components/pagination.astro new file mode 100644 index 0000000..bd1fa5b --- /dev/null +++ b/src/components/pagination.astro @@ -0,0 +1,86 @@ +--- +import type { Page } from "astro"; +import { Icon } from "astro-icon/components"; + +import { url } from "@utils/url"; + + +interface Props { + page: Page; + class?: string; + style?: string; +} + +const { page, style } = Astro.props; + +const HIDDEN = -1; + +const className = Astro.props.class; + +const ADJ_DIST = 2; +const VISIBLE = ADJ_DIST * 2 + 1; + +// for test +let count = 1; +let l = page.currentPage; +let r = page.currentPage; +while (0 < l - 1 && r + 1 <= page.lastPage && count + 2 <= VISIBLE) { + count += 2; + l--; + r++; +} +while (0 < l - 1 && count < VISIBLE) { + count++; + l--; +} +while (r + 1 <= page.lastPage && count < VISIBLE) { + count++; + r++; +} + +let pages: number[] = []; +if (l > 1) pages.push(1); +if (l === 3) pages.push(2); +if (l > 3) pages.push(HIDDEN); +for (let i = l; i <= r; i++) pages.push(i); +if (r < page.lastPage - 2) pages.push(HIDDEN); +if (r === page.lastPage - 2) pages.push(page.lastPage - 1); +if (r < page.lastPage) pages.push(page.lastPage); + +const getPageUrl = (p: number) => { + if (p === 1) return "/"; + return `/${p}/`; +}; +--- + +
    + + + +
    + {pages.map((p) => { + if (p == HIDDEN) + return ; + if (p == page.currentPage) + return
    + {p} +
    + return {p} + })} +
    + + + +
    \ No newline at end of file diff --git a/src/components/pio.svelte b/src/components/pio.svelte new file mode 100644 index 0000000..8c7260d --- /dev/null +++ b/src/components/pio.svelte @@ -0,0 +1,110 @@ + + +{#if pioConfig.enable} +
    +
    + +
    +{/if} + + \ No newline at end of file diff --git a/src/components/post/comment.astro b/src/components/post/comment.astro new file mode 100644 index 0000000..1ad393b --- /dev/null +++ b/src/components/post/comment.astro @@ -0,0 +1,28 @@ +--- +import type { CollectionEntry } from "astro:content"; + +import { getPostUrl } from "@utils/url"; +import { postConfig } from "@/config"; +import Twikoo from "./twikoo.astro"; + + +interface Props { + post: CollectionEntry<"posts">; +} + +const { post } = Astro.props; + +const path = getPostUrl(post); + +let commentService = ""; +if (postConfig.comment?.enable && postConfig.comment?.twikoo) { + commentService = "twikoo"; +} +--- + +{postConfig.comment?.enable && ( +
    + {commentService === 'twikoo' && } + {commentService === '' && null} +
    +)} \ No newline at end of file diff --git a/src/components/post/license.astro b/src/components/post/license.astro new file mode 100644 index 0000000..6b44874 --- /dev/null +++ b/src/components/post/license.astro @@ -0,0 +1,53 @@ +--- +import { Icon } from "astro-icon/components"; + +import { getPostUrlBySlug } from "@utils/url"; +import { postConfig, profileConfig } from "@/config"; +import { formatDateToYYYYMMDD } from "@utils/date"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +interface Props { + title: string; + id: string; + pubDate: Date; + class: string; + author: string; + sourceLink: string; + licenseName: string; + licenseUrl: string; + postUrl?: string; +} + +const { title, id, pubDate, author, sourceLink, licenseName, licenseUrl, postUrl: propPostUrl } = + Astro.props; +const className = Astro.props.class; +const profileConf = profileConfig; +const licenseConf = postConfig.license; +const postUrl = sourceLink || propPostUrl || getPostUrlBySlug(id); +--- + +
    +
    + {title} +
    + + {postUrl} + +
    +
    +
    {i18n(I18nKey.author)}
    +
    {author || profileConf.name}
    +
    +
    +
    {i18n(I18nKey.publishedAt)}
    +
    {formatDateToYYYYMMDD(pubDate)}
    +
    +
    +
    {i18n(I18nKey.license)}
    + {licenseName || licenseConf.name} +
    +
    + +
    \ No newline at end of file diff --git a/src/components/post/postCard.astro b/src/components/post/postCard.astro new file mode 100644 index 0000000..58e8884 --- /dev/null +++ b/src/components/post/postCard.astro @@ -0,0 +1,109 @@ +--- +import { Icon } from "astro-icon/components"; +import { render } from "astro:content"; +import type { CollectionEntry } from "astro:content"; + +import { getFileDirFromPath, getPostUrl } from "@utils/url"; +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import ImageWrapper from "@components/common/imageWrapper.astro"; +import PostMetadata from "./postMeta.astro"; + + +interface Props { + class?: string; + entry: CollectionEntry<"posts">; + style?: string; +} + +const className = Astro.props.class; + +const { entry, style } = Astro.props; + +const url = getPostUrl(entry); + +const { + title, + published, + updated, + description, + cover, + tags, + category, + pinned, +} = entry.data; + +const hasCover = cover !== undefined && cover !== null && cover !== ""; + +const coverWidth = "28%"; + +const { remarkPluginFrontmatter } = await render(entry); + +// derive image base path from the real file path to preserve directory casing +const imageBaseDir = getFileDirFromPath(entry.filePath || ""); +--- + +
    +
    + + {pinned && } + {title} + + + + + + +
    + { description || remarkPluginFrontmatter.excerpt } +
    + +
    +
    + {remarkPluginFrontmatter.words} {" " + i18n(remarkPluginFrontmatter.words === 1 ? I18nKey.wordCount : I18nKey.wordsCount)} +
    +
    |
    +
    + {remarkPluginFrontmatter.minutes} {" " + i18n(remarkPluginFrontmatter.minutes === 1 ? I18nKey.minuteCount : I18nKey.minutesCount)} +
    +
    +
    + + {hasCover && + +
    +
    + + +
    + + +
    + } + + {!hasCover && + + + + + } +
    + + \ No newline at end of file diff --git a/src/components/post/postMeta.astro b/src/components/post/postMeta.astro new file mode 100644 index 0000000..0a17c61 --- /dev/null +++ b/src/components/post/postMeta.astro @@ -0,0 +1,163 @@ +--- +import { Icon } from "astro-icon/components"; + +import { getCategoryUrl, getTagUrl, url } from "@utils/url"; +import { formatDateToYYYYMMDD } from "@utils/date"; +import { umamiConfig } from '@/config'; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +export interface Props { + published: Date; + updated?: Date; + category?: string | null; + tags?: string[]; + hideUpdateDate?: boolean; + hideTagsForMobile?: boolean; + isHome?: boolean; + className?: string; + slug?: string; + postUrl?: string; +} + +const { + published, + updated, + category, + tags, + hideUpdateDate, + hideTagsForMobile, + isHome, + className = "", + slug, + postUrl +} = Astro.props; +const finalPostUrl = postUrl || (slug ? url(`/posts/${slug}/`) : ""); + +// 解析 umami +const umamiEnabled = umamiConfig.enabled || false; +const umamiWebsiteId = umamiConfig.scripts.match(/data-website-id="([^"]+)"/)?.[1] || ""; +const umamiApiKey = umamiConfig.apiKey || ""; +const umamiBaseUrl = umamiConfig.baseUrl || ""; +--- + +
    + +
    +
    + +
    + {formatDateToYYYYMMDD(published)} +
    + + {!hideUpdateDate && updated && updated.getTime() !== published.getTime() && ( +
    +
    + +
    + {formatDateToYYYYMMDD(updated)} +
    + )} + + + +
    +
    + +
    +
    + {(tags && tags.length > 0) && tags.map((tag, i) => ( +
    /
    + + {tag.trim()} + + ))} + {!(tags && tags.length > 0) &&
    {i18n(I18nKey.noTags)}
    } +
    +
    + + {!isHome && umamiEnabled && finalPostUrl && ( +
    +
    + +
    + {i18n(I18nKey.statsLoading)} +
    + )} +
    + + +{!isHome && umamiEnabled && finalPostUrl && ( + +)} \ No newline at end of file diff --git a/src/components/post/twikoo.astro b/src/components/post/twikoo.astro new file mode 100644 index 0000000..689f162 --- /dev/null +++ b/src/components/post/twikoo.astro @@ -0,0 +1,98 @@ +--- +import { postConfig } from "@/config"; + + +interface Props { + path: string; +} + +const config = { + ...postConfig.comment.twikoo, + el: "#tcomment", + path: Astro.props.path, +}; +--- + +
    + + \ No newline at end of file diff --git a/src/components/postPage.astro b/src/components/postPage.astro new file mode 100644 index 0000000..a467c42 --- /dev/null +++ b/src/components/postPage.astro @@ -0,0 +1,21 @@ +--- +import type { CollectionEntry } from "astro:content"; + +import PostCard from "@components/post/postCard.astro"; + + +const { page } = Astro.props; + +let delay = 0; +const interval = 30; +--- + +
    + {page.data.map((entry: CollectionEntry<"posts">) => ( + + ))} +
    \ No newline at end of file diff --git a/src/components/sidebar.astro b/src/components/sidebar.astro new file mode 100644 index 0000000..d6bcd69 --- /dev/null +++ b/src/components/sidebar.astro @@ -0,0 +1,83 @@ +--- +import type { MarkdownHeading } from "astro"; + +import { widgetManager } from "@utils/widget"; +import Profile from "@components/sidebar/profile.astro"; +import Announcement from "@components/sidebar/announcement.astro"; +import Categories from "@components/sidebar/categories.astro"; +import Tags from "@components/sidebar/tags.astro"; +import Statistics from "@components/sidebar/statistics.astro"; +import TOC from "@components/sidebar/toc.astro"; + + +interface Props { + id?: string; + class?: string; + headings?: MarkdownHeading[]; + side: "left" | "right" | "middle"; +} + +const { id, class: className, headings, side } = Astro.props; + +// 获取配置的组件列表(按侧边栏和位置划分) +const topComponents = widgetManager.getComponentsBySideAndPosition(side, "top"); +const stickyComponents = widgetManager.getComponentsBySideAndPosition(side, "sticky"); + +// 组件映射表 +const componentMap = { + profile: Profile, + announcement: Announcement, + categories: Categories, + tags: Tags, + statistics: Statistics, + toc: TOC, +}; + +// 渲染组件的辅助函数 +function renderComponent(component: any, index: number) { + const ComponentToRender = + componentMap[component.type as keyof typeof componentMap]; + if (!ComponentToRender) return null; + + const componentClass = widgetManager.getComponentClass(component, index, side); + const componentStyle = widgetManager.getComponentStyle(component, index); + + return { + Component: ComponentToRender, + props: { + class: componentClass, + style: componentStyle, + headings: component.type === "toc" ? headings : undefined, + ...component.customProps, + }, + }; +} +--- + +
    + + {topComponents.length > 0 && ( +
    0 }]}> + {topComponents.map((component, index) => { + const renderData = renderComponent(component, index); + if (!renderData) return null; + + const { Component, props } = renderData; + return ; + })} +
    + )} + + + {stickyComponents.length > 0 && ( + + )} +
    \ No newline at end of file diff --git a/src/components/sidebar/announcement.astro b/src/components/sidebar/announcement.astro new file mode 100644 index 0000000..7650d4c --- /dev/null +++ b/src/components/sidebar/announcement.astro @@ -0,0 +1,79 @@ +--- +import { Icon } from "astro-icon/components"; + +import { announcementConfig } from "@/config"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import WidgetLayout from "./widgetLayout.astro"; + + +const config = announcementConfig; + +interface Props { + class?: string; + style?: string; +} +const className = Astro.props.class; +const style = Astro.props.style; +--- + + +
    + +
    + {config.content} +
    + +
    +
    + {config.link && config.link.enable !== false && ( + + {config.link.text} + + + )} +
    + {config.closable && ( + + )} +
    +
    +
    + + \ No newline at end of file diff --git a/src/components/sidebar/categories.astro b/src/components/sidebar/categories.astro new file mode 100644 index 0000000..a367a83 --- /dev/null +++ b/src/components/sidebar/categories.astro @@ -0,0 +1,43 @@ +--- +import { getCategoryList } from "@utils/content"; +import { widgetManager, getComponentConfig } from "@utils/widget"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import ButtonLink from "@/components/common/buttonLink.astro"; +import WidgetLayout from "./widgetLayout.astro"; + + +const categories = await getCategoryList(); + +const COLLAPSED_HEIGHT = "7.5rem"; + +// 使用统一的组件管理器检查是否应该折叠 +const categoriesComponent = getComponentConfig("categories"); +const isCollapsed = categoriesComponent ? widgetManager.isCollapsed(categoriesComponent, categories.length) : false; + +interface Props { + class?: string; + style?: string; + side?: string; +} +const { class: className, style, side = "default" } = Astro.props; +--- + + + {categories.map((c) => + + {c.name.trim()} + + )} + \ No newline at end of file diff --git a/src/components/sidebar/profile.astro b/src/components/sidebar/profile.astro new file mode 100644 index 0000000..5fd7149 --- /dev/null +++ b/src/components/sidebar/profile.astro @@ -0,0 +1,112 @@ +--- +import { Icon } from "astro-icon/components"; + +import { profileConfig, umamiConfig } from "@/config"; +import { url } from "@utils/url"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import ImageWrapper from "@/components/common/imageWrapper.astro"; + + +// 解析 umami +const umamiEnabled = umamiConfig.enabled || false; +const umamiWebsiteId = umamiConfig.scripts.match(/data-website-id="([^"]+)"/)?.[1] || ""; +const umamiApiKey = umamiConfig.apiKey || ""; +const umamiBaseUrl = umamiConfig.baseUrl || ""; + +interface Props { + class?: string; + style?: string; + side?: string; +} +const { class: className, style, side = "default" } = Astro.props; +const id = `profile-${side}`; +--- + +
    + +
    + + +
    + +
    +
    +
    {profileConfig.name}
    +
    +
    {profileConfig.bio}
    +
    + {profileConfig.links.length > 1 && profileConfig.links.map(item => + + + + )} + {profileConfig.links.length == 1 && + + {profileConfig.links[0].name} + } +
    + {umamiEnabled && ( +
    +
    + + 统计加载中... +
    + )} +
    +
    + +{umamiEnabled && ( + +)} \ No newline at end of file diff --git a/src/components/sidebar/statistics.astro b/src/components/sidebar/statistics.astro new file mode 100644 index 0000000..71146bf --- /dev/null +++ b/src/components/sidebar/statistics.astro @@ -0,0 +1,19 @@ +--- +import { getCategoryList, getSortedPostsList, getTagList } from "@utils/content"; +import StatsCharts from "./statistics.svelte"; + + +const posts = await getSortedPostsList(); +const categories = await getCategoryList(); +const tags = await getTagList(); + +interface Props { + class?: string; + style?: string; + side?: string; +} + +const { class: className, style, side } = Astro.props; +--- + + \ No newline at end of file diff --git a/src/components/sidebar/statistics.svelte b/src/components/sidebar/statistics.svelte new file mode 100644 index 0000000..b3de343 --- /dev/null +++ b/src/components/sidebar/statistics.svelte @@ -0,0 +1,572 @@ + + +
    +
    {labels.statistics}
    +
    +
    +
    +
    + +
    +
    +
    + + {#if isDesktop} +
    +
    +
    + +
    +
    +
    + {/if} +
    +
    +
    + + diff --git a/src/components/sidebar/tags.astro b/src/components/sidebar/tags.astro new file mode 100644 index 0000000..239849b --- /dev/null +++ b/src/components/sidebar/tags.astro @@ -0,0 +1,35 @@ +--- +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import { getTagList } from "@utils/content"; +import { getTagUrl } from "@utils/url"; +import { widgetManager, getComponentConfig } from "@utils/widget"; +import ButtonTag from "@/components/common/buttonTag.astro"; +import WidgetLayout from "./widgetLayout.astro"; + + +const tags = await getTagList(); + +const COLLAPSED_HEIGHT = "7.5rem"; + +// 使用统一的组件管理器检查是否应该折叠 +const tagsComponent = getComponentConfig("tags"); +const isCollapsed = tagsComponent ? widgetManager.isCollapsed(tagsComponent, tags.length) : false; + +interface Props { + class?: string; + style?: string; + side?: string; +} +const { class: className, style, side = "default" } = Astro.props; +--- + + +
    + {tags.map(t => ( + + {t.name.trim()} + + ))} +
    +
    \ No newline at end of file diff --git a/src/components/sidebar/toc.astro b/src/components/sidebar/toc.astro new file mode 100644 index 0000000..f3d3be2 --- /dev/null +++ b/src/components/sidebar/toc.astro @@ -0,0 +1,83 @@ +--- +import { NAVBAR_HEIGHT } from "@constants/constants"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import WidgetLayout from "./widgetLayout.astro"; + + +interface Props { + id?: string; + class?: string; + style?: string; + depth?: number; + side?: string; +} + +const { id: propId, class: className, style, depth = 3, side = "default" } = Astro.props; +const id = propId || `toc-wrapper-${side}`; +--- + + +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/components/sidebar/toc.ts b/src/components/sidebar/toc.ts new file mode 100644 index 0000000..1f57e3a --- /dev/null +++ b/src/components/sidebar/toc.ts @@ -0,0 +1,405 @@ +import { NAVBAR_HEIGHT } from "@constants/constants"; +import { widgetManager } from "@utils/widget"; + + +export class TableOfContents extends HTMLElement { + tocEl: HTMLElement | null = null; + visibleClass = "visible"; + observer: IntersectionObserver; + anchorNavTarget: HTMLElement | null = null; + headingIdxMap = new Map(); + headings: HTMLElement[] = []; + tocEntries: HTMLAnchorElement[] = []; + active: boolean[] = []; + activeIndicator: HTMLElement | null = null; + _retryCount = 0; + _backToTopObserver: MutationObserver | null = null; + + _handleBtnClick = (e: Event) => { + e.stopPropagation(); + const panel = this.querySelector('.toc-floating-panel'); + const isHidden = panel?.classList.contains('hidden') || panel?.classList.contains('opacity-0'); + this.toggleFloatingPanel(!!isHidden); + }; + + _handleDocClick = (e: Event) => { + const panel = this.querySelector('.toc-floating-panel'); + if (panel && !panel.classList.contains('hidden') && !panel.contains(e.target as Node)) { + this.toggleFloatingPanel(false); + } + }; + + constructor() { + super(); + this.observer = new IntersectionObserver(this.markVisibleSection); + }; + + markActiveHeading = (idx: number)=> { + this.active = new Array(this.headings.length).fill(false); + this.active[idx] = true; + }; + + isInRange(value: number, min: number, max: number) { + return min < value && value < max; + }; + + fallback = () => { + if (!this.headings.length) return; + + let activeIdx = -1; + for (let i = 0; i < this.headings.length; i++) { + const heading = this.headings[i]; + const rect = heading.getBoundingClientRect(); + if (rect.top < 100) { + activeIdx = i; + } else { + break; + } + } + if (activeIdx === -1) { + activeIdx = 0; + } + this.markActiveHeading(activeIdx); + }; + + toggleActiveHeading = () => { + let min = this.active.length, max = -1; + + for (let i = 0; i < this.active.length; i++) { + if (this.active[i]) { + this.tocEntries[i].classList.add(this.visibleClass); + min = Math.min(min, i); + max = Math.max(max, i); + } else { + this.tocEntries[i].classList.remove(this.visibleClass); + } + } + + if (max === -1) { + this.activeIndicator?.setAttribute("style", `opacity: 0`); + } else { + const top = this.tocEntries[min].offsetTop; + const bottom = this.tocEntries[max].offsetTop + this.tocEntries[max].offsetHeight; + this.activeIndicator?.setAttribute("style", `top: ${top}px; height: ${bottom - top}px; opacity: 1`); + } + }; + + scrollToActiveHeading = () => { + if (this.anchorNavTarget || !this.tocEl) return; + const activeHeading = this.querySelectorAll(`.${this.visibleClass}`); + if (!activeHeading.length) return; + + const topmost = activeHeading[0]; + const bottommost = activeHeading[activeHeading.length - 1]; + const tocHeight = this.tocEl.clientHeight; + + let top; + if (bottommost.getBoundingClientRect().bottom - + topmost.getBoundingClientRect().top < 0.9 * tocHeight) + top = topmost.offsetTop - 32; + else + top = bottommost.offsetTop - tocHeight * 0.8; + + this.tocEl.scrollTo({ + top, + left: 0, + behavior: "smooth", + }); + }; + + update = () => { + requestAnimationFrame(() => { + this.toggleActiveHeading(); + this.scrollToActiveHeading(); + }); + }; + + markVisibleSection = (entries: IntersectionObserverEntry[]) => { + entries.forEach((entry) => { + const id = entry.target.getAttribute("id"); + const idx = id ? this.headingIdxMap.get(id) : undefined; + if (idx != undefined) + this.active[idx] = entry.isIntersecting; + + if (entry.isIntersecting && this.anchorNavTarget == entry.target) + this.anchorNavTarget = null; + }); + + if (!this.active.includes(true)) + this.fallback(); + this.update(); + }; + + handleAnchorClick = (event: Event) => { + const anchor = event + .composedPath() + .find((element) => element instanceof HTMLAnchorElement); + + if (anchor) { + event.preventDefault(); + const id = decodeURIComponent(anchor.hash?.substring(1)); + const targetElement = document.getElementById(id); + if (targetElement) { + const navbarHeight = parseInt(this.dataset.navbarHeight || NAVBAR_HEIGHT.toString()); + const targetTop = targetElement.getBoundingClientRect().top + window.scrollY - navbarHeight; + window.scrollTo({ + top: targetTop, + behavior: "smooth" + }); + } + const idx = this.headingIdxMap.get(id); + if (idx !== undefined) { + this.anchorNavTarget = this.headings[idx]; + } else { + this.anchorNavTarget = null; + } + // If floating, close the panel after click + if (this.dataset.isFloating === "true") { + this.toggleFloatingPanel(false); + } + } + }; + + isPostPage() { + return window.location.pathname.includes('/posts/') || + document.querySelector('.custom-md, .markdown-content') !== null; + } + + updateFloatingPosition = () => { + if (this.dataset.isFloating !== "true") return; + const container = this.querySelector('.toc-floating-container') as HTMLElement; + const backToTopBtn = document.getElementById('back-to-top-btn'); + if (!container || !backToTopBtn) return; + + if (backToTopBtn.classList.contains('hide')) { + container.classList.remove('move-up'); + } else { + container.classList.add('move-up'); + } + } + + toggleFloatingPanel(show: boolean) { + const panel = this.querySelector('.toc-floating-panel'); + if (!panel) return; + if (show) { + panel.classList.remove('hidden'); + requestAnimationFrame(() => { + panel.classList.remove('opacity-0', 'translate-y-4', 'pointer-events-none'); + }); + } else { + panel.classList.add('opacity-0', 'translate-y-4', 'pointer-events-none'); + setTimeout(() => { + panel.classList.add('hidden'); + }, 300); + } + } + + regenerateTOC() { + const isFloating = this.dataset.isFloating === "true"; + const tocWrapper = isFloating + ? this.querySelector('.toc-floating-container') as HTMLElement + : this.closest('widget-layout') as HTMLElement; + + if (!tocWrapper) return false; + + const headings = widgetManager.getPageHeadings(); + if (headings.length === 0 && this.isPostPage() && this._retryCount < 3) { + this._retryCount++; + setTimeout(() => this.init(), 120); + return false; + } + this._retryCount = 0; + + const isPost = this.isPostPage(); + + if (headings.length === 0 && !isPost) { + if (!tocWrapper.classList.contains('toc-hide')) { + if (!isFloating) { + tocWrapper.style.maxHeight = tocWrapper.offsetHeight + 'px'; + tocWrapper.offsetHeight; + tocWrapper.classList.add('toc-hide'); + tocWrapper.style.maxHeight = ''; + } else { + tocWrapper.classList.add('toc-hide'); + } + } + return true; + } + + if (tocWrapper.classList.contains('toc-hide')) { + tocWrapper.classList.remove('toc-hide'); + if (!isFloating) { + const targetHeight = tocWrapper.scrollHeight; + tocWrapper.style.maxHeight = '0px'; + tocWrapper.offsetHeight; + tocWrapper.style.maxHeight = targetHeight + 'px'; + setTimeout(() => { + if (!tocWrapper.classList.contains('toc-hide')) { + tocWrapper.style.maxHeight = ''; + } + }, 300); + } + } + + const minDepth = Math.min(...headings.map(h => h.depth)); + const maxLevel = parseInt(this.dataset.depth || '3'); + let heading1Count = 1; + const tocHTML = headings + .filter(heading => heading.depth < minDepth + maxLevel) + .map(heading => { + const depthClass = heading.depth === minDepth ? '' : + heading.depth === minDepth + 1 ? 'ml-4' : 'ml-8'; + const badgeContent = heading.depth === minDepth ? (heading1Count++) : + heading.depth === minDepth + 1 ? '
    ' : + '
    '; + return ` +
    + ${badgeContent} +
    +
    ${heading.text}
    +
    `; + }).join(''); + + const innerContent = this.querySelector('.toc-inner-content'); + if (innerContent) { + innerContent.innerHTML = tocHTML + '
    '; + } + return true; + } + + init() { + this.observer.disconnect(); + this.headingIdxMap.clear(); + this.headings = []; + this.active = []; + + if (!this.regenerateTOC()) return; + + this.tocEl = this.querySelector('.toc-scroll-container'); + this.tocEl?.addEventListener("click", this.handleAnchorClick, { capture: true }); + + this.activeIndicator = this.querySelector(".active-indicator"); + + if (this.dataset.isFloating === "true") { + const btn = this.querySelector('.toc-floating-btn'); + btn?.removeEventListener('click', this._handleBtnClick); + btn?.addEventListener('click', this._handleBtnClick); + + document.removeEventListener('click', this._handleDocClick); + document.addEventListener('click', this._handleDocClick); + + // 监听 backToTop 按钮的状态 + const backToTopBtn = document.getElementById('back-to-top-btn'); + if (backToTopBtn) { + this._backToTopObserver?.disconnect(); + this._backToTopObserver = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.type === 'attributes' && mutation.attributeName === 'class') { + this.updateFloatingPosition(); + } + }); + }); + this._backToTopObserver.observe(backToTopBtn, { attributes: true }); + this.updateFloatingPosition(); // 初始状态检查 + } + } + + const allEntries = Array.from(this.querySelectorAll("a[href^='#']")); + const validHeadings: HTMLElement[] = []; + const validEntries: HTMLAnchorElement[] = []; + + for (let i = 0; i < allEntries.length; i++) { + const entry = allEntries[i]; + const id = decodeURIComponent(entry.hash?.substring(1)); + const heading = document.getElementById(id); + if (heading instanceof HTMLElement) { + validHeadings.push(heading); + validEntries.push(entry); + this.headingIdxMap.set(id, validEntries.length - 1); + } + } + + this.headings = validHeadings; + this.tocEntries = validEntries; + this.active = new Array(this.tocEntries.length).fill(false); + + if (this.tocEntries.length === 0) return; + + this.headings.forEach((heading) => this.observer.observe(heading)); + this.fallback(); + this.update(); + }; + + connectedCallback() { + const element = document.querySelector('.custom-md') || document.querySelector('.prose') || document.querySelector('.markdown-content'); + let initialized = false; + const tryInit = () => { + if (!initialized) { + initialized = true; + this.init(); + } + }; + if (element) { + element.addEventListener('animationend', tryInit, { once: true }); + setTimeout(tryInit, 300); + } else { + tryInit(); + setTimeout(tryInit, 300); + } + + const setupSwup = () => { + if (window.swup && window.swup.hooks) { + if ((this as any)._swupListenersAdded) return; + window.swup.hooks.on('visit:start', () => { + if (this.isPostPage()) { + const isFloating = this.dataset.isFloating === "true"; + const tocWrapper = isFloating + ? this.querySelector('.toc-floating-container') as HTMLElement + : this.closest('widget-layout') as HTMLElement; + if (tocWrapper && !tocWrapper.classList.contains('toc-hide')) { + if (!isFloating) { + tocWrapper.style.maxHeight = tocWrapper.offsetHeight + 'px'; + tocWrapper.offsetHeight; + tocWrapper.classList.add('toc-hide'); + tocWrapper.style.maxHeight = ''; + } else { + tocWrapper.classList.add('toc-hide'); + } + } + } + }); + window.swup.hooks.on('content:replace', () => { + const isFloating = this.dataset.isFloating === "true"; + const tocWrapper = isFloating + ? this.querySelector('.toc-floating-container') as HTMLElement + : this.closest('widget-layout') as HTMLElement; + if (tocWrapper && !this.isPostPage()) { + tocWrapper.classList.add('toc-hide'); + if (!isFloating) tocWrapper.style.maxHeight = ''; + } + setTimeout(() => this.init(), 100); + }); + (this as any)._swupListenersAdded = true; + } + }; + + if (window.swup) setupSwup(); + else document.addEventListener('swup:enable', setupSwup); + window.addEventListener('content-decrypted', () => this.init()); + }; + + disconnectedCallback() { + this.headings.forEach((heading) => this.observer.unobserve(heading)); + this.observer.disconnect(); + this._backToTopObserver?.disconnect(); + this.tocEl?.removeEventListener("click", this.handleAnchorClick); + + const btn = this.querySelector('.toc-floating-btn'); + btn?.removeEventListener('click', this._handleBtnClick); + document.removeEventListener('click', this._handleDocClick); + }; +} + +if (!customElements.get("table-of-contents")) { + customElements.define("table-of-contents", TableOfContents); +} \ No newline at end of file diff --git a/src/components/sidebar/widgetLayout.astro b/src/components/sidebar/widgetLayout.astro new file mode 100644 index 0000000..b03c06b --- /dev/null +++ b/src/components/sidebar/widgetLayout.astro @@ -0,0 +1,63 @@ +--- +import { Icon } from "astro-icon/components"; + +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +interface Props { + id: string; + name?: string; + isCollapsed?: boolean; + collapsedHeight?: string; + class?: string; + style?: string; +} +const { id, name, isCollapsed, collapsedHeight, style } = Astro.props; +const className = Astro.props.class; +--- + + +
    {name}
    +
    + +
    + {isCollapsed &&
    + +
    } +
    + + + + \ No newline at end of file diff --git a/src/components/tocButton.astro b/src/components/tocButton.astro new file mode 100644 index 0000000..6631674 --- /dev/null +++ b/src/components/tocButton.astro @@ -0,0 +1,121 @@ +--- +import { Icon } from "astro-icon/components"; +import { NAVBAR_HEIGHT } from "@constants/constants"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +interface Props { + class?: string; + style?: string; +} + +const { class: className, style } = Astro.props; +--- + + +
    +
    + +
    + +
    +
    + + + + \ No newline at end of file diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..5094cec --- /dev/null +++ b/src/config.ts @@ -0,0 +1,127 @@ +import yaml from "js-yaml"; + +import type { + SiteConfig, + NavbarLink, + NavbarConfig, + SidebarConfig, + ProfileConfig, + AnnouncementConfig, + PostConfig, + FooterConfig, + ParticleConfig, + MusicPlayerConfig, + PioConfig, +} from "./types/config"; +import { LinkPreset } from "./types/config"; +import rawConfig from "../twilight.config.yaml?raw"; + + +type ConfigFile = { + site: SiteConfig; + umami: { + enabled: boolean; + apiKey?: string; + baseUrl: string; + scripts?: string; + }; + navbar: { + links: Array; + }; + sidebar: SidebarConfig; + profile: ProfileConfig; + announcement: AnnouncementConfig; + post: PostConfig; + footer: FooterConfig; + particle: ParticleConfig; + musicPlayer: MusicPlayerConfig; + pio: PioConfig; +}; + +const config = yaml.load(rawConfig) as ConfigFile; + +const linkPresetNameMap: Record = { + Home: LinkPreset.Home, + Archive: LinkPreset.Archive, + Projects: LinkPreset.Projects, + Skills: LinkPreset.Skills, + Timeline: LinkPreset.Timeline, + Diary: LinkPreset.Diary, + Albums: LinkPreset.Albums, + Anime: LinkPreset.Anime, + About: LinkPreset.About, + Friends: LinkPreset.Friends, +}; + +const normalizeNavbarLink = ( + link: NavbarLink | LinkPreset | string, +): NavbarLink | LinkPreset => { + if (typeof link === "string") { + const preset = linkPresetNameMap[link]; + if (preset === undefined) { + throw new Error(`Unknown LinkPreset: ${link}`); + } + return preset; + } + if (typeof link === "number") { + return link; + } + const children = link.children?.map(normalizeNavbarLink); + return children ? { ...link, children } : link; +}; + +const normalizeNavbarLinks = (links: Array) => + links.map(normalizeNavbarLink); + +const resolvedPostConfig: PostConfig = { + ...config.post, + comment: config.post.comment.twikoo + ? { + ...config.post.comment, + twikoo: { + ...config.post.comment.twikoo, + lang: config.post.comment.twikoo.lang ?? config.site.lang, + }, + } + : config.post.comment, +}; + +// 站点配置 +export const siteConfig: SiteConfig = config.site; + +// Umami统计配置 +export const umamiConfig = { + enabled: config.umami.enabled, + apiKey: import.meta.env.UMAMI_API_KEY ?? config.umami.apiKey, + baseUrl: config.umami.baseUrl, + scripts: import.meta.env.UMAMI_TRACKING_CODE ?? config.umami.scripts, +} as const; + +// 导航栏配置 +export const navbarConfig: NavbarConfig = { + links: normalizeNavbarLinks(config.navbar.links), +}; + +// 侧边栏配置 +export const sidebarConfig: SidebarConfig = config.sidebar; + +// 资料配置 +export const profileConfig: ProfileConfig = config.profile; + +// 公告配置 +export const announcementConfig: AnnouncementConfig = config.announcement; + +// 文章配置 +export const postConfig: PostConfig = resolvedPostConfig; + +// 页脚配置 +export const footerConfig: FooterConfig = config.footer; + +// 粒子特效配置 +export const particleConfig: ParticleConfig = config.particle; + +// 音乐播放器配置 +export const musicPlayerConfig: MusicPlayerConfig = config.musicPlayer; + +// 看板娘配置 +export const pioConfig: PioConfig = config.pio; \ No newline at end of file diff --git a/src/constants/breakpoints.ts b/src/constants/breakpoints.ts new file mode 100644 index 0000000..6d347be --- /dev/null +++ b/src/constants/breakpoints.ts @@ -0,0 +1,22 @@ +/** + * Width breakpoints + * Dynamically read from src/styles/main.css @theme configuration + */ + +const getBreakpoint = (name: string, fallback: number): number => { + if (typeof window === "undefined") return fallback; + + // Tailwind v4 exports @theme variables as standard CSS variables + const value = getComputedStyle(document.documentElement) + .getPropertyValue(`--breakpoint-${name}`) + .trim(); + + // Remove 'px' unit and convert to number + const parsed = parseInt(value, 10); + return isNaN(parsed) ? fallback : parsed; +}; + +export const BREAKPOINT_SM = getBreakpoint("sm", 512); // Tailwind sm +export const BREAKPOINT_MD = getBreakpoint("md", 768); // Tailwind md +export const BREAKPOINT_LG = getBreakpoint("lg", 1280); // Tailwind lg +export const BREAKPOINT_XL = getBreakpoint("xl", 1920); // Tailwind xl \ No newline at end of file diff --git a/src/constants/constants.ts b/src/constants/constants.ts new file mode 100644 index 0000000..f5441ad --- /dev/null +++ b/src/constants/constants.ts @@ -0,0 +1,26 @@ +export const PAGE_SIZE = 8; + +export const LIGHT_MODE = "light", + DARK_MODE = "dark", + SYSTEM_MODE = "system"; + +export const WALLPAPER_FULLSCREEN = "fullscreen", + WALLPAPER_BANNER = "banner", + WALLPAPER_NONE = "none"; + +// Navbar height (px) +export const NAVBAR_HEIGHT = 88; + +// Banner height unit (vh) +export const BANNER_HEIGHT = 30; +export const BANNER_HEIGHT_EXTEND = 36; +export const BANNER_HEIGHT_HOME = BANNER_HEIGHT + BANNER_HEIGHT_EXTEND; + +// The height the main panel overlaps the banner (rem) +export const MAIN_PANEL_OVERLAPS_BANNER_HEIGHT = 0; + +// Page width (rem) +export const PAGE_WIDTH = 90; + +// Category constants +export const UNCATEGORIZED = "uncategorized"; \ No newline at end of file diff --git a/src/constants/icon.ts b/src/constants/icon.ts new file mode 100644 index 0000000..ff0efd4 --- /dev/null +++ b/src/constants/icon.ts @@ -0,0 +1,15 @@ +import type { Favicon } from "@/types/config.ts"; + + +export const defaultFavicons: Favicon[] = [ + { + src: "/favicon/icon-light.ico", + theme: "light", + sizes: "96x96", + }, + { + src: "/favicon/icon-dark.ico", + theme: "dark", + sizes: "96x96", + }, +]; diff --git a/src/constants/link-presets.ts b/src/constants/link-presets.ts new file mode 100644 index 0000000..228c56a --- /dev/null +++ b/src/constants/link-presets.ts @@ -0,0 +1,67 @@ +import { LinkPreset, type NavbarLink } from "@/types/config"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +export const LinkPresets: { [key in LinkPreset]: NavbarLink } = { + [LinkPreset.Home]: { + name: i18n(I18nKey.home), + url: "/", + icon: "material-symbols:home", + description: "Twilight - A simple, clean, and beautiful blog theme.", + }, + [LinkPreset.Archive]: { + name: i18n(I18nKey.archive), + url: "/archive/", + icon: "material-symbols:archive", + description: "A chronological list of all published posts.", + }, + [LinkPreset.Projects]: { + name: i18n(I18nKey.projects), + url: "/projects/", + icon: "material-symbols:work", + description: i18n(I18nKey.projectsSubtitle), + }, + [LinkPreset.Skills]: { + name: i18n(I18nKey.skills), + url: "/skills/", + icon: "material-symbols:psychology", + description: i18n(I18nKey.skillsSubtitle), + }, + [LinkPreset.Timeline]: { + name: i18n(I18nKey.timeline), + url: "/timeline/", + icon: "material-symbols:timeline", + description: i18n(I18nKey.timelineSubtitle), + }, + [LinkPreset.Diary]: { + name: i18n(I18nKey.diary), + url: "/diary/", + icon: "material-symbols:book", + description: i18n(I18nKey.diarySubtitle), + }, + [LinkPreset.Albums]: { + name: i18n(I18nKey.albums), + url: "/albums/", + icon: "material-symbols:photo-library", + description: i18n(I18nKey.albumsSubtitle), + }, + [LinkPreset.Anime]: { + name: i18n(I18nKey.anime), + url: "/anime/", + icon: "material-symbols:movie", + description: "A list of anime I have watched.", + }, + [LinkPreset.Friends]: { + name: i18n(I18nKey.friends), + url: "/friends/", + icon: "material-symbols:group", + description: "A curated list of friend sites.", + }, + [LinkPreset.About]: { + name: i18n(I18nKey.about), + url: "/about/", + icon: "material-symbols:info", + description: i18n(I18nKey.about), + }, +}; \ No newline at end of file diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 0000000..78f5a1c --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,56 @@ +import { defineCollection } from "astro:content"; +import { z } from 'astro/zod'; +import { glob } from 'astro/loaders'; + + +// Helper for handling dates that might be empty strings from JSON +const dateSchema = z.preprocess((arg) => { + if (typeof arg === "string" && arg.trim() === "") return undefined; + return arg; +}, z.coerce.date()); +const optionalDateSchema = z.preprocess((arg) => { + if (typeof arg === "string" && arg.trim() === "") return undefined; + return arg; +}, z.coerce.date().optional()); + +const postsCollection = defineCollection({ + loader: glob({ pattern: '**/[^_]*.{md,mdx}', base: "./src/content/posts" }), + schema: z.object({ + title: z.string(), + published: dateSchema, + updated: optionalDateSchema, + draft: z.boolean().optional().default(false), + description: z.string().optional().default(""), + cover: z.string().optional().default(""), + tags: z.array(z.string()).optional().default([]), + category: z.string().optional().nullable().default(""), + lang: z.string().optional().default(""), + pinned: z.boolean().optional().default(false), + author: z.string().optional().default(""), + sourceLink: z.string().optional().default(""), + licenseName: z.string().optional().default(""), + licenseUrl: z.string().optional().default(""), + + /* Page encryption fields */ + encrypted: z.boolean().optional().default(false), + password: z.string().optional().default(""), + + /* Custom routeName */ + routeName: z.string().optional(), + + /* For internal use */ + prevTitle: z.string().default(""), + prevSlug: z.string().default(""), + nextTitle: z.string().default(""), + nextSlug: z.string().default(""), + }), +}); + +const specCollection = defineCollection({ + loader: glob({ pattern: '[^_]*.{md,mdx}', base: "./src/content" }), + schema: z.object({}), +}); +export const collections = { + posts: postsCollection, + spec: specCollection, +}; \ No newline at end of file diff --git a/src/content/about.md b/src/content/about.md new file mode 100644 index 0000000..31d2390 --- /dev/null +++ b/src/content/about.md @@ -0,0 +1,18 @@ +# About This Site + +Twilight is a CMS integrated static blog template built with [Astro](https://astro.build) framework. + +::github{repo="Spr-Aachen/Twilight"} + + +## Milestones + +- Integrated content management system in [#1](https://github.com/Spr-Aachen/Twilight/pull/1) +- Seamless wallpaper mode switching in [#2](https://github.com/Spr-Aachen/Twilight/pull/2) +- Dynamic content container response in [#47](https://github.com/Spr-Aachen/Twilight/pull/47) +- Seamless page component loading in [#48](https://github.com/Spr-Aachen/Twilight/pull/48) +- Smart music playback handling in [#49](https://github.com/Spr-Aachen/Twilight/pull/49) +- Infinite-level navigation system in [#50](https://github.com/Spr-Aachen/Twilight/pull/50) +- Comprehensive statistics dashboard in [#51](https://github.com/Spr-Aachen/Twilight/pull/51) +- Low-barrier configuration scheme in [#58](https://github.com/Spr-Aachen/Twilight/pull/58) +- Dynamic breakpoint handling in [#68](https://github.com/Spr-Aachen/Twilight/pull/68) \ No newline at end of file diff --git a/src/content/albums/example.json b/src/content/albums/example.json new file mode 100644 index 0000000..0c81986 --- /dev/null +++ b/src/content/albums/example.json @@ -0,0 +1,29 @@ +{ + "title": "Album Example", + "description": "This is an example album. Note that the local image path is relative to the corresponding album folder in the public directory.", + "cover": "https://picsum.photos/800/600?random=1", + "date": "2025-01-01T00:00:00.000Z", + "location": "Unknown", + "tags": ["example"], + "layout": "masonry", + "columns": 3, + "photos": [ + { + "src": "智子_ASK.jpg", + "alt": "智子", + "title": "智子 by ASK", + "description": "This is a beautiful image from local file", + "tags": ["human"] + }, + { + "src": "https://picsum.photos/800/600?random=2", + "alt": "random image", + "title": "Random Image", + "description": "This is a beautiful image from external link", + "tags": [ + "scenary" + ] + } + ], + "visible": true +} \ No newline at end of file diff --git a/src/content/diary/example.json b/src/content/diary/example.json new file mode 100644 index 0000000..11a87af --- /dev/null +++ b/src/content/diary/example.json @@ -0,0 +1,5 @@ +{ + "content": "The Darkest Hour Is Just Before The Dawn", + "date": "2020-02-02T00:00:00Z", + "images": [] +} \ No newline at end of file diff --git a/src/content/friends.md b/src/content/friends.md new file mode 100644 index 0000000..01f5d88 --- /dev/null +++ b/src/content/friends.md @@ -0,0 +1,18 @@ +--- + +## How to Apply + +Please send your website information to: xxx@xxx.com + +Email Subject: +``` +Request to Add Friend +``` + +Email Content (Template): +``` +Site Name: [Your Site Name] +Site Desc: [Your Site Description] +Site Link: [Your Site Link] +Avatar Link: [Your Avatar Link] +``` \ No newline at end of file diff --git a/src/content/friends/astro.json b/src/content/friends/astro.json new file mode 100644 index 0000000..876f4b4 --- /dev/null +++ b/src/content/friends/astro.json @@ -0,0 +1,7 @@ +{ + "title": "Astro", + "imgurl": "https://avatars.githubusercontent.com/u/44914786?s=210&v=4", + "desc": "The web framework for content-driven websites.", + "siteurl": "https://github.com/withastro/astro", + "tags": ["Framework"] +} \ No newline at end of file diff --git a/src/content/friends/spraachen.json b/src/content/friends/spraachen.json new file mode 100644 index 0000000..08feda2 --- /dev/null +++ b/src/content/friends/spraachen.json @@ -0,0 +1,7 @@ +{ + "title": "Spr_Aachen's Blog", + "imgurl": "https://blog.spr-aachen.com/assets/images/avatar.png", + "desc": "Spr_Aachen's Personal Blog", + "siteurl": "https://blog.spr-aachen.com", + "tags": ["Blog"] +} \ No newline at end of file diff --git a/src/content/friends/twilight-docs.json b/src/content/friends/twilight-docs.json new file mode 100644 index 0000000..2f83b55 --- /dev/null +++ b/src/content/friends/twilight-docs.json @@ -0,0 +1,7 @@ +{ + "title": "Twilight Docs", + "imgurl": "https://docs.twilight.spr-aachen.com/twilight.png", + "desc": "Twilight User Manual", + "siteurl": "https://docs.twilight.spr-aachen.com", + "tags": ["Docs"] +} \ No newline at end of file diff --git a/src/content/posts/draft.md b/src/content/posts/draft.md new file mode 100644 index 0000000..684905a --- /dev/null +++ b/src/content/posts/draft.md @@ -0,0 +1,23 @@ +--- +title: Draft Example +published: 2021-12-02 +tags: [Markdown] +category: Examples +draft: true +--- + + +# This Article is a Draft + +This article is currently in a draft state and is not published. Therefore, it will not be visible to the general audience. The content is still a work in progress and may require further editing and review. + +When the article is ready for publication, you can update the "draft" field to "false" in the Frontmatter: + +```markdown +--- +title: Draft Example +published: 2024-01-11T04:40:26.381Z +tags: [Markdown] +category: Examples +draft: false +--- \ No newline at end of file diff --git a/src/content/posts/encryption.md b/src/content/posts/encryption.md new file mode 100644 index 0000000..6a20e49 --- /dev/null +++ b/src/content/posts/encryption.md @@ -0,0 +1,38 @@ +--- +title: Encryption Example +published: 2020-02-02 +description: 'Password: 123456' +encrypted: true +pinned: false +password: "123456" +tags: [Encryption] +category: Examples +--- + + +# Password Protected Post + +This is an example of a password-protected post in the Twilight theme. The content below is encrypted using AES and can only be viewed by entering the correct password. + + +## Frontmatter Example + +```yaml +--- +title: Encryption Example +published: 2020-02-02 +encrypted: true +password: "your-password" +... +--- +``` + +- `encrypted` - Whether encryption is enabled for the post. +- `password` - The password required to unlock the content. + + +## Note + +:::warning +Do not use this for extremely sensitive information like bank passwords or private keys. The encryption happens on the client side, and the password itself is stored in the post's metadata (though usually not displayed directly). +::: \ No newline at end of file diff --git a/src/content/posts/features.md b/src/content/posts/features.md new file mode 100644 index 0000000..1a02b71 --- /dev/null +++ b/src/content/posts/features.md @@ -0,0 +1,96 @@ +--- +title: Extended Features +published: 2010-01-02 +updated: 2020-02-02 +description: 'Read more about Markdown features in Twilight' +image: '' +tags: [Markdown] +category: +draft: false +--- + + +## GitHub Repository Cards + +You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API. + +::github{repo="Spr-Aachen/Twilight"} + +Create a GitHub repository card with the code `::github{repo="Spr-Aachen/Twilight"}`. + +```markdown +::github{repo="Spr-Aachen/Twilight"} +``` + + +## Admonitions + +Following types of admonitions are supported: `note` `tip` `important` `warning` `caution` + +:::note +Highlights information that users should take into account, even when skimming. +::: + +:::tip +Optional information to help a user be more successful. +::: + +:::important +Crucial information necessary for users to succeed. +::: + +:::warning +Critical content demanding immediate user attention due to potential risks. +::: + +:::caution +Negative potential consequences of an action. +::: + +### Basic Syntax + +```markdown +:::note +Highlights information that users should take into account, even when skimming. +::: + +:::tip +Optional information to help a user be more successful. +::: +``` + +### Custom Titles + +The title of the admonition can be customized. + +:::note[MY CUSTOM TITLE] +This is a note with a custom title. +::: + +```markdown +:::note[MY CUSTOM TITLE] +This is a note with a custom title. +::: +``` + +### GitHub Syntax + +> [!TIP] +> [The GitHub syntax](https://github.com/orgs/community/discussions/16925) is also supported. + +``` +> [!NOTE] +> The GitHub syntax is also supported. + +> [!TIP] +> The GitHub syntax is also supported. +``` + +### Spoiler + +You can add spoilers to your text. The text also supports **Markdown** syntax. + +The content :spoiler[is hidden **ayyy**]! + +```markdown +The content :spoiler[is hidden **ayyy**]! \ No newline at end of file diff --git a/src/content/posts/guide/cover.jpg b/src/content/posts/guide/cover.jpg new file mode 100644 index 0000000..afcb0bf Binary files /dev/null and b/src/content/posts/guide/cover.jpg differ diff --git a/src/content/posts/guide/index.md b/src/content/posts/guide/index.md new file mode 100644 index 0000000..70c8db8 --- /dev/null +++ b/src/content/posts/guide/index.md @@ -0,0 +1,56 @@ +--- +title: Guide for Blog Template +published: 2001-10-02 +description: "How to use this blog template." +cover: "./cover.jpg" +pinned: true +tags: [] +category: Guides +draft: false +--- + + +Tip: For the things that are not mentioned in this guide, you may find the answers in the [Astro Docs](https://docs.astro.build/). + + +## Front-matter of Posts + +```yaml +--- +title: My First Blog Post +published: 2020-02-02 +description: This is the first post of my new Astro blog. +cover: ./cover.jpg +tags: [Foo, Bar] +category: Front-end +draft: false +--- +``` + + +| Attribute | Description | +|---------------|---------------| +| `title` | The title of the post. | +| `published` | The date the post was published. | +| `pinned` | Whether this post is pinned to the top of the post list. | +| `description` | A short description of the post. Displayed on index page. | +| `cover` | The cover image path of the post.
    1. Start with `http://` or `https://`: For web image
    2. Start with `/`: For image in `public` dir
    3. With none of the prefixes: Relative to the markdown file | +| `tags` | The tags of the post. | +| `category` | The category of the post. | +| `licenseName` | The license name for the post content. | +| `author` | The author of the post. | +| `sourceLink` | The source link or reference for the post content. | +| `draft` | If this post is still a draft, which won't be displayed. | + + +## Where to Place the Post Files + +Your post files should be placed in `src/content/posts/` directory. You can also create sub-directories to better organize your posts and assets. + +``` +src/content/posts/ +├── post-1.md +└── post-2/ + ├── cover.jpg + └── index.md +``` \ No newline at end of file diff --git a/src/content/posts/mermaids.md b/src/content/posts/mermaids.md new file mode 100644 index 0000000..2e299f9 --- /dev/null +++ b/src/content/posts/mermaids.md @@ -0,0 +1,198 @@ +--- +title: Mermaid Example +published: 2011-11-02 +pinned: false +description: A simple example of a Markdown blog post with Mermaid. +tags: [Markdown, Mermaid] +category: Examples +draft: false +--- + + +# Complete Guide to Markdown with Mermaid Diagrams + +This article demonstrates how to create various complex diagrams using Mermaid in Markdown documents, including flowcharts, sequence diagrams, Gantt charts, class diagrams, and state diagrams. + + +## Flowchart Example + +Flowcharts are excellent for representing processes or algorithm steps. + +```mermaid +graph TD + A[Start] --> B{Condition Check} + B -->|Yes| C[Process Step 1] + B -->|No| D[Process Step 2] + C --> E[Subprocess] + D --> E + subgraph E [Subprocess Details] + E1[Substep 1] --> E2[Substep 2] + E2 --> E3[Substep 3] + end + E --> F{Another Decision} + F -->|Option 1| G[Result 1] + F -->|Option 2| H[Result 2] + F -->|Option 3| I[Result 3] + G --> J[End] + H --> J + I --> J +``` + + +## Sequence Diagram Example + +Sequence diagrams show interactions between objects over time. + +```mermaid +sequenceDiagram + participant User + participant WebApp + participant Server + participant Database + + User->>WebApp: Submit Login Request + WebApp->>Server: Send Auth Request + Server->>Database: Query User Credentials + Database-->>Server: Return User Data + Server-->>WebApp: Return Auth Result + + alt Auth Successful + WebApp->>User: Show Welcome Page + WebApp->>Server: Request User Data + Server->>Database: Get User Preferences + Database-->>Server: Return Preferences + Server-->>WebApp: Return User Data + WebApp->>User: Load Personalized Interface + else Auth Failed + WebApp->>User: Show Error Message + WebApp->>User: Prompt Re-entry + end +``` + + +## Gantt Chart Example + +Gantt charts are perfect for displaying project schedules and timelines. + +```mermaid +gantt + title Website Development Project Timeline + dateFormat YYYY-MM-DD + axisFormat %m/%d + + section Design Phase + Requirements Analysis :a1, 2023-10-01, 7d + UI Design :a2, after a1, 10d + Prototype Creation :a3, after a2, 5d + + section Development Phase + Frontend Development :b1, 2023-10-20, 15d + Backend Development :b2, after a2, 18d + Database Design :b3, after a1, 12d + + section Testing Phase + Unit Testing :c1, after b1, 8d + Integration Testing :c2, after b2, 10d + User Acceptance Testing :c3, after c2, 7d + + section Deployment + Production Deployment :d1, after c3, 3d + Launch :milestone, after d1, 0d +``` + + +## Class Diagram Example + +Class diagrams show the static structure of a system, including classes, attributes, methods, and their relationships. + +```mermaid +classDiagram + class User { + +String username + +String password + +String email + +Boolean active + +login() + +logout() + +updateProfile() + } + + class Article { + +String title + +String content + +Date publishDate + +Boolean published + +publish() + +edit() + +delete() + } + + class Comment { + +String content + +Date commentDate + +addComment() + +deleteComment() + } + + class Category { + +String name + +String description + +addArticle() + +removeArticle() + } + + User "1" -- "*" Article : writes + User "1" -- "*" Comment : posts + Article "1" -- "*" Comment : has + Article "1" -- "*" Category : belongs to +``` + + +## State Diagram Example + +State diagrams show the sequence of states an object goes through during its life cycle. + +```mermaid +stateDiagram-v2 + [*] --> Draft + + Draft --> UnderReview : submit + UnderReview --> Draft : reject + UnderReview --> Approved : approve + Approved --> Published : publish + Published --> Archived : archive + Published --> Draft : retract + + state Published { + [*] --> Active + Active --> Hidden : temporarily hide + Hidden --> Active : restore + Active --> [*] + Hidden --> [*] + } + + Archived --> [*] +``` + + +## Pie Chart Example + +Pie charts are ideal for displaying proportions and percentage data. + +```mermaid +pie title Website Traffic Sources Analysis + "Search Engines" : 45.6 + "Direct Access" : 30.1 + "Social Media" : 15.3 + "Referral Links" : 6.4 + "Other Sources" : 2.6 +``` + + +## Conclusion + +Mermaid is a powerful tool for creating various types of diagrams in Markdown documents. This article demonstrated how to use flowcharts, sequence diagrams, Gantt charts, class diagrams, state diagrams, and pie charts. These diagrams can help you express complex concepts, processes, and data structures more clearly. + +To use Mermaid, simply specify the mermaid language in a code block and describe the diagram using concise text syntax. Mermaid will automatically convert these descriptions into beautiful visual diagrams. + +Try using Mermaid diagrams in your next technical blog post or project documentation - they will make your content more professional and easier to understand! \ No newline at end of file diff --git a/src/content/posts/videos.md b/src/content/posts/videos.md new file mode 100644 index 0000000..9d18a0b --- /dev/null +++ b/src/content/posts/videos.md @@ -0,0 +1,34 @@ +--- +title: Video Example +published: 2021-12-02 +description: This post demonstrates how to embed video in a blog post. +tags: [Markdown, Video] +category: Examples +draft: false +--- + + +## Instructions + +Just copy the embed code from YouTube or other platforms, and paste it in the markdown file as below: + +```yaml +--- +title: Include Video in the Post +published: 2023-10-19 +// ... +--- + + +``` + + +## Examples + +### YouTube + + + +### Bilibili + + \ No newline at end of file diff --git a/src/content/projects/Twilight.json b/src/content/projects/Twilight.json new file mode 100644 index 0000000..f3083c1 --- /dev/null +++ b/src/content/projects/Twilight.json @@ -0,0 +1,21 @@ +{ + "title": "Twilight Blog Template", + "description": "A CMS integrated blog theme built with Astro framework.", + "image": "", + "category": "website", + "techStack": [ + "Astro", + "Svelte", + "Tailwind CSS" + ], + "status": "in-progress", + "liveDemo": "https://twilight.spr-aachen.com", + "sourceCode": "https://github.com/Spr-Aachen/Twilight", + "startDate": "2025-10-01", + "endDate": "", + "featured": true, + "tags": [ + "Personal Project", + "Open Source Project" + ] +} \ No newline at end of file diff --git a/src/content/skills/astro.json b/src/content/skills/astro.json new file mode 100644 index 0000000..147a80d --- /dev/null +++ b/src/content/skills/astro.json @@ -0,0 +1,15 @@ +{ + "name": "Astro", + "description": "A modern static site generator supporting multi-framework integration.", + "icon": "logos:astro-icon", + "category": "frontend", + "level": "beginner", + "experience": { + "years": 0, + "months": 3 + }, + "projects": [ + "Twilight" + ], + "color": "#BC52EE" +} \ No newline at end of file diff --git a/src/content/skills/git.json b/src/content/skills/git.json new file mode 100644 index 0000000..ab4199a --- /dev/null +++ b/src/content/skills/git.json @@ -0,0 +1,12 @@ +{ + "name": "Git", + "description": "A distributed version control system.", + "icon": "logos:git-icon", + "category": "tools", + "level": "advanced", + "experience": { + "years": 3, + "months": 0 + }, + "color": "#F05032" +} \ No newline at end of file diff --git a/src/content/skills/svelte.json b/src/content/skills/svelte.json new file mode 100644 index 0000000..63ae499 --- /dev/null +++ b/src/content/skills/svelte.json @@ -0,0 +1,15 @@ +{ + "name": "Svelte", + "description": "A compiler-based UI framework.", + "icon": "logos:svelte-icon", + "category": "frontend", + "level": "beginner", + "experience": { + "years": 0, + "months": 3 + }, + "projects": [ + "Twilight" + ], + "color": "#FF3E00" +} \ No newline at end of file diff --git a/src/content/skills/tailwindcss.json b/src/content/skills/tailwindcss.json new file mode 100644 index 0000000..2ac5e7b --- /dev/null +++ b/src/content/skills/tailwindcss.json @@ -0,0 +1,15 @@ +{ + "name": "Tailwind CSS", + "description": "A utility-first CSS framework.", + "icon": "logos:tailwindcss-icon", + "category": "frontend", + "level": "beginner", + "experience": { + "years": 0, + "months": 3 + }, + "projects": [ + "Twilight" + ], + "color": "#06B6D4" +} \ No newline at end of file diff --git a/src/content/timeline/first-template-project.json b/src/content/timeline/first-template-project.json new file mode 100644 index 0000000..8b15966 --- /dev/null +++ b/src/content/timeline/first-template-project.json @@ -0,0 +1,28 @@ +{ + "title": "Twilight", + "description": "My first open source template project, a CMS integrated blog template built with Astro framework.", + "type": "project", + "startDate": "2025-10-01", + "endDate": "", + "skills": [ + "Astro", + "Svelte", + "Tailwind CSS" + ], + "achievements": [], + "links": [ + { + "name": "Online Demo", + "url": "https://twilight.spr-aachen.com", + "type": "project" + }, + { + "name": "GitHub Repository", + "url": "https://github.com/Spr-Aachen/Twilight", + "type": "project" + } + ], + "icon": "material-symbols:code", + "color": "#7C3AED", + "featured": true +} \ No newline at end of file diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..5b0a7e0 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,2 @@ +/// +/// \ No newline at end of file diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..c4f1948 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,82 @@ +declare global { + interface HTMLElementTagNameMap { + "table-of-contents": HTMLElement & { + init?: () => void; + }; + } + + interface Window { + // Define swup type directly since @swup/astro doesn't export AstroIntegration + swup: any; + semifullScrollHandler: (() => void) | null; + closeAnnouncement: () => void; + iconifyLoaded: boolean; + __iconifyLoader: { + load: () => Promise; + }; + pagefind: { + search: (query: string) => Promise<{ + results: Array<{ + data: () => Promise; + }>; + }>; + }; + translate?: { + service: { + use: (service: string) => void; + }; + language: { + setLocal: (language: string) => void; + }; + setAutoDiscriminateLocalLanguage: () => void; + ignore: { + class: string[]; + tag: string[]; + }; + selectLanguageTag: { + show: boolean; + }; + storage: { + set: () => void; + }; + listener: { + start: () => void; + }; + execute: () => void; + }; + mobileTOCInit?: () => void; + loadTranslateScript?: () => Promise; + getUmamiWebsiteStats?: (baseUrl: string, apiKey: string, websiteId: string) => Promise; + getUmamiPageStats?: (baseUrl: string, apiKey: string, websiteId: string, urlPath: string, startAt?: number, endAt?: number) => Promise; + } +} + + +interface SearchResult { + url: string; + meta: { + title: string; + }; + excerpt: string; + content?: string; + word_count?: number; + filters?: Record; + anchors?: Array<{ + element: string; + id: string; + text: string; + location: number; + }>; + weighted_locations?: Array<{ + weight: number; + balanced_score: number; + location: number; + }>; + locations?: number[]; + raw_content?: string; + raw_url?: string; + sub_results?: SearchResult[]; +} + + +export { SearchResult }; \ No newline at end of file diff --git a/src/i18n/i18nKey.ts b/src/i18n/i18nKey.ts new file mode 100644 index 0000000..3968cc2 --- /dev/null +++ b/src/i18n/i18nKey.ts @@ -0,0 +1,273 @@ +enum I18nKey { + // 加载 + loading = "loading", + + // 导航 + home = "home", + archive = "archive", + about = "about", + search = "search", + + // 文章 + tags = "tags", + categories = "categories", + series = "series", + posts = "posts", + recentPosts = "recentPosts", + postList = "postList", + statistics = "statistics", + tableOfContents = "tableOfContents", + + // 统计 + pageViews = "pageViews", + visitors = "visitors", + statsLoading = "statsLoading", + statsError = "statsError", + + // 公告栏 + announcement = "announcement", + announcementClose = "announcementClose", + + comments = "comments", + + untitled = "untitled", + uncategorized = "uncategorized", + noTags = "noTags", + + wordCount = "wordCount", + wordsCount = "wordsCount", + minuteCount = "minuteCount", + minutesCount = "minutesCount", + postCount = "postCount", + postsCount = "postsCount", + + themeColor = "themeColor", + + lightMode = "lightMode", + darkMode = "darkMode", + systemMode = "systemMode", + + wallpaperMode = "wallpaperMode", + wallpaperFullscreen = "wallpaperFullscreen", + wallpaperBanner = "wallpaperBanner", + wallpaperNone = "wallpaperNone", + + more = "more", + + backTo = "backTo", + + author = "author", + publishedAt = "publishedAt", + license = "license", + + // 404页面 + notFound = "notFound", + notFoundTitle = "notFoundTitle", + notFoundDescription = "notFoundDescription", + backToHome = "backToHome", + + // 项目展示页面 + projects = "projects", + projectsSubtitle = "projectsSubtitle", + projectsAll = "projectsAll", + projectsWeb = "projectsWeb", + projectsMobile = "projectsMobile", + projectsDesktop = "projectsDesktop", + projectsOther = "projectsOther", + projectTechStack = "projectTechStack", + projectLiveDemo = "projectLiveDemo", + projectSourceCode = "projectSourceCode", + projectDescription = "projectDescription", + projectStatus = "projectStatus", + projectStatusCompleted = "projectStatusCompleted", + projectStatusInProgress = "projectStatusInProgress", + projectStatusPlanned = "projectStatusPlanned", + projectsTotal = "projectsTotal", + projectsCompleted = "projectsCompleted", + projectsInProgress = "projectsInProgress", + projectsTechStack = "projectsTechStack", + projectsFeatured = "projectsFeatured", + projectsPlanned = "projectsPlanned", + projectsDemo = "projectsDemo", + projectsSource = "projectsSource", + + // 技能展示页面 + skills = "skills", + skillsSubtitle = "skillsSubtitle", + skillsAI = "skillsAI", + skillsBackend = "skillsBackend", + skillsClient = "skillsClient", + skillsFrontend = "skillsFrontend", + skillsDatabase = "skillsDatabase", + skillsEngines = "skillsEngines", + skillsTools = "skillsTools", + skillsOthers = "skillsOthers", + skillLevel = "skillLevel", + skillLevelBeginner = "skillLevelBeginner", + skillLevelIntermediate = "skillLevelIntermediate", + skillLevelAdvanced = "skillLevelAdvanced", + skillLevelExpert = "skillLevelExpert", + skillExperience = "skillExperience", + skillYears = "skillYears", + skillMonths = "skillMonths", + skillsTotal = "skillsTotal", + skillsExpert = "skillsExpert", + skillsAdvanced = "skillsAdvanced", + skillsIntermediate = "skillsIntermediate", + skillsBeginner = "skillsBeginner", + skillsAdvancedTitle = "skillsAdvancedTitle", + skillsProjects = "skillsProjects", + skillsDistribution = "skillsDistribution", + skillsByLevel = "skillsByLevel", + skillsByCategory = "skillsByCategory", + + // 时间线页面 + timeline = "timeline", + timelineSubtitle = "timelineSubtitle", + timelineEducation = "timelineEducation", + timelineWork = "timelineWork", + timelineProject = "timelineProject", + timelineAchievement = "timelineAchievement", + timelinePresent = "timelinePresent", + timelineLocation = "timelineLocation", + timelineDescription = "timelineDescription", + timelineMonths = "timelineMonths", + timelineYears = "timelineYears", + timelineTotal = "timelineTotal", + timelineProjects = "timelineProjects", + timelineExperience = "timelineExperience", + timelineCurrent = "timelineCurrent", + timelineHistory = "timelineHistory", + timelineAchievements = "timelineAchievements", + timelineStatistics = "timelineStatistics", + timelineByType = "timelineByType", + timelineWorkExperience = "timelineWorkExperience", + timelineTotalExperience = "timelineTotalExperience", + timelineWorkPositions = "timelineWorkPositions", + timelineCurrentRole = "timelineCurrentRole", + timelineEmployed = "timelineEmployed", + timelineAvailable = "timelineAvailable", + + // 短文页面 + diary = "diary", + diarySubtitle = "diarySubtitle", + diaryCount = "diaryCount", + diaryImage = "diaryImage", + diaryReply = "diaryReply", + diaryTips = "diaryTips", + diaryMinutesAgo = "diaryMinutesAgo", + diaryHoursAgo = "diaryHoursAgo", + diaryDaysAgo = "diaryDaysAgo", + + // 相册页面 + albums = "albums", + albumsSubtitle = "albumsSubtitle", + albumsEmpty = "albumsEmpty", + albumsEmptyDesc = "albumsEmptyDesc", + albumsBackToList = "albumsBackToList", + albumsPhotoCount = "albumsPhotoCount", + albumsPhotosCount = "albumsPhotosCount", + + // 番剧页面 + anime = "anime", + animeTitle = "animeTitle", + animeSubtitle = "animeSubtitle", + animeList = "animeList", + animeTotal = "animeTotal", + animeWatching = "animeWatching", + animeCompleted = "animeCompleted", + animeAvgRating = "animeAvgRating", + animeStatusWatching = "animeStatusWatching", + animeStatusCompleted = "animeStatusCompleted", + animeStatusPlanned = "animeStatusPlanned", + animeYear = "animeYear", + animeStudio = "animeStudio", + animeEmpty = "animeEmpty", + animeEmptyBangumi = "animeEmptyBangumi", + + // 友链页面 + friends = "friends", + + // RSS页面 + rss = "rss", + rssDescription = "rssDescription", + rssSubtitle = "rssSubtitle", + rssLink = "rssLink", + rssCopyToReader = "rssCopyToReader", + rssCopyLink = "rssCopyLink", + rssLatestPosts = "rssLatestPosts", + rssWhatIsRSS = "rssWhatIsRSS", + rssWhatIsRSSDescription = "rssWhatIsRSSDescription", + rssBenefit1 = "rssBenefit1", + rssBenefit2 = "rssBenefit2", + rssBenefit3 = "rssBenefit3", + rssBenefit4 = "rssBenefit4", + rssHowToUse = "rssHowToUse", + rssCopied = "rssCopied", + rssCopyFailed = "rssCopyFailed", + + // Atom页面 + atom = "atom", + atomDescription = "atomDescription", + atomSubtitle = "atomSubtitle", + atomLink = "atomLink", + atomCopyToReader = "atomCopyToReader", + atomCopyLink = "atomCopyLink", + atomLatestPosts = "atomLatestPosts", + atomWhatIsAtom = "atomWhatIsAtom", + atomWhatIsAtomDescription = "atomWhatIsAtomDescription", + atomBenefit1 = "atomBenefit1", + atomBenefit2 = "atomBenefit2", + atomBenefit3 = "atomBenefit3", + atomBenefit4 = "atomBenefit4", + atomHowToUse = "atomHowToUse", + atomCopied = "atomCopied", + atomCopyFailed = "atomCopyFailed", + + // 密码保护 + passwordProtected = "passwordProtected", + passwordProtectedTitle = "passwordProtectedTitle", + passwordProtectedDescription = "passwordProtectedDescription", + passwordPlaceholder = "passwordPlaceholder", + passwordUnlock = "passwordUnlock", + passwordUnlocking = "passwordUnlocking", + passwordIncorrect = "passwordIncorrect", + passwordDecryptError = "passwordDecryptError", + passwordRequired = "passwordRequired", + passwordVerifying = "passwordVerifying", + passwordDecryptFailed = "passwordDecryptFailed", + passwordDecryptRetry = "passwordDecryptRetry", + passwordUnlockButton = "passwordUnlockButton", + copyFailed = "copyFailed", + syntaxHighlightFailed = "syntaxHighlightFailed", + autoSyntaxHighlightFailed = "autoSyntaxHighlightFailed", + decryptionError = "decryptionError", + + //最后编辑时间卡片 + lastModifiedPrefix = "lastModifiedPrefix", + lastModifiedOutdated = "lastModifiedOutdated", + year = "year", + month = "month", + day = "day", + hour = "hour", + minute = "minute", + second = "second", + + // 音乐播放器 + playlist = "playlist", + musicEmptyPlaylist = "musicEmptyPlaylist", + musicNoSongsAvailable = "musicNoSongsAvailable", + musicPlayFailed = "musicPlayFailed", + musicAutoplayBlocked = "musicAutoplayBlocked", + musicMetingFailed = "musicMetingFailed", + musicUnknownArtist = "musicUnknownArtist", + musicUnknownTrack = "musicUnknownTrack", + musicSwitchToLocal = "musicSwitchToLocal", + musicSwitchToMeting = "musicSwitchToMeting", + musicProgress = "musicProgress", + musicCollapse = "musicCollapse", + musicVolume = "musicVolume", + musicExpand = "musicExpand", +} + +export default I18nKey; \ No newline at end of file diff --git a/src/i18n/language.ts b/src/i18n/language.ts new file mode 100644 index 0000000..f314250 --- /dev/null +++ b/src/i18n/language.ts @@ -0,0 +1,149 @@ +/** + * 统一的语言配置文件 + * 所有语言相关的映射和配置都从这里导出 + */ + +export interface LanguageConfig { + /** 翻译服务使用的语言代码 */ + translateCode: string; + /** 语言显示名称 */ + displayName: string; + /** Intl.DateTimeFormat 使用的 locale */ + locale: string; + /** 语言图标(国旗 emoji) */ + icon: string; +} + +/** + * 支持的语言配置 + * 单一数据源,避免重复定义 + */ +export const LANGUAGE_CONFIG = { + zh: { + translateCode: "chinese_simplified", + displayName: "中文", + locale: "zh-CN", + icon: "🇨🇳", + }, + en: { + translateCode: "english", + displayName: "English", + locale: "en-US", + icon: "🇺🇸", + }, + ja: { + translateCode: "japanese", + displayName: "日本語", + locale: "ja-JP", + icon: "🇯🇵", + }, + ko: { + translateCode: "korean", + displayName: "한국어", + locale: "ko-KR", + icon: "🇰🇷", + }, + es: { + translateCode: "spanish", + displayName: "Español", + locale: "es-ES", + icon: "🇪🇸", + }, + th: { + translateCode: "thai", + displayName: "ไทย", + locale: "th-TH", + icon: "🇹🇭", + }, + vi: { + translateCode: "vietnamese", + displayName: "Tiếng Việt", + locale: "vi-VN", + icon: "🇻🇳", + }, + tr: { + translateCode: "turkish", + displayName: "Türkçe", + locale: "tr-TR", + icon: "🇹🇷", + }, + id: { + translateCode: "indonesian", + displayName: "Bahasa Indonesia", + locale: "id-ID", + icon: "🇮🇩", + }, + fr: { + translateCode: "french", + displayName: "Français", + locale: "fr-FR", + icon: "🇫🇷", + }, + de: { + translateCode: "german", + displayName: "Deutsch", + locale: "de-DE", + icon: "🇩🇪", + }, + ru: { + translateCode: "russian", + displayName: "Русский", + locale: "ru-RU", + icon: "🇷🇺", + }, + ar: { + translateCode: "arabic", + displayName: "العربية", + locale: "ar-SA", + icon: "🇸🇦", + }, +} as const satisfies Record; + +/** 支持的语言代码列表 */ +export const SUPPORTED_LANGUAGES = Object.keys(LANGUAGE_CONFIG) as Array< + keyof typeof LANGUAGE_CONFIG +>; + +export type SupportedLanguage = keyof typeof LANGUAGE_CONFIG; + +/** + * 配置文件语言代码到翻译服务语言代码的映射 + * 自动从 LANGUAGE_CONFIG 生成 + */ +export const langToTranslateMap: Record = Object.fromEntries( + Object.entries(LANGUAGE_CONFIG).map(([lang, config]) => [ + lang, + config.translateCode, + ]), +); + +/** + * 翻译服务语言代码到配置文件语言代码的映射 + * 自动从 LANGUAGE_CONFIG 生成 + */ +export const translateToLangMap: Record = Object.fromEntries( + Object.entries(LANGUAGE_CONFIG).map(([lang, config]) => [ + config.translateCode, + lang, + ]), +); + +/** + * 语言代码到 locale 的映射 + * 自动从 LANGUAGE_CONFIG 生成 + */ +export const langToLocaleMap: Record = Object.fromEntries( + Object.entries(LANGUAGE_CONFIG).map(([lang, config]) => [lang, config.locale]), +); + +/** + * 获取所有支持翻译的语言列表(用于 Translator) + */ +export function getSupportedTranslateLanguages() { + return Object.entries(LANGUAGE_CONFIG).map(([code, config]) => ({ + code: config.translateCode, + name: config.displayName, + icon: config.icon, + langCode: code, + })); +} diff --git a/src/i18n/languages/en.ts b/src/i18n/languages/en.ts new file mode 100644 index 0000000..8dc79f0 --- /dev/null +++ b/src/i18n/languages/en.ts @@ -0,0 +1,274 @@ +import Key from "@i18n/i18nKey"; +import type { Translation } from "@i18n/translation"; + + +export const en: Translation = { + // Loading Overlay + [Key.loading]: "LOADING", + + // Navigations + [Key.home]: "Home", + [Key.archive]: "Archive", + [Key.about]: "About", + [Key.search]: "Search", + + // Posts + [Key.tags]: "Tags", + [Key.categories]: "Categories", + [Key.series]: "Series", + [Key.posts]: "Posts", + [Key.recentPosts]: "Recent Posts", + [Key.postList]: "Post List", + [Key.statistics]: "Statistics", + [Key.tableOfContents]: "Table of Contents", + + // Page Stats + [Key.pageViews]: "Views", + [Key.visitors]: "Visitors", + [Key.statsLoading]: "Loading stats...", + [Key.statsError]: "Stats unavailable", + + // Announcement + [Key.announcement]: "Announcement", + [Key.announcementClose]: "Close", + + [Key.comments]: "Comments", + [Key.untitled]: "Untitled", + [Key.uncategorized]: "Uncategorized", + [Key.noTags]: "No Tags", + + [Key.wordCount]: "word", + [Key.wordsCount]: "words", + [Key.minuteCount]: "minute", + [Key.minutesCount]: "minutes", + [Key.postCount]: "post", + [Key.postsCount]: "posts", + + [Key.themeColor]: "Theme Color", + + [Key.lightMode]: "Light", + [Key.darkMode]: "Dark", + [Key.systemMode]: "System", + + [Key.wallpaperMode]: "Wallpaper Mode", + [Key.wallpaperFullscreen]: "Fullscreen", + [Key.wallpaperBanner]: "Banner", + [Key.wallpaperNone]: "None", + + [Key.more]: "More", + + [Key.backTo]: "Back to", + + [Key.author]: "Author", + [Key.publishedAt]: "Published at", + [Key.license]: "License", + + // 404 Page + [Key.notFound]: "404", + [Key.notFoundTitle]: "Page Not Found", + [Key.notFoundDescription]: "Sorry, the page you visited does not exist or has been moved.", + [Key.backToHome]: "Back to Home", + + // Projects Page + [Key.projects]: "Projects", + [Key.projectsSubtitle]: "My development project portfolio", + [Key.projectsAll]: "All", + [Key.projectsWeb]: "Web Applications", + [Key.projectsMobile]: "Mobile Applications", + [Key.projectsDesktop]: "Desktop Applications", + [Key.projectsOther]: "Other", + [Key.projectTechStack]: "Tech Stack", + [Key.projectLiveDemo]: "Live Demo", + [Key.projectSourceCode]: "Source Code", + [Key.projectDescription]: "Project Description", + [Key.projectStatus]: "Status", + [Key.projectStatusCompleted]: "Completed", + [Key.projectStatusInProgress]: "In Progress", + [Key.projectStatusPlanned]: "Planned", + [Key.projectsTotal]: "Total Projects", + [Key.projectsCompleted]: "Completed", + [Key.projectsInProgress]: "In Progress", + [Key.projectsTechStack]: "Tech Stack Statistics", + [Key.projectsFeatured]: "Featured Projects", + [Key.projectsPlanned]: "Planned", + [Key.projectsDemo]: "Live Demo", + [Key.projectsSource]: "Source Code", + + // Skills Page + [Key.skills]: "Skills", + [Key.skillsSubtitle]: "My technical skills and expertise", + [Key.skillsAI]: "AI Development", + [Key.skillsBackend]: "Backend Development", + [Key.skillsClient]: "Client Development", + [Key.skillsFrontend]: "Frontend Development", + [Key.skillsDatabase]: "Database", + [Key.skillsEngines]: "Engines", + [Key.skillsTools]: "Development Tools", + [Key.skillsOthers]: "Other Skills", + [Key.skillLevel]: "Proficiency", + [Key.skillLevelBeginner]: "Beginner", + [Key.skillLevelIntermediate]: "Intermediate", + [Key.skillLevelAdvanced]: "Advanced", + [Key.skillLevelExpert]: "Expert", + [Key.skillExperience]: "Experience", + [Key.skillYears]: "years", + [Key.skillMonths]: "months", + [Key.skillsTotal]: "Total Skills", + [Key.skillsExpert]: "Expert Level", + [Key.skillsAdvanced]: "Advanced", + [Key.skillsIntermediate]: "Intermediate", + [Key.skillsBeginner]: "Beginner", + [Key.skillsAdvancedTitle]: "Professional Skills", + [Key.skillsProjects]: "Related Projects", + [Key.skillsDistribution]: "Skill Distribution", + [Key.skillsByLevel]: "Distribution by Level", + [Key.skillsByCategory]: "Distribution by Category", + + // Timeline Page + [Key.timeline]: "Timeline", + [Key.timelineSubtitle]: "My growth journey and important milestones", + [Key.timelineEducation]: "Education", + [Key.timelineWork]: "Work Experience", + [Key.timelineProject]: "Project Experience", + [Key.timelineAchievement]: "Achievements", + [Key.timelinePresent]: "Present", + [Key.timelineLocation]: "Location", + [Key.timelineDescription]: "Detailed Description", + [Key.timelineMonths]: "months", + [Key.timelineYears]: "years", + [Key.timelineTotal]: "Total", + [Key.timelineProjects]: "Projects", + [Key.timelineExperience]: "Work Experience", + [Key.timelineCurrent]: "Current Status", + [Key.timelineHistory]: "History", + [Key.timelineAchievements]: "Achievements", + [Key.timelineStatistics]: "Statistics", + [Key.timelineByType]: "Grouped by Type", + [Key.timelineWorkExperience]: "Work Experience", + [Key.timelineTotalExperience]: "Total Work Experience", + [Key.timelineWorkPositions]: "Work Positions", + [Key.timelineCurrentRole]: "Current Status", + [Key.timelineEmployed]: "Employed", + [Key.timelineAvailable]: "Available", + + // Diary Page + [Key.diary]: "Diary", + [Key.diarySubtitle]: "Share life anytime, anywhere", + [Key.diaryCount]: "diary entries", + [Key.diaryImage]: "Image", + [Key.diaryReply]: "Reply", + [Key.diaryTips]: "Only show the latest 30 diary entries", + [Key.diaryMinutesAgo]: "minutes ago", + [Key.diaryHoursAgo]: "hours ago", + [Key.diaryDaysAgo]: "days ago", + + // Albums Page + [Key.albums]: "Albums", + [Key.albumsSubtitle]: "Record beautiful moments in life", + [Key.albumsEmpty]: "No content", + [Key.albumsEmptyDesc]: "No albums have been created yet. Go add some beautiful memories!", + [Key.albumsBackToList]: "Back to Albums", + [Key.albumsPhotoCount]: "photo", + [Key.albumsPhotosCount]: "photos", + + // Anime Page + [Key.anime]: "Anime", + [Key.animeTitle]: "My Anime List", + [Key.animeSubtitle]: "Record my anime journey", + [Key.animeList]: "Anime List", + [Key.animeTotal]: "Total", + [Key.animeWatching]: "Watching", + [Key.animeCompleted]: "Completed", + [Key.animeAvgRating]: "Average Rating", + [Key.animeStatusWatching]: "Watching", + [Key.animeStatusCompleted]: "Completed", + [Key.animeStatusPlanned]: "Planned", + [Key.animeYear]: "Year", + [Key.animeStudio]: "Studio", + [Key.animeEmpty]: "No anime data", + [Key.animeEmptyBangumi]: "Please check Bangumi configuration or network connection", + + // Friends Page + [Key.friends]: "Friends", + + // RSS Page + [Key.rss]: "RSS Feed", + [Key.rssDescription]: "Subscribe to get latest updates", + [Key.rssSubtitle]: "Subscribe via RSS to get the latest articles and updates imediately", + [Key.rssLink]: "RSS Link", + [Key.rssCopyToReader]: "Copy link to your RSS reader", + [Key.rssCopyLink]: "Copy Link", + [Key.rssLatestPosts]: "Latest Posts", + [Key.rssWhatIsRSS]: "What is RSS?", + [Key.rssWhatIsRSSDescription]: "RSS (Really Simple Syndication) is a standard format for publishing frequently updated content. With RSS, you can:", + [Key.rssBenefit1]: "Get the latest website content in time without manually visiting", + [Key.rssBenefit2]: "Manage subscriptions to multiple websites in one place", + [Key.rssBenefit3]: "Avoid missing important updates and articles", + [Key.rssBenefit4]: "Enjoy an ad-free, clean reading experience", + [Key.rssHowToUse]: "It is recommended to use Feedly, Inoreader or other RSS readers to subscribe to this site.", + [Key.rssCopied]: "RSS link copied to clipboard!", + [Key.rssCopyFailed]: "Copy failed, please copy the link manually", + + // Atom Page + [Key.atom]: "Atom Feed", + [Key.atomDescription]: "Subscribe to get latest updates", + [Key.atomSubtitle]: "Subscribe via Atom to get the latest articles and updates immediately", + [Key.atomLink]: "Atom Link", + [Key.atomCopyToReader]: "Copy link to your Atom reader", + [Key.atomCopyLink]: "Copy Link", + [Key.atomLatestPosts]: "Latest Posts", + [Key.atomWhatIsAtom]: "What is Atom?", + [Key.atomWhatIsAtomDescription]: "Atom (Atom Syndication Format) is an XML-based standard for describing feeds and their items. With Atom, you can:", + [Key.atomBenefit1]: "Get the latest website content in time without manually visiting", + [Key.atomBenefit2]: "Manage subscriptions to multiple websites in one place", + [Key.atomBenefit3]: "Avoid missing important updates and articles", + [Key.atomBenefit4]: "Enjoy an ad-free, clean reading experience", + [Key.atomHowToUse]: "It is recommended to use Feedly, Inoreader or other Atom readers to subscribe to this site.", + [Key.atomCopied]: "Atom link copied to clipboard!", + [Key.atomCopyFailed]: "Copy failed, please copy the link manually", + + // Password Protection + [Key.passwordProtected]: "Password Protected", + [Key.passwordProtectedTitle]: "This content is password protected", + [Key.passwordProtectedDescription]: "Please enter the password to view the protected content", + [Key.passwordPlaceholder]: "Enter password", + [Key.passwordUnlock]: "Unlock", + [Key.passwordUnlocking]: "Unlocking...", + [Key.passwordIncorrect]: "Incorrect password, please try again", + [Key.passwordDecryptError]: "Decryption failed, please check if the password is correct", + [Key.passwordRequired]: "Please enter the password", + [Key.passwordVerifying]: "Verifying...", + [Key.passwordDecryptFailed]: "Decryption failed, please check the password", + [Key.passwordDecryptRetry]: "Decryption failed, please try again", + [Key.passwordUnlockButton]: "Unlock", + [Key.copyFailed]: "Copy failed:", + [Key.syntaxHighlightFailed]: "Syntax highlighting failed:", + [Key.autoSyntaxHighlightFailed]: "Automatic syntax highlighting also failed:", + [Key.decryptionError]: "An error occurred during decryption:", + + // Last Modified Time Card + [Key.lastModifiedPrefix]: "Time since last edit: ", + [Key.lastModifiedOutdated]: "Some information may be outdated", + [Key.year]: "year", + [Key.month]: "month", + [Key.day]: "day", + [Key.hour]: "hour", + [Key.minute]: "minute", + [Key.second]: "second", + + // Music Player + [Key.playlist]: "Playlist", + [Key.musicEmptyPlaylist]: "Local playlist is empty", + [Key.musicNoSongsAvailable]: "No songs available in playlist", + [Key.musicPlayFailed]: "Failed to play \"{0}\", trying next...", + [Key.musicAutoplayBlocked]: "Autoplay blocked", + [Key.musicMetingFailed]: "Failed to fetch Meting playlist", + [Key.musicUnknownArtist]: "Unknown Artist", + [Key.musicUnknownTrack]: "Unknown Track", + [Key.musicSwitchToLocal]: "Switch to Local mode", + [Key.musicSwitchToMeting]: "Switch to Meting mode", + [Key.musicProgress]: "Progress", + [Key.musicCollapse]: "Collapse player", + [Key.musicVolume]: "Volume", + [Key.musicExpand]: "Expand music player", +}; \ No newline at end of file diff --git a/src/i18n/languages/ja.ts b/src/i18n/languages/ja.ts new file mode 100644 index 0000000..fcdcd61 --- /dev/null +++ b/src/i18n/languages/ja.ts @@ -0,0 +1,274 @@ +import Key from "@i18n/i18nKey"; +import type { Translation } from "@i18n/translation"; + + +export const ja: Translation = { + // 加載遮罩 + [Key.loading]: "読み込み中", + + // ナビゲーション + [Key.home]: "ホーム", + [Key.archive]: "アーカイブ", + [Key.about]: "について", + [Key.search]: "検索", + + // 投稿 + [Key.tags]: "タグ", + [Key.categories]: "カテゴリ", + [Key.series]: "シリーズ", + [Key.posts]: "投稿", + [Key.recentPosts]: "最近の投稿", + [Key.postList]: "投稿リスト", + [Key.statistics]: "統計", + [Key.tableOfContents]: "目次", + + // 統計 + [Key.pageViews]: "閲覧数", + [Key.visitors]: "訪問者", + [Key.statsLoading]: "統計を読み込み中...", + [Key.statsError]: "統計を利用できません", + + // お知らせ + [Key.announcement]: "お知らせ", + [Key.announcementClose]: "閉じる", + + [Key.comments]: "コメント", + [Key.untitled]: "無題", + [Key.uncategorized]: "未分類", + [Key.noTags]: "タグなし", + + [Key.wordCount]: "語", + [Key.wordsCount]: "語", + [Key.minuteCount]: "分", + [Key.minutesCount]: "分", + [Key.postCount]: "投稿", + [Key.postsCount]: "投稿", + + [Key.themeColor]: "テーマカラー", + + [Key.lightMode]: "ライト", + [Key.darkMode]: "ダーク", + [Key.systemMode]: "システム", + + [Key.wallpaperMode]: "壁紙モード", + [Key.wallpaperFullscreen]: "全画面", + [Key.wallpaperBanner]: "バナー", + [Key.wallpaperNone]: "なし", + + [Key.more]: "もっと", + + [Key.backTo]: "戻る", + + [Key.author]: "著者", + [Key.publishedAt]: "公開日", + [Key.license]: "ライセンス", + + // 404ページ + [Key.notFound]: "404", + [Key.notFoundTitle]: "ページが見つかりません", + [Key.notFoundDescription]: "申し訳ありませんが、アクセスしたページは存在しないか、移動されています。", + [Key.backToHome]: "ホームに戻る", + + // プロジェクトページ + [Key.projects]: "プロジェクト", + [Key.projectsSubtitle]: "私の開発プロジェクトポートフォリオ", + [Key.projectsAll]: "すべて", + [Key.projectsWeb]: "ウェブアプリケーション", + [Key.projectsMobile]: "モバイルアプリケーション", + [Key.projectsDesktop]: "デスクトップアプリケーション", + [Key.projectsOther]: "その他", + [Key.projectTechStack]: "技術スタック", + [Key.projectLiveDemo]: "ライブデモ", + [Key.projectSourceCode]: "ソースコード", + [Key.projectDescription]: "プロジェクト説明", + [Key.projectStatus]: "ステータス", + [Key.projectStatusCompleted]: "完了", + [Key.projectStatusInProgress]: "進行中", + [Key.projectStatusPlanned]: "予定", + [Key.projectsTotal]: "プロジェクト合計", + [Key.projectsCompleted]: "完了", + [Key.projectsInProgress]: "進行中", + [Key.projectsTechStack]: "技術スタック統計", + [Key.projectsFeatured]: "注目プロジェクト", + [Key.projectsPlanned]: "予定", + [Key.projectsDemo]: "ライブデモ", + [Key.projectsSource]: "ソースコード", + + // スキルページ + [Key.skills]: "スキル", + [Key.skillsSubtitle]: "私の技術スキルと専門知識", + [Key.skillsAI]: "AI開発", + [Key.skillsBackend]: "バックエンド開発", + [Key.skillsClient]: "クライアント開発", + [Key.skillsFrontend]: "フロントエンド開発", + [Key.skillsDatabase]: "データベース", + [Key.skillsEngines]: "エンジン", + [Key.skillsTools]: "開発ツール", + [Key.skillsOthers]: "その他のスキル", + [Key.skillLevel]: "熟練度", + [Key.skillLevelBeginner]: "初心者", + [Key.skillLevelIntermediate]: "中級者", + [Key.skillLevelAdvanced]: "上級者", + [Key.skillLevelExpert]: "エキスパート", + [Key.skillExperience]: "経験", + [Key.skillYears]: "年", + [Key.skillMonths]: "ヶ月", + [Key.skillsTotal]: "スキル合計", + [Key.skillsExpert]: "エキスパートレベル", + [Key.skillsAdvanced]: "上級者", + [Key.skillsIntermediate]: "中級者", + [Key.skillsBeginner]: "初心者", + [Key.skillsAdvancedTitle]: "専門スキル", + [Key.skillsProjects]: "関連プロジェクト", + [Key.skillsDistribution]: "スキル分布", + [Key.skillsByLevel]: "レベル別分布", + [Key.skillsByCategory]: "カテゴリ別分布", + + // タイムラインページ + [Key.timeline]: "タイムライン", + [Key.timelineSubtitle]: "私の成長の旅と重要なマイルストーン", + [Key.timelineEducation]: "教育", + [Key.timelineWork]: "職歴", + [Key.timelineProject]: "プロジェクト経験", + [Key.timelineAchievement]: "実績", + [Key.timelinePresent]: "現在", + [Key.timelineLocation]: "場所", + [Key.timelineDescription]: "詳細説明", + [Key.timelineMonths]: "ヶ月", + [Key.timelineYears]: "年", + [Key.timelineTotal]: "合計", + [Key.timelineProjects]: "プロジェクト", + [Key.timelineExperience]: "職歴", + [Key.timelineCurrent]: "現在の状態", + [Key.timelineHistory]: "履歴", + [Key.timelineAchievements]: "実績", + [Key.timelineStatistics]: "統計", + [Key.timelineByType]: "タイプ別グループ化", + [Key.timelineWorkExperience]: "職歴", + [Key.timelineTotalExperience]: "総職歴", + [Key.timelineWorkPositions]: "職位数", + [Key.timelineCurrentRole]: "現在の状態", + [Key.timelineEmployed]: "在職中", + [Key.timelineAvailable]: "入社可能", + + // 日記ページ + [Key.diary]: "日記", + [Key.diarySubtitle]: "いつでもどこでも、生活を共有する", + [Key.diaryCount]: "日記エントリ", + [Key.diaryImage]: "画像", + [Key.diaryReply]: "返信", + [Key.diaryTips]: "最新の30件の日記エントリのみを表示", + [Key.diaryMinutesAgo]: "分前", + [Key.diaryHoursAgo]: "時間前", + [Key.diaryDaysAgo]: "日前", + + // アルバムページ + [Key.albums]: "アルバム", + [Key.albumsSubtitle]: "生活の美しい瞬間を記録する", + [Key.albumsEmpty]: "コンテンツなし", + [Key.albumsEmptyDesc]: "アルバムがまだ作成されていません。美しい思い出を追加してください!", + [Key.albumsBackToList]: "アルバムに戻る", + [Key.albumsPhotoCount]: "写真", + [Key.albumsPhotosCount]: "写真", + + // アニメページ + [Key.anime]: "アニメ", + [Key.animeTitle]: "私のアニメリスト", + [Key.animeSubtitle]: "私の二次元の旅を記録する", + [Key.animeList]: "アニメリスト", + [Key.animeTotal]: "合計", + [Key.animeWatching]: "視聴中", + [Key.animeCompleted]: "完了", + [Key.animeAvgRating]: "平均評価", + [Key.animeStatusWatching]: "視聴中", + [Key.animeStatusCompleted]: "完了", + [Key.animeStatusPlanned]: "予定", + [Key.animeYear]: "年", + [Key.animeStudio]: "スタジオ", + [Key.animeEmpty]: "アニメデータなし", + [Key.animeEmptyBangumi]: "Bangumiの設定またはネットワーク接続を確認してください", + + // 友達ページ + [Key.friends]: "友達", + + // RSSページ + [Key.rss]: "RSSフィード", + [Key.rssDescription]: "最新の更新を購読する", + [Key.rssSubtitle]: "RSSで購読して、最新の記事と更新を第一时间で取得する", + [Key.rssLink]: "RSSリンク", + [Key.rssCopyToReader]: "RSSリンクをリーダーにコピー", + [Key.rssCopyLink]: "リンクをコピー", + [Key.rssLatestPosts]: "最新の投稿", + [Key.rssWhatIsRSS]: "RSSとは?", + [Key.rssWhatIsRSSDescription]: "RSS(Really Simple Syndication)は、頻繁に更新されるコンテンツを公開するための標準形式です。RSSを使用すると:", + [Key.rssBenefit1]: "手動で訪問することなく、最新のウェブサイトコンテンツを及时に取得", + [Key.rssBenefit2]: "1か所で複数のウェブサイトの購読を管理", + [Key.rssBenefit3]: "重要な更新や記事を見逃すことを回避", + [Key.rssBenefit4]: "広告なしのクリーンな読書体験を楽しむ", + [Key.rssHowToUse]: "Feedly、Inoreaderまたは他のRSSリーダーを使用してこのサイトを購読することを推奨します。", + [Key.rssCopied]: "RSSリンクがクリップボードにコピーされました!", + [Key.rssCopyFailed]: "コピーに失敗しました。手動でリンクをコピーしてください", + + // Atomページ + [Key.atom]: "Atomフィード", + [Key.atomDescription]: "最新の更新を購読する", + [Key.atomSubtitle]: "Atomで購読して、最新の記事と更新を第一时间で取得する", + [Key.atomLink]: "Atomリンク", + [Key.atomCopyToReader]: "Atomリンクをリーダーにコピー", + [Key.atomCopyLink]: "リンクをコピー", + [Key.atomLatestPosts]: "最新の投稿", + [Key.atomWhatIsAtom]: "Atomとは?", + [Key.atomWhatIsAtomDescription]: "Atom連合フォーマット(Atom Syndication Format)は、フィードとそのアイテムを記述するためのXMLベースの標準です。Atomを使用すると:", + [Key.atomBenefit1]: "手動で訪問することなく、最新のウェブサイトコンテンツを及时に取得", + [Key.atomBenefit2]: "1か所で複数のウェブサイトの購読を管理", + [Key.atomBenefit3]: "重要な更新や記事を見逃すことを回避", + [Key.atomBenefit4]: "広告なしのクリーンな読書体験を楽しむ", + [Key.atomHowToUse]: "Feedly、Inoreaderまたは他のAtomリーダーを使用してこのサイトを購読することを推奨します。", + [Key.atomCopied]: "Atomリンクがクリップボードにコピーされました!", + [Key.atomCopyFailed]: "コピーに失敗しました。手動でリンクをコピーしてください", + + // パスワード保護 + [Key.passwordProtected]: "パスワード保護", + [Key.passwordProtectedTitle]: "このコンテンツはパスワードで保護されています", + [Key.passwordProtectedDescription]: "保護されたコンテンツを表示するにはパスワードを入力してください", + [Key.passwordPlaceholder]: "パスワードを入力", + [Key.passwordUnlock]: "ロック解除", + [Key.passwordUnlocking]: "ロック解除中...", + [Key.passwordIncorrect]: "パスワードが間違っています。再試行してください", + [Key.passwordDecryptError]: "復号化に失敗しました。パスワードが正しいか確認してください", + [Key.passwordRequired]: "パスワードを入力してください", + [Key.passwordVerifying]: "検証中...", + [Key.passwordDecryptFailed]: "復号化に失敗しました。パスワードを確認してください", + [Key.passwordDecryptRetry]: "復号化に失敗しました。再試行してください", + [Key.passwordUnlockButton]: "ロック解除", + [Key.copyFailed]: "コピーに失敗しました:", + [Key.syntaxHighlightFailed]: "構文ハイライトに失敗しました:", + [Key.autoSyntaxHighlightFailed]: "自動構文ハイライトにも失敗しました:", + [Key.decryptionError]: "復号化中にエラーが発生しました:", + + // 最終更新時間カード + [Key.lastModifiedPrefix]: "最終編集からの時間:", + [Key.lastModifiedOutdated]: "一部の情報は古くなっている可能性があります", + [Key.year]: "年", + [Key.month]: "月", + [Key.day]: "日", + [Key.hour]: "時間", + [Key.minute]: "分", + [Key.second]: "秒", + + // 音楽プレイヤー + [Key.playlist]: "プレイリスト", + [Key.musicEmptyPlaylist]: "ローカルプレイリストが空です", + [Key.musicNoSongsAvailable]: "プレイリストに利用可能な曲がありません", + [Key.musicPlayFailed]: "\"{0}\" の再生に失敗しました。次を試行しています...", + [Key.musicAutoplayBlocked]: "自動再生がブロックされました", + [Key.musicMetingFailed]: "Meting プレイリストの取得に失敗しました", + [Key.musicUnknownArtist]: "未知のアーティスト", + [Key.musicUnknownTrack]: "未知の曲", + [Key.musicSwitchToLocal]: "ローカルモードに切り替え", + [Key.musicSwitchToMeting]: "Metingモードに切り替え", + [Key.musicProgress]: "再生の進捗", + [Key.musicCollapse]: "プレイヤーを閉じる", + [Key.musicVolume]: "音量調節", + [Key.musicExpand]: "音楽プレイヤーを展開", +}; \ No newline at end of file diff --git a/src/i18n/languages/zh.ts b/src/i18n/languages/zh.ts new file mode 100644 index 0000000..84304b8 --- /dev/null +++ b/src/i18n/languages/zh.ts @@ -0,0 +1,274 @@ +import Key from "@i18n/i18nKey"; +import type { Translation } from "@i18n/translation"; + + +export const zh: Translation = { + // 加载遮罩 + [Key.loading]: "加载中", + + // 导航 + [Key.home]: "主页", + [Key.archive]: "归档", + [Key.about]: "关于", + [Key.search]: "搜索", + + // 文章 + [Key.tags]: "标签", + [Key.categories]: "分类", + [Key.series]: "系列", + [Key.posts]: "文章", + [Key.recentPosts]: "最新文章", + [Key.postList]: "文章列表", + [Key.statistics]: "统计", + [Key.tableOfContents]: "目录", + + // 统计 + [Key.pageViews]: "浏览量", + [Key.visitors]: "访客", + [Key.statsLoading]: "统计加载中...", + [Key.statsError]: "统计不可用", + + // 公告栏 + [Key.announcement]: "公告", + [Key.announcementClose]: "关闭", + + [Key.comments]: "评论", + [Key.untitled]: "无标题", + [Key.uncategorized]: "未分类", + [Key.noTags]: "无标签", + + [Key.wordCount]: "字", + [Key.wordsCount]: "字", + [Key.minuteCount]: "分钟", + [Key.minutesCount]: "分钟", + [Key.postCount]: "篇文章", + [Key.postsCount]: "篇文章", + + [Key.themeColor]: "主题色", + + [Key.lightMode]: "亮色", + [Key.darkMode]: "暗色", + [Key.systemMode]: "跟随系统", + + [Key.wallpaperMode]: "壁纸模式", + [Key.wallpaperFullscreen]: "全屏壁纸", + [Key.wallpaperBanner]: "横幅壁纸", + [Key.wallpaperNone]: "纯色背景", + + [Key.more]: "更多", + + [Key.backTo]: "返回", + + [Key.author]: "作者", + [Key.publishedAt]: "发布于", + [Key.license]: "许可协议", + + // 404页面 + [Key.notFound]: "404", + [Key.notFoundTitle]: "页面未找到", + [Key.notFoundDescription]: "抱歉,您访问的页面不存在或已被移动。", + [Key.backToHome]: "返回首页", + + // 项目展示页面 + [Key.projects]: "项目展示", + [Key.projectsSubtitle]: "我的开发项目作品集", + [Key.projectsAll]: "全部", + [Key.projectsWeb]: "网页应用", + [Key.projectsMobile]: "移动应用", + [Key.projectsDesktop]: "桌面应用", + [Key.projectsOther]: "其他", + [Key.projectTechStack]: "技术栈", + [Key.projectLiveDemo]: "在线演示", + [Key.projectSourceCode]: "源代码", + [Key.projectDescription]: "项目描述", + [Key.projectStatus]: "状态", + [Key.projectStatusCompleted]: "已完成", + [Key.projectStatusInProgress]: "进行中", + [Key.projectStatusPlanned]: "计划中", + [Key.projectsTotal]: "项目总数", + [Key.projectsCompleted]: "已完成", + [Key.projectsInProgress]: "进行中", + [Key.projectsTechStack]: "技术栈统计", + [Key.projectsFeatured]: "精选项目", + [Key.projectsPlanned]: "计划中", + [Key.projectsDemo]: "在线演示", + [Key.projectsSource]: "源代码", + + // 技能展示页面 + [Key.skills]: "技能展示", + [Key.skillsSubtitle]: "我的技术技能和专业知识", + [Key.skillsAI]: "AI 开发", + [Key.skillsBackend]: "后端开发", + [Key.skillsClient]: "客户端开发", + [Key.skillsFrontend]: "前端开发", + [Key.skillsDatabase]: "数据库", + [Key.skillsEngines]: "引擎", + [Key.skillsTools]: "开发工具", + [Key.skillsOthers]: "其他技能", + [Key.skillLevel]: "熟练度", + [Key.skillLevelBeginner]: "初学者", + [Key.skillLevelIntermediate]: "中级", + [Key.skillLevelAdvanced]: "高级", + [Key.skillLevelExpert]: "专家", + [Key.skillExperience]: "经验", + [Key.skillYears]: "年", + [Key.skillMonths]: "个月", + [Key.skillsTotal]: "总技能数", + [Key.skillsExpert]: "专家级", + [Key.skillsAdvanced]: "高级", + [Key.skillsIntermediate]: "中级", + [Key.skillsBeginner]: "初级", + [Key.skillsAdvancedTitle]: "专业技能", + [Key.skillsProjects]: "相关项目", + [Key.skillsDistribution]: "技能分布", + [Key.skillsByLevel]: "按等级分布", + [Key.skillsByCategory]: "按分类分布", + + // 时间线页面 + [Key.timeline]: "时间线", + [Key.timelineSubtitle]: "我的成长历程和重要里程碑", + [Key.timelineEducation]: "教育经历", + [Key.timelineWork]: "工作经历", + [Key.timelineProject]: "项目经历", + [Key.timelineAchievement]: "成就荣誉", + [Key.timelinePresent]: "至今", + [Key.timelineLocation]: "地点", + [Key.timelineDescription]: "详细描述", + [Key.timelineMonths]: "个月", + [Key.timelineYears]: "年", + [Key.timelineTotal]: "总计", + [Key.timelineProjects]: "项目数", + [Key.timelineExperience]: "工作经验", + [Key.timelineCurrent]: "当前状态", + [Key.timelineHistory]: "历史记录", + [Key.timelineAchievements]: "成就荣誉", + [Key.timelineStatistics]: "统计信息", + [Key.timelineByType]: "按类型分组", + [Key.timelineWorkExperience]: "工作经验", + [Key.timelineTotalExperience]: "总工作经验", + [Key.timelineWorkPositions]: "工作岗位数", + [Key.timelineCurrentRole]: "当前状态", + [Key.timelineEmployed]: "在职", + [Key.timelineAvailable]: "可入职", + + // 短文页面 + [Key.diary]: "日记", + [Key.diarySubtitle]: "随时随地,分享生活", + [Key.diaryCount]: "条短文", + [Key.diaryImage]: "图片", + [Key.diaryReply]: "回复", + [Key.diaryTips]: "只展示最近30条日记", + [Key.diaryMinutesAgo]: "分钟前", + [Key.diaryHoursAgo]: "小时前", + [Key.diaryDaysAgo]: "天前", + + // 相册页面 + [Key.albums]: "相册", + [Key.albumsSubtitle]: "记录生活中的美好瞬间", + [Key.albumsEmpty]: "暂无内容", + [Key.albumsEmptyDesc]: "还没有创建任何相册,快去添加一些美好的回忆吧!", + [Key.albumsBackToList]: "返回相册", + [Key.albumsPhotoCount]: "张照片", + [Key.albumsPhotosCount]: "张照片", + + // 番剧页面 + [Key.anime]: "追番", + [Key.animeTitle]: "我的追番记录", + [Key.animeSubtitle]: "记录我的二次元之旅", + [Key.animeList]: "追番列表", + [Key.animeTotal]: "总数", + [Key.animeWatching]: "追番中", + [Key.animeCompleted]: "已追完", + [Key.animeAvgRating]: "平均评分", + [Key.animeStatusWatching]: "追番中", + [Key.animeStatusCompleted]: "已追完", + [Key.animeStatusPlanned]: "计划中", + [Key.animeYear]: "年份", + [Key.animeStudio]: "制作", + [Key.animeEmpty]: "暂无追番数据", + [Key.animeEmptyBangumi]: "请检查 Bangumi 配置或网络连接", + + // 友链页面 + [Key.friends]: "友链", + + // RSS页面 + [Key.rss]: "RSS 订阅", + [Key.rssDescription]: "订阅获取最新更新", + [Key.rssSubtitle]: "通过 RSS 订阅,第一时间获取最新文章和动态", + [Key.rssLink]: "RSS 链接", + [Key.rssCopyToReader]: "复制链接到你的 RSS 阅读器", + [Key.rssCopyLink]: "复制链接", + [Key.rssLatestPosts]: "最新文章", + [Key.rssWhatIsRSS]: "什么是 RSS?", + [Key.rssWhatIsRSSDescription]: "RSS(Really Simple Syndication)是一种用于发布经常更新内容的标准格式。通过 RSS,你可以:", + [Key.rssBenefit1]: "及时获取网站最新内容,无需手动访问", + [Key.rssBenefit2]: "在一个地方管理多个网站的订阅", + [Key.rssBenefit3]: "避免错过重要更新和文章", + [Key.rssBenefit4]: "享受无广告的纯净阅读体验", + [Key.rssHowToUse]: "推荐使用 Feedly、Inoreader 或其他 RSS 阅读器来订阅本站。", + [Key.rssCopied]: "RSS 链接已复制到剪贴板!", + [Key.rssCopyFailed]: "复制失败,请手动复制链接", + + //Atom 页面 + [Key.atom]: "Atom 订阅", + [Key.atomDescription]: "订阅获取最新更新", + [Key.atomSubtitle]: "通过 Atom 订阅,第一时间获取最新文章和动态", + [Key.atomLink]: "Atom 链接", + [Key.atomCopyToReader]: "复制链接到你的 Atom 阅读器", + [Key.atomCopyLink]: "复制链接", + [Key.atomLatestPosts]: "最新文章", + [Key.atomWhatIsAtom]: "什么是 Atom?", + [Key.atomWhatIsAtomDescription]: "Atom联合格式(Atom Syndication Format)是一个基于XML的标准,用于描述订阅源及其信息项。通过 Atom,你可以:", + [Key.atomBenefit1]: "及时获取网站最新内容,无需手动访问", + [Key.atomBenefit2]: "在一个地方管理多个网站的订阅", + [Key.atomBenefit3]: "避免错过重要更新和文章", + [Key.atomBenefit4]: "享受无广告的纯净阅读体验", + [Key.atomHowToUse]: "推荐使用 Feedly、Inoreader 或其他 Atom 阅读器来订阅本站。", + [Key.atomCopied]: "Atom 链接已复制到剪贴板!", + [Key.atomCopyFailed]: "复制失败,请手动复制链接", + + // 密码保护 + [Key.passwordProtected]: "密码保护", + [Key.passwordProtectedTitle]: "此内容受密码保护", + [Key.passwordProtectedDescription]: "请输入密码以查看受保护的内容", + [Key.passwordPlaceholder]: "请输入密码", + [Key.passwordUnlock]: "解锁", + [Key.passwordUnlocking]: "解锁中...", + [Key.passwordIncorrect]: "密码错误,请重试", + [Key.passwordDecryptError]: "解密失败,请检查密码是否正确", + [Key.passwordRequired]: "请输入密码", + [Key.passwordVerifying]: "验证中...", + [Key.passwordDecryptFailed]: "解密失败,请检查密码", + [Key.passwordDecryptRetry]: "解密失败,请重试", + [Key.passwordUnlockButton]: "解锁", + [Key.copyFailed]: "复制失败:", + [Key.syntaxHighlightFailed]: "语法高亮失败:", + [Key.autoSyntaxHighlightFailed]: "自动语法高亮也失败:", + [Key.decryptionError]: "解密过程中发生错误:", + + //最后编辑时间卡片 + [Key.lastModifiedPrefix]: "距离上次编辑: ", + [Key.lastModifiedOutdated]: "部分信息可能已经过时", + [Key.year]: "年", + [Key.month]: "月", + [Key.day]: "天", + [Key.hour]: "小时", + [Key.minute]: "分", + [Key.second]: "秒", + + // 音乐播放器 + [Key.playlist]: "播放列表", + [Key.musicEmptyPlaylist]: "本地播放列表为空", + [Key.musicNoSongsAvailable]: "播放列表中没有可用的歌曲", + [Key.musicPlayFailed]: "无法播放 \"{0}\", 正在尝试下一首...", + [Key.musicAutoplayBlocked]: "自动播放被拦截", + [Key.musicMetingFailed]: "Meting 歌单获取失败", + [Key.musicUnknownArtist]: "未知艺术家", + [Key.musicUnknownTrack]: "未知歌曲", + [Key.musicSwitchToLocal]: "切换到 Local 模式", + [Key.musicSwitchToMeting]: "切换到 Meting 模式", + [Key.musicProgress]: "播放进度", + [Key.musicCollapse]: "折叠播放器", + [Key.musicVolume]: "音量控制", + [Key.musicExpand]: "展开音乐播放器", +}; \ No newline at end of file diff --git a/src/i18n/translation.ts b/src/i18n/translation.ts new file mode 100644 index 0000000..3d37c28 --- /dev/null +++ b/src/i18n/translation.ts @@ -0,0 +1,32 @@ +import { getResolvedSiteLang } from "@utils/language"; +import { en } from "./languages/en"; +import { ja } from "./languages/ja"; +import { zh } from "./languages/zh"; +import type I18nKey from "./i18nKey"; + + +export type Translation = { + [K in I18nKey]: string; +}; + +const defaultTranslation = en; + +const map: { [key: string]: Translation } = { + en: en, + en_us: en, + en_gb: en, + en_au: en, + zh: zh, + zh_cn: zh, + ja: ja, + ja_jp: ja, +}; + +export function getTranslation(lang: string): Translation { + return map[lang.toLowerCase()] || defaultTranslation; +} + +export function i18n(key: I18nKey): string { + const lang = getResolvedSiteLang(); + return getTranslation(lang)[key]; +} \ No newline at end of file diff --git a/src/layouts/base.astro b/src/layouts/base.astro new file mode 100644 index 0000000..7bbd2cd --- /dev/null +++ b/src/layouts/base.astro @@ -0,0 +1,522 @@ +--- +import "katex/dist/katex.css"; + +import { siteConfig, profileConfig, umamiConfig, musicPlayerConfig, pioConfig } from "@/config"; +import type { Favicon } from "@/types/config"; +import { defaultFavicons } from "@constants/icon"; +import { + BANNER_HEIGHT, + BANNER_HEIGHT_EXTEND, + BANNER_HEIGHT_HOME, + LIGHT_MODE, + DARK_MODE, + SYSTEM_MODE, + PAGE_WIDTH, + NAVBAR_HEIGHT, +} from "@constants/constants"; +import { pathsEqual, url } from "@utils/url"; +import FontLoader from "@components/fontLoader.astro"; +import LoadingOverlay from "@components/loadingOverlay.astro"; +import ConfigCarrier from "@components/configCarrier.astro"; +import MusicPlayer from "@components/musicPlayer.svelte"; +import Pio from "@components/pio.svelte"; +import "@styles/navbar.css"; +import "@styles/banner.css"; +import "@styles/fancybox.css"; + + +interface Props { + title?: string; + banner?: string; + description?: string; + lang?: string; + setOGTypeArticle?: boolean; + postSlug?: string; +} + +let { title, banner, description, lang, setOGTypeArticle, postSlug } = Astro.props; + +// apply a class to the body element to decide the height of the banner, only used for initial page load +const isHomePage = pathsEqual(Astro.url.pathname, url("/")); + +// defines global css variables +// why doing this in BaseLayout instead of GlobalStyles: https://github.com/withastro/astro/issues/6728#issuecomment-1502203757 +const configHue = siteConfig.themeColor.hue; + +// 获取导航栏透明模式配置 +const navbarTransparentMode = + siteConfig.wallpaper.banner?.navbar?.transparentMode || "semi"; +// 判断是否应该显示顶部高光效果(只在full和semifull模式下显示) +const shouldShowTopHighlight = + navbarTransparentMode === "full" || navbarTransparentMode === "semifull"; + +// 获取默认banner图片的辅助函数 +const getDefaultBanner = (): string => { + const src = siteConfig.wallpaper.src; + if (typeof src === "string") { + return src; + } + if (Array.isArray(src)) { + return src[0] || ""; + } + if (src && typeof src === "object") { + // 优先使用desktop,如果没有则使用mobile + const desktopSrc = src.desktop; + const mobileSrc = src.mobile; + if (typeof desktopSrc === "string") { + return desktopSrc; + } + if (Array.isArray(desktopSrc) && desktopSrc.length > 0) { + return desktopSrc[0]; + } + if (typeof mobileSrc === "string") { + return mobileSrc; + } + if (Array.isArray(mobileSrc) && mobileSrc.length > 0) { + return mobileSrc[0]; + } + } + return ""; +}; + +// TODO don't use post cover as banner for now +banner = getDefaultBanner(); + +const enableBanner = siteConfig.wallpaper.mode === "banner"; + +let pageTitle: string; +if (title) { + pageTitle = `${title} - ${siteConfig.title}`; +} else { + pageTitle = siteConfig.subtitle + ? `${siteConfig.title} - ${siteConfig.subtitle}` + : siteConfig.title; +} + +let ogImageUrl: string | undefined; +if (siteConfig.generateOgImages && postSlug) { + ogImageUrl = new URL(`/og/${postSlug}.png`, Astro.site).toString(); +} + +const favicons: Favicon[] = + siteConfig.favicon.length > 0 ? siteConfig.favicon : defaultFavicons; + +// const siteLang = siteConfig.lang.replace('_', '-') +if (!lang) { + lang = `${siteConfig.lang}`; +} +const siteLang = lang.replace("_", "-"); + +const bannerOffsetByPosition = { + top: `${BANNER_HEIGHT_EXTEND}vh`, + center: `${BANNER_HEIGHT_EXTEND / 2}vh`, + bottom: "0", +}; +const bannerOffset = + bannerOffsetByPosition[siteConfig.wallpaper.position || "center"]; + +const umamiEnabled = umamiConfig.enabled || false; +const umamiScripts = umamiConfig.scripts || ""; // 获取Umami scripts配置 +--- + + + + + + + + + + + + + {pageTitle} + + + + {siteConfig.keywords && siteConfig.keywords.length > 0 && ( + + )} + + + + + + + + {ogImageUrl && } + { + setOGTypeArticle ? ( + + ) : ( + + ) + } + + + + + + + + + + + {favicons.map(favicon => ( + + ))} + + + + + + + + {pioConfig.enable && } + + + + {umamiEnabled && umamiScripts && } + + + + + + + + + {shouldShowTopHighlight &&
    } + + + + {musicPlayerConfig.enable && } + + {pioConfig.enable && } + + + + + + + + + + \ No newline at end of file diff --git a/src/layouts/grid.astro b/src/layouts/grid.astro new file mode 100644 index 0000000..2f7662f --- /dev/null +++ b/src/layouts/grid.astro @@ -0,0 +1,248 @@ +--- +import type { MarkdownHeading } from "astro"; +import { Icon } from "astro-icon/components"; + +import { siteConfig } from "@/config"; +import { + BANNER_HEIGHT, + MAIN_PANEL_OVERLAPS_BANNER_HEIGHT, +} from "@constants/constants"; +import { widgetManager } from "@utils/widget"; +import IconifyLoader from "@components/common/iconifyLoader.astro"; +import Navbar from "@components/navbar.astro"; +import FullscreenWallpaper from "@components/fullscreenWallpaper.astro"; +import Banner from "@components/banner.astro"; +import Sidebar from "@components/sidebar.astro"; +import Footer from "@components/footer.astro"; +import TocButton from "@components/tocButton.astro"; +import BackToTopButton from "@components/back2TopButton.astro"; +import BaseLayout from "./base.astro"; +import "@styles/grid.css"; + +/** + * Wallpaper + */ + +interface Props { + title?: string; + banner?: string; + description?: string; + lang?: string; + setOGTypeArticle?: boolean; + postSlug?: string; + headings?: MarkdownHeading[]; +} + +const { + title, + banner, + description, + lang, + setOGTypeArticle, + postSlug, + headings = [], +} = Astro.props; +const hasBannerCredit = siteConfig.wallpaper.mode === "banner" && siteConfig.wallpaper.banner?.credit?.enable; +const hasBannerLink = !!siteConfig.wallpaper.banner?.credit?.url; + +// 检查是否为首页 +const isHomePage = Astro.url.pathname === "/" || Astro.url.pathname === ""; + +// 计算主内容区域位置 +const mainPanelTop = siteConfig.wallpaper.mode === "banner" + ? `calc(${BANNER_HEIGHT}vh - ${MAIN_PANEL_OVERLAPS_BANNER_HEIGHT}rem)` + : "5.5rem"; + +// 当banner被禁用时,主内容区域应该始终从顶栏下面开始 +const finalMainPanelTop = siteConfig.wallpaper.mode === "banner" ? mainPanelTop : "5.5rem"; + +// 检查是否应该启用半透明效果 +const shouldEnableTransparency = siteConfig.wallpaper.mode === "banner" || siteConfig.wallpaper.mode === "fullscreen"; + +// 为组件添加半透明效果的CSS类 +const transparentClass = shouldEnableTransparency ? "wallpaper-transparent" : ""; + +/** + * Sidebar + */ + +// 检查侧边栏是否启用,动态调整网格布局 +const { + hasLeftSidebar, + hasRightSidebar, + hasAnyComponents, + gridCols, + leftSidebarClass, + rightSidebarClass, + mainContentClass, + mobileFooterClass, + middleSidebarClass, +} = widgetManager.getGridLayout(headings); +--- + + + + + + + +
    + +
    + + + + + + { + shouldEnableTransparency && ( + + ) + } + + + + + +
    +
    +
    + + { + hasBannerCredit && ( + + ) + } + +
    + { + hasLeftSidebar ? ( + + ) : ( + + ) + } + { + hasRightSidebar ? ( + + ) : ( + + ) + } +
    + +
    + +
    + + +
    +
    + +
    + +
    + +
    +
    +
    + +
    +
    +
    + + + + + +
    \ No newline at end of file diff --git a/src/pages/404.astro b/src/pages/404.astro new file mode 100644 index 0000000..0286e99 --- /dev/null +++ b/src/pages/404.astro @@ -0,0 +1,74 @@ +--- +import { Icon } from "astro-icon/components"; + +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import GridLayout from "@layouts/grid.astro"; +--- + + +
    +
    + +
    + {i18n(I18nKey.notFound)} +
    + + +
    + +
    + + +

    + {i18n(I18nKey.notFoundTitle)} +

    + + +

    + {i18n(I18nKey.notFoundDescription)} +

    + + + + + {i18n(I18nKey.backToHome)} + + + +
    + +
    +
    + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/pages/[...menu].astro b/src/pages/[...menu].astro new file mode 100644 index 0000000..8200796 --- /dev/null +++ b/src/pages/[...menu].astro @@ -0,0 +1,112 @@ +--- +import { Icon } from "astro-icon/components"; + +import { type NavbarLink } from "@/types/config"; +import { navbarConfig } from "@/config"; +import { LinkPresets } from "@constants/link-presets"; +import { url } from "@utils/url"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +export async function getStaticPaths() { + return navbarConfig.links + .filter(link => typeof link !== "number" && link.children && link.children.length > 0) + .map(link => { + const navLink = link as NavbarLink; + // 提取 slug,去掉前后的斜杠 + const slug = navLink.url.replace(/^\/|\/$/g, ''); + return { + params: { menu: slug }, + props: { link: navLink } + }; + }); +} + + +interface Props { + link: NavbarLink; +} + +const { link } = Astro.props; + +// 获取子链接,并将 LinkPreset 转换为完整的 NavbarLink 对象 +const childrenLinks = link.children || []; + +const processedLinks = childrenLinks.map(child => { + if (typeof child === "number") { + return LinkPresets[child]; + } + return child; +}); + +const pageTitle = link.name; +const pageDescription = link.description || ""; +--- + + +
    +
    + + +
    +

    + {pageTitle} +

    + {pageDescription && ( +

    + {pageDescription} +

    + )} +
    + + +
    +
    +
    + + \ No newline at end of file diff --git a/src/pages/[...page].astro b/src/pages/[...page].astro new file mode 100644 index 0000000..19520b4 --- /dev/null +++ b/src/pages/[...page].astro @@ -0,0 +1,29 @@ +--- +export const prerender = true; + + +import type { GetStaticPaths } from "astro"; + +import { PAGE_SIZE } from "@constants/constants"; +import { getSortedPosts } from "@utils/content"; +import Pagination from "@components/pagination.astro"; +import PostPage from "@components/postPage.astro"; +import GridLayout from "@layouts/grid.astro"; + + +export const getStaticPaths = (async ({ paginate }) => { + const allBlogPosts = await getSortedPosts(); + return paginate(allBlogPosts, { pageSize: PAGE_SIZE }); +}) satisfies GetStaticPaths; +// https://github.com/withastro/astro/issues/6507#issuecomment-1489916992 + + +const { page } = Astro.props; + +const len = page.data.length; +--- + + + + + \ No newline at end of file diff --git a/src/pages/about.astro b/src/pages/about.astro new file mode 100644 index 0000000..746953e --- /dev/null +++ b/src/pages/about.astro @@ -0,0 +1,35 @@ +--- +export const prerender = true; + + +import { getEntry, render } from "astro:content"; + +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import Markdown from "@components/common/markdown.astro"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const pageTitle = LinkPresets[LinkPreset.About].name; +const pageDescription = LinkPresets[LinkPreset.About].description; + +const aboutPost = await getEntry("spec", "about"); + +if (!aboutPost) { + throw new Error("About page content not found"); +} + +const { Content } = await render(aboutPost); +--- + + +
    +
    + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/pages/albums.astro b/src/pages/albums.astro new file mode 100644 index 0000000..b164de7 --- /dev/null +++ b/src/pages/albums.astro @@ -0,0 +1,131 @@ +--- +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { sortedAlbums } from "@utils/albums"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const pageTitle = LinkPresets[LinkPreset.Albums].name; +const pageDescription = LinkPresets[LinkPreset.Albums].description; + +// 获取所有相册 +const albumsData = sortedAlbums.filter(album => album.visible); +--- + + + + + + \ No newline at end of file diff --git a/src/pages/albums/[id]/index.astro b/src/pages/albums/[id]/index.astro new file mode 100644 index 0000000..0b7e419 --- /dev/null +++ b/src/pages/albums/[id]/index.astro @@ -0,0 +1,139 @@ +--- +import type { AlbumGroup } from "@utils/albums"; +import { sortedAlbums } from "@utils/albums"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +export const getStaticPaths = async () => { + return sortedAlbums.filter(album => album.visible).map((album) => ({ + params: { id: album.id }, + props: { album }, + })); +}; + + +interface Props { + album: AlbumGroup; +} + +const { album } = Astro.props; + +if (!album) { + return Astro.redirect("/404"); +} +--- + + +
    +
    + + +
    +

    + {album.title} +

    + {album.description && ( +

    + {album.description} +

    + )} + +
    + {album.photos.length} {album.photos.length > 1 ? i18n(I18nKey.albumsPhotosCount) : i18n(I18nKey.albumsPhotoCount)} + + {album.location && ( + + + + + {album.location} + + )} +
    + + {album.tags && album.tags.length > 0 && ( +
    + {album.tags.map(tag => ( + + {tag} + + ))} +
    + )} +
    + + +
    +
    +
    + + \ No newline at end of file diff --git a/src/pages/anime.astro b/src/pages/anime.astro new file mode 100644 index 0000000..286a7fa --- /dev/null +++ b/src/pages/anime.astro @@ -0,0 +1,360 @@ +--- +export const prerender = true; + + +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { siteConfig } from "@/config"; +import I18nKey from "@i18n/i18nKey"; +import { i18n } from "@i18n/translation"; +import ImageWrapper from "@components/common/imageWrapper.astro"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const pageTitle = LinkPresets[LinkPreset.Anime].name; +const pageDescription = LinkPresets[LinkPreset.Anime].description; + +// Bangumi API配置 +const BANGUMI_USER_ID = siteConfig.bangumi?.userId || ""; +const BANGUMI_API_BASE = "https://api.bgm.tv"; + +// 检查是否配置了有效的 Bangumi 用户 ID +const isBangumiConfigured = + BANGUMI_USER_ID && + BANGUMI_USER_ID !== "your-bangumi-id" && + BANGUMI_USER_ID !== "your-user-id"; + +// 获取单个条目相关人员信息 +async function fetchSubjectPersons(subjectId: number) { + if (!isBangumiConfigured) return []; + try { + const response = await fetch( + `${BANGUMI_API_BASE}/v0/subjects/${subjectId}/persons`, + ); + const data = await response.json(); + return Array.isArray(data) ? data : []; + } catch (error) { + console.error(`Error fetching subject ${subjectId} persons:`, error); + return []; + } +} + +// 获取Bangumi收藏列表 +async function fetchBangumiCollection( + userId: string, + subjectType: number, + type: number, +) { + if (!isBangumiConfigured) return null; + try { + let allData: any[] = []; + let offset = 0; + const limit = 50; // 每页获取的数量 + let hasMore = true; + + // 循环获取所有数据 + while (hasMore) { + const response = await fetch( + `${BANGUMI_API_BASE}/v0/users/${userId}/collections?subject_type=${subjectType}&type=${type}&limit=${limit}&offset=${offset}`, + ); + if (!response.ok) { + throw new Error(`Bangumi API error: ${response.status}`); + } + const data = await response.json(); + + // 添加当前页数据到总数据中 + if (data.data && data.data.length > 0) { + allData = [...allData, ...data.data]; + } + if (!data.data || data.data.length < limit) { + hasMore = false; + } else { + offset += limit; + } + // 防止请求过于频繁 + await new Promise((resolve) => setTimeout(resolve, 100)); + } + return { data: allData }; + } catch (error) { + console.error("Error fetching Bangumi data:", error); + return null; + } +} + +// 获取Bangumi数据转换为页面所需格式 +async function processBangumiData(data: any, status: string) { + if (!data || !data.data) return []; + + // 为每个条目获取详细信息 + const detailedItems = await Promise.all( + data.data.map(async (item: any) => { + // 获取相关人员信息 + const subjectPersons = await fetchSubjectPersons(item.subject_id); + // 获取年份信息 + const year = item.subject?.date || "Unknown"; + // 获取评分 + const rating = item.rate ? Number.parseFloat(item.rate.toFixed(1)) : 0; + // 获取进度信息 + const progress = item.ep_status || 0; + const totalEpisodes = item.subject?.eps || progress; + // 从相关人员中获取制作方信息 + let studio = "Unknown"; + if (Array.isArray(subjectPersons)) { + // 定义筛选优先级顺序 + const priorities = ["动画制作", "製作", "制作"]; + for (const relation of priorities) { + const match = subjectPersons.find( + (person) => person.relation === relation, + ); + if (match?.name) { + studio = match.name; + break; + } + } + } + + return { + title: item.subject?.name_cn || item.subject?.name || "Unknown Title", + status: status, + rating: rating, + cover: item.subject?.images?.medium || "/assets/anime/default.webp", + description: ( + item.subject?.short_summary || + item.subject?.name_cn || + "" + ).trimStart(), + episodes: `${totalEpisodes} episodes`, + year: year, + genre: item.subject?.tags + ? item.subject.tags.slice(0, 3).map((tag: any) => tag.name) + : ["Unknown"], + studio: studio, + link: `https://bgm.tv/subject/${item.subject.id}` || "#", + progress: progress, + totalEpisodes: totalEpisodes, + startDate: item.subject?.date || "", + endDate: item.subject?.date || "", + }; + }), + ); + return detailedItems; +} + +// 获取Bangumi番剧列表 +const watchingData = await fetchBangumiCollection(BANGUMI_USER_ID, 2, 3); +const completedData = await fetchBangumiCollection(BANGUMI_USER_ID, 2, 2); + +const watchingList = watchingData + ? await processBangumiData(watchingData, "watching") + : []; +const completedList = completedData + ? await processBangumiData(completedData, "completed") + : []; + +const animeList = [...watchingList, ...completedList]; + +// 获取状态的翻译文本和样式 +function getStatusInfo(status: string) { + switch (status) { + case "watching": + return { + text: i18n(I18nKey.animeStatusWatching), + class: + "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300", + icon: "▶", + }; + case "completed": + return { + text: i18n(I18nKey.animeStatusCompleted), + class: + "bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300", + icon: "✓", + }; + case "planned": + return { + text: i18n(I18nKey.animeStatusPlanned), + class: + "bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300", + icon: "⏰", + }; + default: + return { + text: status, + class: "bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300", + icon: "?", + }; + } +} + +// 计算统计数据 +const stats = { + total: animeList.length, + watching: animeList.filter((anime) => anime.status === "watching").length, + completed: animeList.filter((anime) => anime.status === "completed").length, + avgRating: (() => { + const ratedAnime = animeList.filter((anime) => anime.rating > 0); + if (ratedAnime.length === 0) return "0.0"; + return ( + ratedAnime.reduce((sum, anime) => sum + anime.rating, 0) / + ratedAnime.length + ).toFixed(1); + })(), +}; +--- + + +
    +
    + + +
    +
    +

    {i18n(I18nKey.animeTitle)}

    +

    {pageDescription}

    +
    + +
    +
    +
    +
    📊
    +
    +
    {stats.total}
    +
    {i18n(I18nKey.animeTotal)}
    +
    +
    +
    +
    +
    +
    ▶️
    +
    +
    {stats.watching}
    +
    {i18n(I18nKey.animeWatching)}
    +
    +
    +
    +
    +
    +
    +
    +
    {stats.completed}
    +
    {i18n(I18nKey.animeCompleted)}
    +
    +
    +
    +
    +
    +
    +
    +
    {stats.avgRating}
    +
    {i18n(I18nKey.animeAvgRating)}
    +
    +
    +
    +
    +
    + +
    +

    + {i18n(I18nKey.animeList)} +

    + {!isBangumiConfigured ? ( +
    +
    😢
    +

    + {i18n(I18nKey.animeEmpty)} +

    +

    + Please configure your Bangumi account in the config file. +

    +
    + ) : animeList.length > 0 ? ( +
    + {animeList.map(anime => { + const statusInfo = getStatusInfo(anime.status); + const progressPercent = anime.totalEpisodes > 0 ? (anime.progress / anime.totalEpisodes) * 100 : 0; + return ( +
    + +
    + + +
    +
    +
    + + + +
    +
    +
    +
    + +
    + {statusInfo.icon} + {statusInfo.text} +
    + +
    + + + + {anime.rating} +
    + + {anime.status === 'watching' && ( +
    +
    +
    +
    +
    + {anime.progress}/{anime.totalEpisodes} ({Math.round(progressPercent)}%) +
    +
    + )} +
    + +
    +

    {anime.title}

    +

    {anime.description}

    + +
    +
    + {i18n(I18nKey.animeYear)} + {anime.year} +
    +
    + {i18n(I18nKey.animeStudio)} + {anime.studio} +
    +
    + {anime.genre.map(g => ( + {g} + ))} +
    +
    +
    +
    + ); + })} +
    + ) : ( +
    +
    😢
    +

    + {i18n(I18nKey.animeEmpty)} +

    +

    + {i18n(I18nKey.animeEmptyBangumi)} +

    +
    + )} +
    +
    +
    +
    \ No newline at end of file diff --git a/src/pages/archive.astro b/src/pages/archive.astro new file mode 100644 index 0000000..c7610ff --- /dev/null +++ b/src/pages/archive.astro @@ -0,0 +1,35 @@ +--- +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { getSortedPostsList } from "@utils/content"; +import ArchivePanel from "@components/archivePanel.svelte"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const pageTitle = LinkPresets[LinkPreset.Archive].name; +const pageDescription = LinkPresets[LinkPreset.Archive].description; + +const sortedPostsList = await getSortedPostsList(); +--- + + +
    +
    + + +
    +

    + {pageTitle} +

    + {pageDescription && ( +

    + {pageDescription} +

    + )} +
    + + +
    +
    +
    \ No newline at end of file diff --git a/src/pages/atom.astro b/src/pages/atom.astro new file mode 100644 index 0000000..2b6f159 --- /dev/null +++ b/src/pages/atom.astro @@ -0,0 +1,134 @@ +--- +import { Icon } from "astro-icon/components"; + +import { getSortedPosts } from "@utils/content"; +import { formatDateToYYYYMMDD } from "@utils/date"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import GridLayout from "@layouts/grid.astro"; + + +const posts = (await getSortedPosts()).filter((post) => !post.data.encrypted); +const recentPosts = posts.slice(0, 6); +--- + + + +
    + +
    +
    +
    + +
    +

    {i18n(I18nKey.atom)}

    +

    + {i18n(I18nKey.atomSubtitle)} +

    +
    +
    + +
    +
    +
    +
    + +
    +
    +

    {i18n(I18nKey.atomLink)}

    +

    {i18n(I18nKey.atomCopyToReader)}

    +
    +
    +
    + + {Astro.site}atom.xml + + +
    +
    +
    + +
    +

    + + {i18n(I18nKey.atomLatestPosts)} +

    +
    + {recentPosts.map((post) => ( +
    +

    + + {post.data.title} + +

    + {post.data.description && ( +

    + {post.data.description} +

    + )} +
    + +
    +
    + ))} +
    +
    + +
    +

    + + {i18n(I18nKey.atomWhatIsAtom)} +

    +
    +

    + {i18n(I18nKey.atomWhatIsAtomDescription)} +

    +
      +
    • {i18n(I18nKey.atomBenefit1)}
    • +
    • {i18n(I18nKey.atomBenefit2)}
    • +
    • {i18n(I18nKey.atomBenefit3)}
    • +
    • {i18n(I18nKey.atomBenefit4)}
    • +
    +
    +
    +
    + + + +
    \ No newline at end of file diff --git a/src/pages/atom.xml.ts b/src/pages/atom.xml.ts new file mode 100644 index 0000000..a33eb05 --- /dev/null +++ b/src/pages/atom.xml.ts @@ -0,0 +1,134 @@ +import { getImage } from "astro:assets"; +import { parse as htmlParser } from "node-html-parser"; +import type { APIContext, ImageMetadata } from "astro"; +import MarkdownIt from "markdown-it"; +import sanitizeHtml from "sanitize-html"; + +import { siteConfig, profileConfig } from "@/config"; +import { getSortedPosts } from "@utils/content"; +import { getFileDirFromPath, getPostUrl } from "@utils/url"; + + +const markdownParser = new MarkdownIt(); + +// get dynamic import of images as a map collection +const imagesGlob = import.meta.glob<{ default: ImageMetadata }>( + "/src/content/**/*.{jpeg,jpg,png,gif,webp}", // include posts and assets +); + +export async function GET(context: APIContext) { + if (!context.site) { + throw Error("site not set"); + } + + // Use the same ordering as site listing (pinned first, then by published desc) + // 过滤掉加密文章和草稿文章 + const posts = (await getSortedPosts()).filter((post) => !post.data.encrypted && post.data.draft !== true); + + // 创建Atom feed头部 + let atomFeed = ` + + ${siteConfig.title} + ${siteConfig.subtitle || "No description"} + + + ${context.site} + ${new Date().toISOString()} + ${siteConfig.lang}`; + + for (const post of posts) { + // convert markdown to html string, ensure post.body is a string + const body = markdownParser.render(String(post.body ?? "")); + // convert html string to DOM-like structure + const html = htmlParser.parse(body); + // hold all img tags in variable images + const images = html.querySelectorAll("img"); + + for (const img of images) { + const src = img.getAttribute("src"); + if (!src) continue; + // Handle content-relative images and convert them to built _astro paths + if ( + src.startsWith("./") || + src.startsWith("../") || + (!src.startsWith("http") && !src.startsWith("/")) + ) { + let importPath: string | null = null; + // derive base directory from real file path to preserve casing + const contentDirRaw = post.filePath + ? getFileDirFromPath(post.filePath) + : "src/content/posts"; + const contentDir = contentDirRaw.startsWith("src/") + ? contentDirRaw + : `src/${contentDirRaw}`; + if (src.startsWith("./")) { + // Path relative to the post file directory + const prefixRemoved = src.slice(2); + importPath = `/${contentDir}/${prefixRemoved}`; + } else if (src.startsWith("../")) { + // Path like ../assets/images/xxx -> relative to /src/content/ + const cleaned = src.replace(/^\.\.\//, ""); + importPath = `/src/content/${cleaned}`; + } else { + // direct filename (no ./ prefix) - assume it's in the same directory as the post + importPath = `/${contentDir}/${src}`; + } + // import the image module dynamically + const imageMod = await imagesGlob[importPath]?.()?.then( + (res) => res.default, + ); + if (imageMod) { + // optimize the image and get the final src URL + const optimizedImg = await getImage({ src: imageMod }); + img.setAttribute("src", new URL(optimizedImg.src, context.site).href); + } else { + // log the failed import path + console.log( + `Failed to load image: ${importPath} for post: ${post.id}`, + ); + } + } else if (src.startsWith("/")) { + // images starting with `/` are in public dir + img.setAttribute("src", new URL(src, context.site).href); + } + } + + // 添加Atom条目 + const postUrl = new URL(getPostUrl(post), context.site).href; + const content = sanitizeHtml(html.toString(), { + allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]), + }); + + atomFeed += ` + + ${post.data.title} + + ${postUrl} + ${post.data.published.toISOString()} + ${post.data.updated?.toISOString() || post.data.published.toISOString()} + ${post.data.description || ""} + + + ${profileConfig.name} + `; + // 添加分类标签 + if (post.data.category) { + atomFeed += ` + `; + } + // 添加标签 + atomFeed += ` + `; + } + + // 关闭Atom feed + atomFeed += ` + `; + + return new Response(atomFeed, { + headers: { + "Content-Type": "application/atom+xml; charset=utf-8", + + }, + }); +} \ No newline at end of file diff --git a/src/pages/diary.astro b/src/pages/diary.astro new file mode 100644 index 0000000..39f0527 --- /dev/null +++ b/src/pages/diary.astro @@ -0,0 +1,260 @@ +--- +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { siteConfig } from "@/config"; +import { sortedMoments } from "@/utils/diary"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const pageTitle = LinkPresets[LinkPreset.Diary].name; +const pageDescription = LinkPresets[LinkPreset.Diary].description; + +// 时间格式化函数 +function formatTime(dateString: string): string { + var TG = 8; + if (siteConfig.timeZone >= -12 && siteConfig.timeZone <= 12) TG = siteConfig.timeZone; + const timeGap = TG; + const now = new Date(); + const date = new Date(dateString); + const diffInMinutes = Math.floor( + (now.getTime() + timeGap*60*60*1000 - date.getTime()) / (1000 * 60), + ); + if (diffInMinutes < 60) { + return `${diffInMinutes}${i18n(I18nKey.diaryMinutesAgo)}`; + } + if (diffInMinutes < 1440) { + // 24小时 + const hours = Math.floor(diffInMinutes / 60); + return `${hours}${i18n(I18nKey.diaryHoursAgo)}`; + } + const days = Math.floor(diffInMinutes / 1440); + return `${days}${i18n(I18nKey.diaryDaysAgo)}`; +} +--- + + +
    +
    + +
    + +
    +
    +
    +

    {pageTitle}

    +

    {pageDescription}

    +
    +
    +
    + {sortedMoments.length} + {i18n(I18nKey.diaryCount)} +
    +
    +
    +
    + +
    +
    + {sortedMoments.map(moment => ( +
    +
    +

    {moment.content}

    + {moment.images && moment.images.length > 0 && ( +
    + {moment.images.map((image, index) => ( +
    + {i18n(I18nKey.diaryImage)} +
    + ))} +
    + )} +
    +
    + +
    + ))} +
    +
    + +
    + {i18n(I18nKey.diaryTips)} +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/pages/friends.astro b/src/pages/friends.astro new file mode 100644 index 0000000..89fb6bf --- /dev/null +++ b/src/pages/friends.astro @@ -0,0 +1,114 @@ +--- +import { getEntry, render } from "astro:content"; + +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { friendsData } from "@utils/friends"; +import Markdown from "@components/common/markdown.astro"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const pageTitle = LinkPresets[LinkPreset.Friends].name; +const pageDescription = LinkPresets[LinkPreset.Friends].description; + +const friendsPost = await getEntry("spec", "friends"); + +if (!friendsPost) { + throw new Error("friends page content not found"); +} + +const { Content } = await render(friendsPost); +const items = friendsData; + +function shuffleArray(array) { + const newArray = [...array]; + for (let i = newArray.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [newArray[i], newArray[j]] = [newArray[j], newArray[i]]; + } + return newArray; +} + +const shuffledItems = shuffleArray(items); +--- + + + + + + \ No newline at end of file diff --git a/src/pages/og/[...slug].png.ts b/src/pages/og/[...slug].png.ts new file mode 100644 index 0000000..f13e5a3 --- /dev/null +++ b/src/pages/og/[...slug].png.ts @@ -0,0 +1,342 @@ +import { getCollection } from "astro:content"; +import type { APIContext, GetStaticPaths } from "astro"; +import type { CollectionEntry } from "astro:content"; +import * as fs from "node:fs"; +import satori from "satori"; +import sharp from "sharp"; + +import { profileConfig, siteConfig } from "@/config"; +import { defaultFavicons } from "@constants/icon"; + + +type Weight = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900; +type FontStyle = "normal" | "italic"; +interface FontOptions { + data: Buffer | ArrayBuffer; + name: string; + weight?: Weight; + style?: FontStyle; + lang?: string; +} +export const prerender = true; + +export const getStaticPaths: GetStaticPaths = async () => { + if (!siteConfig.generateOgImages) { + return []; + } + + const allPosts = await getCollection("posts"); + const publishedPosts = allPosts.filter((post) => !post.data.draft); + + return publishedPosts.map((post) => ({ + params: { slug: post.id }, + props: { post }, + })); +}; + +let fontCache: { regular: Buffer | null; bold: Buffer | null } | null = null; + +async function fetchNotoSansSCFonts() { + if (fontCache) { + return fontCache; + } + + try { + const cssResp = await fetch( + "https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700&display=swap", + ); + if (!cssResp.ok) throw new Error("Failed to fetch Google Fonts CSS"); + const cssText = await cssResp.text(); + + const getUrlForWeight = (weight: number) => { + const blockRe = new RegExp( + `@font-face\\s*{[^}]*font-weight:\\s*${weight}[^}]*}`, + "g", + ); + const match = cssText.match(blockRe); + if (!match || match.length === 0) return null; + const urlMatch = match[0].match(/url\((https:[^)]+)\)/); + return urlMatch ? urlMatch[1] : null; + }; + + const regularUrl = getUrlForWeight(400); + const boldUrl = getUrlForWeight(700); + + if (!regularUrl || !boldUrl) { + console.warn( + "Could not find font urls in Google Fonts CSS; falling back to no fonts.", + ); + fontCache = { regular: null, bold: null }; + return fontCache; + } + + const [rResp, bResp] = await Promise.all([ + fetch(regularUrl), + fetch(boldUrl), + ]); + if (!rResp.ok || !bResp.ok) { + console.warn( + "Failed to download font files from Google; falling back to no fonts.", + ); + fontCache = { regular: null, bold: null }; + return fontCache; + } + + const rBuf = Buffer.from(await rResp.arrayBuffer()); + const bBuf = Buffer.from(await bResp.arrayBuffer()); + + fontCache = { regular: rBuf, bold: bBuf }; + return fontCache; + } catch (err) { + console.warn("Error fetching fonts:", err); + fontCache = { regular: null, bold: null }; + return fontCache; + } +} + +export async function GET({ + props, +}: APIContext<{ post: CollectionEntry<"posts"> }>) { + const { post } = props; + + // Try to fetch fonts from Google Fonts (woff2) at runtime. + const { regular: fontRegular, bold: fontBold } = await fetchNotoSansSCFonts(); + + // Avatar + icon: still read from disk (small assets) + let avatarPath = `./public${profileConfig.avatar}`; + const avatarBuffer = fs.readFileSync(avatarPath); + const avatarBase64 = `data:image/png;base64,${avatarBuffer.toString("base64")}`; + + let iconPath = `./public${defaultFavicons[0].src}`; + if (siteConfig.favicon.length > 0) { + iconPath = `./public${siteConfig.favicon[0].src}`; + } + const iconBuffer = fs.readFileSync(iconPath); + const iconBase64 = `data:image/png;base64,${iconBuffer.toString("base64")}`; + + const hue = siteConfig.themeColor.hue; + const primaryColor = `hsl(${hue}, 90%, 65%)`; + const textColor = "hsl(0, 0%, 95%)"; + + const subtleTextColor = `hsl(${hue}, 10%, 75%)`; + const backgroundColor = `hsl(${hue}, 15%, 12%)`; + + const pubDate = post.data.published.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }); + + const description = post.data.description; + + const template = { + type: "div", + props: { + style: { + height: "100%", + width: "100%", + display: "flex", + flexDirection: "column", + backgroundColor: backgroundColor, + fontFamily: + '"Noto Sans SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif', + padding: "60px", + }, + children: [ + { + type: "div", + props: { + style: { + width: "100%", + display: "flex", + alignItems: "center", + gap: "20px", + }, + children: [ + { + type: "img", + props: { + src: iconBase64, + width: 48, + height: 48, + style: { borderRadius: "10px" }, + }, + }, + { + type: "div", + props: { + style: { + fontSize: "36px", + fontWeight: 600, + color: subtleTextColor, + }, + children: siteConfig.title, + }, + }, + ], + }, + }, + + { + type: "div", + props: { + style: { + display: "flex", + flexDirection: "column", + justifyContent: "center", + flexGrow: 1, + gap: "20px", + }, + children: [ + { + type: "div", + props: { + style: { + display: "flex", + alignItems: "flex-start", + }, + children: [ + { + type: "div", + props: { + style: { + width: "10px", + height: "68px", + backgroundColor: primaryColor, + borderRadius: "6px", + marginTop: "14px", + }, + }, + }, + { + type: "div", + props: { + style: { + fontSize: "72px", + fontWeight: 700, + lineHeight: 1.2, + color: textColor, + marginLeft: "25px", + display: "-webkit-box", + overflow: "hidden", + textOverflow: "ellipsis", + lineClamp: 3, + WebkitLineClamp: 3, + WebkitBoxOrient: "vertical", + }, + children: post.data.title, + }, + }, + ], + }, + }, + description && { + type: "div", + props: { + style: { + fontSize: "32px", + lineHeight: 1.5, + color: subtleTextColor, + paddingLeft: "35px", + display: "-webkit-box", + overflow: "hidden", + textOverflow: "ellipsis", + lineClamp: 2, + WebkitLineClamp: 2, + WebkitBoxOrient: "vertical", + }, + children: description, + }, + }, + ], + }, + }, + { + type: "div", + props: { + style: { + display: "flex", + justifyContent: "space-between", + alignItems: "center", + width: "100%", + }, + children: [ + { + type: "div", + props: { + style: { + display: "flex", + alignItems: "center", + gap: "20px", + }, + children: [ + { + type: "img", + props: { + src: avatarBase64, + width: 60, + height: 60, + style: { borderRadius: "50%" }, + }, + }, + { + type: "div", + props: { + style: { + fontSize: "28px", + fontWeight: 600, + color: textColor, + }, + children: profileConfig.name, + }, + }, + ], + }, + }, + { + type: "div", + props: { + style: { fontSize: "28px", color: subtleTextColor }, + children: pubDate, + }, + }, + ], + }, + }, + ], + }, + }; + + const fonts: FontOptions[] = []; + if (fontRegular) { + fonts.push({ + name: "Noto Sans SC", + data: fontRegular, + weight: 400, + style: "normal", + }); + } + if (fontBold) { + fonts.push({ + name: "Noto Sans SC", + data: fontBold, + weight: 700, + style: "normal", + }); + } + + const svg = await satori(template, { + width: 1200, + height: 630, + fonts, + }); + + const png = await sharp(Buffer.from(svg)).png().toBuffer(); + + return new Response(new Uint8Array(png), { + headers: { + "Content-Type": "image/png", + "Cache-Control": "public, max-age=31536000, immutable", + }, + }); +} \ No newline at end of file diff --git a/src/pages/posts/[...slug].astro b/src/pages/posts/[...slug].astro new file mode 100644 index 0000000..6b46d49 --- /dev/null +++ b/src/pages/posts/[...slug].astro @@ -0,0 +1,358 @@ +--- +import { Icon } from "astro-icon/components"; +import { render } from "astro:content"; +import type { CollectionEntry } from "astro:content"; +import dayjs from "dayjs"; +import utc from "dayjs/plugin/utc"; + +import { siteConfig, profileConfig, postConfig } from "@/config"; +import { getSortedPosts } from "@utils/content"; +import { formatDateToYYYYMMDD } from "@utils/date"; +import { getFileDirFromPath, getPostUrl, getPostUrlBySlug, removeFileExtension} from "@utils/url"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import License from "@components/post/license.astro"; +import Markdown from "@components/common/markdown.astro"; +import ImageWrapper from "@components/common/imageWrapper.astro"; +import Comment from "@components/post/comment.astro"; +import PasswordProtection from "@components/common/passwordProtection.astro"; +import PostMetadata from "@components/post/postMeta.astro"; +import GridLayout from "@layouts/grid.astro"; + + + +export async function getStaticPaths() { + const blogEntries = await getSortedPosts(); + const paths: { + params: { slug: string }; + props: { entry: CollectionEntry<"posts"> }; + }[] = []; + + for (const entry of blogEntries) { + // 将 id 转换为 slug(移除扩展名)以匹配路由参数 + const slug = removeFileExtension(entry.id); + // 为每篇文章创建默认的 slug 路径 + paths.push({ + params: { slug }, + props: { entry }, + }); + // 如果文章有自定义固定链接,也创建对应的路径 + if (entry.data.routeName) { + // 移除开头的斜杠和结尾的斜杠 + // 同时移除可能的 "posts/" 前缀,避免重复 + let routeName = entry.data.routeName + .replace(/^\/+/, "") + .replace(/\/+$/, ""); + if (routeName.startsWith("posts/")) { + routeName = routeName.replace(/^posts\//, ""); + } + paths.push({ + params: { slug: routeName }, + props: { entry }, + }); + } + } + + return paths; +} + + +const { entry } = Astro.props; +const { Content, headings } = await render(entry); + +const { remarkPluginFrontmatter } = await render(entry); + +// 处理加密逻辑 +let isEncrypted = !!(entry.data.encrypted && entry.data.password); + +dayjs.extend(utc); +const lastModified = dayjs(entry.data.updated || entry.data.published) + .utc() + .format("YYYY-MM-DDTHH:mm:ss"); + +const jsonLd = { + "@context": "https://schema.org", + "@type": "BlogPosting", + headline: entry.data.title, + description: entry.data.description || entry.data.title, + keywords: entry.data.tags, + author: { + "@type": "Person", + name: profileConfig.name, + url: Astro.site, + }, + datePublished: formatDateToYYYYMMDD(entry.data.published), + inLanguage: entry.data.lang + ? entry.data.lang.replace("_", "-") + : siteConfig.lang.replace("_", "-"), + // TODO include cover image here +}; +--- + + + +
    +
    +
    + +
    +
    +
    +

    + {i18n(I18nKey.lastModifiedOutdated)} +

    +
    +
    +
    + + + )} + +
    \ No newline at end of file diff --git a/src/pages/projects.astro b/src/pages/projects.astro new file mode 100644 index 0000000..9da2e8b --- /dev/null +++ b/src/pages/projects.astro @@ -0,0 +1,146 @@ +--- +export const prerender = true; + + +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { + projectsData, + getProjectStats, + getProjectsByCategory, + getFeaturedProjects, + getAllTechStack, +} from "@utils/projects"; +import { UNCATEGORIZED } from "@constants/constants"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import ProjectCard from "@components/data/projectCard.astro"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const title = LinkPresets[LinkPreset.Projects].name; +const subtitle = LinkPresets[LinkPreset.Projects].description; + +// 获取项目统计信息 +const stats = getProjectStats(); +const featuredProjects = getFeaturedProjects(); +const allTechStack = getAllTechStack(); + +// 获取所有分类 +const categories = [ + ...new Set(projectsData.map((project) => project.category)), +]; + +// 按分类获取项目 +const projectsByCategory = categories.reduce( + (acc, category) => { + acc[category] = getProjectsByCategory(category); + return acc; + }, + {} as Record, +); + +// 获取分类文本的国际化翻译 +const getCategoryText = (category: string) => { + switch (category) { + case "web": + return i18n(I18nKey.projectsWeb); + case "mobile": + return i18n(I18nKey.projectsMobile); + case "desktop": + return i18n(I18nKey.projectsDesktop); + case "other": + return i18n(I18nKey.projectsOther); + case UNCATEGORIZED: + return i18n(I18nKey.uncategorized); + default: + return category; + } +}; +--- + + +
    +
    + + +
    +

    + {i18n(I18nKey.projects)} +

    +

    + {i18n(I18nKey.projectsSubtitle)} +

    +
    + +
    +
    +
    {stats.total}
    +
    {i18n(I18nKey.projectsTotal)}
    +
    +
    +
    {stats.byStatus.completed}
    +
    {i18n(I18nKey.projectsCompleted)}
    +
    +
    +
    {stats.byStatus.inProgress}
    +
    {i18n(I18nKey.projectsInProgress)}
    +
    +
    +
    {allTechStack.length}
    +
    {i18n(I18nKey.projectsTechStack)}
    +
    +
    + + {featuredProjects.length > 0 && ( +
    +

    + {i18n(I18nKey.projectsFeatured)} +

    +
    + {featuredProjects.map((project) => ( + + ))} +
    +
    + )} + +
    + {categories.map((category) => { + const categoryProjects = projectsByCategory[category]; + if (categoryProjects.length === 0) return null; + + return ( +
    +

    + {getCategoryText(category)} + + ({categoryProjects.length}) + +

    +
    + {categoryProjects.map((project) => ( + + ))} +
    +
    + ); + })} +
    + +
    +

    + {i18n(I18nKey.projectsTechStack)} +

    +
    + {allTechStack.map((tech) => ( + + {tech} + + ))} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/pages/robots.txt.ts b/src/pages/robots.txt.ts new file mode 100644 index 0000000..124f130 --- /dev/null +++ b/src/pages/robots.txt.ts @@ -0,0 +1,17 @@ +import type { APIRoute } from "astro"; + + +const robotsTxt = ` +User-agent: * +Disallow: /_astro/ + +Sitemap: ${new URL("sitemap-index.xml", import.meta.env.SITE).href} +`.trim(); + +export const GET: APIRoute = () => { + return new Response(robotsTxt, { + headers: { + "Content-Type": "text/plain; charset=utf-8", + }, + }); +}; \ No newline at end of file diff --git a/src/pages/rss.astro b/src/pages/rss.astro new file mode 100644 index 0000000..4752f1c --- /dev/null +++ b/src/pages/rss.astro @@ -0,0 +1,137 @@ +--- +import { Icon } from "astro-icon/components"; + +import { getSortedPosts } from "@utils/content"; +import { formatDateToYYYYMMDD } from "@utils/date"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import GridLayout from "@layouts/grid.astro"; + + +const posts = (await getSortedPosts()).filter((post) => !post.data.encrypted); +const recentPosts = posts.slice(0, 6); +--- + + + +
    + +
    +
    +
    + +
    +

    {i18n(I18nKey.rss)}

    +

    + {i18n(I18nKey.rssSubtitle)} +

    +
    +
    + +
    +
    +
    +
    + +
    +
    +

    {i18n(I18nKey.rssLink)}

    +

    {i18n(I18nKey.rssCopyToReader)}

    +
    +
    +
    + + {Astro.site}rss.xml + + +
    +
    +
    + +
    +

    + + {i18n(I18nKey.rssLatestPosts)} +

    +
    + {recentPosts.map((post) => ( +
    +

    + + {post.data.title} + +

    + {post.data.description && ( +

    + {post.data.description} +

    + )} +
    + +
    +
    + ))} +
    +
    + +
    +

    + + {i18n(I18nKey.rssWhatIsRSS)} +

    +
    +

    + {i18n(I18nKey.rssWhatIsRSSDescription)} +

    +
      +
    • {i18n(I18nKey.rssBenefit1)}
    • +
    • {i18n(I18nKey.rssBenefit2)}
    • +
    • {i18n(I18nKey.rssBenefit3)}
    • +
    • {i18n(I18nKey.rssBenefit4)}
    • +
    +

    + {i18n(I18nKey.rssHowToUse)} +

    +
    +
    +
    + + + +
    \ No newline at end of file diff --git a/src/pages/rss.xml.ts b/src/pages/rss.xml.ts new file mode 100644 index 0000000..40ab186 --- /dev/null +++ b/src/pages/rss.xml.ts @@ -0,0 +1,105 @@ +import { getImage } from "astro:assets"; +import { parse as htmlParser } from "node-html-parser"; +import type { APIContext, ImageMetadata } from "astro"; +import type { RSSFeedItem } from "@astrojs/rss"; +import rss from "@astrojs/rss"; +import MarkdownIt from "markdown-it"; +import sanitizeHtml from "sanitize-html"; + +import { siteConfig } from "@/config"; +import { getSortedPosts } from "@utils/content"; +import { getFileDirFromPath, getPostUrl } from "@utils/url"; + + +const markdownParser = new MarkdownIt(); + +// get dynamic import of images as a map collection +const imagesGlob = import.meta.glob<{ default: ImageMetadata }>( + "/src/content/**/*.{jpeg,jpg,png,gif,webp}", // include posts and assets +); + +export async function GET(context: APIContext) { + if (!context.site) { + throw Error("site not set"); + } + + // Use the same ordering as site listing (pinned first, then by published desc) + const posts = (await getSortedPosts()).filter((post) => !post.data.encrypted); + const feed: RSSFeedItem[] = []; + + for (const post of posts) { + // convert markdown to html string, ensure post.body is a string + const body = markdownParser.render(String(post.body ?? "")); + // convert html string to DOM-like structure + const html = htmlParser.parse(body); + // hold all img tags in variable images + const images = html.querySelectorAll("img"); + // process each image tag to correct src paths + for (const img of images) { + const src = img.getAttribute("src"); + if (!src) continue; + // Handle content-relative images and convert them to built _astro paths + if ( + src.startsWith("./") || + src.startsWith("../") || + (!src.startsWith("http") && !src.startsWith("/")) + ) { + let importPath: string | null = null; + // derive base directory from real file path to preserve casing + const contentDirRaw = post.filePath + ? getFileDirFromPath(post.filePath) + : "src/content/posts"; + const contentDir = contentDirRaw.startsWith("src/") + ? contentDirRaw + : `src/${contentDirRaw}`; + if (src.startsWith("./")) { + // Path relative to the post file directory + const prefixRemoved = src.slice(2); + importPath = `/${contentDir}/${prefixRemoved}`; + } else if (src.startsWith("../")) { + // Path like ../assets/images/xxx -> relative to /src/content/ + const cleaned = src.replace(/^\.\.\//, ""); + importPath = `/src/content/${cleaned}`; + } else { + // direct filename (no ./ prefix) - assume it's in the same directory as the post + importPath = `/${contentDir}/${src}`; + } + // import the image module dynamically + const imageMod = await imagesGlob[importPath]?.()?.then( + (res) => res.default, + ); + if (imageMod) { + const optimizedImg = await getImage({ src: imageMod }); + img.setAttribute("src", new URL(optimizedImg.src, context.site).href); + } else { + // log the failed import path + console.log( + `Failed to load image: ${importPath} for post: ${post.id}`, + ); + } + } else if (src.startsWith("/")) { + // images starting with `/` are in public dir + img.setAttribute("src", new URL(src, context.site).href); + } + } + + feed.push({ + title: post.data.title, + description: post.data.description, + pubDate: post.data.published, + link: getPostUrl(post), + // sanitize the new html string with corrected image paths + content: sanitizeHtml(html.toString(), { + allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]), + }), + }); + } + + return rss({ + title: siteConfig.title, + description: siteConfig.subtitle || "No description", + site: context.site, + items: feed, + customData: `${siteConfig.lang}`, + }); +} \ No newline at end of file diff --git a/src/pages/skills.astro b/src/pages/skills.astro new file mode 100644 index 0000000..2dd5065 --- /dev/null +++ b/src/pages/skills.astro @@ -0,0 +1,253 @@ +--- +export const prerender = true; + + +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { UNCATEGORIZED } from "@constants/constants"; +import { + getAdvancedSkills, + getSkillStats, + getSkillsByCategory, + getTotalExperience, + skillsData, +} from "@utils/skills"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import IconifyLoader from "@components/common/iconifyLoader.astro"; +import SkillCard from "@components/data/skillCard.astro"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const title = LinkPresets[LinkPreset.Skills].name; +const subtitle = LinkPresets[LinkPreset.Skills].description; + +// 获取技能统计信息 +const stats = getSkillStats(); +const advancedSkills = getAdvancedSkills(); +const totalExperience = getTotalExperience(); + +// 获取所有分类 +const categories = [...new Set(skillsData.map((skill) => skill.category))]; + +// 按分类获取技能 +const skillsByCategory = categories.reduce( + (acc, category) => { + acc[category] = getSkillsByCategory(category); + return acc; + }, + {} as Record, +); + +// 获取分类的翻译文本 +const getCategoryText = (category: string) => { + switch (category) { + case "ai": + return i18n(I18nKey.skillsAI); + case "server": + return i18n(I18nKey.skillsBackend); + case "client": + return i18n(I18nKey.skillsClient); + case "web": + return i18n(I18nKey.skillsFrontend); + case "database": + return i18n(I18nKey.skillsDatabase); + case "engines": + return i18n(I18nKey.skillsEngines); + case "tools": + return i18n(I18nKey.skillsTools); + case "others": + return i18n(I18nKey.skillsOthers); + case UNCATEGORIZED: + return i18n(I18nKey.uncategorized); + default: + return category; + } +}; + +// 收集所有技能图标用于预加载 +const allIcons = skillsData.map((skill) => skill.icon).filter(Boolean); +--- + + + + +
    +
    + + +
    +

    + {i18n(I18nKey.skills)} +

    +

    + {i18n(I18nKey.skillsSubtitle)} +

    +
    + + +
    +
    +
    {stats.total}
    +
    {i18n(I18nKey.skillsTotal)}
    +
    +
    +
    {stats.byLevel.expert}
    +
    {i18n(I18nKey.skillsExpert)}
    +
    +
    +
    {stats.byLevel.advanced}
    +
    {i18n(I18nKey.skillsAdvanced)}
    +
    +
    +
    + {totalExperience.years}{totalExperience.months > 0 ? `.${totalExperience.months}` : ''} +
    +
    {i18n(I18nKey.skillExperience)}
    +
    +
    + + + {advancedSkills.length > 0 && ( +
    +

    + {i18n(I18nKey.skillsAdvancedTitle)} +

    +
    + {advancedSkills.map((skill) => ( + + ))} +
    +
    + )} + + +
    + {categories.map((category) => { + const categorySkills = skillsByCategory[category]; + if (categorySkills.length === 0) return null; + + return ( +
    +

    + {getCategoryText(category)} + + ({categorySkills.length}) + +

    +
    + {categorySkills.map((skill) => ( + + ))} +
    +
    + ); + })} +
    + + +
    +

    + {i18n(I18nKey.skillsDistribution)} +

    +
    + +
    +

    + {i18n(I18nKey.skillsByLevel)} +

    +
    + {Object.entries(stats.byLevel).map(([level, count]) => { + const percentage = Math.round((count / stats.total) * 100); + return ( +
    +
    + {i18n(level === 'expert' ? I18nKey.skillsExpert : + level === 'advanced' ? I18nKey.skillsAdvanced : + level === 'intermediate' ? I18nKey.skillsIntermediate : + I18nKey.skillsBeginner)} +
    +
    +
    +
    +
    + {count} +
    +
    + ); + })} +
    +
    + + +
    +

    + {i18n(I18nKey.skillsByCategory)} +

    +
    + {Object.entries(stats.byCategory).map(([category, count]) => { + const percentage = Math.round((count / stats.total) * 100); + return ( +
    +
    + {getCategoryText(category)} +
    +
    +
    +
    +
    + {count} +
    +
    + ); + })} +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/pages/timeline.astro b/src/pages/timeline.astro new file mode 100644 index 0000000..186387a --- /dev/null +++ b/src/pages/timeline.astro @@ -0,0 +1,219 @@ +--- +export const prerender = true; + + +import { LinkPresets } from "@constants/link-presets"; +import { LinkPreset } from "@/types/config"; +import { + timelineData, + getTimelineStats, + getTimelineByType, + getCurrentItems, + getTotalWorkExperience, +} from "@utils/timeline"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; +import IconifyLoader from "@components/common/iconifyLoader.astro"; +import TimelineItem from "@components/data/timelineItem.astro"; +import GridLayout from "@layouts/grid.astro"; +import BackwardButton from "@components/backwardButton.astro"; + + +const title = LinkPresets[LinkPreset.Timeline].name; +const subtitle = LinkPresets[LinkPreset.Timeline].description; + +// 收集所有时间线图标用于预加载 +const allIcons = timelineData + .map((item) => item.icon || getTypeIcon(item.type)) + .filter(Boolean); + +// 获取时间线统计信息 +const stats = getTimelineStats(); +const currentItems = getCurrentItems(); +const workExperience = getTotalWorkExperience(); + +// 获取所有时间线项目(按时间倒序) +const allTimelineItems = getTimelineByType(); + +// 类型图标映射 +const getTypeIcon = (type: string) => { + switch (type) { + case "education": + return "material-symbols:school"; + case "work": + return "material-symbols:work"; + case "project": + return "material-symbols:code"; + case "achievement": + return "material-symbols:emoji-events"; + default: + return "material-symbols:event"; + } +}; +--- + + + + +
    +
    + + +
    +

    + {i18n(I18nKey.timeline)} +

    +

    + {i18n(I18nKey.timelineSubtitle)} +

    +
    + +
    +
    +
    {stats.total}
    +
    {i18n(I18nKey.timelineTotal)}
    +
    +
    +
    {stats.byType.work}
    +
    {i18n(I18nKey.timelineWork)}
    +
    +
    +
    {stats.byType.project}
    +
    {i18n(I18nKey.timelineProjects)}
    +
    +
    +
    + {workExperience.years}+ +
    +
    {i18n(I18nKey.timelineExperience)}
    +
    +
    + + {currentItems.length > 0 && ( +
    +

    + {i18n(I18nKey.timelineCurrent)} +

    +
    + {currentItems.map((item) => ( + + ))} +
    +
    + )} + +
    +

    + {i18n(I18nKey.timelineHistory)} +

    +
    + +
    +
    + {allTimelineItems.map((item, index) => ( + + ))} +
    +
    +
    + +
    +

    + {i18n(I18nKey.timelineStatistics)} +

    +
    + +
    +

    + {i18n(I18nKey.timelineByType)} +

    +
    + {Object.entries(stats.byType).map(([type, count]) => { + const percentage = Math.round((count / stats.total) * 100); + return ( +
    +
    + {i18n(type === 'education' ? I18nKey.timelineEducation : + type === 'work' ? I18nKey.timelineWork : + type === 'project' ? I18nKey.timelineProject : + I18nKey.timelineAchievement)} +
    +
    +
    +
    +
    + {count} +
    +
    + ); + })} +
    +
    + +
    +

    + {i18n(I18nKey.timelineWorkExperience)} +

    +
    +
    + {i18n(I18nKey.timelineTotalExperience)} + + {workExperience.years} {i18n(I18nKey.timelineYears)} {workExperience.months} {i18n(I18nKey.timelineMonths)} + +
    +
    + {i18n(I18nKey.timelineWorkPositions)} + {stats.byType.work} +
    +
    + {i18n(I18nKey.timelineCurrentRole)} + + {currentItems.filter(item => item.type === 'work').length > 0 ? i18n(I18nKey.timelineEmployed) : i18n(I18nKey.timelineAvailable)} + +
    +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/plugins/expressive-code/collapse-button.ts b/src/plugins/expressive-code/collapse-button.ts new file mode 100644 index 0000000..5a5d097 --- /dev/null +++ b/src/plugins/expressive-code/collapse-button.ts @@ -0,0 +1,83 @@ +import { definePlugin } from "@expressive-code/core"; +import type { Element } from "hast"; + +export function pluginCollapseButton() { + return definePlugin({ + name: "Collapse Button", + hooks: { + postprocessRenderedBlock: (context) => { + // If the code block has a title, we don't add the collapse button + // as it might conflict with the title bar layout + const classNames = (context.renderData.blockAst.properties?.className as string[]) || []; + if (classNames.includes("has-title")) { + return; + } + + function processCodeBlock(node: Element) { + // Add classes to the root node to indicate it's collapsible and expanded by default + if (!node.properties) node.properties = {}; + const classNames = (node.properties.className as string[]) || []; + if (!classNames.includes("collapsible")) { + classNames.push("collapsible"); + } + if (!classNames.includes("expanded")) { + classNames.push("expanded"); + } + node.properties.className = classNames; + + const collapseButton = { + type: "element" as const, + tagName: "button", + properties: { + className: [ + "collapse-btn" + ], + "aria-label": "Collapse code", + }, + children: [ + { + type: "element" as const, + tagName: "div", + properties: { + className: [ + "collapse-btn-icon", + ], + }, + children: [ + { + type: "element" as const, + tagName: "svg", + properties: { + viewBox: "0 0 24 24", + xmlns: "http://www.w3.org/2000/svg", + className: [ + "collapse-btn-icon", + "collapse-icon", + ], + }, + children: [ + { + type: "element" as const, + tagName: "path", + properties: { + d: "M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z" + }, + children: [], + }, + ], + }, + ], + }, + ], + } as Element; + if (!node.children) { + node.children = []; + } + node.children.push(collapseButton); + } + + processCodeBlock(context.renderData.blockAst); + }, + }, + }); +} \ No newline at end of file diff --git a/src/plugins/expressive-code/copy-button.ts b/src/plugins/expressive-code/copy-button.ts new file mode 100644 index 0000000..dce54c7 --- /dev/null +++ b/src/plugins/expressive-code/copy-button.ts @@ -0,0 +1,88 @@ +import { definePlugin } from "@expressive-code/core"; +import type { Element } from "hast"; + + +export function pluginCopyButton() { + return definePlugin({ + name: "Copy Button", + hooks: { + postprocessRenderedBlock: (context) => { + function processCodeBlock(node: Element) { + const copyButton = { + type: "element" as const, + tagName: "button", + properties: { + className: [ + "copy-btn" + ], + "aria-label": "Copy code", + }, + children: [ + { + type: "element" as const, + tagName: "div", + properties: { + className: [ + "copy-btn-icon" + ], + }, + children: [ + { + type: "element" as const, + tagName: "svg", + properties: { + viewBox: "0 -960 960 960", + xmlns: "http://www.w3.org/2000/svg", + className: [ + "copy-btn-icon", + "copy-icon", + ], + }, + children: [ + { + type: "element" as const, + tagName: "path", + properties: { + d: "M368.37-237.37q-34.48 0-58.74-24.26-24.26-24.26-24.26-58.74v-474.26q0-34.48 24.26-58.74 24.26-24.26 58.74-24.26h378.26q34.48 0 58.74 24.26 24.26 24.26 24.26 58.74v474.26q0 34.48-24.26 58.74-24.26 24.26-58.74 24.26H368.37Zm0-83h378.26v-474.26H368.37v474.26Zm-155 238q-34.48 0-58.74-24.26-24.26-24.26-24.26-58.74v-515.76q0-17.45 11.96-29.48 11.97-12.02 29.33-12.02t29.54 12.02q12.17 12.03 12.17 29.48v515.76h419.76q17.45 0 29.48 11.96 12.02 11.97 12.02 29.33t-12.02 29.54q-12.03 12.17-29.48 12.17H213.37Zm155-238v-474.26 474.26Z", + }, + children: [], + }, + ], + }, + { + type: "element" as const, + tagName: "svg", + properties: { + viewBox: "0 -960 960 960", + xmlns: "http://www.w3.org/2000/svg", + className: [ + "copy-btn-icon", + "success-icon", + ], + }, + children: [ + { + type: "element" as const, + tagName: "path", + properties: { + d: "m389-377.13 294.7-294.7q12.58-12.67 29.52-12.67 16.93 0 29.61 12.67 12.67 12.68 12.67 29.53 0 16.86-12.28 29.14L419.07-288.41q-12.59 12.67-29.52 12.67-16.94 0-29.62-12.67L217.41-430.93q-12.67-12.68-12.79-29.45-.12-16.77 12.55-29.45 12.68-12.67 29.62-12.67 16.93 0 29.28 12.67L389-377.13Z", + }, + children: [], + }, + ], + }, + ], + }, + ], + } as Element; + if (!node.children) { + node.children = []; + } + node.children.push(copyButton); + } + + processCodeBlock(context.renderData.blockAst); + }, + }, + }); +} \ No newline at end of file diff --git a/src/plugins/expressive-code/language-badge.ts b/src/plugins/expressive-code/language-badge.ts new file mode 100644 index 0000000..4416ecc --- /dev/null +++ b/src/plugins/expressive-code/language-badge.ts @@ -0,0 +1,52 @@ +/** + * Based on the discussion at https://github.com/expressive-code/expressive-code/issues/153#issuecomment-2282218684 + */ +import { definePlugin } from "@expressive-code/core"; + + +export function pluginLanguageBadge() { + return definePlugin({ + name: "Language Badge", + hooks: { + postprocessRenderedBlock: ({ codeBlock, renderData }) => { + const language = codeBlock.language; + if (language && renderData.blockAst.properties) { + renderData.blockAst.properties["data-language"] = language; + } + }, + }, + baseStyles: ({}) => ` + .frame[data-language]:not(.has-title):not(.is-terminal) { + position: relative; + + &::after { + pointer-events: none; + position: absolute; + z-index: 2; + right: 0.5rem; + top: 0.5rem; + content: attr(data-language); + font-family: "JetBrains Mono Variable", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 0.75rem; + font-weight: bold; + text-transform: uppercase; + color: var(--btn-content); + background: var(--btn-regular-bg); + opacity: 0; + transition: opacity 0.3s; + padding: 0.1rem 0.5rem; + border-radius: 0.5rem; + } + + @media (hover: hover) { + &::after { + opacity: 1; + } + &:hover::after { + opacity: 0; + } + } + } + `, + }); +} \ No newline at end of file diff --git a/src/plugins/mermaid-render-script.js b/src/plugins/mermaid-render-script.js new file mode 100644 index 0000000..4e01e2f --- /dev/null +++ b/src/plugins/mermaid-render-script.js @@ -0,0 +1,481 @@ +(() => { + // 单例模式:检查是否已经初始化过 + if (window.mermaidInitialized) { + return; + } + + window.mermaidInitialized = true; + + // 记录当前主题状态,避免不必要的重新渲染 + let currentTheme = null; + let isRendering = false; // 防止并发渲染 + let retryCount = 0; + const MAX_RETRIES = 3; + const RETRY_DELAY = 1000; // 1秒 + + // 检查主题是否真的发生了变化 + function hasThemeChanged() { + const isDark = document.documentElement.classList.contains("dark"); + const newTheme = isDark ? "dark" : "default"; + + if (currentTheme !== newTheme) { + currentTheme = newTheme; + return true; + } + return false; + } + + // 等待 Mermaid 库加载完成 + function waitForMermaid(timeout = 10000) { + return new Promise((resolve, reject) => { + const startTime = Date.now(); + + function check() { + if (window.mermaid && typeof window.mermaid.initialize === "function") { + resolve(window.mermaid); + } else if (Date.now() - startTime > timeout) { + reject(new Error("Mermaid library failed to load within timeout")); + } else { + setTimeout(check, 100); + } + } + + check(); + }); + } + + // 设置 MutationObserver 监听 html 元素的 class 属性变化 + function setupMutationObserver() { + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if ( + mutation.type === "attributes" && + mutation.attributeName === "class" + ) { + // 检查是否是 dark 类的变化 + const target = mutation.target; + const wasDark = mutation.oldValue + ? mutation.oldValue.includes("dark") + : false; + const isDark = target.classList.contains("dark"); + + if (wasDark !== isDark) { + if (hasThemeChanged()) { + // 延迟渲染,避免主题切换时的闪烁 + setTimeout(() => renderMermaidDiagrams(), 150); + } + } + } + }); + }); + + // 开始观察 html 元素的 class 属性变化 + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["class"], + attributeOldValue: true, + }); + } + + // 缩放平移 + function attachZoomControls(element, svgElement) { + if (element.__zoomAttached) return; + element.__zoomAttached = true; + + const wrapper = document.createElement("div"); + wrapper.className = "mermaid-zoom-wrapper"; + + const svgParent = svgElement.parentNode; + wrapper.appendChild(svgElement); + svgParent.appendChild(wrapper); + + let scale = 1; + let tx = 0; + let ty = 0; + const MIN_SCALE = 0.2; + const MAX_SCALE = 6; + + function applyTransform() { + wrapper.style.transform = `translate(${tx}px, ${ty}px) scale(${scale})`; + } + const controls = document.createElement("div"); + controls.className = "mermaid-zoom-controls"; + controls.innerHTML = ` + + + + `; + + controls.addEventListener("click", (ev) => { + const action = + ev.target.getAttribute && ev.target.getAttribute("data-action"); + if (!action) return; + switch (action) { + case "zoom-in": + scale = Math.min(MAX_SCALE, +(scale * 1.2).toFixed(3)); + applyTransform(); + break; + case "zoom-out": + scale = Math.max(MIN_SCALE, +(scale / 1.2).toFixed(3)); + applyTransform(); + break; + case "reset": + scale = 1; + tx = 0; + ty = 0; + applyTransform(); + break; + } + }); + + element.appendChild(controls); + + // 鼠标滚轮缩放 + element.addEventListener( + "wheel", + (ev) => { + ev.preventDefault(); + const delta = -ev.deltaY; + const zoomFactor = delta > 0 ? 1.12 : 1 / 1.12; + const prevScale = scale; + scale = Math.min( + MAX_SCALE, + Math.max(MIN_SCALE, +(scale * zoomFactor).toFixed(3)), + ); + const rect = wrapper.getBoundingClientRect(); + const cx = ev.clientX - rect.left; + const cy = ev.clientY - rect.top; + const worldX = cx / prevScale - tx; + const worldY = cy / prevScale - ty; + tx = cx / scale - worldX; + ty = cy / scale - worldY; + applyTransform(); + }, + { passive: false }, + ); + + let isPanning = false; + let startX = 0; + let startY = 0; + let startTx = 0; + let startTy = 0; + + wrapper.style.touchAction = "none"; + + wrapper.addEventListener("pointerdown", (ev) => { + if (ev.button !== 0) return; // 仅左键 + isPanning = true; + wrapper.setPointerCapture(ev.pointerId); + startX = ev.clientX; + startY = ev.clientY; + startTx = tx; + startTy = ty; + }); + wrapper.addEventListener("pointermove", (ev) => { + if (!isPanning) return; + const dx = ev.clientX - startX; + const dy = ev.clientY - startY; + tx = startTx + dx / scale; // 根据当前缩放调整灵敏度 + ty = startTy + dy / scale; + applyTransform(); + }); + wrapper.addEventListener("pointerup", (ev) => { + isPanning = false; + try { + wrapper.releasePointerCapture(ev.pointerId); + } catch (e) { } + }); + wrapper.addEventListener("pointercancel", () => { + isPanning = false; + }); + + // 双击重置 + wrapper.addEventListener("dblclick", () => { + scale = 1; + tx = 0; + ty = 0; + applyTransform(); + }); + applyTransform(); + let resizeTimer = null; + window.addEventListener("resize", () => { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(() => { + applyTransform(); + }, 200); + }); + } + + // 设置其他事件监听器 + function setupEventListeners() { + // 监听页面切换 + document.addEventListener("astro:page-load", () => { + // 重新初始化主题状态 + currentTheme = null; + retryCount = 0; // 重置重试计数 + if (hasThemeChanged()) { + setTimeout(() => renderMermaidDiagrams(), 100); + } + }); + + // 监听页面可见性变化,页面重新可见时重新渲染 + document.addEventListener("visibilitychange", () => { + if (!document.hidden) { + setTimeout(() => renderMermaidDiagrams(), 200); + } + }); + } + + async function initializeMermaid() { + try { + await waitForMermaid(); + + // 初始化 Mermaid 配置 + window.mermaid.initialize({ + startOnLoad: false, + theme: "default", + themeVariables: { + fontFamily: "inherit", + fontSize: "16px", + }, + securityLevel: "loose", + // 添加错误处理配置 + errorLevel: "warn", + logLevel: "error", + }); + + // 渲染所有 Mermaid 图表 + await renderMermaidDiagrams(); + } catch (error) { + console.error("Failed to initialize Mermaid:", error); + // 如果初始化失败,尝试重新加载 + if (retryCount < MAX_RETRIES) { + retryCount++; + setTimeout(() => initializeMermaid(), RETRY_DELAY * retryCount); + } + } + } + + async function renderMermaidDiagrams() { + // 防止并发渲染 + if (isRendering) { + return; + } + + // 检查 Mermaid 是否可用 + if (!window.mermaid || typeof window.mermaid.render !== "function") { + console.warn("Mermaid not available, skipping render"); + return; + } + + isRendering = true; + + try { + const mermaidElements = document.querySelectorAll( + ".mermaid[data-mermaid-code]", + ); + + if (mermaidElements.length === 0) { + isRendering = false; + return; + } + + // 延迟检测主题,确保 DOM 已经更新 + await new Promise((resolve) => setTimeout(resolve, 100)); + + const htmlElement = document.documentElement; + const isDark = htmlElement.classList.contains("dark"); + const theme = isDark ? "dark" : "default"; + + // 更新 Mermaid 主题(只需要更新一次) + window.mermaid.initialize({ + startOnLoad: false, + theme: theme, + themeVariables: { + fontFamily: "inherit", + fontSize: "16px", + // 强制应用主题变量 + primaryColor: isDark ? "#ffffff" : "#000000", + primaryTextColor: isDark ? "#ffffff" : "#000000", + primaryBorderColor: isDark ? "#ffffff" : "#000000", + lineColor: isDark ? "#ffffff" : "#000000", + secondaryColor: isDark ? "#333333" : "#f0f0f0", + tertiaryColor: isDark ? "#555555" : "#e0e0e0", + }, + securityLevel: "loose", + errorLevel: "warn", + logLevel: "error", + }); + + // 批量渲染所有图表,添加重试机制 + const renderPromises = Array.from(mermaidElements).map( + async (element, index) => { + let attempts = 0; + const maxAttempts = 3; + + while (attempts < maxAttempts) { + try { + const code = element.getAttribute("data-mermaid-code"); + if (!code) { + break; + } + // 渲染图表 + const { svg } = await window.mermaid.render( + `mermaid-${Date.now()}-${index}-${attempts}`, + code, + ); + const parser = new DOMParser(); + const doc = parser.parseFromString( + svg, + "image/svg+xml", + ); + const svgElement = doc.documentElement; + element.innerHTML = ""; + element.__zoomAttached = false; + element.appendChild(svgElement); + // 添加响应式支持 + const insertedSvg = element.querySelector("svg"); + if (insertedSvg) { + insertedSvg.setAttribute("width", "100%"); + insertedSvg.removeAttribute("height"); + insertedSvg.style.maxWidth = "100%"; + insertedSvg.style.height = "auto"; + //Todo 需要根据实际情况 + insertedSvg.style.minHeight = "300px"; + // 强制应用样式 + if (isDark) { + svgElement.style.filter = "brightness(0.9) contrast(1.1)"; + } else { + svgElement.style.filter = "none"; + } + attachZoomControls(element, insertedSvg); + } + // 渲染成功,跳出重试循环 + break; + } catch (error) { + attempts++; + console.warn( + `Mermaid rendering attempt ${attempts} failed for element ${index}:`, + error, + ); + if (attempts >= maxAttempts) { + console.error( + `Failed to render Mermaid diagram after ${maxAttempts} attempts:`, + error, + ); + element.innerHTML = ` +
    +

    Failed to render diagram after ${maxAttempts} attempts.

    + +
    + `; + } else { + // 等待一段时间后重试 + await new Promise((resolve) => + setTimeout(resolve, 500 * attempts), + ); + } + } + } + }, + ); + + // 等待所有渲染完成 + await Promise.all(renderPromises); + retryCount = 0; // 重置重试计数 + } catch (error) { + console.error("Error in renderMermaidDiagrams:", error); + + // 如果渲染失败,尝试重新渲染 + if (retryCount < MAX_RETRIES) { + retryCount++; + setTimeout(() => renderMermaidDiagrams(), RETRY_DELAY * retryCount); + } + } finally { + isRendering = false; + } + } + + // 初始化主题状态 + function initializeThemeState() { + const isDark = document.documentElement.classList.contains("dark"); + currentTheme = isDark ? "dark" : "default"; + } + + // 加载 Mermaid 库 + async function loadMermaid() { + if (typeof window.mermaid !== "undefined") { + return Promise.resolve(); + } + + return new Promise((resolve, reject) => { + const script = document.createElement("script"); + script.src = + "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"; + + script.onload = () => { + console.log("Mermaid library loaded successfully"); + resolve(); + }; + + script.onerror = (error) => { + console.error("Failed to load Mermaid library:", error); + // 尝试备用 CDN + const fallbackScript = document.createElement("script"); + fallbackScript.src = "https://unpkg.com/mermaid@11/dist/mermaid.min.js"; + + fallbackScript.onload = () => { + console.log("Mermaid library loaded from fallback CDN"); + resolve(); + }; + + fallbackScript.onerror = () => { + reject( + new Error( + "Failed to load Mermaid from both primary and fallback CDNs", + ), + ); + }; + + document.head.appendChild(fallbackScript); + }; + + document.head.appendChild(script); + }); + } + + // 主初始化函数 + async function initialize() { + try { + // 首先检查是否有 Mermaid 图表 + const mermaidElements = document.querySelectorAll( + ".mermaid[data-mermaid-code]", + ); + if (mermaidElements.length === 0) { + return; + } + + // 设置监听器 + setupMutationObserver(); + setupEventListeners(); + + // 初始化主题状态 + initializeThemeState(); + + // 加载并初始化 Mermaid + await loadMermaid(); + await initializeMermaid(); + } catch (error) { + console.error("Failed to initialize Mermaid system:", error); + } + } + + // 启动初始化 + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", initialize); + } else { + initialize(); + } +})(); \ No newline at end of file diff --git a/src/plugins/rehype-component-admonition.mjs b/src/plugins/rehype-component-admonition.mjs new file mode 100644 index 0000000..a691aa4 --- /dev/null +++ b/src/plugins/rehype-component-admonition.mjs @@ -0,0 +1,33 @@ +/// +import { h } from "hastscript"; + +/** + * Creates an admonition component. + * + * @param {Object} properties - The properties of the component. + * @param {string} [properties.title] - An optional title. + * @param {('tip'|'note'|'important'|'caution'|'warning')} type - The admonition type. + * @param {import('mdast').RootContent[]} children - The children elements of the component. + * @returns {import('mdast').Parent} The created admonition component. + */ +export function AdmonitionComponent(properties, children, type) { + if (!Array.isArray(children) || children.length === 0) + return h( + "div", + { class: "hidden" }, + 'Invalid admonition directive. (Admonition directives must be of block type ":::note{name="name"} :::")', + ); + + let label = null; + if (properties?.["has-directive-label"]) { + label = children[0]; // The first child is the label + // biome-ignore lint/style/noParameterAssign: + children = children.slice(1); + label.tagName = "div"; // Change the tag

    to

    + } + + return h("blockquote", { class: `admonition bdm-${type}` }, [ + h("span", { class: "bdm-title" }, label ? label : type.toUpperCase()), + ...children, + ]); +} \ No newline at end of file diff --git a/src/plugins/rehype-component-github-card.mjs b/src/plugins/rehype-component-github-card.mjs new file mode 100644 index 0000000..ce9acc4 --- /dev/null +++ b/src/plugins/rehype-component-github-card.mjs @@ -0,0 +1,95 @@ +/// +import { h } from "hastscript"; + +/** + * Creates a GitHub Card component. + * + * @param {Object} properties - The properties of the component. + * @param {string} properties.repo - The GitHub repository in the format "owner/repo". + * @param {import('mdast').RootContent[]} children - The children elements of the component. + * @returns {import('mdast').Parent} The created GitHub Card component. + */ +export function GithubCardComponent(properties, children) { + if (Array.isArray(children) && children.length !== 0) + return h("div", { class: "hidden" }, [ + 'Invalid directive. ("github" directive must be leaf type "::github{repo="owner/repo"}")', + ]); + + if (!properties.repo || !properties.repo.includes("/")) + return h( + "div", + { class: "hidden" }, + 'Invalid repository. ("repo" attributte must be in the format "owner/repo")', + ); + + const repo = properties.repo; + const cardUuid = `GC${Math.random().toString(36).slice(-6)}`; // Collisions are not important + + const nAvatar = h(`div#${cardUuid}-avatar`, { class: "gc-avatar" }); + const nLanguage = h( + `span#${cardUuid}-language`, + { class: "gc-language" }, + "Waiting...", + ); + + const nTitle = h("div", { class: "gc-titlebar" }, [ + h("div", { class: "gc-titlebar-left" }, [ + h("div", { class: "gc-owner" }, [ + nAvatar, + h("div", { class: "gc-user" }, repo.split("/")[0]), + ]), + h("div", { class: "gc-divider" }, "/"), + h("div", { class: "gc-repo" }, repo.split("/")[1]), + ]), + h("div", { class: "github-logo" }), + ]); + + const nDescription = h( + `div#${cardUuid}-description`, + { class: "gc-description" }, + "Waiting for api.github.com...", + ); + + const nStars = h(`div#${cardUuid}-stars`, { class: "gc-stars" }, "00K"); + const nForks = h(`div#${cardUuid}-forks`, { class: "gc-forks" }, "0K"); + const nLicense = h(`div#${cardUuid}-license`, { class: "gc-license" }, "0K"); + + const nScript = h( + `script#${cardUuid}-script`, + { type: "text/javascript", defer: true }, + ` + fetch('https://api.github.com/repos/${repo}', { referrerPolicy: "no-referrer" }).then(response => response.json()).then(data => { + document.getElementById('${cardUuid}-description').innerText = data.description?.replace(/:[a-zA-Z0-9_]+:/g, '') || "Description not set"; + document.getElementById('${cardUuid}-language').innerText = data.language; + document.getElementById('${cardUuid}-forks').innerText = Intl.NumberFormat('en-us', { notation: "compact", maximumFractionDigits: 1 }).format(data.forks).replaceAll("\u202f", ''); + document.getElementById('${cardUuid}-stars').innerText = Intl.NumberFormat('en-us', { notation: "compact", maximumFractionDigits: 1 }).format(data.stargazers_count).replaceAll("\u202f", ''); + const avatarEl = document.getElementById('${cardUuid}-avatar'); + avatarEl.style.backgroundImage = 'url(' + data.owner.avatar_url + ')'; + avatarEl.style.backgroundColor = 'transparent'; + document.getElementById('${cardUuid}-license').innerText = data.license?.spdx_id || "no-license"; + document.getElementById('${cardUuid}-card').classList.remove("fetch-waiting"); + console.log("[GITHUB-CARD] Loaded card for ${repo} | ${cardUuid}.") + }).catch(err => { + const c = document.getElementById('${cardUuid}-card'); + c?.classList.add("fetch-error"); + console.warn("[GITHUB-CARD] (Error) Loading card for ${repo} | ${cardUuid}.") + }) + `, + ); + + return h( + `a#${cardUuid}-card`, + { + class: "card-github fetch-waiting no-styling", + href: `https://github.com/${repo}`, + target: "_blank", + repo, + }, + [ + nTitle, + nDescription, + h("div", { class: "gc-infobar" }, [nStars, nForks, nLicense, nLanguage]), + nScript, + ], + ); +} diff --git a/src/plugins/rehype-mermaid.mjs b/src/plugins/rehype-mermaid.mjs new file mode 100644 index 0000000..f1bb3ce --- /dev/null +++ b/src/plugins/rehype-mermaid.mjs @@ -0,0 +1,53 @@ +import { h } from "hastscript"; +import { visit } from "unist-util-visit"; +import mermaidRenderScript from "./mermaid-render-script.js?raw"; + + +export function rehypeMermaid() { + return (tree) => { + visit(tree, "element", (node) => { + if ( + node.tagName === "div" && + node.properties && + node.properties.className && + node.properties.className.includes("mermaid-container") + ) { + const mermaidCode = node.properties["data-mermaid-code"] || ""; + const mermaidId = `mermaid-${Math.random().toString(36).slice(-6)}`; + + // 创建 Mermaid 容器 + const mermaidContainer = h( + "div", + { + class: "mermaid-wrapper", + id: mermaidId, + }, + [ + h( + "div", + { + class: "mermaid", + "data-mermaid-code": mermaidCode, + }, + mermaidCode, + ), + ], + ); + + // 创建客户端渲染脚本 + const renderScript = h( + "script", + { + type: "text/javascript", + }, + mermaidRenderScript, + ); + + // 替换原始节点 + node.tagName = "div"; + node.properties = { class: "mermaid-diagram-container" }; + node.children = [mermaidContainer, renderScript]; + } + }); + }; +} \ No newline at end of file diff --git a/src/plugins/remark-directive-rehype.js b/src/plugins/remark-directive-rehype.js new file mode 100644 index 0000000..f64eaeb --- /dev/null +++ b/src/plugins/remark-directive-rehype.js @@ -0,0 +1,31 @@ +import { h } from "hastscript"; +import { visit } from "unist-util-visit"; + + +export function parseDirectiveNode() { + return (tree, { _data }) => { + visit(tree, (node) => { + if ( + node.type === "containerDirective" || + node.type === "leafDirective" || + node.type === "textDirective" + ) { + // biome-ignore lint/suspicious/noAssignInExpressions: + const data = node.data || (node.data = {}); + node.attributes = node.attributes || {}; + if ( + node.children.length > 0 && + node.children[0].data && + node.children[0].data.directiveLabel + ) { + // Add a flag to the node to indicate that it has a directive label + node.attributes["has-directive-label"] = true; + } + const hast = h(node.name, node.attributes); + + data.hName = hast.tagName; + data.hProperties = hast.properties; + } + }); + }; +} \ No newline at end of file diff --git a/src/plugins/remark-excerpt.js b/src/plugins/remark-excerpt.js new file mode 100644 index 0000000..7acbbfe --- /dev/null +++ b/src/plugins/remark-excerpt.js @@ -0,0 +1,18 @@ +// biome-ignore lint/suspicious/noShadowRestrictedNames: +import { toString } from "mdast-util-to-string"; + + +/* Use the post's first paragraph as the excerpt */ +export function remarkExcerpt() { + return (tree, { data }) => { + let excerpt = ""; + for (const node of tree.children) { + if (node.type !== "paragraph") { + continue; + } + excerpt = toString(node); + break; + } + data.astro.frontmatter.excerpt = excerpt; + }; +} \ No newline at end of file diff --git a/src/plugins/remark-mermaid.js b/src/plugins/remark-mermaid.js new file mode 100644 index 0000000..5f67ad0 --- /dev/null +++ b/src/plugins/remark-mermaid.js @@ -0,0 +1,20 @@ +import { visit } from "unist-util-visit"; + + +export function remarkMermaid() { + return (tree) => { + visit(tree, "code", (node) => { + if (node.lang === "mermaid") { + // 将 mermaid 代码块转换为自定义节点类型 + node.type = "mermaid"; + node.data = { + hName: "div", + hProperties: { + className: ["mermaid-container"], + "data-mermaid-code": node.value, + }, + }; + } + }); + }; +} \ No newline at end of file diff --git a/src/plugins/remark-reading-time.mjs b/src/plugins/remark-reading-time.mjs new file mode 100644 index 0000000..31fa44b --- /dev/null +++ b/src/plugins/remark-reading-time.mjs @@ -0,0 +1,16 @@ +// biome-ignore lint/suspicious/noShadowRestrictedNames: +import { toString } from "mdast-util-to-string"; +import getReadingTime from "reading-time"; + + +export function remarkReadingTime() { + return (tree, { data }) => { + const textOnPage = toString(tree); + const readingTime = getReadingTime(textOnPage); + data.astro.frontmatter.minutes = Math.max( + 1, + Math.round(readingTime.minutes), + ); + data.astro.frontmatter.words = readingTime.words; + }; +} \ No newline at end of file diff --git a/src/plugins/translate.js b/src/plugins/translate.js new file mode 100644 index 0000000..8c3ddd4 --- /dev/null +++ b/src/plugins/translate.js @@ -0,0 +1,12365 @@ +/* + + 国际化,网页自动翻译。 + 作者:管雷鸣 + 开原仓库:https://github.com/xnx3/translate + */ +if (typeof (translate) == 'object' && typeof (translate.version) == 'string') { + throw new Error('translate.js 已经加载过一次了,当前是重复加载,避免你的翻译出现异常,已帮你拦截此次加载。本信息只是给你一个提示,你可以检查一下你的项目中是否出现了重复引入 translate.js ,当然,这个异常并不会影响到你的具体使用,它已经自动帮你处理拦截了这个异常,只不过提示出来是让你知道,你的代码里出现了重复引入的情况。'); +} +var translate = { + /** + * 当前的版本 + * 由 npm 脚本自动更新,无需手动修改 + * 格式:major.minor.patch.date + */ + // AUTO_VERSION_START + version: '3.18.107.20260106', + + /*js translate.config start*/ + /* + 用于当前整个 translate.js 配置参数(整形、布尔值、字符串等参数,不包括function参数) 的导出及导入。 + v3.18.99.20251205 增加,主要用于自动注入iframe中的页面实现翻译而作。 + 主要用到里面的 get、set 方法。 + */ + config: { + //这是一个 Bean 类,避免传统json方式再有写错某个参数 + data: class { + //只翻译指定的元素 https://translate.zvo.cn/4063.html translate.setDocuments(documents); 对应的数据 translate.documents + documents = []; + language = { + //设定是否自动出现 select 切换语言, https://translate.zvo.cn/4056.html + select: { + // 对应的数据 translate.selectLanguageTag.show + show: true, + // 对应的数据 translate.selectLanguageTag.languages = 'english,chinese_simplified,korean'; + languages: '', + }, + //设置本地语种(当前网页的语种) https://translate.zvo.cn/4066.html translate.language.setLocal('chinese_simplified'); 对应的数据 translate.language.local + local: '', + //设置默认翻译为的语种 https://translate.zvo.cn/4071.html translate.language.setDefaultTo('english'); 对应的数据 translate.language.defaultTo + defaultTo: '', + //自动切换为用户所使用的语种 https://translate.zvo.cn/4065.html translate.setAutoDiscriminateLocalLanguage(); 对应 translate.autoDiscriminateLocalLanguage 的值 + autoDiscriminateLocalLanguage: false, + //设置只对指定语种进行翻译 https://translate.zvo.cn/4085.html translate.language.translateLanguagesRange = ['chinese_simplified','english']; 对应的数据 translate.language.translateLanguagesRange + range: [], + //根据URL传参控制以何种语种显示 https://translate.zvo.cn/4075.html + urlParamControl: { + // translate.language.setUrlParamControl(); 默认是false, 对应的数据 translate.language.setUrlParamControl_use + use: false, + // translate.language.setUrlParamControl('lang'); 默认是 language ,对应的数据 translate.language.setUrlParamControl_name + name: 'language' + }, + //本地语种也进行强制翻译 https://translate.zvo.cn/289574.html 对应的数据 translate.language.translateLocal + translateLocal: false + }; + //对网页中图片进行翻译 https://translate.zvo.cn/4055.html translate.images.add(...) 对应的数据 translate.images.queues + images = []; + //自定义翻译术语 https://translate.zvo.cn/4070.html translate.nomenclature.append(from, to, properties); 对应的数据 translate.nomenclature.data + nomenclature = []; + listener = { + //监控页面动态渲染的文本进行自动翻译 https://translate.zvo.cn/4067.html translate.listener.start(); 如果为true,则是启用。 对应 translate.listener.use 的值 + use: false, + }; + ignore = { + // 翻译时忽略指定的文字不翻译 https://translate.zvo.cn/283381.html translate.ignore.text.push('你好'); 对应的数据 translate.ignore.text + text: [], + //通过正则的方式忽略某些文字不翻译 https://translate.zvo.cn/283381.html translate.ignore.setTextRegexs([/请求/g, /[u4a01-u4a05]+/g]); 对应的数据 translate.ignore.textRegex + textRegex: [], + // 翻译时忽略指定的id https://translate.zvo.cn/4062.html translate.ignore.id.push('test'); 对应的数据 translate.ignore.id + id: [], + //翻译时忽略指定的class属性 https://translate.zvo.cn/4061.html translate.ignore.class.push('test'); + //class:[], + class: { + //对应的数据 translate.ignore.class.data + data: [], + //对应的数据 translate.ignore.class.conditionFunction + conditionFunction: {} + }, + //翻译时忽略指定的tag标签 https://translate.zvo.cn/4060.html translate.ignore.tag.push('span'); 对应的数据 translate.ignore.tag + tag: [], + + }; + //设置使用的翻译服务 translate.service.use https://translate.zvo.cn/4081.html translate.service.use('client.edge'); 对应的数据 translate.service.name , 默认则是 translate.service + service = 'translate.service'; + //元素的内容整体翻译能力配置 https://translate.zvo.cn/4078.html + whole = { + //是否开启对整个html页面的整体翻译,也就是整个页面上所有存在的能被翻译的全部会采用整体翻译的方式。默认是 false不开启 对应的数据 translate.whole.isEnableAll + enableAll: false, + /* + 以下三个,也就是 class tag id 分别存储加入的值。 + 比如 translate.whole.tag.push('h3'); + 对应的数据 translate.whole.tag\class\id + */ + class: [], + tag: [], + id: [], + }; + //鼠标划词翻译 https://translate.zvo.cn/4072.html + selectionTranslate = { + //是否启用,默认是false,不启用。如果启用,则是 translate.selectionTranslate.start(); 对应的数据 translate.selectionTranslate.use + use: false + }; + request = { + api: { + // 指定翻译服务接口 https://translate.zvo.cn/4068.html translate.request.setHost(['https://api.translate.zvo.cn/','https://api2.translate.zvo.cn/']); + // 这里数据同步的是 translate.request.api.host + host: [], + // 获取支持的语种列表接口, 可以设置两种形态。 + // 可以设置为 language.json 具体请求api的文件名 + // 另外它还可以设置为 translate.request.api.language = [{id: "chinese_simplified", name: "简体中文"},{id: "korean", name: "한국어"}]; 这种形态,不需要通过联网即可获取切换的语言。 + language: 'language.json', + translate: 'translate.json', //翻译接口 + ip: 'ip.json', //根据用户当前ip获取其所在地的语种 + connectTest: 'connectTest.json', //用于 translate.js 多节点翻译自动检测网络连通情况 + init: 'init.json', //获取最新版本号,跟当前版本进行比对,用于提醒版本升级等使用 + }, + //网页ajax请求触发自动翻译 https://translate.zvo.cn/4086.html + listener: { + // 用户的代码里是否启用了 translate.request.listener.start() ,true:启用 对应的数据 translate.request.listener.use + use: false, + // 进行翻译时,延迟翻译执行的时间 当ajax请求结束后,延迟这里设置的时间,然后自动触发 translate.execute() 执行。 对应的数据 translate.request.listener.delayExecuteTime + delayExecuteTime: 200, + //两次触发的最小间隔时间,单位是毫秒,这里默认是800毫秒。最小填写时间为 200毫秒。 对应的数据 translate.request.listener.minIntervalTime + minIntervalTime: 800, + }, + // 网络请求自定义附加参数-追加请求参数, https://translate.zvo.cn/471711.html 对应的数据 translate.request.appendParams + appendParams: {}, + // 网络请求自定义附加参数-追加 header 请求头参数, https://translate.zvo.cn/471711.html 对应的数据 translate.request.appendHeaders + appendHeaders: {}, + // 翻译排队执行 https://translate.zvo.cn/479742.html 对应的数据 translate.waitingExecute.use + waitingExecute: true, + }; + element = { + //增加对指定标签的属性进行翻译 https://translate.zvo.cn/231504.html translate.element.tagAttribute + //当前忽略 condition 的function 参数 + tagAttribute: {} + }; + //翻译中的遮罩层 https://translate.zvo.cn/407105.html + progress = { + api: { + //启用翻译中的遮罩层, 默认不使用,translate.progress.api.startUITip(); 可以设置为启用,对应的数据 translate.progress.api.use + use: false, + }, + // 对应 translate.progress.style 的数据 + style: '', + }; + //网络请求数据拦截并翻译 https://translate.zvo.cn/479724.html + network = { + // 对应的数据 translate.network.rules + rules: [], + // 对应的数据 translate.network.isUse + use: false + }; + visual = { + //网页打开时自动隐藏文字,翻译完成后显示译文 https://translate.zvo.cn/549731.html 对应的数据 translate.visual.webPageLoadTranslateBeforeHiddenText_use + webPageLoadTranslateBeforeHiddenText: { + use: false, + } + }; + }, + + + //获取当前 translate.js 所设置的数据 (排除设置的 function) + get: function () { + + var data = new translate.config.data(); + + data.documents = translate.documents; + data.language.select.show = translate.selectLanguageTag.show; + data.language.select.languages = translate.selectLanguageTag.languages; + data.language.local = translate.language.local; + data.language.defaultTo = translate.language.defaultTo; + data.language.autoDiscriminateLocalLanguage = translate.autoDiscriminateLocalLanguage; + data.language.range = translate.language.translateLanguagesRange; + data.language.urlParamControl.use = translate.language.setUrlParamControl_use; + data.language.urlParamControl.name = translate.language.setUrlParamControl_name; + data.language.translateLocal = translate.language.translateLocal; + data.images = translate.images.queues; + data.nomenclature = translate.images.queues; + data.listener.use = translate.listener.use; + data.ignore.text = translate.ignore.text; + data.ignore.textRegex = translate.ignore.textRegex; + data.ignore.id = translate.ignore.id; + data.ignore.class.data = translate.ignore.class.data; + data.ignore.class.conditionFunction = translate.ignore.class.conditionFunction; + data.ignore.tag = translate.ignore.tag; + data.service = translate.service.name; + data.whole.enableAll = translate.whole.isEnableAll; + data.whole.class = translate.whole.class; + data.whole.tag = translate.whole.tag; + data.whole.id = translate.whole.id; + data.selectionTranslate.use = translate.selectionTranslate.use; + data.request.api.host = translate.request.api.host; + data.request.api.language = translate.request.api.language; + data.request.api.translate = translate.request.api.translate; + data.request.api.ip = translate.request.api.ip; + data.request.api.connectTest = translate.request.api.connectTest; + data.request.api.init = translate.request.api.init; + data.request.listener.use = translate.request.listener.use; + data.request.listener.delayExecuteTime = translate.request.listener.delayExecuteTime; + data.request.listener.minIntervalTime = translate.request.listener.minIntervalTime; + data.request.appendParams = translate.request.appendParams; + data.request.appendHeaders = translate.request.appendHeaders; + data.request.waitingExecute = translate.waitingExecute.use; + data.element.tagAttribute = translate.element.tagAttribute; + data.progress.api.use = translate.progress.api.use; + data.progress.style = translate.progress.style; + data.network.rules = translate.network.rules; + data.network.use = translate.network.isUse; + data.visual.webPageLoadTranslateBeforeHiddenText.use = translate.visual.webPageLoadTranslateBeforeHiddenText_use; + + return data; + }, + + /* + 设置数据,传入 Config.data 格式的数据, 设置到当前 translate.js 中 + 不想设置的项可以不传入。 + */ + set: function (data) { + //console.log(data); + if (typeof (data.documents) === 'object') { + translate.setDocuments(data.documents); + } + if (typeof (data.language.select.show) === 'boolean') { + translate.selectLanguageTag.show = data.language.select.show; + } + if (typeof (data.language.select.languages) === 'string' && data.language.select.languages.trim().length > 0) { + translate.selectLanguageTag.languages = data.language.select.languages; + } + if (typeof (data.language.local) === 'string' && data.language.local.trim().length > 0) { + translate.language.setLocal(data.language.local); + } + if (typeof (data.language.defaultTo) === 'string' && data.language.defaultTo.trim().length > 0) { + translate.language.setDefaultTo(data.language.defaultTo); + } + if (typeof (data.language.autoDiscriminateLocalLanguage) === 'boolean' && data.language.autoDiscriminateLocalLanguage === true) { + translate.setAutoDiscriminateLocalLanguage(); + } + if (typeof (data.language.range) === 'object' && data.language.range.length > 0) { + translate.language.translateLanguagesRange = data.language.range; + } + if (typeof (data.language.urlParamControl.use) === 'boolean') { + translate.language.setUrlParamControl_use = data.language.urlParamControl.use; + } + if (typeof (data.language.urlParamControl.name) === 'string' && data.language.urlParamControl.name.trim().toLowerCase() !== 'language') { + translate.language.setUrlParamControl(data.language.urlParamControl.name); + } + if (typeof (data.language.translateLocal) === 'boolean') { + translate.language.translateLocal = data.language.translateLocal; + } + if (typeof (data.images) === 'object') { + translate.images.queues = data.images; + } + if (typeof (data.nomenclature) === 'object') { + translate.nomenclature.data = data.nomenclature; + } + if (typeof (data.listener.use) === 'boolean') { + translate.listener.use = data.listener.use; + } + if (typeof (data.ignore.text) === 'object') { + translate.ignore.text = data.ignore.text; + } + if (typeof (data.ignore.textRegex) === 'object') { + translate.ignore.textRegex = data.ignore.textRegex; + } + if (typeof (data.ignore.id) === 'object') { + translate.ignore.id = data.ignore.id; + } + if (typeof (data.ignore.class) === 'object') { + translate.ignore.class = data.ignore.class; + } + if (typeof (data.ignore.tag) === 'object') { + translate.ignore.tag = data.ignore.tag; + } + if (typeof (data.service) === 'string' && data.service.trim().length > 0) { + translate.service.name = data.service; + } + if (typeof (data.whole.enableAll) === 'boolean') { + translate.listener.use = data.whole.enableAll; + } + if (typeof (data.whole.class) === 'object') { + translate.whole.class = data.whole.class; + } + if (typeof (data.whole.tag) === 'object') { + translate.whole.tag = data.whole.tag; + } + if (typeof (data.whole.id) === 'object') { + translate.whole.id = data.whole.id; + } + if (typeof (data.selectionTranslate.use) === 'boolean' && data.selectionTranslate.use === true) { + if (translate.selectionTranslate.use === false) { //没有启动,才会启动 + translate.selectionTranslate.start(); + } + } + if (typeof (data.request.api.host) === 'object') { + translate.request.api.host = data.request.api.host; + } + if (typeof (data.request.api.language) === 'string') { + translate.request.api.language = data.request.api.language; + } + if (typeof (data.request.api.ip) === 'string') { + translate.request.api.ip = data.request.api.ip; + } + if (typeof (data.request.api.connectTest) === 'string') { + translate.request.api.connectTest = data.request.api.connectTest; + } + if (typeof (data.request.api.init) === 'string') { + translate.request.api.init = data.request.api.init; + } + if (typeof (data.request.listener.use) === 'boolean') { + translate.request.listener.use = data.request.listener.use; + } + if (typeof (data.request.listener.delayExecuteTime) === 'number') { + translate.request.listener.delayExecuteTime = data.request.listener.delayExecuteTime; + } + if (typeof (data.request.listener.minIntervalTime) === 'number') { + translate.request.listener.minIntervalTime = data.request.listener.minIntervalTime; + } + if (typeof (data.request.appendParams) === 'object') { + translate.request.appendParams = data.request.appendParams; + } + if (typeof (data.request.appendHeaders) === 'object') { + translate.request.appendHeaders = data.request.appendHeaders; + } + if (typeof (data.request.waitingExecute) === 'boolean') { + translate.waitingExecute.use = data.request.waitingExecute; + } + if (typeof (data.element.tagAttribute) === 'object') { + translate.element.tagAttribute = data.element.tagAttribute; + } + if (typeof (data.progress.api.use) === 'boolean' && data.progress.api.use === true) { + if (translate.progress.api.use === false) { //没有启动,才会启动 + translate.progress.api.startUITip(); + } + } + if (typeof (data.progress.style) === 'string') { + translate.progress.style = data.progress.style; + } + if (typeof (data.network.rules) === 'object') { + translate.network.rules = data.network.rules; + } + if (typeof (data.network.use) === 'boolean' && data.network.use === true) { + if (translate.network.isUse === false) { //没有启动,才会启动 + translate.network.use(); + } + } + if (typeof (data.visual.webPageLoadTranslateBeforeHiddenText.use) === 'boolean' && data.visual.webPageLoadTranslateBeforeHiddenText.use === true) { + if (translate.visual.webPageLoadTranslateBeforeHiddenText_use === false) { //没有启动,才会启动 + translate.visual.webPageLoadTranslateBeforeHiddenText(); + } + } + } + }, + /*js translate.config end*/ + + + // AUTO_VERSION_END + /* + 当前使用的版本,默认使用v2. 可使用 setUseVersion2(); + 来设置使用v2 ,已废弃,主要是区分是否是v1版本来着,v2跟v3版本是同样的使用方式 + */ + useVersion: 'v2', + /*js translate.setUseVersion2 start*/ + setUseVersion2: function () { + translate.useVersion = 'v2'; + translate.log('提示:自 v2.10 之后的版本默认就是使用V2版本(当前版本为:' + translate.version + '), translate.setUseVersion2() 可以不用再加这一行了。当然加了也无所谓,只是加了跟不加是完全一样的。'); + }, + /*js translate.setUseVersion2 end*/ + /* + * 翻译的对象,也就是 new google.translate.TranslateElement(...) + * 已废弃,v1使用的 + */ + translate: null, + + /*js translate.includedLanguages end*/ + /* + * 支持哪些语言切换,包括:de,hi,lt,hr,lv,ht,hu,zh-CN,hy,uk,mg,id,ur,mk,ml,mn,af,mr,uz,ms,el,mt,is,it,my,es,et,eu,ar,pt-PT,ja,ne,az,fa,ro,nl,en-GB,no,be,fi,ru,bg,fr,bs,sd,se,si,sk,sl,ga,sn,so,gd,ca,sq,sr,kk,st,km,kn,sv,ko,sw,gl,zh-TW,pt-BR,co,ta,gu,ky,cs,pa,te,tg,th,la,cy,pl,da,tr + * 已废弃,请使用 translate.selectLanguageTag.languages + */ + includedLanguages: 'zh-CN,zh-TW,en', + /*js translate.includedLanguages end*/ + + /*js translate.resourcesUrl start*/ + /* + * 资源文件url的路径 + * 已废弃,v1使用的 + */ + resourcesUrl: '//res.zvo.cn/translate', + /*js translate.resourcesUrl end*/ + + /*js translate.log start*/ + log: function (obj) { + console.log(obj); + }, + /*js translate.log end*/ + + /** + * 默认出现的选择语言的 select 选择框,可以通过这个选择切换语言。 + */ + selectLanguageTag: { + /* + v3.1 增加,将 select切换语言的选择框赋予哪个id,这里是具体的id的名字。 + 如果这个id不存在,会创建这个id的元素 + */ + documentId: 'translate', + /* 是否显示 select选择语言的选择框,true显示; false不显示。默认为true */ + show: true, + /* + 支持哪些语言切换 + v1.x 版本包括:de,hi,lt,hr,lv,ht,hu,zh-CN,hy,uk,mg,id,ur,mk,ml,mn,af,mr,uz,ms,el,mt,is,it,my,es,et,eu,ar,pt-PT,ja,ne,az,fa,ro,nl,en-GB,no,be,fi,ru,bg,fr,bs,sd,se,si,sk,sl,ga,sn,so,gd,ca,sq,sr,kk,st,km,kn,sv,ko,sw,gl,zh-TW,pt-BR,co,ta,gu,ky,cs,pa,te,tg,th,la,cy,pl,da,tr + v2.x 版本根据后端翻译服务不同,支持的语言也不同。具体支持哪些,可通过 http://api.translate.zvo.cn/doc/language.json.html 获取 (如果您私有部署的,将请求域名换为您自己私有部署的域名) + */ + languages: '', + alreadyRender: false, //当前是否已渲染过了 true为是 v2.2增加 + + changeLanguageBeforeLoadOfflineFile: function (path) { + + }, + + selectOnChange: function (event) { + var language = event.target.value; + translate.changeLanguage(language); + }, + //重新绘制 select 语种下拉选择。比如进行二次开发过translate.js,手动进行了设置 translate.to ,但是手动改动后的,在select语种选择框中并不会自动进行改变,这是就需要手动重新绘制一下 select语种选择的下拉选择框 + refreshRender: function () { + // 获取元素 + let element = document.getElementById(translate.selectLanguageTag.documentId + "SelectLanguage"); + + // 删除元素 + if (element) { + element.parentNode.removeChild(element); + } + + //设置为未 render 状态,允许进行 render + translate.selectLanguageTag.alreadyRender = false; + + translate.selectLanguageTag.render(); + }, + /* + 自定义语种 translate.selectLanguageTag.languages 的处理,进行按顺序筛选出来 + + @param languageList 当前支持的所有语种列表,传入格式如: + [ + {id: 'english', name: 'English', serviceId: 'en'}, + {id: 'korean', name: '한국어', serviceId: 'ko'}, + ... + ] + + 返回值是将当前翻译通道所支持的语种进行按顺序筛选完后的结果返回。 + 比如 + translate.selectLanguageTag.languages = 'english,chinese_simplified,korean'; + 那么这里返回的便是 + + [ + {id: 'english', name: 'English', serviceId: 'en'}, + {id: 'chinese_simplified', name: '简体中文', serviceId: 'zh-CHS'}, + {id: 'korean', name: '한국어', serviceId: 'ko'} + ] + + 如果 translate.selectLanguageTag.languages 未设置,那么这里将返回当前支持的所有语种 + */ + customLanguagesHandle: function (languageList) { + if (translate.selectLanguageTag.languages.length > 0) { + //设置了自定义显示的语言,需要重新根据自定义的语言进行过滤,同时顺序也要保持跟它一致 + + //都转小写判断 + var divLanguages = translate.selectLanguageTag.languages.toLowerCase(); + var divArray = divLanguages.split(','); + + //将支持的语种 languageList 转化为 map 形态 + if (typeof (translate.selectLanguageTag.supportLanguageMap) == 'undefined') { + translate.selectLanguageTag.supportLanguageMap = new Map(); + for (var si = 0; si < languageList.length; si++) { + if (typeof (languageList[si]) != 'undefined' && typeof (languageList[si].id)) { + translate.selectLanguageTag.supportLanguageMap.set(languageList[si].id, languageList[si]); + } + } + //console.log(translate.selectLanguageTag.supportLanguageMap) + } + + + //重新组合要显示的语种 + var newLangs = []; + for (var i = 0; i < divArray.length; i++) { + if (divArray[i].length > 0 && translate.selectLanguageTag.supportLanguageMap.get(divArray[i]) != null) { + newLangs.push(translate.selectLanguageTag.supportLanguageMap.get(divArray[i])); + } + } + return newLangs; + } + + return languageList; + }, + + /* + 自定义切换语言的样式渲染 v3.2.4 增加 + + */ + customUI: function (languageList) { + //select的onchange事件 + var onchange = function (event) { translate.selectLanguageTag.selectOnChange(event); } + + //创建 select 标签 + var selectLanguage = document.createElement("select"); + selectLanguage.id = translate.selectLanguageTag.documentId + 'SelectLanguage'; + selectLanguage.className = translate.selectLanguageTag.documentId + 'SelectLanguage'; + var to = translate.language.getCurrent(); + + + for (var i = 0; i < languageList.length; i++) { + var option = document.createElement("option"); + option.setAttribute("value", languageList[i].id); + + + /*判断默认要选中哪个语言*/ + + if (to != null && typeof (to) != 'undefined' && to.length > 0) { + //设置了目标语言,那就进行判断显示目标语言 + if (to == languageList[i].id) { + option.setAttribute("selected", 'selected'); + } + } else { + //没设置目标语言,那默认选中当前本地的语种 + if (languageList[i].id == translate.language.getLocal()) { + option.setAttribute("selected", 'selected'); + } + } + + option.appendChild(document.createTextNode(languageList[i].name)); + selectLanguage.appendChild(option); + } + //增加 onchange 事件 + if (window.addEventListener) { // Mozilla, Netscape, Firefox + selectLanguage.addEventListener('change', onchange, false); + } else { // IE + selectLanguage.attachEvent('onchange', onchange); + } + + //将select加入进网页显示 + document.getElementById(translate.selectLanguageTag.documentId).appendChild(selectLanguage); + + }, + render: function () { //v2增加 + if (translate.selectLanguageTag.alreadyRender) { + return; + } + translate.selectLanguageTag.alreadyRender = true; + + //判断如果不显示select选择语言,直接就隐藏掉 + if (!translate.selectLanguageTag.show) { + return; + } + + //判断translate 的id是否存在,不存在就创建一个 + if (document.getElementById(translate.selectLanguageTag.documentId) == null) { + var findBody = document.getElementsByTagName('body'); + if (findBody.length == 0) { + translate.log('body tag not find, translate.selectLanguageTag.render() is not show Select Language'); + return; + } + var body_trans = findBody[0]; + var div = document.createElement("div"); //创建一个script标签 + div.id = translate.selectLanguageTag.documentId; + body_trans.appendChild(div); + } else { + //存在,那么判断一下 select是否存在,要是存在就不重复创建了 + if (document.getElementById(translate.selectLanguageTag.documentId + 'SelectLanguage') != null) { + //select存在了,就不重复创建了 + return; + } + } + + //从服务器加载支持的语言库 + if (typeof (translate.request.api.language) == 'string' && translate.request.api.language.length > 0) { + //从接口加载语种 + translate.request.post(translate.request.api.language, {}, function (responseData, requestData) { + if (responseData.result == 0) { + translate.log('load language list error : ' + responseData.info); + return; + } + //console.log(data.list); + translate.request.api.language = responseData.list; //进行缓存,下一次切换语言渲染的时候直接从缓存取,就不用在通过网络加载了 + translate.selectLanguageTag.customUI(translate.selectLanguageTag.customLanguagesHandle(responseData.list)); + }, null); + } else if (typeof (translate.request.api.language) == 'object') { + //无网络环境下,自定义显示语种 + translate.selectLanguageTag.customUI(translate.selectLanguageTag.customLanguagesHandle(translate.request.api.language)); + } + } + }, + + /* + * 当前本地语言 + * 已废弃,v1使用的 + */ + //localLanguage:'zh-CN', + /*js translate.localLanguage start*/ + localLanguage: 'zh-CN', + /*js translate.localLanguage end*/ + + /*js translate.googleTranslateElementInit start*/ + /** + * google翻译执行的 + * 已废弃,v1使用的 + */ + googleTranslateElementInit: function () { + var selectId = ''; + if (document.getElementById('translate') != null) { // && document.getElementById('translate').innerHTML.indexOf('translateSelectLanguage') > 0 + //已经创建过了,存在 + selectId = 'translate'; + } + + translate.translate = new google.translate.TranslateElement( + { + //这参数没用,请忽略 + pageLanguage: 'zh-CN', + //一共80种语言选择,这个是你需要翻译的语言,比如你只需要翻译成越南和英语,这里就只写en,vi + //includedLanguages: 'de,hi,lt,hr,lv,ht,hu,zh-CN,hy,uk,mg,id,ur,mk,ml,mn,af,mr,uz,ms,el,mt,is,it,my,es,et,eu,ar,pt-PT,ja,ne,az,fa,ro,nl,en-GB,no,be,fi,ru,bg,fr,bs,sd,se,si,sk,sl,ga,sn,so,gd,ca,sq,sr,kk,st,km,kn,sv,ko,sw,gl,zh-TW,pt-BR,co,ta,gu,ky,cs,pa,te,tg,th,la,cy,pl,da,tr', + includedLanguages: translate.selectLanguageTag.languages, + //选择语言的样式,这个是面板,还有下拉框的样式,具体的记不到了,找不到api~~ + layout: 0, + //自动显示翻译横幅,就是翻译后顶部出现的那个,有点丑,设置这个属性不起作用的话,请看文章底部的其他方法 + //autoDisplay: false, + //disableAutoTranslation:false, + //还有些其他参数,由于原插件不再维护,找不到详细api了,将就了,实在不行直接上dom操作 + }, + selectId //触发按钮的id + ); + }, + /*js translate.googleTranslateElementInit end*/ + + /** + * 初始化,如加载js、css资源 + * 已废弃,v1使用的 + */ + /* v2.11.11.20240124 彻底注释掉,有新的init方法替代 + init:function(){ + var protocol = window.location.protocol; + if(window.location.protocol == 'file:'){ + //本地的,那就用http + protocol = 'http:'; + } + if(this.resourcesUrl.indexOf('://') == -1){ + //还没设置过,进行设置 + this.resourcesUrl = protocol + this.resourcesUrl; + } + + //this.resourcesUrl = 'file://G:/git/translate'; + + }, + */ + + + /*js translate.execute_v1 start*/ + /** + * 执行翻译操作 + * 已废弃,v1使用的 + */ + execute_v1: function () { + translate.log('=====ERROR======'); + translate.log('The v1 version has been discontinued since 2022. Please use the latest V3 version and refer to: http://translate.zvo.cn/41162.html'); + }, + /*js translate.execute_v1 end*/ + + /*js translate.setCookie start*/ + /** + * 设置Cookie,失效时间一年。 + * @param name + * @param value + * * 已废弃,v1使用的 + */ + setCookie: function (name, value) { + var cookieString = name + "=" + escape(value); + document.cookie = cookieString; + }, + /*js translate.setCookie end*/ + + /*js translate.getCookie start*/ + //获取Cookie。若是不存再,返回空字符串 + //* 已废弃,v1使用的 + getCookie: function (name) { + var strCookie = document.cookie; + var arrCookie = strCookie.split("; "); + for (var i = 0; i < arrCookie.length; i++) { + var arr = arrCookie[i].split("="); + if (arr[0] == name) { + return unescape(arr[1]); + } + } + return ""; + }, + /*js translate.getCookie end*/ + + + /*js translate.currentLanguage start*/ + /* + 获取当前页面采用的是什么语言 + 返回值如 en、zh-CN、zh-TW (如果是第一次用,没有设置过,那么返回的是 translate.localLanguage 设置的值) + 已废弃,v1使用的 + */ + currentLanguage: function () { + //translate.check(); + var cookieValue = translate.getCookie('googtrans'); + if (cookieValue.length > 0) { + return cookieValue.substr(cookieValue.lastIndexOf('/') + 1, cookieValue.length - 1); + } else { + return translate.localLanguage; + } + }, + /*js translate.currentLanguage end*/ + + /** + * 切换语言,比如切换为英语、法语 + * @param languageName 要切换的语言语种。传入如 english + * 会自动根据传入的语言来判断使用哪种版本。比如传入 en、zh-CN 等,则会使用v1.x版本 + * 传入 chinese_simplified 、english 等,则会使用 v2.x版本 + */ + changeLanguage: function (languageName) { + translate.time.log('触发'); + //console.log('changeLanguage -> '+languageName); + //判断使用的是否是v1.x + var v1 = ',en,de,hi,lt,hr,lv,ht,hu,zh-CN,hy,uk,mg,id,ur,mk,ml,mn,af,mr,uz,ms,el,mt,is,it,my,es,et,eu,ar,pt-PT,ja,ne,az,fa,ro,nl,en-GB,no,be,fi,ru,bg,fr,bs,sd,se,si,sk,sl,ga,sn,so,gd,ca,sq,sr,kk,st,km,kn,sv,ko,sw,gl,zh-TW,pt-BR,co,ta,gu,ky,cs,pa,te,tg,th,la,cy,pl,da,tr,'; + if (v1.indexOf(',' + languageName + ',') > -1) { + //用的是v1.x + translate.log('您使用的是v1版本的切换语种方式,v1已在2021年就以废弃,请更换为v2,参考文档: http://translate.zvo.cn/41549.html'); + translate.check(); + + var googtrans = '/' + translate.localLanguage + '/' + languageName; + + //先清空泛解析域名的设置 + var s = document.location.host.split('.'); + if (s.length > 2) { + var fanDomain = s[s.length - 2] + '.' + s[s.length - 1]; + document.cookie = 'googtrans=;expires=' + (new Date(1)) + ';domain=' + fanDomain + ';path=/'; + document.cookie = 'googtrans=' + googtrans + ';domain=' + fanDomain + ';path=/'; + } + + translate.setCookie('googtrans', '' + googtrans); + translate.refreshCurrentPage(); + return; + } + + translate.lifecycle.changeLanguage.trigger_Trigger({ + to: languageName + }); + + + //用的是v2.x或更高 + //translate.setUseVersion2(); + translate.useVersion = 'v2'; + var isReload = false; //标记要刷新页面, true刷新, false不刷新 + //判断是否是第一次翻译,如果是,那就不用刷新页面了。 true则是需要刷新,不是第一次翻译 + if (translate.node.data == null) { + translate.node.data = new Map(); + } + if (translate.node.data.size > 0) { //那当前已经被翻译过 + isReload = true; //标记要刷新页面 + } + + translate.to = languageName; + translate.storage.set('to', languageName); //设置目标翻译语言 + + //判断当前页面是否需要进行翻译,如果需要,那还要对整个页面内容文本进行隐藏处理 + if (translate.visual.webPageLoadTranslateBeforeHiddenText_use) { + //清除 最开始的全部文本隐藏的first记录 + if (typeof (translate.visual.hideText.first_translate_request_uuid) != 'undefined') { + //是第一次翻译请求,记录其uuid + translate.visual.hideText.first_translate_request_uuid = undefined; + } + + //网页打开时自动隐藏文字,翻译完成后显示译文 http://translate.zvo.cn/549731.html + translate.visual.webPageLoadTranslateBeforeHiddenText({ + inHeadTip: false //警告要在head中触发的控制台消息提醒,true是如果发现就打印这个提醒。 默认不设置便是true + }); + } + + + //将翻译进行还原 + translate.reset({ + selectLanguageRefreshRender: false //是否重新渲染select选择语言到原始未翻译前的状态,默认不设置则是true,进行重新渲染 + }); + + + /* + 先触发父级,免得当前刷新了,导致父级不执行翻译了 + */ + //检测当前是否处于iframe中,如果当前是在iframe中,有父级页面,也要触发父级进行翻译 + try { + if (window.self !== window.top) { + if (typeof (window.parent.translate) == 'object' && typeof (window.parent.translate.version) == 'string') { + //iframe页面中存在 translate,那么也控制iframe中的进行翻译 + if (window.parent.translate.to !== languageName) { + //如果父页面当前的语种不是需要翻译的语种,对其进行翻译 + window.parent.translate.changeLanguage(languageName); + } + } + } + } catch (e) { + //增加try,避免异常导致无法用 + translate.log(e); + } + + translate.time.log('父级 iframe 触发changeLanguage完成'); + + translate.to = languageName; + translate.storage.set('to', languageName); //设置目标翻译语言 + + translate.lifecycle.changeLanguage.resetAfter_Trigger({ + to: languageName + }); + + //重新绘制 select 选择语言 + translate.selectLanguageTag.refreshRender(); + + //无刷新切换语言 + isReload = false; + if (isReload) { + location.reload(); //刷新页面 + } else { + //不用刷新,直接翻译 + + translate.execute(); //翻译 + + //检测是否有iframe中的子页面,如果有,也对子页面下发翻译命令。这个是针对 LayuiAdmin 框架的场景适配,它的主体区域是在 iframe 中的,不能点击切换语言后,只翻译外面的大框,而iframe中的不翻译 + const iframes = document.querySelectorAll('iframe'); + for (let i = 0; i < iframes.length; i++) { + const iframe = iframes[i]; + // 获取 iframe 的 window 对象 + const iframeWindow = iframe.contentWindow; + try { + if (typeof (iframeWindow.translate) == 'object' && typeof (iframeWindow.translate.version) == 'string') { + //iframe页面中存在 translate,那么也控制iframe中的进行翻译 + if (iframeWindow.translate.to != languageName) { + iframeWindow.translate.to = languageName; + iframeWindow.translate.storage.set('to', languageName); //设置目标翻译语言 + //iframeWindow.translate.execute(); + iframeWindow.translate.changeLanguage(languageName); + } + } + } catch (e) { + //增加try,避免异常,比如跨域,中断导致无法用 + if (typeof (iframe.src) === 'string') { + translate.log('change sub page iframe exception , iframe src : ' + iframe.src); + } + translate.log(e); + } + } + } + + /* + 放到了 translate.init 中 + //当用户代码设置里启用了 translate.listener.start() 然后用户加载页面后并没有翻译(这时listener是不启动的只是把listener.use标记为true),然后手动点击翻译按钮翻译为其他语种(这是不会刷新页面),翻译后也要跟着启动监听 + if(translate.listener.use == true && translate.listener.isStart == false){ + if(typeof(translate.listener.start) != 'undefined'){ + translate.listener.addListener(); + } + } + */ + }, + + /** + * 自检提示,适用于 v1.x, 在 v2.x中已废弃 + * english + * 已废弃,v1使用的 + */ + /*js translate.check start*/ + check: function () { + if (window.location.protocol == 'file:') { + translate.log('\r\n---WARNING----\r\ntranslate.js 主动翻译组件自检异常,当前协议是file协议,翻译组件要在正常的线上http、https协议下才能正常使用翻译功能\r\n------------'); + } + }, + /*js translate.check end*/ + + + + /**************************** v2.0 */ + to: '', //翻译为的目标语言,如 english 、chinese_simplified + //用户第一次打开网页时,自动判断当前用户所在国家使用的是哪种语言,来自动进行切换为用户所在国家的语种。 + //如果使用后,第二次在用,那就优先以用户所选择的为主,这个就不管用了 + //默认是false,不使用,可设置true:使用 + //使用 setAutoDiscriminateLocalLanguage 进行设置 + autoDiscriminateLocalLanguage: false, + documents: [], //指定要翻译的元素的集合,可设置多个,如设置: document.getElementsByTagName('DIV') + + //翻译时忽略的一些东西,比如忽略某个tag、某个class等 + ignore: { + tag: ['style', 'script', 'link', 'pre', 'code'], + //class:['ignore','translateSelectLanguage'], + class: { + data: ['ignore', 'translateSelectLanguage'], + conditionFunction: { + ignore: function (element) { return true; } + }, + /* + 追加一个忽略翻译的 class name + className 忽略翻译的 class name 的字符串值 + conditionFunction function(element){} 方法,用于呼应 class name 的规则判定 + 其中 element 则是当前扫描到的,已经被 class name 所标记影响范围的某个html元素,针对这个元素进行进一步判定,是否真的忽略对它进行翻译。 + 如果这个方法返回true则是遵循忽略class name 的规则,不对这个传入的element元素进行翻译; + 如果返回false,则是不遵循class name 的规则,没有达到忽略class name 的条件,对于element 这个元素,依旧正常进行翻译,所设置的 class name 对这个 element 这个元素无效。 + 如果不传入 conditionFunction 这个参数,或传入 null ,则默认相当于设置为 function(element){return true;} + */ + push: function (className, conditionFunction) { + if (translate.ignore.class.data.indexOf(className) > -1) { + translate.log('translate.ignore.class.push 设置异常,所设置的 className: ' + className + ' 已存在里面了,所以此次设置被放弃'); + return; + } + translate.ignore.class.data.push(className); + if (conditionFunction === null) { + return; + } + if (typeof (conditionFunction) !== 'function') { + translate.log('translate.ignore.class.push 设置异常,所设置的第二个参数类型不是function,被抛弃'); + return; + } + translate.ignore.class.conditionFunction[className] = conditionFunction; + }, + }, + id: [], + /* + 传入一个元素,判断这个元素是否是被忽略的元素。 这个会找父类,看看父类中是否包含在忽略的之中。 + return true是在忽略的之中,false不再忽略的之中 + */ + isIgnore: function (ele) { + if (ele == null || typeof (ele) == 'undefined') { + return false; + } + if (ele.nodeType === 2) { //是属性,将其转为元素判断,因为当前忽略配置,是针对元素配置的 + ele = ele.ownerElement; + } else if (ele.nodeType === 3) { + //文本节点,转为元素 + ele = ele.parentNode; + } + + var parentNode = ele; + var maxnumber = 100; //最大循环次数,避免死循环 + while (maxnumber-- > 0) { + if (parentNode == null || typeof (parentNode) == 'undefined') { + //没有父元素了 + return false; + } + + //判断Tag + //var tagName = parentNode.nodeName.toLowerCase(); //tag名字,小写 + var nodename = translate.element.getNodeName(parentNode).toLowerCase(); //tag名字,小写 + if (nodename.length > 0) { + //有nodename + if (nodename == 'body' || nodename == 'html' || nodename == '#document') { + //上层元素已经是顶级元素了,那肯定就不是了 + return false; + } + if (translate.ignore.tag.indexOf(nodename) > -1) { + //发现ignore.tag 当前是处于被忽略的 tag + return true; + } + } + + + //判断class name + if (parentNode.className !== null && typeof (parentNode.className) === 'string') { + var classNames = parentNode.className; + if (classNames == null || typeof (classNames) != 'string') { + continue; + } + //console.log('className:'+typeof(classNames)); + //console.log(classNames); + classNames = classNames.trim().split(' '); + for (var c_index = 0; c_index < classNames.length; c_index++) { + if (classNames[c_index] != null && classNames[c_index].trim().length > 0) { + //有效的class name,进行判断 + if (translate.ignore.class.data.indexOf(classNames[c_index]) > -1) { + //发现ignore.class 当前是处于被忽略的 class, 在判定它的 conditionFunction 是否正常 + + if (typeof (translate.ignore.class.conditionFunction[classNames[c_index]]) === 'function') { + return translate.ignore.class.conditionFunction[classNames[c_index]](ele); + } else { + return true; + } + } + } + } + } + + //判断id + if (parentNode.id != null && typeof (parentNode.id) != 'undefined') { + //有效的class name,进行判断 + if (translate.ignore.id.indexOf(parentNode.id) > -1) { + //发现ignore.id 当前是处于被忽略的 id + return true; + } + } + + //赋予判断的元素向上一级 + parentNode = parentNode.parentNode; + } + + return false; + }, + + /* + * 忽略不被翻译的文本,这里出现的文本将不会被翻译。 + * 这个其实是借用了 自定义术语 的能力,设置了自定义术语的原字符等于翻译后的字符, 于是这个字符就不会被翻译了 + * 这里可以是多个,数组,如 ['你好','世界'] + */ + text: [], + /* + 下面的 textRegex 、 setTextRegexs 正则方式设置忽略不翻译text的能力,有 https://github.com/wangliangyu 提交贡献, 弥补 translate.ignore.text 固定设置的不足 + */ + textRegex: [], + /* + 使用方式如: + translate.ignore.setTextRegexs([/请求/g, /[\u4a01-\u4a05]+/g]); + */ + setTextRegexs: function (arr) { + if (!Array.isArray(arr)) throw new Error('参数必须为数组'); + for (let i = 0; i < arr.length; i++) { + if (!(arr[i] instanceof RegExp)) { + throw new Error('第' + i + '项不是RegExp对象'); + } + } + //this.textRegex = [...this.textRegex, ...arr]; + //改为兼容 es5 的方式,提供更多兼容 + this.textRegex = this.textRegex.concat(arr); + }, + }, + //刷新页面,你可以自定义刷新页面的方式,比如在 uniapp 打包生成 apk 时,apk中的刷新页面就不是h5的这个刷新,而是app的刷新方式,就需要自己进行重写这个刷新页面的方法了 + refreshCurrentPage: function () { + location.reload(); + }, + + /* + 判定当前是否使用翻译,也就是使用多语言切换能力 + 注意,它里面会触发 translate.language.getLocal() 进行判定,要保证提前设置了本地语种,或在dom加载完(网页内容已渲染完毕,以便能进行本地语种自动识别)后使用此 + + @param to 要以什么语种显示。 如果不传入,则默认赋予 translate.to + + true:是 + false:否,不需要进行任何翻译 + */ + isTranslate: function (to) { + if (typeof (to) === 'undefined') { + to = translate.to; + } + if (to.length === 0) { + return false; + } + if (to === translate.language.getLocal()) { + if (translate.language.translateLocal) { + return true; + } else { + return false; + } + } else { + return true; + } + }, + + //自定义翻译术语 + nomenclature: { + /* + 术语表 + 一维:要转换的语种,如 english + 二维:翻译至的目标语种,如 english + 三维:要转换的字符串,如 "你好" + 结果:自定义的翻译结果,如 “Hallo” + */ + data: new Array(), + + /* + 原始术语表,可编辑的 + 一维:要自定义目标词 + 二维:针对的是哪个语种 + 值:要翻译为什么内容 + + 其设置如 + var data = new Array(); + data['版本'] = { + english : 'banben', + korean : 'BanBen' + }; + data['国际化'] = { + english : 'guojihua', + korean : 'GuoJiHua' + }; + + 【已过时】 + */ + old_Data: [], + /* + set:function(data){ + translate.nomenclature.data = data; + }, + */ + set: function (data) { + alert('请将 translate.nomenclature.set 更换为 append,具体使用可参考: https://github.com/xnx3/translate '); + }, + /* + 向当前术语库中追加自定义术语。如果追加的数据重复,会自动去重 + 传入参数: + from 要转换的语种 + to 翻译至的目标语种 + properties 属于配置表,格式如: + 你好=Hello + 世界=ShiJie + + */ + append: function (from, to, properties) { + if (typeof (from) == 'undefined' || from == null || from == 'auto') { + //如果from未传入,则自动识别当前页面的语种为from + //如果自动识别,也要确保是页面加载完后,免得放到了head里,那肯定啥也识别不出来 + if (document.body == null) { + translate.log('使用错误!你使用自定义术语 translate.nomenclature.append 时,from 未传值,此时 translate.js 会自动识别当前翻译区域的内容是什么语种,但是你当前吧 translate.nomenclature.append 放在了body之前就加载了,body都还没加载出来,翻译区域当前无内容,所以无法识别当前页面的语种。请将 translate.nomenclature.append 放在翻译内容加载完后再执行 (注意,要将 translate.nomenclature.append 放在 translate.execute() 的前面),建议将 translate.nomenclature.append 放在 跟 之间。'); + } else { + if (document.readyState === 'loading') { + translate.log('使用异常告警:你使用的自定义术语 translate.nomenclature.append 时,from 未传值,此时 translate.js 会自动识别当前翻译区域的内容是什么语种,但页面Dom还未加载完毕时就触发了它,如果翻译区域当前无内容或者内容不是完整的,会造成识别当前页面的语种会有异常不准确,你需要仔细确认这个问题。建议将 translate.nomenclature.append 放在 跟 之间。'); + } + } + + from = translate.language.getLocal(); + } + + if (typeof (translate.nomenclature.data[from]) == 'undefined') { + translate.nomenclature.data[from] = new Array(); + } + if (typeof (translate.nomenclature.data[from][to]) == 'undefined') { + translate.nomenclature.data[from][to] = new Array(); + } + + //将properties进行分析 + //按行拆分 + var line = properties.split('\n'); + //console.log(line) + for (var line_index = 0; line_index < line.length; line_index++) { + var item = line[line_index].trim(); + if (item.length < 1) { + //空行,忽略 + continue; + } + var kvs = item.split('='); + //console.log(kvs) + if (kvs.length != 2) { + //不是key、value构成的,忽略 + continue; + } + var key = kvs[0].trim(); + var value = kvs[1].trim(); + //console.log(key) + if (key.length == 0 || value.length == 0) { + //其中某个有空,则忽略 + continue; + } + + + //加入,如果之前有加入,则会覆盖 + translate.nomenclature.data[from][to][key] = value; + //console.log(local+', '+target+', key:'+key+', value:'+value); + } + + //追加完后,对整个对象数组进行排序,key越大越在前面 + translate.nomenclature.data[from][to] = translate.util.objSort(translate.nomenclature.data[from][to]); + + }, + //获取当前定义的术语表 + get: function () { + return translate.nomenclature.data; + }, + + /** + * 对指定文本进行自定义术语替换 + * 示例: + * translate.nomenclature.replace(['你好我好她也好'],'好','hao', null) + * 结果: + { + find:true, + texts: ['你', '我', '她也'], + resultText: "你hao我hao她也hao" + } + * + * @param text 要进行自定义术语替换的文本 + * @param nomenclatureKey 自定义术语的key + * @param nomenclatureValue 自定义术语的value + * @param nodeObject 要进行替换的节点对象,自定义术语命中后,会直接在这个节点上进行替换显示 + * 如果传入 null,则不进行任何替换操作 + * 如果传入具体的值,则是: + * { + * node: node节点 ,要改动的文字所在的node节点。 如果改动的文字比如是 div 的title中,那么这里传入的node应该是 title 的node,而不是 div 的node + * } + * + * @returns { + * find:false, //是否命中了自定义术语,命中了,则是 true,也代表 textArray 已经不是传入的那个了,已经被处理分割过了 + texts:['你','好'], //针对传入的 textArray 参数,进行术语命中完成后,将命中术语的部分剔除掉,进行分割,所返回的新的textArray + resultText: "你hao我hao她也hao" //对text处理后,替换后的文本 + + } + */ + replace: function (text, nomenclatureKey, nomenclatureValue, nodeObject) { + /* + if(text.trim() == nomenclatureValue.trim()){ + + + + //这里是自定义术语被替换后,重新扫描时扫出来的,那么直接忽略,不做任何处理。因为自定义术语的结果就是最终结果了 + return { + texts:[text], + find:false, + resultText:text + } + } + */ + if (nomenclatureKey.length == 0) { //上个版本有这个,应该不会有这个情况,但是还是保留了 + return { + texts: [text], + find: false, + resultText: text + } + } + + //判断一下原始文本是否有出现在了这个word要翻译的字符串中 + var wordKeyIndex = text.indexOf(nomenclatureKey); + if (wordKeyIndex > -1) { + //出现了,那么需要将其立即进行更改,将自定义术语定义的结果渲染到页面中,并且将 word 要翻译的字符串中,自定义术语部分删除,只翻译除了自定义术语剩余的部分 + + //这里考虑重复替换问题,比如要将 好 替换为 你好 ,如果重复替换,可能会出来 你你你你你好 + //另外还要考虑特殊字符问题,如果用 split 会出现异常 + //注意,可能会出现多个key的情况 + var positions = []; + var pos = wordKeyIndex; + // 当找到 key的文字时继续查找 + while (pos !== -1) { + positions.push(pos); + // 从当前位置的下一个字符开始继续查找 + pos = text.indexOf(nomenclatureKey, pos + 1); + } + // 遍历所有找到的位置,判断是否是已经自定义术语替换后的,如果全部都是替换后的,那么就不需要继续替换了,直接 return 退出,避免重复替换。 + //但是如果只要有一次是没有被替换的,那么都会往下执行,可能会存在重复替换。 + //比如 "你好吗我好吗大家好都好呀" 将 "好" 替换为 “好吗”,这里会替换为 “你好吗吗我好吗吗大家好吗都好吗呀” ,因为最后的俩“好”经过识别,是没有被替换过的,所以这句是要被进行替换执行的,这个整句替换是现有的方法,这个后续可以把提花你方法拆分一下,进行针对性的只针对最后的俩“好”进行精准替换,而不对前面的俩“好吗”在进行替换 + + var texts = new Array(); //它是text经过pos的分割后的数组,要返回的数组 + var resultText = text; //这是有text文本经过将 nomenclatureKey 替换为 nomenclatureValue 之后,得到的新的文本 + var lastPos = text.length; //记录上一个pos的位置 + for (var i = positions.length - 1; i >= 0; i--) { //采用--的方式,保证替换后下标依旧能保持一致 + var itempos = positions[i]; + + //将pos分割之后的文本,加入到 wordSplits 数组中 + texts.unshift(text.substring(itempos + nomenclatureKey.length, lastPos)); + //console.log(pos +' --> '+text.substring(pos + nomenclatureKey.length, lastPos)); + + // 将 text 中 的 pos 下标的文本,也就是从 pos 开始,到pos+nomenclatureKey.length 结束的文本,替换为 nomenclatureValue + resultText = resultText.substring(0, itempos) + nomenclatureValue + resultText.substring(itempos + nomenclatureKey.length); + + lastPos = itempos; + } + if (lastPos > 0) { + //将pos分割之前的文本,加入到 wordSplits 数组中 + texts.unshift(text.substring(0, lastPos)); + } + + //筛选 texts ,将空字符串 length == 0 的剔除 + if (texts.length > 0) { + for (var di = texts.length - 1; di >= 0; di--) { + if (texts[di].length == 0) { + texts.splice(di, 1); + } + } + } + + + //如果是自定义术语的key等于value,则是属于指定的某些文本不进行翻译的情况,所以这里要单独判断一下,它俩不相等才会去进行替换操作,免得进行性能计算浪费 - 虽然这一步是不会到的,因为在这个方法的入口处就已经经过这个判定了 + if (nodeObject != null && typeof (nodeObject.node) !== 'undefined' && nodeObject.node !== null) { + + // 记录此次node的改变是有 translate.js 导致的,避免被dom改变监听给误以为别的引起的 + if (translate.node.get(nodeObject.node) != null) { + translate.node.get(nodeObject.node).lastTranslateRenderTime = Date.now(); + } else { + //这个如果有 translate.js 内部自主触发,肯定不会没有值的。但是如果手动再其他程序里触发,那这个是会没有值的 + } + + if (nomenclatureKey === nomenclatureValue) { + //自定义忽略翻译的文字 ,key 跟 value 相等,便是忽略翻译的 + translate.element.nodeAnalyse.set(nodeObject.node, nomenclatureKey, nomenclatureValue, nodeObject.attribute); + } else { + //自定义术语的 + translate.element.nodeAnalyse.set(nodeObject.node, nomenclatureKey, nomenclatureValue, nodeObject.attribute); + } + } + + return { + texts: texts, + find: true, + resultText: resultText + } + } else { + return { + texts: [text], + find: false, + resultText: text + } + } + }, + //对传入的str字符进行替换,将其中的自定义术语提前进行替换,然后将替换后的结果返回 + /* + 自定义术语 + 示例: + translate.nomenclature.dispose(['你好我好她也好'],'好','hao', null) + 结果: + { + find:true, + texts: ['你', '我', '她也'], + resultText: "你hao我hao她也hao" + } + + @param {*} texts 要进行自定义术语替换的文本数组,传入比如 ["你好","世界"] + @param {*} nomenclatureKey + @param {*} nomenclatureValue + @param {*} nodeObject 要进行替换的节点对象,自定义术语命中后,会直接在这个节点上进行替换显示 + 如果传入 null,则不进行任何替换操作 + 如果传入具体的值,则是: + { + node: node节点 ,要改动的文字所在的node节点。 如果改动的文字比如是 div 的title中,那么这里传入的node应该是 title 的node,而不是 div 的node + } + + + @returns { + find:false, //是否命中了自定义术语,命中了,则是 true,也代表 textArray 已经不是传入的那个了,已经被处理分割过了 + texts:['你','好'], //针对传入的 textArray 参数,进行术语命中完成后,将命中术语的部分剔除掉,进行分割,所返回的新的textArray . 如果没有命中术语,那么这里是只有一个值,那便是返回传入的text + resultText: "你hao我hao她也hao" + } + */ + dispose: function (textArray, nomenclatureKey, nomenclatureValue, nodeObject) { + // 输入验证 + if (!Array.isArray(textArray)) { + textArray = [String(textArray)]; + } + + //这里要调用 translate.nomenclature.replace 方法,对 textArray 中的每个文本进行自定义术语替换处理 + var result = { + find: false + }; + result.texts = new Array(); + result.resultText = new Array(); + for (var i = 0; i < textArray.length; i++) { + var text = textArray[i]; + var res = translate.nomenclature.replace(text, nomenclatureKey, nomenclatureValue, nodeObject); + if (res.find) { + result.find = true; + } + result.texts = result.texts.concat(res.texts); + result.resultText.push(res.resultText); + } + + //对 result.texts 进行去重处理 + if (result.texts.length > 0) { + for (var di = result.texts.length - 1; di >= 0; di--) { + if (result.texts.indexOf(result.texts[di]) != di) { + result.texts.splice(di, 1); + } + } + } + + return result; + + }, + }, + + //已转为 offline ,这个是对旧版做兼容 + office: { + export: function () { + console.log('请使用最新版本的 translate.offline.export , 而不是 translate.office.export'); + }, + showPanel: function () { + console.log('请使用最新版本的 translate.offline.showPanel , 而不是 translate.office.export'); + }, + append: function (to, properties) { + translate.offline.append(to, properties); + }, + fullExtract: { + isUse: false + } + }, + offline: { + /* + 网页上翻译之后,自动导出当前页面的术语库 + + 需要先指定本地语种,会自动将本地语种进行配置术语库 + + */ + export: function () { + if (translate.language.getLocal() == translate.language.getCurrent()) { + alert('本地语种跟要翻译的语种一致,无需导出'); + return; + } + + var text = ''; + for (var uuid in translate.nodeQueue) { + if (!translate.nodeQueue.hasOwnProperty(uuid)) { + continue; + } + + var queueValue = translate.nodeQueue[uuid]; + for (var lang in translate.nodeQueue[uuid].list) { + if (!translate.nodeQueue[uuid].list.hasOwnProperty(lang)) { + continue; + } + //console.log('------'+lang) + if (typeof (lang) != 'string' || lang.length < 1) { + continue; + } + //if(translate.language.getLocal() == lang){ + //console.log(translate.nodeQueue[uuid].list[lang]); + for (var hash in translate.nodeQueue[uuid].list[lang]) { + if (!translate.nodeQueue[uuid].list[lang].hasOwnProperty(hash)) { + continue; + } + + var result = translate.storage.get('hash_' + translate.language.getCurrent() + '_' + hash); + //如果翻译结果不存在,可能是同语种本身就没有翻译,忽略就好了 (因为有个本地语种也强制翻译的能力,所以同语种也放行,在这里进行一次结果判断,免得遗漏同语种也翻译的情况) + if (typeof (result) === 'undefined' || result === null || result.length === 0) { + continue; + } + + //将配置中出现的换行替换为 \n 这个符号 + var lineText = translate.nodeQueue[uuid].list[lang][hash].original + '=' + result; + text = text + '\n' + (lineText.replace(/\n/g, '{\\\\n}')); + } + //} + } + + } + + if (text.length > 0) { + //有内容 + text = 'translate.offline.append(\'' + translate.language.getCurrent() + '\',`' + text + '\n`);'; + //console.log(text); + translate.util.loadMsgJs(); + msg.popups({ + text: '', + width: '750px', + height: '600px', + padding: '1px', + }); + document.getElementById('msgPopupsTextarea').value = text; + } else { + msg.alert('无有效内容!'); + } + + + }, + //显示导出面板 + showPanel: function () { + translate.recycle = function () { }; //重写垃圾回收,弃用 + + let panel = document.createElement('div'); + panel.setAttribute('id', 'translate_export'); + panel.setAttribute('class', 'ignore'); + + //导出按钮 + let button = document.createElement('button'); + button.onclick = function () { + translate.offline.export(); + }; + button.innerHTML = '导出配置信息'; + button.setAttribute('style', 'margin-left: 72px; margin-top: 30px; margin-bottom: 20px; font-size: 25px; background-color: blue; padding: 15px; padding-top: 3px; padding-bottom: 3px; border-radius: 3px;'); + panel.appendChild(button); + + //说明文字 + let textdiv = document.createElement('div'); + textdiv.innerHTML = '1. 首先将当前语种切换为你要翻译的语种
    2. 点击导出按钮,将翻译的配置信息导出
    3. 将导出的配置信息粘贴到代码中,即可完成
    点此进行查阅详细使用说明'; + textdiv.setAttribute('style', 'font-size: 14px; padding: 12px;'); + + panel.appendChild(textdiv); + + panel.setAttribute('style', 'background-color: black; color: #fff; width: 320px; height: 206px; position: fixed; bottom: 50px; right: 50px;'); + //把元素节点添加到body元素节点中成为其子节点,放在body的现有子节点的最后 + document.body.appendChild(panel); + + translate.util.loadMsgJs(); + }, + /* + 追加离线翻译数据。如果追加的数据重复,会自动去重 + 传入参数: + from 要转换的语种 + to 翻译至的目标语种 + properties 属于配置表,格式如: + 你好=Hello + 世界=ShiJie + 这个传入参数跟 translate.nomenclature.append 的传入参数格式是一致的 + */ + append: function (to, properties) { + //console.log(properties) + //将properties进行分析 + //按行拆分 + var line = properties.split('\n'); + //console.log(line) + + //计算前10行,判定当前配置文件的行开头缩进方式 + var lmap = new Map(); + for (var line_index = 0; line_index < line.length && line_index < 10; line_index++) { + const match = line[line_index].match(/^[ \t]+/); + var suojin = match ? match[0] : '0'; //0便是没有空白符缩进 + var sum = 1; //累加次数 + if (typeof (lmap.get(suojin)) !== 'undefined') { + sum = sum + lmap.get(suojin); + } + lmap.set(suojin, sum); + } + + // 核心逻辑:遍历Map找到次数最多的key + let maxCount = 0; // 记录最大次数(初始为0,次数至少为1,不影响) + let maxKey = null; // 记录次数最多的key + + // 方式1:for...of遍历Map.entries()(推荐,直观) + for (const [key, count] of lmap.entries()) { + if (count > maxCount) { + maxCount = count; // 更新最大次数 + maxKey = key; // 更新对应key + } + } + //console.log(lmap); + //console.log(maxKey+' -> '+maxCount); + lmap = null; + + for (var line_index = 0; line_index < line.length; line_index++) { + var item = line[line_index]; + //有缩进,那就需要把行开始的缩进去掉 + if (maxKey !== '0') { + if (line[line_index].startsWith(maxKey)) { + var item = line[line_index].slice(maxKey.length); + } else { + //异常提示告警 + if (line[line_index].trim().length > 0) { + translate.log('WAINING : translate.offline.append 异常,发现某行的配置项缩进异常,这行的缩进应该跟其他行的缩进保持一致!异常的这行配置项为:\n' + item); + } + } + } + if (item.length < 1) { + //空行,忽略 + continue; + } + item = item.replace(/\{\\n\}/g, '\n'); + var kvs = item.split('='); + //console.log(kvs) + if (kvs.length != 2) { + //不是key、value构成的,忽略 + continue; + } + var key = kvs[0]; + var value = kvs[1]; + //console.log(key) + if (key.length == 0 || value.length == 0) { + //其中某个有空,则忽略 + continue; + } + //console.log('set---'+key); + //加入 storate + translate.storage.set('hash_' + to + '_' + translate.util.hash(key), value); + } + }, + + + //全部提取能力(整站的离线翻译数据提取) + fullExtract: { + /*js translate.offline.fullExtract.set start*/ + /* + 将翻译的结果加入 + hash: 翻译前的文本的hash + originalText: 翻以前的文本,原始文本 + toLanguage: 翻译为什么语言 + translateText: 翻译结果的文本 + */ + set: async function (hash, originalText, toLanguage, translateText) { + if (typeof (translate.storage.IndexedDB) == 'undefined') { + translate.log('ERROR: translate.storage.IndexedDB not find'); + return; + } + var obj = await translate.storage.IndexedDB.get('hash_' + hash); + if (typeof (obj) == 'undefined' && obj == null) { + obj = { + originalText: originalText + }; + } + obj[toLanguage] = translateText; + await translate.storage.IndexedDB.set('hash_' + hash, obj); + }, + /*js translate.offline.fullExtract.set end*/ + + /*js translate.offline.fullExtract.export start*/ + /* + 将存储的数据导出为 txt 文件下载下来 + */ + export: async function (to) { + if (typeof (translate.storage.IndexedDB) == 'undefined') { + translate.log('ERROR: translate.storage.IndexedDB not find'); + return; + } + if (typeof (to) != 'string') { + translate.log('error : to param not find, example: "english"'); + return; + } + var text = 'translate.offline.append(\'' + to + '\',`'; + + var data = await translate.storage.IndexedDB.list('hash_*'); + for (var i in data) { + if (!data.hasOwnProperty(i)) { + continue; + } + //var originalText = data[i].value.originalText.replace(/\n/g, "\\n").replace(/\t/g, "\\t"); + //text = text + '\n' + originalText + '='+data[i].value.english.replace(/\n/g, "\\n").replace(/\t/g, "\\t"); + + //如果翻译结果不存在,可能是同语种本身就没有翻译,忽略就好了 (因为有个本地语种也强制翻译的能力,所以同语种也放行,在这里进行一次结果判断,免得遗漏同语种也翻译的情况) + if (typeof (data[i].value) === 'undefined' || typeof (data[i].value[to]) === 'undefined' || data[i].value[to] === null || data[i].value[to].trim().length === 0) { + continue; + } + + var lineText = data[i].value.originalText + '=' + data[i].value[to]; + text = text + '\n' + (lineText.replace(/\n/g, '{\\\\n}')); + } + text = text + '\n`);' + + const blob = new Blob([text], { type: "text/plain" }); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = to + ".txt"; + link.click(); + URL.revokeObjectURL(url); + }, + /*js translate.offline.fullExtract.export end*/ + + /* + 是否启用全部提取的能力 + true: 启用, 默认是false不启用。 + 如果设置为true,则每次通过调用翻译接口进行翻译后,都会将翻译的原文、译文、翻译为什么语种,都会单独记录一次,存入浏览器的 IndexedDB 的 translate.js 数据库 + 然后可以浏览所有页面后,把所有翻译一对一的对应翻译结果直接全部导出,用于做离线翻译配置使用。 + */ + isUse: false, + } + }, + setAutoDiscriminateLocalLanguage: function () { + translate.autoDiscriminateLocalLanguage = true; + }, + /* + 待翻译的页面的node队列 + 一维:key:uuid,也就是execute每次执行都会创建一个翻译队列,这个是翻译队列的唯一标识。 + value: + k/v + 二维:对象形态,具体有: + key:expireTime 当前一维数组key的过期时间,到达过期时间会自动删除掉这个一维数组。如果<0则代表永不删除,常驻内存 + value:list 从DOM中自动识别出的语言文本及节点数据,按照语种进行了划分,每个语种便是其中的一项。 + 三维:针对二维的value, key:english、chinese_simplified等语种,这里的key便是对value的判断,取value中的要翻译的词是什么语种,对其进行了语种分类 value: k/v + 四维:针对三维的value, key:要翻译的词(经过语种分割的)的hash, value: node数组 + 五维:针对四维的value, 这是个对象, 其中 + original: 是三维的key的hash的原始文字, node 元素中的原始文字(可能是node元素整个内容,也可能是被分割出的某一块内容,比如中英文混合时单独提取中文) + cacheHash: 如果翻译时匹配到了自定义术语库中的词,那么翻译完后存入到缓存中时,其缓存的翻译前字符串已经不是original,而是匹配完术语库后的文本的hash了。所以这里额外多增加了这个属性。如果匹配了术语库,那这里就是要进行缓存的翻译前文本的hash,如果未使用术语库,这里就跟其key-hash 相同。 + translateText: 针对 original 的经过加工过的文字,比如经过自定义术语、以及其他处理操作后的,待进行文本翻译的文字。 + nodes: 有哪些node元素中包含了这个词,都会在这里记录 + 六维:针对五维的 nodes,将各个具体的 node 以及 其操作的 attribute 以数组形式列出 + 七维:针对六维列出的nodes数组,其中包含: + node: 具体操作的node元素 + attribute: 也就是翻译文本针对的是什么,是node本身(nodeValue),还是 node 的某个属性,比如title属性,这则是设置为 "title"。如果这里不为空,那就是针对的属性操作的。 如果这里为空或者undefined ,那就是针对node本身,也就是 nodeValue 的字符串操作的 + beforeText: node元素中进行翻译结果赋予时,额外在翻译结果的前面加上的字符串。其应用场景为,如果中英文混合场景下,避免中文跟英文挨着导致翻译为英语后,连到一块了。默认是空字符串 '' + afterText: node元素中进行翻译结果赋予时,额外在翻译结果的后面加上的字符串。其应用场景为,如果中英文混合场景下,避免中文跟英文挨着导致翻译为英语后,连到一块了。默认是空字符串 '' + + 生命周期: 当execute()执行时创建, 当execute结束(其中的所有request接收到响应并渲染完毕)时销毁(当前暂时不销毁,以方便调试) + */ + nodeQueue: {}, + //指定要翻译的元素的集合,可传入一个元素或多个元素 + //如设置一个元素,可传入如: document.getElementById('test') + //如设置多个元素,可传入如: document.getElementsByTagName('DIV') + setDocuments: function (documents) { + if (documents == null || typeof (documents) == 'undefined') { + return; + } + + if (typeof (documents.length) == 'undefined') { + //不是数组,是单个元素 + translate.documents[0] = documents; + } else { + //是数组,直接赋予 + for (var i = 0; i < documents.length; i++) { + if (typeof (documents[i]) === 'undefined' || documents[i] === null) { + //这个元素不存在,从这里面删除掉 + documents.splice(i, 1); + } + } + + if (documents.length > 0) { + translate.documents = documents; + } + } + //清空翻译队列,下次翻译时重新检索 + translate.nodeQueue = {}; + //console.log('set documents , clear translate.nodeQueue'); + }, + //获取当前指定翻译的元素(数组形式 [document,document,...]) + //如果用户未使用setDocuments 指定的,那么返回整个网页 + //它返回的永远是个数组形式 + getDocuments: function () { + if (translate.documents != null && typeof (translate.documents) != 'undefined' && translate.documents.length > 0) { + // setDocuments 指定的 + return translate.documents; + } else { + //未使用 setDocuments指定,那就是整个网页了 + //return document.all; //翻译所有的 这是 v3.5.0之前的 + //v3.5.0 之后采用 拿 html的最上层的demo,而不是 document.all 拿到可能几千个dom + var doms = new Array(); + doms[0] = document.documentElement; + return doms; + } + }, + + listener: { + //当前页面打开后,是否已经执行完execute() 方法进行翻译了,只要执行完一次,这里便是true。 (多种语言的API请求完毕并已渲染html) + //isExecuteFinish:false, + //是否已经使用了 translate.listener.start() 了,如果使用了,那这里为true,多次调用 translate.listener.start() 只有第一次有效 + isStart: false, + //用户的代码里是否启用了 translate.listener.start() ,true:启用 + //当用户加载页面后,但是未启用翻译时,为了降低性能,监听是不会启动的,但是用户手动点击翻译后,也要把监听启动起来,所以就加了这个参数,来表示当前是否在代码里启用了监听,以便当触发翻译时,监听也跟着触发 + use: false, + + //针对 input 的 value 监听情况, 它无法用dom监控,针对像是 vant 框架,要用 input 的 value 进行作为内容显示的,就要采用这种方式来监听变动并翻译了 + input: { + /* + 原生value属性描述符 + 如果为null,则是还没对input的value进行监听。 + 如果已进行监听,会把原本的 value 改变的 set ... 赋予这里。 + */ + originalValueDescriptor: null, + + /* + 启动对 input value 变动的监听及翻译 + */ + start: function () { + if (translate.listener.input.originalValueDescriptor !== null) { + console.log('已启动过了,无需在启动'); + return; + } + + // 1. 保存原生value属性描述符 + translate.listener.input.originalValueDescriptor = Object.getOwnPropertyDescriptor( + HTMLInputElement.prototype, + 'value' + ); + + // 2. 重写HTMLInputElement原型的value setter(影响所有input) + Object.defineProperty(HTMLInputElement.prototype, 'value', { + ...translate.listener.input.originalValueDescriptor, + set(newValue) { + const oldValue = this.value; // this指向当前被修改的input + + // 执行原生赋值 + translate.listener.input.originalValueDescriptor.set.call(this, newValue); + + // 值变化时触发逻辑 + if (newValue !== oldValue) { + //console.log(`JS修改了input值:`); + //console.log(` 旧值=${oldValue} → 新值=${newValue}`); + //console.log(this) + + //如果有 translate.node 历史,要根据历史判定一下,如果当前不是translate.js 导致的改变,那就是其他js触发的,那么将其删掉,这样才能触发它重新翻译 + if (translate.node.find(this)) { + var nodeData = translate.node.get(this); + + if (typeof (nodeData.lastTranslateRenderTime) === 'number' && Date.now() - nodeData.lastTranslateRenderTime < 100) { + //小于100毫秒,这是 translate.js 引起的改动,不需要任何处理 + } else { + //不是 translate.js 引起的,那么需要进行翻译 + //删掉当前的记录,以便能正常扫描加入翻译 + translate.node.delete(this); + } + + } + translate.execute([this]); + } + } + }); + + }, + + /* + 当启动对input value监听时,如果切换回源语种了且本地语种并不强制翻译,那么就不需要再翻译了,还原回来,避免性能浪费。 + 也就是相当于对 translate.listener.input.start() 触发后的还原 + */ + reset: function () { + if (translate.listener.input.originalValueDescriptor === null) { + return; + } + + // 1. 还原HTMLInputElement原型的原生value属性描述符 + Object.defineProperty( + HTMLInputElement.prototype, + 'value', + translate.listener.input.originalValueDescriptor + ); + + // 2. 重置标记为未监听状态,允许后续重新启动监听 + translate.listener.input.originalValueDescriptor = null; + } + + + }, + + + //translate.listener.start(); //开启html页面变化的监控,对变化部分会进行自动翻译。注意,这里变化区域,是指使用 translate.setDocuments(...) 设置的区域。如果未设置,那么为监控整个网页的变化 + start: function () { + if (typeof (translate.temp_listenerStartInterval) != 'undefined') { + //已经触发过一次了,不需要再触发了 + return; + } + translate.listener.use = true; + + /* + 放到了 translate.init 中 + translate.temp_listenerStartInterval = setInterval(function(){ + if(document.readyState == 'complete'){ + //dom加载完成,进行启动 + + // 先判断定时器是否已被清除(防止重复执行) + if (!translate.temp_listenerStartInterval){ + return; + } + + clearInterval(translate.temp_listenerStartInterval);//停止 + + //如果不需要翻译的情况,是不需要进行监听的 + if(translate.language.getCurrent() == translate.language.getLocal()){ + if(translate.language.translateLocal){ + //本地语种也要强制翻译跟本地语种不一致的语种 + }else{ + //console.log('本地语种跟目标语种一致,不进行翻译操作,无需监听。'); + return; + } + } + + //console.log('进行监听。。'); + translate.listener.addListener(); + } + + }, 300); + */ + + }, + /* + 对 dom 动态监听进行还原操作,还原到未监听时的状态,进行还原 + */ + reset: function () { + + //清除 translate.listener + if (typeof (translate.listener.observer) != 'undefined' && translate.listener.observer != null) { + translate.listener.observer.disconnect(); + } + + //设置为未启动 + if (translate.listener.isStart) { + translate.listener.isStart = false; + } + + //还原 input value 监听 + translate.listener.input.reset(); + }, + + /* + 用于监听发生改变的这个 node 是否有正常需要翻译的内容、以及是否是非translate.js触发的需要被翻译。 + 注意,传入进行判断的node中的文本必须是 node.nodeValue ,也就是这个必须是 node.nodeType == 2(某个元素的属性,比如 input 的 placeholder) 或 3(文本节点), 这样他们才会有正常的 node.nodeValue,而且文本也存在于 node.nodeValue 中 + 比如 div title="你好" ,要对 title 的 你好 这个值进行判定,传入的node必须是 title 的 node,而非 div 的 node + 它主要是为了给 translate.listener.addListener 中的动态监听node改变所服务的 + + @param node 要判断的这个是否需要触发翻译的node + @return boolean true:需要触发 translate.execute(node) 进行翻译 + */ + nodeValueChangeNeedTranslate: function (node) { + if (typeof (node) === 'undefined' || node === null) { + return false; + } + + //是否是要加入翻译扫描触发执行,是则是true + var addTranslateExecute = true; + + /* + 不会进入翻译的情况 - + 1. 认为是有 translate.js 本身翻译导致的改变,不进行翻译 + 取 translate.node.data 中的数据,当改变的node节点在其中找到了对应的数据后,进行判定 + 1. 是整体翻译,且当前node改变后的内容,跟上次翻译后的结果一样,那说明当前node改变事件 + 2. 不是整体翻译,可能是触发自定义术语、或直接没启用整体翻译能力,那就要根据最后翻译时间这个来判定了。如果这个node元素,已经被翻译过了,最后一次翻译渲染时间,距离当前时间不超过500毫秒 + 2. 其他的情况如果后续发现有遗漏,再加入,当前没有这种考虑 + */ + if (translate.node.get(node) != null) { + //根据现实结果来判断是否是有translate.js 本身翻译导致的dom改变 + if (typeof (translate.node.get(node).translateResults) !== 'undefined' && typeof (translate.node.get(node).translateResults[node.nodeValue]) === 'number') { + //是translate.js翻译导致的dom文字改变 + addTranslateExecute = false; + } + + if (addTranslateExecute === true) { + if (typeof (translate.node.get(node).whole) !== 'undefined' && translate.node.get(node).whole === true) { + //整体翻译 + if (typeof (translate.node.get(node).resultText) !== 'undefined' && translate.node.get(node).resultText === node.nodeValue) { + //当前改变后的内容,跟上次翻译后的结果一样,那说明当前node改变事件,是有translate.js 本身翻译导致的,不进行翻译 + addTranslateExecute = false; + } + } else { + //不是整体翻译,可能是触发自定义术语、或直接没启用整体翻译能力 + + //这就要根据最后翻译时间这个来判定了 -- 这个计划要剔除,因为本身在 translate.node.get(node).translateResults 已经判定了,这个属于重复判定。 这个先留一段时间 + if (typeof (translate.node.get(node).lastTranslateRenderTime) === 'number' && translate.node.get(node).lastTranslateRenderTime + 30 > Date.now()) { + //如果这个node元素,已经被翻译过了,最后一次翻译渲染时间,距离当前时间不超过500毫秒,那认为这个元素动态改变,是有translate.js 本身引起的,将不做任何动作 + addTranslateExecute = false; + } + } + } + } + + //如果新的里面没有非空白字符的值,那也不再触发翻译 + if (addTranslateExecute === true) { + if (node.nodeValue.trim().length === 0) { + addTranslateExecute = false; + } + } + + return addTranslateExecute; + }, + + + //增加监听,开始监听。这个不要直接调用,需要使用上面的 start() 开启 + addListener: function () { + if (translate.listener.isStart == true) { + //console.log('translate.listener.start() 已经启动了,无需再重复启动监听,增加浏览器负担'); + return; + } + translate.listener.isStart = true; //记录已执行过启动方法了 + //console.log('translate.listener.addListener() ...'); + + // 观察器的配置(需要观察什么变动) + translate.listener.config = { attributes: true, childList: true, subtree: true, characterData: true, attributeOldValue: true, characterDataOldValue: true }; + // 当观察到变动时执行的回调函数 + translate.listener.callback = function (mutationsList, observer) { + var documents = []; //有变动的元素 + //console.log('--------- lisetner 变动'); + //console.log(mutationsList); + // Use traditional 'for loops' for IE 11 + for (let mutation of mutationsList) { + let addNodes = []; + if (mutation.type === 'childList') { + if (mutation.addedNodes.length > 0) { + //多了组件 + for (var ani = 0; ani < mutation.addedNodes.length; ani++) { + var addNodeName = translate.element.getNodeName(mutation.addedNodes[ani]).toLowerCase(); + if (addNodeName === 'iframe') { //如果是iframe,还要进行注入进去翻译 + //console.log(mutation.addedNodes[ani]); + if (typeof (translate.element.iframe) !== 'undefined') { + translate.element.iframe.execute(mutation.addedNodes[ani]); + } + } + if (addNodeName.length > 0 && translate.ignore.tag.indexOf(addNodeName) == -1) { + addNodes.push(mutation.addedNodes[ani]); + } + } + //addNodes = mutation.addedNodes; + //documents.push.apply(documents, mutation.addedNodes); + } + if (mutation.removedNodes.length > 0) { + //console.log('remove:'); + //console.log(mutation.removedNodes); + for (var ri = 0; ri < mutation.removedNodes.length; ri++) { + //console.log('listener -- mutation.type === childList -- delete node ----: '); + //console.log(mutation.removedNodes[ri]); + translate.node.delete(mutation.removedNodes[ri]); //删除掉被dom给移除的节点,比如执行了 InnerHTML 操作的元素会自动删除 + } + } + } else if (mutation.type === 'attributes') { + if (mutation.attributeName === 'class' || mutation.attributeName === 'style') { + //如果是class/ style 这种常见的,不做任何改变,直接跳出 + continue; + } + + /* + 这里要判断一些允许翻译的属性 + input 的 placeholder 属性 ,直接判断 placeholder 就行了,也就 input、textarea 有这个属性 + img 的 alt 属性 + 所有标签的 title 属性 + */ + + if (mutation.attributeName === 'placeholder' || mutation.attributeName === 'alt' || mutation.attributeName === 'title') { + //允许翻译 + } else { + + var nodeNameLowerCase = mutation.target.nodeName.toLowerCase(); + + //判断是否是 iframe 的,允许翻译 + if (nodeNameLowerCase === 'iframe' && typeof (mutation.attributeName) === 'string' && mutation.attributeName.toLowerCase() === 'src') { + //iframe 改变了src,那么iframe会重新加载新网页,针对这个新网页,也要监听 + if (typeof (translate.element.iframe) !== 'undefined') { + translate.element.iframe.execute(mutation.target); + } + } + + + //判断是否是 translate.element.tagAttribute 自定义翻译属性的 + var divTagAttribute = translate.element.tagAttribute[nodeNameLowerCase]; + //console.log('divTagAttribute:'+divTagAttribute); + if (typeof (divTagAttribute) !== 'undefined' && divTagAttribute.attribute.indexOf(mutation.attributeName) > -1 && divTagAttribute.condition(mutation.target)) { + //是自定义翻译这个属性的,以及判定是否达到翻译条件 + //条件满足,允许翻译 + } else { + //条件不满足,不在翻译的属性范围 + continue; + } + + } + + //这里出现的 mutation.target 是定位到了元素上面,而不是变化的这个 attributes 属性上,需要用 mutation.attributeName 获取到这个属性的node + var node = mutation.target.getAttributeNode(mutation.attributeName); + + //是否是要加入翻译扫描触发执行,是则是true + var addTranslateExecute = translate.listener.nodeValueChangeNeedTranslate(node); + if (addTranslateExecute) { //不是 translate.js 翻译引起的改变,那么 + //console.log('listener attributes change ' + mutation.target.nodeName+'['+ mutation.attributeName + '] '+mutation.oldValue+' --> '+node.nodeValue); + translate.node.delete(node); + addNodes = [node]; //将这个属性转为的node加入待翻译 + } + } else if (mutation.type === 'characterData') { + //内容改变 + + //是否是要加入翻译扫描触发执行,是则是true + var addTranslateExecute = translate.listener.nodeValueChangeNeedTranslate(mutation.target); + + if (addTranslateExecute) { //不是 translate.js 翻译引起的改变,那么 + translate.node.delete(mutation.target); + addNodes = [mutation.target]; //将重新触发 translate.execute(); + //console.log('listener - mutation.type === \'characterData\' , node: '); + //console.log(mutation.target) + } + + //documents.push.apply(documents, [mutation.target]); + } + + //去重并加入 documents + for (let item of addNodes) { + //console.log(item); + + //判断是否已经加入过了,如果已经加入过了,就不重复加了 + var isFind = false; + for (var di = 0; di < documents.length; di++) { + if (documents[di].isSameNode(item)) { + isFind = true; + break; + } + } + if (isFind) { + break; + } + documents.push.apply(documents, [item]); + } + } + + if (documents.length > 0) { + //有变动,需要看看是否需要翻译,延迟10毫秒执行 + translate.time.log('监听到元素发生变化,' + documents.length + '个元素'); + translate.execute(documents); + } + }; + // 创建一个观察器实例并传入回调函数 + translate.listener.observer = new MutationObserver(translate.listener.callback); + // 以上述配置开始观察目标节点 + var docs = translate.getDocuments(); + for (var docs_index = 0; docs_index < docs.length; docs_index++) { + var doc = docs[docs_index]; + if (doc != null) { + translate.listener.observer.observe(doc, translate.listener.config); + } + } + + + //如果要对 input 的value进行翻译,那么还要监听 input 的 value 的值 + if (typeof (translate.element.tagAttribute['input']) === 'object' && translate.element.tagAttribute['input'].attribute.indexOf('value') > -1) { + translate.listener.input.start(); + } + + + }, + /* + 每当执行完一次渲染任务(翻译)时会触发此。注意页面一次翻译会触发多个渲染任务。普通情况下,一次页面的翻译可能会触发两三次渲染任务。 + 另外如果页面中有ajax交互方面的信息,时,每次ajax信息刷新后,也会进行翻译,也是一次渲染任务。 + 这个是为了方便扩展使用。比如在layui中扩展,监控 select 的渲染 + */ + renderTaskFinish: function (renderTask) { + //console.log(renderTask); + }, + + /* + 翻译执行过程中,相关的监控 + */ + execute: { + + /* + 每当触发执行 translate.execute() 时,当缓存中未发现,需要请求翻译API进行翻译时,在发送API请求前,触发此 + + @param uuid:translate.nodeQueue[uuid] 这里的 + @param from 来源语种,翻译前的语种 + @param to 翻译为的语种 + */ + renderStartByApi: [], + renderStartByApiRun: function (uuid, from, to) { + //console.log(translate.nodeQueue[uuid]); + for (var i = 0; i < translate.listener.execute.renderStartByApi.length; i++) { + try { + translate.listener.execute.renderStartByApi[i](uuid, from, to); + } catch (e) { + translate.log(e); + } + } + }, + + /* + 每当 translate.execute() 执行完毕(前提是采用API翻译的,API将翻译结果返回,并且界面上的翻译结果也已经渲染完毕)后,触发此方法。 + + @param uuid:translate.nodeQueue[uuid] 这里的 + @param from 来源语种,翻译前的语种 + @param to 翻译为的语种 + */ + renderFinishByApi: [], + renderFinishByApiRun: function (uuid, from, to) { + //console.log(translate.nodeQueue[uuid]); + for (var i = 0; i < translate.listener.execute.renderFinishByApi.length; i++) { + try { + translate.listener.execute.renderFinishByApi[i](uuid, from, to); + } catch (e) { + translate.log(e); + } + } + } + } + + }, + //对翻译结果进行替换渲染的任务,将待翻译内容替换为翻译内容的过程 + renderTask: class { + constructor() { + /* + * 任务列表 + * map + * key: node + * value: [task,task,...] 是多个task的数组集合,存放多个 task,每个task是一个替换。这里的数组是同一个nodeValue的多个task替换 + * 每个 task: + task['originalText'] + task['resultText'] 存放要替换的字符串 + task['attribute'] 存放要替换的属性,比如 a标签的title属性。 如果是直接替换node.nodeValue ,那这个没有 + */ + this.taskQueue = new Map(); + + /* + * 要进行翻译的node元素, + * 一维数组 key:node.nodeValue 的 hash , value:node的元素数组 + * 二维数组,也就是value中包含的node集合 [node,node,...] + */ + this.nodes = []; + } + + /** + * 向替换队列中增加替换任务 + * node:要替换的字符属于那个node元素 + * originalText:待翻译的字符 + * resultText:翻译后的结果字符 + * attribute: 要替换的是哪个属性,比如 a标签的title属性,这里便是传入title。如果不是替换属性,这里不用传入,或者传入null + * participles: 分词,数组形态。默认不传则是没有其他分词需要保留的。 传入比如 ['你好','你是谁'] + 比如 translateOriginal 传入 '你' 时, text 中的 '你好','你是谁' 是不能被拆出'你'这个字进行替换的,不然就破坏了分词了 + */ + add(node, originalText, resultText, attribute, participles) { + //console.log('renderTask.add : originalText:'+originalText+', resultText:'+resultText+', attribute:'+attribute+', node:'); + //console.log(node); + var nodeAnaly = translate.element.nodeAnalyse.get(node, attribute); //node解析 + //var hash = translate.util.hash(translate.element.getTextByNode(node)); //node中内容的hash + var hash = translate.util.hash(nodeAnaly['text']); + //console.log('--------------'+hash); + //console.log(nodeAnaly); + + /****** 加入翻译的元素队列 */ + if (typeof (this.nodes[hash]) == 'undefined') { + this.nodes[hash] = new Array(); + } + this.nodes[hash].push(node); + //console.log(node) + + /****** 加入翻译的任务队列 */ + //var tasks = this.taskQueue[hash]; + var tasks = this.taskQueue.get(node); + if (tasks == null || typeof (tasks) == 'undefined') { + //console.log(node.nodeValue); + tasks = new Array(); //任务列表,存放多个 task,每个task是一个替换。这里的数组是同一个nodeValue的多个task替换 + } + var task = new Array(); + + //v2.3.3 增加 -- 开始 + //这里要进行处理,因为有时候翻译前,它前或者后是有空格的,但是翻译后会把前或者后的空格给自动弄没了,如果是这种情况,要手动补上 + if (originalText.substr(0, 1) == ' ') { + //console.log('第一个字符是空格'); + if (resultText.substr(0, 1) != ' ') { + //翻译结果的第一个字符不是空格,那么补上 + resultText = ' ' + resultText; + } + } + if (originalText.substr(originalText.length - 1, 1) === ' ') { + //console.log('最后一个字符是空格'); + if (resultText.substr(0, 1) != ' ') { + //翻译结果的最后一个字符不是空格,那么补上 + resultText = resultText + ' '; + } + } + //v2.3.3 增加 -- 结束 + + task['originalText'] = originalText; + task['resultText'] = resultText; + task['attribute'] = attribute; + task['participles'] = participles; + + + //console.log(task); + tasks.push(task); + //this.taskQueue[hash] = tasks; + this.taskQueue.set(node, tasks); + /****** 加入翻译的任务队列 end */ + } + //进行替换渲染任务,对页面进行渲染替换翻译 + execute() { + //先对tasks任务队列的替换词进行排序,将同一个node的替换词有大到小排列,避免先替换了小的,大的替换时找不到 + //for(var hash in this.taskQueue){ + for (let node of this.taskQueue.keys()) { + var tasks = this.taskQueue.get(node); + if (tasks == null) { + continue; + } + if (typeof (tasks) == 'function') { + //进行异常的预处理调出 + continue; + } + + //进行排序,将原字符串长的放前面,避免造成有部分不翻译的情况(bug是先翻译了短的,导致长的被打断而无法进行适配) + tasks.sort((a, b) => b.originalText.length - a.originalText.length); + + //this.taskQueue[hash] = tasks; + this.taskQueue.set(node, tasks); + } + + //console.log('===========task========='); + //console.log(this.taskQueue); + //console.log(this.nodes); + //console.log('===========task======end==='); + + + //对nodeQueue进行翻译 + for (var hash in this.nodes) { + if (!this.nodes.hasOwnProperty(hash)) { + continue; + } + + //var tasks = this.taskQueue[hash]; //取出当前node元素对应的替换任务 + //var tagName = this.nodes[hash][0].nodeName; //以下节点的tag name + //console.log(tasks); + for (var node_index = 0; node_index < this.nodes[hash].length; node_index++) { + //当前翻译的node + var node = this.nodes[hash][node_index]; + + //取出当前node元素对应的替换任务 + var tasks = this.taskQueue.get(node); + //console.log(tasks); + if (tasks == null) { + translate.log('WARNING : renderTask.execute 中,this.taskQueue.get(node) == null ,理论上要进行替换任务,就应该会有内容的,数据在理论上出现异常'); + continue; + } + + //对这个node元素进行替换翻译字符 + for (var task_index = 0; task_index < tasks.length; task_index++) { + var task = tasks[task_index]; + if (typeof (tasks) == 'function') { + //进行异常的预处理调出 + continue; + } + + + // translate.node 记录 + + var translateNode = null; //当前操作的,要记录入 translate.node 中的,进行翻译的node + var translateNode_attribute = ''; //当前操作的是node中的哪个attribute,如果没有是node本身则是空字符串 + if (typeof (task['attribute']) === 'string' && task['attribute'].length > 0) { + //当前渲染任务是针对的元素的某个属性,这是要取出这个元素的具体属性,作为一个目的 node 来进行加入 translate.node + //是操作的元素的某个属性,这时要判断 是否是 input、textarea 的value属性 + if (task['attribute'] === 'value') { + var nodeNameLowerCase = translate.element.getNodeName(this.nodes[hash][node_index]).toLowerCase(); + if ((nodeNameLowerCase === 'input' || nodeNameLowerCase === 'textarea')) { + translateNode = this.nodes[hash][node_index]; + translateNode_attribute = 'value'; + } + } + if (translateNode === null) { + translateNode = this.nodes[hash][node_index].getAttributeNode(task['attribute']); + translateNode_attribute = task['attribute']; + } + } else { + //操作的就是node本身 + translateNode = this.nodes[hash][node_index]; + } + //console.log(translateNode) + //var nodeAttribute = translate.node.getAttribute(task['attribute']); + if (typeof (translate.node.data.get(translateNode)) === 'undefined' || translate.node.data.get(translateNode) === null) { + translate.log('执行异常,渲染时,node 未在 translate.node 中找到, 这个很有可能是点击过快,上一个翻译任务还在网络请求中,又点击了别的地方导致内容又被改变。当前异常已被容错。 node:'); + translate.log(translateNode); + + var getNodeText = translate.element.nodeAnalyse.get(node, task['attribute']); + translate.node.set(translateNode, { + attribute: translateNode_attribute, + originalText: getNodeText.text, + whole: true, + translateTexts: {} + }); + translate.node.setModified(translateNode, 'create:translate.renderTask.execute'); + } + + // 记录当前有 translate.js 所触发翻译之后渲染到dom界面显示的时间,13位时间戳 + translate.node.get(translateNode).lastTranslateRenderTime = Date.now(); + + + //渲染页面进行翻译显示 + //console.log(task.originalText+' ('+task['attribute']+') --> ' + task.resultText+', node:'); + //console.log(node); + //console.log(typeof(task['participles']) === 'undefined'? []:task['participles']) + var analyseSet = translate.element.nodeAnalyse.set(node, task.originalText, task.resultText, task['attribute'], typeof (task['participles']) === 'undefined' ? [] : task['participles']); + //console.log(analyseSet); + + if (translate.node.data.get(translateNode) != null) { + //将具体通过文本翻译接口进行翻译的文本记录到 translate.node.data + translate.node.get(translateNode).translateTexts[task.originalText] = task.resultText; + //将翻译完成后要显示出的文本进行记录 + translate.node.get(translateNode).resultText = analyseSet.resultText; + + //将其加入 translate.history.translateTexts + translate.history.translateText.add(translate.node.get(translateNode).originalText, analyseSet.resultText); + } + + + /* + //var tagName = translate.element.getTagNameByNode(this.nodes[hash][task_index]);//节点的tag name + //console.log(tagName) + //console.log(this.nodes[hash][task_index]) + //var tagName = this.nodes[hash][task_index].nodeName; //节点的tag name + var nodename = translate.element.getNodeName(this.nodes[hash][task_index]); + + //console.log(this.nodes[hash][task_index]+', '+task.originalText+', '+task.resultText+', tagName:'+tagName); + if(nodename == 'META'){ + if(typeof(this.nodes[hash][task_index].name) != 'undefined' && this.nodes[hash][task_index].name != null){ + //var nodeName = this.nodes[hash][task_index].name.toLowerCase(); //取meta 标签的name 属性 + + this.nodes[hash][task_index].content = this.nodes[hash][task_index].content.replace(new RegExp(translate.util.regExp.pattern(task.originalText),'g'), translate.util.regExp.resultText(task.resultText)); + } + }else if(nodename == 'IMG'){ + this.nodes[hash][task_index].alt = this.nodes[hash][task_index].alt.replace(new RegExp(translate.util.regExp.pattern(task.originalText),'g'), translate.util.regExp.resultText(task.resultText)); + }else{ + //普通的 + //console.log('task.originalText : '+task.originalText); + //console.log(translate.util.regExp.pattern(task.originalText)) + //console.log('task.resultText : '+task.resultText); + this.nodes[hash][task_index].nodeValue = this.nodes[hash][task_index].nodeValue.replace(new RegExp(translate.util.regExp.pattern(task.originalText),'g'), translate.util.regExp.resultText(task.resultText)); + } + */ + } + } + } + + //console.log('---listen'); + + //监听 - 增加到翻译历史里面 nodeHistory + if (typeof (this.taskQueue) != 'undefined' && Object.keys(this.taskQueue).length > 0) { + //50毫秒后执行,以便页面渲染完毕 + var renderTask = this; + setTimeout(function () { + /** 执行完成后,触发用户自定义的翻译完成执行函数 **/ + translate.listener.renderTaskFinish(renderTask); + }, 5); + + } else { + //console.log(this.taskQueue); + //console.log('---this.taskQueue is null'); + } + } + }, + + + /* + 当前状态,执行状态 + 0 空闲(或者执行翻译完毕) + 2 translate.execute 触发,立即变为3,然后再执行 translate.execute 的一些初始化自检啥的 + 10 扫描要翻译的node,并读取浏览器缓存的翻译内容进行渲染显示 + 20 浏览器缓存渲染完毕,ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求 + 至于翻译完毕后进行渲染,这个就不单独记录了,因为如果页面存在不同的语种,不同的语种是按照不同的请求来的,是多个异步同时进行的过程 + */ + state: 0, + + + /* + 等待翻译队列 v3.12.6 增加 + 当前是否有需要等待翻译的任务,这个目的是为了保证同一时间 translate.execute() 只有一次在执行,免得被新手前端给造成死循环,导致edge翻译给你屏蔽,用户网页还卡死 + 当执行 translate.execute() 时,会先判断状态 translate.state 是否是0空闲的状态,如果空闲,才会执行,如果不是空闲,则不会执行,而是进入到这里进行等待,等待执行完毕后 translate.state 变成0空闲之后,再来执行这里的 + + */ + waitingExecute: { + use: true, //默认是使用,自有部署场景不担心并发的场景,可以禁用,以提高用户使用体验。 + + /* + 一维数组形态,存放执行的翻译任务 + 二维对象形态,存放执行传入的 docs + */ + queue: [], + /* + 增加一个翻译任务到翻译队列中 + docs 同 translate.execute(docs) 的传入参数 + */ + add: function (docs) { + //向数组末尾追加 + translate.waitingExecute.queue.push(docs); + //开启一个定时器进行触发 + let intervalId = setInterval(function () { + if (translate.state == 0) { + //清除定时器,结束循环 + clearInterval(intervalId); + var docs = translate.waitingExecute.get(); + translate.execute(docs); + //console.log('stop waitingExecute setInterval'); + } + }, 500); + }, + /* + 从 quque 中取第一个元素,同时将其从queue中删除掉它。 + 如果取的时候 quque已经没有任何元素了,会返回 null, 但是理论上不会出现null + */ + get: function () { + //使用 shift 方法删除数组的第一个元素,并将第一个元素的值返回 + if (translate.waitingExecute.queue.length > 0) { + return translate.waitingExecute.queue.shift(); + } else { + translate.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。'); + return null; + } + }, + /* + 当前 translate.translateRequest[uuid] 的是否已经全部执行完毕 + 这里单纯只是对 translate.translateRequest[uuid] 的进行判断 + 这里要在 translate.json 接口触发完并渲染完毕后触发,当然接口失败时也要触发。 + + 正常情况下,是根据本地语言不同,进行分别请求翻译的,比如本地中包含中文、英文、俄语三种语种,要翻译为韩语,那么 + * 中文->韩语会请求一次api + * 英文->韩语会请求一次APi + * 俄语->韩语会请求一次APi + 也就会触发三次 + + @param uuid translate.translateRequest[uuid]中的uuid,也是 translate.nodeQueue 中的uuid + @param from 来源语种,翻译前的语种 + @param to 翻译为的语种 + @param result 本次网络请求的结果, 1成功, 0失败。 网络不通,翻译结果返回result非1都是记入0 + @param info 如果result为0,这里是失败信息 + */ + isAllExecuteFinish: function (uuid, from, to, result, info) { + + translate.listener.execute.renderFinishByApiRun(uuid, from, to); + + //通过 uuid、from 取得本次翻译相关的 texts、nodes , 触发 translateNetworkAfter_Trigger 钩子 + //获取请求日志 + var requestData = translate.request.data[uuid].list[from][to]; + translate.lifecycle.execute.translateNetworkAfter_Trigger({ + uuid: uuid, + from: from, + to: to, + texts: requestData.texts, + nodes: requestData.nodes, + result: result, + info: info + }); + + //console.log('uuid:'+uuid+', from:'+from+', to:'+to); + for (var lang in translate.translateRequest[uuid]) { + if (!translate.translateRequest[uuid].hasOwnProperty(lang)) { + continue; + } + if (translate.translateRequest[uuid][lang].executeFinish == 0) { + //这个还没执行完,那么直接退出,不在向后执行了 + //console.log('uuid:'+uuid+' lang:'+lang+' executeFinish:0 time:'+translate.translateRequest[uuid][lang][i][addtime]); + + //这里要考虑进行时间判断 + + return; + } + } + + //生命周期触发事件 + translate.lifecycle.execute.renderFinish_Trigger(uuid, to); + + //都执行完了,那么设置完毕 + translate.state = 0; + translate.executeNumber++; + } + + }, + + //execute() 方法已经被执行过多少次了, 只有 translate.execute() 完全执行完,也就是界面渲染完毕后,它才会+1 + executeNumber: 0, + //translate.execute() 方法已经被触发过多少次了, 只要 translate.execute() 被触发,它就会在触发时立即 +1 (translate.execute() 默认是同一时刻只能执行一次,这个触发是在这个同一时刻执行一次的判定之前进行++ 的,如果这个同一时刻执行一次不通过,还有其他在执行,进入排队执行时,这里也会++ ,当从排队的中顺序排到进行执行时,又会执行++ ) 。 当页面打开第一次触发执行translate.execute(),这里便是 1 + executeTriggerNumber: 0, + + lifecycle: { + + /* + * 切换语言 + */ + changeLanguage: { + + /* + 当触发 translate.changeLanguage(...) 时,会立即先触发此,再去执行 translate.changeLanguage(...) 的处理 + */ + trigger: [], + trigger_Trigger: function (data) { + for (var i = 0; i < translate.lifecycle.changeLanguage.trigger.length; i++) { + try { + translate.lifecycle.changeLanguage.trigger[i](data); + } catch (e) { + translate.log(e); + } + } + + //兼容旧版本的 + for (var i = 0; i < translate.lifecycle.changeLanguage.old_trigger_array.length; i++) { + try { + translate.lifecycle.changeLanguage.old_trigger_array[i](data.to); + } catch (e) { + translate.log(e); + } + } + }, + /* + 下面这两个是兼容以前版本的 + */ + //通过 push 加入的,只会加入到 old_trigger_array 中,传入参数是 to,也就是 string格式 + old_trigger_array: [], + push: function (func) { + translate.log('提示, translate.lifecycle.changeLanguage.push 方式已过时,但依旧生效,可正常使用。 最新的方式,文档参考 http://translate.zvo.cn/540189.html '); + translate.lifecycle.changeLanguage.trigger.push(func); + translate.lifecycle.changeLanguage.old_trigger_array.push(func); + }, + + + + /* + 在触发 translate.reset() 之后、 执行切换语言动作之前,进行触发 + { + to: //翻译为的语种 + } + */ + resetAfter: [], + resetAfter_Trigger: function (data) { + var isNextExecute = true; //是否继续向下执行,true则是继续执行,false则是不继续执行。 + for (var i = 0; i < translate.lifecycle.changeLanguage.resetAfter.length; i++) { + try { + translate.lifecycle.changeLanguage.resetAfter[i](data); + } catch (e) { + translate.log(e); + } + } + }, + + }, + + /* + translate.execute() 执行相关 + */ + execute: { + /* + 每当触发执行 translate.execute() 时,会直接触发此。 + 这个触发是指在所有判断之前,也就是只要 触发了 translate.execute() 会立即触发此,然后在进行执行其他的。 + { + to: , //翻译为的语种 + docs: //当前触发 translate.execute() 要进行翻译的元素。 + 比如单纯触发执行 translate.execute() 、translate.request.listener.start() 那么这里 docs 则是 通过 translate.setDocuments(...) 所设置的元素。 如果没有使用 translate.setDocuments(...) 设置过,那就是翻译整个html页面。 + 如果是 translate.listener.start(); 监控页面发生变化的元素进行翻译,则这里的docs 则是发生变化的元素 + executeTriggerNumber: 整数型,当前触发 translate.execute() 执行,属于打开页面后第几次执行 translate.execute() , 它不会经过任何初始化判断,只要触发了 translate.execute() 就会立即+1,即使初始化判断当前不需要翻译、或者当前正在翻译需要排队等待,它依旧也会+1 + + } + + 注意,它有返回参数,boolean 类型: + true 则是继续执行 translate.execute() + false 则是不继续执行,直接终止本次的 translate.execute() 也就是后面的 translate.lifecycle.execute.start 都不会执行到,不会触发。 + 如果钩子没有任何返回值,则默认是 true + + 如果本钩子有多个实现,其中某个实现返回 false,它不会阻止其他钩子的执行,其他的钩子实现也都会触发执行。 只不过里面只要其中有一个是返回 false,那么 translate.execute() 都会终止。 + */ + trigger: [], + trigger_Trigger: function (data) { + var isNextExecute = true; //是否继续向下执行,true则是继续执行,false则是不继续执行。 + for (var i = 0; i < translate.lifecycle.execute.trigger.length; i++) { + try { + var isNext = translate.lifecycle.execute.trigger[i](data); + if (typeof (isNext) === 'boolean' && isNext === false) { + isNextExecute = false; + } + } catch (e) { + translate.log(e); + } + } + return isNextExecute; + }, + + /* + 每当触发执行 translate.execute() 时,会先进行当前是否可以正常进行翻译的判定,比如 当前语种是否就已经是翻译之后的语种了是否没必要翻译了等。(这些初始判定可以理解成它的耗时小于1毫秒,几乎没有耗时) + 经过初始的判断后,发现允许被翻译,那么在向后执行之前,先触发此。 + 也就是在进行翻译之前,触发此。 + + { + uuid: , //translate.nodeQueue[uuid] 这里的 + to: , //翻译为的语种 + } + + */ + start: [], + //start_Trigger:function(uuid, to){ + start_Trigger: function (data) { + for (var i = 0; i < translate.lifecycle.execute.start.length; i++) { + if (translate.lifecycle.execute.start[i].length === 2) { + //原本的,旧版 20250925 之前的,是string方式传入 uuid, to 这2个参数 + try { + translate.lifecycle.execute.start[i](data.uuid, data.to); + } catch (e) { + translate.log(e); + } + } else { + try { + translate.lifecycle.execute.start[i](data); + } catch (e) { + translate.log(e); + } + } + + } + }, + + + //待整理 + start_old: [], + startRun: function (uuid, from, to) { + //console.log(translate.nodeQueue[uuid]); + for (var i = 0; i < translate.listener.execute.renderStartByApi.length; i++) { + try { + translate.listener.execute.renderStartByApi[i](uuid, from, to); + } catch (e) { + translate.log(e); + } + } + }, + + /* + 当扫描整个节点完成,进行翻译(1. 命中本地缓存、 2.进行网络翻译请求)之前,触发 + 待整理 + */ + scanNodesFinsh: [], + + + /* + 每当触发执行 translate.execute() 时,当缓存中未发现,需要请求翻译API进行翻译时,在发送API请求前,触发此 + + { + uuid: , //translate.nodeQueue[uuid] 这里的 + lang: //来源语种,翻译前的语种 + to: , //翻译为的语种 + texts: , //要翻译的文本,它是一个数组形态,是要进行通过API翻译接口进行翻译的文本,格式如 ['你好','世界'] + nodes: //要翻译的文本的node集合,也就是有哪些node中的文本参与了 通过API接口进行翻译文本,这里是这些node。 格式如 [node1, node2, ...] + } + + */ + translateNetworkBefore: [], + //translateNetworkBefore_Trigger:function(uuid, from, to, texts){ + translateNetworkBefore_Trigger: function (data) { + /* + if(typeof(data) == 'string'){ + data = { + uuid: data, + }; + } + if(typeof(from) == 'string'){ + data.from = from; + } + if(typeof(to) == 'string'){ + data.to = to; + } + if(typeof(texts) == 'string'){ + data.texts = texts; + } + */ + + for (var i = 0; i < translate.lifecycle.execute.translateNetworkBefore.length; i++) { + //console.log('translate.lifecycle.execute.translateNetworkBefore[i] 传入参数的数量:'+translate.lifecycle.execute.translateNetworkBefore[i].length); + if (translate.lifecycle.execute.translateNetworkBefore[i].length === 4) { + //原本的,旧版 20250915 之前的,是string方式传入 uuid, from, to, texts 这四个参数 + try { + translate.lifecycle.execute.translateNetworkBefore[i](data.uuid, data.from, data.to, data.texts); + } catch (e) { + translate.log(e); + } + } else { + //2025.9.15 之后的新的 + try { + translate.lifecycle.execute.translateNetworkBefore[i](data); + } catch (e) { + translate.log(e); + } + } + + } + }, + + /* + 当 translate.execute() 触发网络翻译请求完毕,并将翻译结果渲染到页面完毕后(不管网络翻译请求成功还是失败、还是翻译请求本身返回翻译失败),都触发此。 + + { + uuid: , //translate.nodeQueue[uuid] 这里的 + lang: //来源语种,翻译前的语种 + to: , //翻译为的语种 + texts: , //要翻译的文本,它是一个数组形态,是要进行通过API翻译接口进行翻译的文本,格式如 ['你好','世界'] + nodes: , //要翻译的文本的node集合,也就是有哪些node中的文本参与了 通过API接口进行翻译文本,这里是这些node。 格式如 [node1, node2, ...] + result: //执行结果 1成功, 0失败 + } + */ + translateNetworkAfter: [], + translateNetworkAfter_Trigger: function (data) { + for (var i = 0; i < translate.lifecycle.execute.translateNetworkAfter.length; i++) { + try { + translate.lifecycle.execute.translateNetworkAfter[i](data); + } catch (e) { + translate.log(e); + } + } + }, + + + + /* + translate.execute() 的翻译渲染完毕触发 + 这个完毕是指它当触发 translate.execute() 进行翻译后,无论是全部命中了本地缓存,还是有部分要通过翻译接口发起多个网络请求,当拿到结果(缓存中的翻译结果或多个不同的有xx语种翻译的网络请求全部完成,这个完成是包含所有成功跟失败的响应),并完成将翻译结果渲染到页面中进行显示后,触发此 + 它跟 translateNetworkFinish 的区别是, translateNetworkFinish 仅仅针对有网络请求的才会触发,而 renderFinish 是如果全部命中了浏览器本地缓存,无需发起任何网络翻译请求这种情况时,也会触发。 + @param uuid translate.nodeQueue 的uuid + @param to 当前是执行的翻译为什么语种 + */ + renderFinish: [function (uuid, to) { //这里默认带着一个触发翻译为英文后,自动对英文进行元素视觉处理,追加空格的 + if (typeof (translate.visual) != 'undefined') { + translate.visual.adjustTranslationSpacesByNodequeueUuid(uuid); + } + }], + renderFinish_Trigger: function (uuid, to) { + for (var i = 0; i < translate.lifecycle.execute.renderFinish.length; i++) { + try { + translate.lifecycle.execute.renderFinish[i](uuid, to); + } catch (e) { + translate.log(e); + } + } + }, + + /* + 每当 translate.execute() 执行结束、中止、自检不通过跳出 ... 等,都会触发这个。 + 注意,不管在 translate.execute() 是否自检通过、不管是否进行了翻译、不管文本翻译API接口是否拿到翻译结果,只要 translate.execute 执行完毕或触发了什么自检不通过不再往下执行,都会触发这个。 + 这个仅仅只是用于 translate.execute() 从上而下执行完跳出时,进行触发的。 + + { + uuid: translate.nodeQueue[uuid] 这里的。 如果当前没有进行正常翻译,比如自检失败不在执行跳出了,那这个将会返回空字符串 '' + to: 翻译为什么语种,如果当前没有进行正常翻译,比如自检失败不在执行跳出了,那这个将会返回空字符串 '' + state : 状态,用于判断是什么情况执行完的,整数型,取值有: + 1 当前翻译未完结,新翻译任务已加入等待翻译队列,待上个翻译任务结束后便会执行当前翻译任务 + 3 没有指定翻译目标语言,不翻译 + 5 本地语种跟要翻译的目标语种一样,且没有启用本地语种也强制翻译,那么当前不需要执行翻译,退出 + 16 已经匹配完自定义术语跟离线翻译,但是用户设置了不掉翻译接口进行翻译,不在向后执行通过文本翻译接口进行翻译 + 18 已经匹配完自定义术语跟离线翻译,此时所有要翻译的文本都已经匹配完了,没有在需要通过文本翻译接口进行翻译的了 + 21 进行通过文本翻译API进行调用接口翻译时,某个语种的数据校验失败导致退出。 这个情况理论上应该不会出现,预留这个情况,后续将会剔除这个状态 + 25 已通过文本翻译接口发起所有翻译请求,translate.execute 执行完毕。 (只是发起网络请求,不代表翻译完成,因为这里还没有等着拿到网络请求的响应结果,还处于网络请求的过程中) + triggerNumber: translate.execute() 方法已经被触发过多少次了, 只要 translate.execute() 被触发,它就会在触发时立即 +1 (translate.execute() 默认是同一时刻只能执行一次,这个触发是在这个同一时刻执行一次的判定之前进行++ 的,如果这个同一时刻执行一次不通过,还有其他在执行,进入排队执行时,这里也会++ ,当从排队的中顺序排到进行执行时,又会执行++ ) 。 当页面打开第一次触发执行translate.execute(),这里便是 1 + } + */ + finally: [], + finally_Trigger: function (data) { + //console.log(data) + for (var i = 0; i < translate.lifecycle.execute.finally.length; i++) { + try { + translate.lifecycle.execute.finally[i](data); + } catch (e) { + translate.log(e); + } + } + }, + } + }, + + /*translate.execute() start */ + /* + 执行翻译操作。翻译的是 nodeQueue 中的 + docs 如果传入,那么翻译的只是传入的这个docs的。传入如 [document.getElementById('xxx'),document.getElementById('xxx'),...] + 如果不传入或者传入null,则是翻译整个网页所有能翻译的元素 + */ + execute: function (docs) { + translate.executeTriggerNumber = translate.executeTriggerNumber + 1; + var triggerNumber = translate.executeTriggerNumber; //为了整个 translate.execute 的数据一致性,下面都是使用这个变量 + + //每次执行execute,都会生成一个唯一uuid,也可以叫做队列的唯一标识,每一次执行execute都会创建一个独立的翻译执行队列 + var uuid = translate.util.uuid(); + translate.time.log('创建uuid:' + uuid); + + //如果页面打开第一次使用,先判断缓存中有没有上次使用的语种,从缓存中取出 + if (translate.to == null || translate.to == '') { + var to_storage = translate.storage.get('to'); + if (to_storage != null && typeof (to_storage) != 'undefined' && to_storage.length > 0) { + translate.to = to_storage; + } + } + + /* + 进行翻译指定的node操作。优先级为: + 1. 这个方法已经指定的翻译 nodes + 2. setDocuments 指定的 + 3. 整个网页 + 其实2、3都是通过 getDocuments() 取,在getDocuments() 就对2、3进行了判断 + */ + var all; + if (typeof (docs) != 'undefined' && docs != null) { + if (typeof (docs.length) == 'undefined') { + //不是数组,是单个元素 + all = new Array(); + all[0] = docs; + } else { + //是数组,直接赋予 + all = docs; + } + } else { + //2、3 + all = translate.getDocuments(); + } + + + //钩子 + var triggerIsNextExecute = translate.lifecycle.execute.trigger_Trigger({ + to: translate.to, + docs: all, + executeTriggerNumber: triggerNumber, + uuid: uuid + }); + if (!triggerIsNextExecute) { + //终止执行 + + //钩子 + translate.lifecycle.execute.finally_Trigger({ + uuid: uuid, + to: translate.to, + state: 2, + triggerNumber: triggerNumber + }); + + return; + } + + + + if (translate.waitingExecute.use) { + if (translate.state != 0) { + var sliceDocString = ''; + + if (typeof (docs) != 'undefined' && docs != null) { + var sliceDoc = docs.slice(0, 2); + + for (var di = 0; di < sliceDoc.length; di++) { + if (sliceDocString.length > 0) { + sliceDocString = sliceDocString + ', '; + } + if (sliceDoc[di].nodeType === 1) { + //元素 + sliceDocString = sliceDocString + "" + sliceDoc[di].tagName; + if (typeof (sliceDoc[di].id) == 'string' && sliceDoc[di].id.length > 0) { + sliceDocString = sliceDocString + " id=" + sliceDoc[di].id; + } + if (sliceDoc[di].getAttribute('class') != null && typeof (sliceDoc[di].getAttribute('class')) == 'string' && sliceDoc[di].getAttribute('class').length > 0) { + sliceDocString = sliceDocString + " class=" + sliceDoc[di].getAttribute('class'); + } + } else if (sliceDoc[di].nodeType === 2 || sliceDoc[di].nodeType === 3) { + //2属性 或 3文本节点 + sliceDocString = sliceDocString + sliceDoc[di].nodeValue.replaceAll(/\r?\n/g, '[换行符]'); + } + } + sliceDocString = ' (' + docs.length + ')[' + sliceDocString + (docs.length > 2 ? ', ...' : '') + ']'; + } + + + translate.log('当前翻译未完结,新翻译任务已加入等待翻译队列,待上个翻译任务结束后便会执行当前翻译任务' + sliceDocString); + translate.waitingExecute.add(docs); + + //钩子 + translate.lifecycle.execute.finally_Trigger({ + uuid: uuid, + to: translate.to, + state: 4, + triggerNumber: triggerNumber + }); + + return; + } + } + + + translate.state = 2; + translate.time.log('触发'); + + //init.json + translate.request.initRequest(); + + //console.log('translate.state = 1'); + if (typeof (docs) != 'undefined') { + //execute传入参数,只有v2版本才支持 + translate.useVersion = 'v2'; + } + + if (translate.useVersion == 'v1') { + //if(this.to == null || this.to == ''){ + //采用1.x版本的翻译,使用google翻译 + //translate.execute_v1(); + //return; + //v2.5.1增加 + translate.log('提示:https://github.com/xnx3/translate 在 v2.5 版本之后,由于谷歌翻译调整,免费翻译通道不再支持,所以v1版本的翻译接口不再被支持,v1全线下架。考虑到v1已不能使用,当前已自动切换到v2版本。如果您使用中发现什么异常,请针对v2版本进行适配。'); + translate.useVersion = 'v2'; + } + + + + /****** 采用 2.x 版本的翻译,使用自有翻译算法 */ + + + + //console.log('=====') + //console.log(translate.nodeQueue); + + /* v2.4.3 将初始化放到了 translate.element.whileNodes 中,如果uuid对应的没有,则自动创建 + + translate.nodeQueue[uuid] = new Array(); //创建 + translate.nodeQueue[uuid]['expireTime'] = Date.now() + 120*1000; //删除时间,10分钟后删除 + translate.nodeQueue[uuid]['list'] = new Array(); + */ + //console.log(translate.nodeQueue); + //console.log('=====end') + + + + translate.time.log('渲染出选择语言的select窗口-开始'); + //渲染select选择语言 + try { + translate.selectLanguageTag.render(); + } catch (e) { + translate.log(e); + } + + translate.time.log('渲染出选择语言的select窗口-已完成'); + + //判断是否还未指定翻译的目标语言 + if (translate.to == null || typeof (translate.to) == 'undefined' || translate.to.length == 0) { + //未指定,判断如果指定了自动获取用户本国语种了,那么进行获取 + if (translate.autoDiscriminateLocalLanguage) { + translate.executeByLocalLanguage(); + } else { + //没有指定翻译目标语言、又没自动获取用户本国语种,则不翻译 + translate.state = 0; + + //钩子 + translate.lifecycle.execute.finally_Trigger({ + uuid: uuid, + to: translate.to, + state: 6, + triggerNumber: triggerNumber + }); + + return; + } + } + + //判断本地语种跟要翻译的目标语种是否一样,如果是一样,那就不需要进行任何翻译 + if (translate.to == translate.language.getLocal()) { + if (translate.language.translateLocal) { + //这是自定义设置的允许翻译本地语种中,跟本地语种不一致的语言进行翻译 + + } else { + translate.state = 0; + + //钩子 + translate.lifecycle.execute.finally_Trigger({ + uuid: uuid, + to: translate.to, + state: 8, + triggerNumber: triggerNumber + }); + + return; + } + } + + //初始化 translate.element.tagAttribute ,主要针对 v3.17.10 版本的适配调整,对 translate.element.tagAttribute 的设置做了改变,做旧版本的适配 + try { + for (var te_tag in translate.element.tagAttribute) { + if (!translate.element.tagAttribute.hasOwnProperty(te_tag)) { + continue; + } + if (translate.element.tagAttribute[te_tag] instanceof Array) { + //是 v3.17.10 之前版本的设置方式,要进行对旧版本的适配 + var tArray = translate.element.tagAttribute[te_tag]; + translate.element.tagAttribute[te_tag] = { + attribute: tArray, + condition: function (element) { + return true; + } + } + } + } + } catch (e) { + translate.log(e); + } + + + /********** 翻译进行 */ + + translate.time.log('生命周期-触发翻译进行之前,用户自定义的钩子-开始'); + + //生命周期-触发翻译进行之前,用户自定义的钩子 + translate.lifecycle.execute.start_Trigger({ + uuid: uuid, + to: translate.to + }); + translate.time.log('生命周期-触发翻译进行之前,用户自定义的钩子-完成'); + + translate.time.log('进行图片翻译-开始'); + //先进行图片的翻译替换,毕竟图片还有加载的过程 + translate.images.execute(); + translate.time.log('进行图片翻译-完成'); + + + //console.log('----要翻译的目标元素-----'); + //console.log(all) + + if (all.length > 1500) { + translate.log('------tip------'); + translate.log('警告 translate.execute( docs ) 传入的docs.length 过大,超过1500,这不正常,当前 docs.length : ' + all.length + ' , 它依旧会正常进行执行,但会有性能损耗。 这个情况很可能是你用的某些框架,没有等dom渲染完就执行了translate.execute() ,同时启用了dom变动监听,导致监听到页面加载大量的DOM渲染; 另外也有可能你本身页面就是列表页或者什么原因就是有大量的动态元素获取后渲染,如果是这种情况,这是正常的。'); + } + + + translate.time.log('开始扫描要翻译区域的元素'); + //检索目标内的node元素 + for (var i = 0; i < all.length & i < 15000; i++) { + var node = all[i]; + translate.element.whileNodes(uuid, node); + } + translate.time.log('扫描要翻译区域的元素完成'); + + /***** translate.language.translateLanguagesRange 开始 *****/ + if (translate.language.translateLanguagesRange.length > 0) { + //如果大于0,则是有设置,那么只翻译有设置的语种,不在设置中的语种不会参与翻译 + for (var lang in translate.nodeQueue[uuid].list) { + if (!translate.nodeQueue[uuid].list.hasOwnProperty(lang)) { + continue; + } + if (translate.language.translateLanguagesRange.indexOf(lang) < 0) { + //删除这个语种 + delete translate.nodeQueue[uuid].list[lang]; + } + } + } + + /***** translate.language.translateLanguagesRange 结束 *****/ + + //修复如果translate放在了页面最顶部,此时执行肯定扫描不到任何东西的,避免这种情况出现报错 + if (typeof (translate.nodeQueue[uuid]) == 'undefined') { + translate.nodeQueue[uuid] = new Array(); + translate.nodeQueue[uuid].list = []; + translate.log('--- translate.js warn tip 警告!! ---'); + translate.log('您使用translate.js时可能放的位置不对,不要吧 translate.js 放在网页最顶部,这样当 translate.js 进行执行,也就是 translate.execute() 执行时,因为网页是从上往下加载,它放在网页最顶部,那么它执行时网页后面的内容都还没加载出来,这个是不会获取到网页任何内容的,也就是它是不起任何作用的'); + } + for (var lang in translate.nodeQueue[uuid].list) { + if (!translate.nodeQueue[uuid].list.hasOwnProperty(lang)) { + continue; + } + //console.log('lang:'+lang) + for (var hash in translate.nodeQueue[uuid].list[lang]) { + if (!translate.nodeQueue[uuid].list[lang].hasOwnProperty(hash)) { + continue; + } + //console.log(hash) + if (typeof (translate.nodeQueue[uuid].list[lang][hash]) == 'function') { + //v2.10增加,避免hash冒出个 Contains 出来导致for中的.length 出错 + continue; + } + if (typeof (translate.nodeQueue[uuid].list[lang][hash].nodes) == 'undefined' || typeof (translate.nodeQueue[uuid].list[lang][hash].nodes.length) == 'undefined') { + //v3.16.2 增加,针对深圳北理莫斯科学校龙老师提出的这里 .length 遇到了 undefined 的情况 + continue; + } + + + /* 20250912 删除,因为在扫描阶段就已经判定了 + for(var nodeindex = translate.nodeQueue[uuid].list[lang][hash].nodes.length-1; nodeindex > -1; nodeindex--){ + //console.log(translate.nodeQueue[uuid].list[lang][hash].nodes[nodeindex]); + var analyse = translate.element.nodeAnalyse.get(translate.nodeQueue[uuid].list[lang][hash].nodes[nodeindex].node); + //analyse.text analyse.node + var nodeid = nodeuuid.uuid(analyse.node); + //translate.nodeQueue[uuid].list[lang][hash].nodes.splice(nodeindex, 1); + //console.log(nodeid+'\t'+analyse.text); + //这个放到了node扫描里去进行判定了,后续要考虑删除 + if(translate.node.get(analyse.node) != null){ + //存在,判断其内容是否发生了改变 + //console.log('比较---------'); + //console.log(translate.node[nodeid].translateText); + //console.log(analyse.text); + var nodeAttribute = translate.node.getAttribute(translate.nodeQueue[uuid].list[lang][hash].nodes[nodeindex].attribute); + //console.log(translate.node.get(analyse.node)[nodeAttribute.key]); + if(translate.node.get(analyse.node)[nodeAttribute.key].resultText == analyse.text){ + //内容未发生改变,那么不需要再翻译了,从translate.nodeQueue中删除这个node + translate.nodeQueue[uuid].list[lang][hash].nodes.splice(nodeindex, 1); + //console.log('发现相等的node,删除 '+analyse.text+'\t'+hash); + }else{ + //console.log("发现变化的node =======nodeid:"+nodeid); + //console.log(translate.node[nodeid].translateText == analyse.text); + //console.log(translate.node[nodeid].node); + //console.log(translate.node[nodeid].translateText); + //console.log(analyse.text); + + } + }else{ + //console.log('未在 nodeHistory 中发现,新的node nodeid:'+nodeid); + //console.log(analyse.node) + } + + //以上考虑删除 + + } + */ + + if (translate.nodeQueue[uuid].list[lang][hash].nodes.length == 0) { + //如果node数组中已经没有了,那么直接把这个hash去掉 + delete translate.nodeQueue[uuid].list[lang][hash]; + } + } + if (Object.keys(translate.nodeQueue[uuid].list[lang]).length == 0) { + //如果这个语言中没有要翻译的node了,那么删除这个语言 + delete translate.nodeQueue[uuid].list[lang]; + } + } + + translate.time.log('对扫描到的元素进行预处理完毕'); + //console.log('new queuq'); + //console.log(translate.nodeQueue[uuid]) + //translate.node.data[nodeid] + + + //console.log('-----待翻译:----'); + //console.log(translate.nodeQueue); + + //translateTextArray[lang][0] + var translateTextArray = {}; //要翻译的文本的数组,格式如 ["你好","欢迎"] + var translateHashArray = {}; //要翻译的文本的hash,跟上面的index是一致的,只不过上面是存要翻译的文本,这个存hash值 + /* + 要翻译的文本所在的 node ,这些要翻译的文本是在哪些node中。 + 它是二维的。 + 一维: + key: language + value: map + key: node + value: 1 //value无任何意义,只是凑上去的 , 这样key会自动排重 + + */ + var translateTextNodeMap = new Map(); + + + /* + 要进行第二次扫描的node - 2023.8.22 解决缓存会打散扫描到的翻译文本,导致翻译结束后找寻不到而导致不翻译的问题 + 一维 key: lang + 二维 key: hash + 三维 key: + node: 当前的node元素 + + 四维 -delete ... array: 当前缓存中进行翻译的文本数组: + cacheOriginal: 已缓存被替换前的文本 + cacheTranslateText: 已缓存被替换后的翻译文本 + + */ + var twoScanNodes = {}; + var cacheScanNodes = []; //同上面的 twoScanNodes,只不过 twoScanNodes 是按照lang存的,而这个不再有lang区分 + for (var lang in translate.nodeQueue[uuid]['list']) { //二维数组中,取语言 + if (!translate.nodeQueue[uuid]['list'].hasOwnProperty(lang)) { + continue; + } + //console.log('lang:'+lang); //lang为english这种语言标识 + if (lang == null || typeof (lang) == 'undefined' || lang.length == 0 || lang == 'undefined') { + //console.log('lang is null : '+lang); + continue; + } + + translateTextArray[lang] = []; + translateTextNodeMap.set(lang, new Map()); + translateHashArray[lang] = []; + + let task = new translate.renderTask(); + //console.log(translate.nodeQueue); + + twoScanNodes[lang] = []; + //二维数组,取hash、value + for (var hash in translate.nodeQueue[uuid]['list'][lang]) { + if (!translate.nodeQueue[uuid]['list'][lang].hasOwnProperty(hash)) { + continue; + } + if (typeof (translate.nodeQueue[uuid]['list'][lang][hash]) == 'function') { + //跳出,增加容错。 正常情况下应该不会这样 + continue; + } + + //原始的node中的词 + var originalWord = translate.nodeQueue[uuid]['list'][lang][hash]['original']; + //要翻译的词 + var translateText = translate.nodeQueue[uuid]['list'][lang][hash]['translateText']; + //console.log(originalWord); + + //根据hash,判断本地是否有缓存了 + var cacheHash = originalWord == translateText ? hash : translate.util.hash(translateText); //如果匹配到了自定义术语库,那翻译前的hash是被改变了 + translate.nodeQueue[uuid]['list'][lang][hash]['cacheHash'] = cacheHash; //缓存的hash。 缓存时,其hash跟翻译的语言是完全对应的,缓存的hash就是翻译的语言转换来的 + var cache = translate.storage.get('hash_' + translate.to + '_' + cacheHash); + + //缓存是否有拿到具体缓存内容 + if (cache != null && cache.length > 0) { + for (var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++) { + //console.log(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]); + + //判断是否是整体翻译,如果不是整体翻译,要考虑到缓存中短句会打散整个句子结构,破坏断句分词,造成 长句子中包含的短句子被翻译了,最后长句子翻译之后未能替换,产生部分未翻译的情况,所以要讲断句的分词也要拿出来 + var translateNodeData = translate.node.get(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index].node); + var participles = []; + if (typeof (translateNodeData) !== 'undefined' && translateNodeData !== null && typeof (translateNodeData.whole) === 'boolean' && translateNodeData.whole === false) { + //console.log(translateNodeData); + //console.log(typeof(translateNodeData.translateTexts)) + //不是整体翻译,那就要将拆分的每句都整理,避免破坏分词结构 + for (var translateText_original in translateNodeData.translateTexts) { + //console.log(translateText_original); + if (!translateNodeData.translateTexts.hasOwnProperty(translateText_original)) { + continue; + } + participles.push(translateText_original); + } + } + + + //翻译结果的文本,包含了before 、 after 了 + var translateResultText = translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['beforeText'] + cache + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['afterText']; + task.add(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'], originalWord, translateResultText, translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['attribute'], participles); + //this.nodeQueue[lang][hash]['nodes'][node_index].nodeValue = this.nodeQueue[lang][hash]['nodes'][node_index].nodeValue.replace(new RegExp(originalWord,'g'), cache); + //console.log(translateResultText); + + //重新扫描这个node,避免这种情况: + /* + localstorage缓存中有几个词的缓存了,但是从缓存中使用时,把原本识别的要翻译的数据给打散了,导致翻译结果没法赋予,导致用户展示时有些句子没成功翻译的问题 -- 2023.8.22 + 比如有这个 node,其内容为: + 你是谁?你好世界 + 扫描完后,触发了自定义术语将文本分割成多个、或者未启用整体翻译,出现分割后的文本数组为 + ['你是谁','你','世界'] + 这时, '你' 这个字发现有本地缓存,被触发立即替换为 you ,替换完成后,会导致将 '你是谁' 也被替换了,node 当前的文本变成了 + you 是谁?you 好世界 + + */ + //console.log('继续扫描 + 1 - '+twoScanNodes.length); + var twoScanIndex = -1; //当前元素是否在 twoScan 中已经加入了,如果已经加入了,那么这里赋予当前所在的下标 + for (var i = 0; i < twoScanNodes[lang].length; i++) { + if (translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'].isSameNode(twoScanNodes[lang][i]['node'])) { + //if(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'].isSameNode(cacheScanNodes[i]['node'])){ + //如果已经加入过了,那么跳过 + twoScanIndex = i; + break; + } + } + var twoScanIndex_cache = -1; //当前元素是否在 twoScan 中已经加入了,如果已经加入了,那么这里赋予当前所在的下标 + for (var i = 0; i < cacheScanNodes.length; i++) { + //if(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'].isSameNode(twoScanNodes[lang][i]['node'])){ + if (translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'].isSameNode(cacheScanNodes[i]['node'])) { + //如果已经加入过了,那么跳过 + twoScanIndex_cache = i; + break; + } + } + + if (twoScanIndex == -1) { + //console.log(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node']); + twoScanIndex = twoScanNodes[lang].length; + twoScanNodes[lang][twoScanIndex] = {}; + twoScanNodes[lang][twoScanIndex]['node'] = translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node']; + twoScanNodes[lang][twoScanIndex]['array'] = []; + } + + if (twoScanIndex_cache == -1) { + twoScanIndex_cache = cacheScanNodes.length; + cacheScanNodes[twoScanIndex_cache] = {}; + cacheScanNodes[twoScanIndex_cache]['node'] = translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node']; + cacheScanNodes[twoScanIndex_cache]['array'] = []; + } + + //未加入过,那么加入 + var arrayIndex = twoScanNodes[lang][twoScanIndex]['array'].length; + twoScanNodes[lang][twoScanIndex]['array'][arrayIndex] = translateResultText; + + var arrayIndex_cache = cacheScanNodes[twoScanIndex_cache]['array'].length; + cacheScanNodes[twoScanIndex_cache]['array'][arrayIndex_cache] = translateResultText; + + } + + + + continue; //跳出,不用在传入下面的翻译接口了 + } + + /* + //取出数组 + var queueNodes = this.nodeQueue[lang][hash]; + if(queueNodes.length > 0){ + //因为在这个数组中的值都是一样的,那么只需要取出第一个就行了 + var valueStr = queueNodes[0].nodeValue; + valueStr = this.util.charReplace(valueStr); + + translateTextArray[lang].push(valueStr); + translateHashArray[lang].push(hash); + } + */ + + //加入待翻译数组 + translateTextArray[lang].push(translateText); + for (var ni = 0; ni < translate.nodeQueue[uuid]['list'][lang][hash].nodes.length; ni++) { + translateTextNodeMap.get(lang).set(translate.nodeQueue[uuid]['list'][lang][hash].nodes[ni].node, 1) + } + translateHashArray[lang].push(hash); //这里存入的依旧还是用原始hash,未使用自定义术语库前的hash,目的是不破坏 nodeQueue 的 key + } + + task.execute(); //执行渲染任务 + } + + translate.time.log('对扫描到的元素进行浏览器本地缓存命中-完毕'); + //console.log(twoScanNodes); + //console.log('cacheScanNodes:'); + //console.log(cacheScanNodes); + //console.log(translateTextArray); + //return; + + if (typeof (translate.request.api.translate) != 'string' || translate.request.api.translate == null || translate.request.api.translate.length < 1) { + //用户已经设置了不掉翻译接口进行翻译 + translate.state = 0; + + //生命周期触发事件 + translate.lifecycle.execute.renderFinish_Trigger(uuid, translate.to); + translate.executeNumber++; + + //钩子 + translate.lifecycle.execute.finally_Trigger({ + uuid: uuid, + to: translate.to, + state: 16, + triggerNumber: triggerNumber + }); + + return; + } + + + + /******* 进行第二次扫描、追加入翻译队列。目的是防止缓存打散扫描的待翻译文本 ********/ + /* + for(var lang in twoScanNodes){ + if (!twoScanNodes.hasOwnProperty(lang)) { + continue; + } + + //记录第一次扫描的数据,以便跟第二次扫描后的进行对比 + var firstScan = Object.keys(translate.nodeQueue[uuid]['list'][lang]); + var firstScan_lang_langth = firstScan.length; //第一次扫描后的数组长度 + + //console.log(twoScanNodes[lang]); + for(var i = 0; i -1) { + //发现了,那么强制赋予翻以前内容 + text = translateTextArray[responseData.from][i]; + } + + + //翻译前的hash对应下标 + var hash = translateHashArray[responseData.from][i]; + var cacheHash = translate.nodeQueue[uuid]['list'][lang][hash]['cacheHash']; + + + + //取原始的词,还未经过翻译的,需要进行翻译的词 + var originalWord = ''; + try { + originalWord = translate.nodeQueue[uuid]['list'][lang][hash]['original']; + //console.log('bef:'+translate.nodeQueue[uuid]['list'][lang][hash]['beforeText']); + } catch (e) { + translate.log('uuid:' + uuid + ', originalWord:' + originalWord + ', lang:' + lang + ', hash:' + hash + ', text:' + text + ', queue:' + translate.nodeQueue[uuid]); + translate.log(e); + continue; + } + + //for(var index = 0; index < translate.nodeQueue[lang][hash].length; index++){ + for (var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++) { + //translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue = translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue.replace(new RegExp(originalWord,'g'), text); + //加入任务 + task.add(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'], originalWord, translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['beforeText'] + text + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['afterText'], translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['attribute']); + } + //} + /* + for(var index = 0; index < translate.nodeQueue[data.from][hash].length; index++){ + translate.nodeQueue[data.from][hash][index].nodeValue = text; + } + */ + + //将翻译结果以 key:hash value翻译结果的形式缓存 + translate.storage.set('hash_' + responseData.to + '_' + cacheHash, text); + //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储 + if (translate.offline.fullExtract.isUse) { + translate.offline.fullExtract.set(hash, originalWord, responseData.to, text); + } + } + task.execute(); //执行渲染任务 + //translate.temp_executeFinishNumber++; //记录执行完的次数 + + translate.translateRequest[uuid][lang].result = 1; + translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕 + translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000); + setTimeout(function () { + translate.waitingExecute.isAllExecuteFinish(uuid, responseData.from, responseData.to, 1, ''); + }, 5); + }, function (xhr) { + translate.translateRequest[uuid][xhr.data.from].executeFinish = 1; //1是执行完毕 + translate.translateRequest[uuid][xhr.data.from].stoptime = Math.floor(Date.now() / 1000); + translate.translateRequest[uuid][xhr.data.from].result = 3; + var info = ''; + if (typeof (xhr.status) != 'undefined') { + if (xhr.status < 1) { + info = 'Network connection failed. url: ' + xhr.requestURL; + } else { + info = 'HTTP response code : ' + xhr.status + ', url: ' + xhr.requestURL; + } + } else { + info = 'Network connection failed. url: ' + xhr.requestURL; + } + translate.waitingExecute.isAllExecuteFinish(uuid, xhr.data.from, translate.to, 0, info); + }); + /*** 翻译end ***/ + } + + //钩子 + translate.lifecycle.execute.finally_Trigger({ + uuid: uuid, + to: translate.to, + state: 25, + triggerNumber: triggerNumber + }); + }, + /*translate.execute() end */ + + /** + * 翻译请求记录 + * 一维:key:uuid,也就是execute每次执行都会创建一个翻译队列,这个是翻译队列的唯一标识。 这个uuid跟 nodeQueue 的uuid是一样的 + * value:对象 + * 二维: 对象,包含: + * from 存放的是要翻译的源语种,比如要讲简体中文翻译为英文,这里存放的就是 chinese_simplified + * state 是否执行完毕,0是执行中, 1是执行完毕(不管是失败还是成功) 而且执行完毕是指ajax请求获得响应,并且dom渲染完成之后才算完毕。当然如果ajax接口失败那也是直接算完毕 + * addtime 这条数据加入到本数组的时间,也就是进行ajax请求开始那一刻的时间,10位时间戳 + * stoptime 执行完毕的时间,也就是state转为2那一刻的时间 + * result 执行结果, 0 是还没执行完,等待执行完, > 0 是执行完了有结果了, + * 1 是执行成功 + * 2 是接口有响应,也是200响应,但是接口响应的结果返回了错误,也就是返回了 {result:0, info:'...'} + * 3 是接口不是200响应码 + * + */ + translateRequest: { + /* + uuid:[ + 'chinese_simplified':{ + executeFinish:0, + addtime:150001111, + stoptime:150001111, + result:0 + }, + ... + ] + */ + }, + + //20250908 废弃,要删除这个 + nodeHistory: null, + + //当前页面中,翻译后操作的 ,dom 中有效的node节点 + node: { + /* + 将已扫描的节点进行记录,这里是只要进行扫描到了,也就是在加入 translate.nodeQueue 时就也要加入到这里。 + 这是一个map,为了兼容es5,这里设置为null,在 translate.execute 中在进行初始化 + + key: node ,进行翻译的文本的node, 如果是 div 的 title属性进行的翻译,那这个node是定位在 title 上的node,而不是 div 这个依附的元素 + 注意,如果是对 input、textarea 的value进行翻译,而 value是通过js赋予的,那么这个value属性的值并不是一个单独的node,所以是为空的,此时要记录的node便是 input、textarea 这个node本身。 + value: 这是一个对像 + 其中,key的取值有这几种: + translate_default_value: 如果当前翻译的是元素本身的值或node节点本身的值(nodeValue),那么这里的key就是固定的 translate_default_value + attribute_属性名: 如果当前翻译的是元素的attribute 的某个属性,那么这里就是 attribute_属性名, 比如 a 标签的 title ,那这里便是 attribute_title + modified: 被改动的动作,比如创建、值发生改动,都会记录到这里,它没有什么实际作用,仅仅只是为了方便开发调试使用。 + 这是一个数组格式,其值如: + [ + 'create:translate.faultTolerance.documentCreateTextNode.enable', + 'update:translate.execute' + ] + 创建便是 create 开头,数据修改(追加属性、属性值修改、删除属性等)便是 update 开头,后面跟着的是操作它是在哪个方法里 + 越早操作,下标越小,也就是 [0] 是最开始创建的,然后每次修改都会push进一个数据进去 + + lastTranslateRenderTime: 记录当前有 translate.js 所触发翻译之后渲染到dom界面显示的时间,13位时间戳。 + 每当触发渲染时这里都会重新赋予一次最新的时间,这里也就是最后一次渲染的时间。 如果还没渲染那这里便是 undefined 或者 null,总之 typeof 不是 number + 另外这个时间是渲染的前一刻赋予的,赋予后立即进行的DOM渲染 + + translateResults: array string 文本数组,这里是被 translate.element.nodeAnalyse.set 进行翻译渲染之后,每次针对node进行一次渲染,它都会讲渲染的文本(注意是翻译之后的文本,而不是原文)设置进来,不管是node本身还是属性还是什么,都会直接讲其具体结果拿过来。 + 注意,翻译完毕进行渲染时,是先将要显示的文本(翻译后的文本)拿来赋予到这里,然后在执行 dom渲染(触发listener) + 当listener动态监听时,也是根据这个来判定当前是否是有 translate.js 本身导致的node发生了改变 + { + 你好,世界:1 + 你是谁:1 + } + 它使用是 typeof(translate.node.get(node).translateResults['你好世界']) === 'number' 这样使用,至于后面的value为1那纯属是凑的,没任何意义 + + + attribute 这个翻译的node对象是否是翻译的其中的某个attribute属性,如果是,那么这里便是长度大于0, 如果是元素或节点本身(nodeValue),那么这里就是空字符串,注意,是空字符串 '' + 另外这个字段,当前应该仅仅只是针对 input、textarea 的 value 属性有用,也就是它的值要么是空字符串,要么是 'value', 因为像是 input value 的属性是不属于dom的,必须 input.value 这样才能点出来 + + resultText: string 翻译完成后,当前node节点的内容文本,注意,是node节点整体所有的内容文本(是已经翻译渲染过的) + 注意,翻译失败或者本身是特殊字符比如数字,不需要被翻译,是没有这个属性的 + originalText: string 翻译前显示的文本,是node节点所有的内容文本,原始的文本,(当前这里仅仅只对元素整体翻译时才会记录这个 - v3.18.14.20250903 增加) + + translateTexts: array string 文本数组,这里是被文本翻译接口所翻译的文本。 + 比如其中某项为 '你好':'hello' ,其中key是翻译前的, value是翻译后的结果, 如果 value 为 null,则代表还未进行翻译拿到翻译结果 + + whole: boolean 当前是否是整体进行翻译的,比如当前即使是设置的整体翻译,但是这个node命中了自定义术语,被术语分割了,那当前翻译也不是整体翻译的。 + 这个属性在扫描完节点,进行请求翻译接口或命中本地缓存之前,就要被设置。 + true:是节点内容整体翻译 + + */ + data: null, + /* + 从 translate.node.data 中,根据key,进行获取 translate.node.data.get(node) + */ + get: function (node) { + return translate.node.data.get(node); + }, + //判断某个node (key) 是否在 translate.node.data 中是否存在,如果存在返回true + find: function (node) { + return translate.node.get(node) != null; + }, + set: function (node, value) { + translate.node.data.set(node, value); + }, + /* + 向 translate.node 的元素中,追加属性 modified 的数组内容 + */ + setModified: function (node, text) { + if (typeof (translate.node.data.get(node)) === 'undefined' || translate.node.data.get(node) === null) { + translate.log('translate.node.setModified exception: node not find in translate.node, node:'); + translate.log(node); + return; + } + + if (typeof (translate.node.data.get(node).modified) === 'undefined') { + translate.node.data.get(node).modified = []; + } + translate.node.data.get(node).modified.push(text); + }, + //从 translate.node.data 中 删除 key 是 node 的 + delete: function (node) { + //console.log('delete node -- > '+node.nodeValue); + translate.node.data.delete(node); + }, + /* + 获取 translate.node.get(node)[attribute] 这里的 attribute + + attribute 传入的可以是 undefined、null、'' 、 以及具体的字符串 + + 返回的是一个对象: + { + key: translate.node 中 translate.node.get(node)[attribute] 所使用的 attribute 的字符串,如 attribute_title 、translate_default_value + attribute: 这里是attribute具体的内容,比如 key 是 attribute_title 那么这里就是 title , key 是 translate_default_value 这里就是 '' 空字符串 + } + + getAttribute:function(attribute){ + var history_attribute; + if(typeof(attribute) != 'undefined' && attribute.length > 0){ + //是对 attribute 进行的操作 + history_attribute = 'attribute_'+attribute + }else{ + //是对节点本身进行的操作,操作的是 nodeValue + attribute = ''; + history_attribute = 'translate_default_value'; + } + return { + key:history_attribute, + attribute:attribute + } + }, + */ + /* + 刷新 translate.node.data 中的数据,剔除过时的(node已经不存在于dom的) + */ + refresh: function () { + + // 收集要删除的无效节点 + const deleteKeys = new Array(); + + for (let key of translate.node.data.keys()) { + // 检查节点是否还在DOM中 + let isValidNode = false; + + if (key.nodeType === Node.ELEMENT_NODE) { + // 元素节点 + isValidNode = key.isConnected; + } else if (key.nodeType === Node.ATTRIBUTE_NODE) { + // 属性节点(如placeholder) + isValidNode = key.ownerElement && key.ownerElement.isConnected; + } else if (key.nodeType === Node.TEXT_NODE) { + // 文本节点 + isValidNode = key.isConnected; + } + + if (!isValidNode) { + //console.log('节点已经不存在,剔除节点'); + deleteKeys.push(key); + } + + // 处理有效节点... + //if(!key.isConnected){ text node 没有 isConnected + // console.log(key.nodeValue+' 这个translate.node 中的 node不存在,忽略'); + // continue; + //} + } + + // 统一删除无效节点 + for (var i = 0; i < deleteKeys.length; i++) { + translate.node.delete(deleteKeys[i]); + } + + } + }, + + element: { + + /* + 注意,里面全部的必须小写。 + 第一个是tag,第二个是tag的属性。比如要翻译 input 的 value 属性,那么如下: + translate.element.tagAttribute['input']=['value']; + 比如要翻译 input 的 value 、 data-value 这两个属性,那么如下: + translate.element.tagAttribute['input']=['value','data-value']; + 有几个要翻译的属性,就写上几个。 + 同样,有几个要额外翻译的tag,就加上几行。 + 详细文档参考: http://translate.zvo.cn/231504.html + + + //针对宁德时代提出的需求,需要对 标签本身进行一个判定,是否符合条件符合条件才会翻译,不符合条件则不要进行翻译 + //比如标签带有 disabled 的才会被翻译,所以要增加一个自定义入参的 function ,返回 true、false + translate.element.tagAttribute['input']={ + //要被翻译的tag的属性,这里是要翻译 input 的 value 、 data-value 这两个属性。 + //数组格式,可以一个或多个属性 + attribute:['value','data-value'], + //条件,传入一个function,返回一个布尔值。 + //只有当返回的布尔值是true时,才会对上面设置的 attribute 进行翻译,否则并不会对当前设定标签的 attribute 进行任何翻译操作。 + condition:function(element){ + // element 便是当前的元素, + // 比如这里是 translate.element.tagAttribute['input'] 那这个 element 参数便是扫描到的具体的 input 元素 + // 可以针对 element 这个当前元素本身来进行判定,来决定是否进行翻译。 + // 返回值是布尔值 true、false + // return true; //要对 attribute中设置的 ['value','data-value'] 这两个input 的属性的值进行翻译。 + // 如果不设置或传入 condition ,比如单纯这样设置: + // translate.element.tagAttribute['input']={ + // attribute:['value','data-value'] + // } + // 那么这里默认就是 return true; + // return false; //不对 attribute中设置的 ['value','data-value'] 这两个input 的属性的值进行任何操作 + return true; + } + }; + + */ + tagAttribute: {}, + + //对翻译前后的node元素的分析(翻以前)及渲染(翻译后) + nodeAnalyse: { + /* + 获取node中的要进行翻译的文本内容、以及要操作的实际node对象(这个node对象很可能是传入的node中的某个子node) + node + attribute 要获取的是某个属性的值,还是node本身的值。比如 a标签的title属性的值,则传入 title。 如果是直接获取node.nodeValue ,那这个没有 + + 返回结果是一个数组。其中: + ['text']:要进行翻译的text内容文本 + ['node']:要进行翻译的目标node + + */ + get: function (node, attribute) { + return translate.element.nodeAnalyse.analyse(node, '', '', attribute); + }, + /* + 同上,只不过这个是扫描 element/node 下的所有可翻译的子节点(下层节点),返回数组形态。 + 这里面的数组,已经经过判断, text 必然是有不为空的值的。 + 所以它的返回值,有可能是一个空的数组 + + [ + { + node: 当前扫描出的node (传入的node、或下层node) + attribute: 是否是下层属性,比如 alt、placeholder , 如果是传入的node本身,不是任何下层属性,则这里是空白字符串 '' + text: 可进行翻译的文本,也就是当前数组中 node 的值的文本 + }, + ... + ] + */ + gets: function (node) { + var resultArray = []; + + var nodename = translate.element.getNodeName(node).toUpperCase(); + switch (nodename) { + case 'META': //meta标签,如是关键词、描述等 + var nodeAttributeName = node.name.toLowerCase(); //取meta 标签的name 属性 + var nodeAttributePropertyOri = node.getAttribute('property'); //取 property的值 + var nodeAttributeProperty = ''; + if (typeof (nodeAttributePropertyOri) === 'string' && nodeAttributePropertyOri.length > 0) { + nodeAttributeProperty = nodeAttributePropertyOri.toLowerCase(); + } + + if (nodeAttributeName == 'keywords' || nodeAttributeName == 'description' || nodeAttributeName == 'sharetitle' || nodeAttributeProperty == 'og:title' || nodeAttributeProperty == 'og:description' || nodeAttributeProperty == 'og:site_name' || nodeAttributeProperty == 'og:novel:latest_chapter_name') { + if (typeof (node.content) === 'string' && node.content.trim().length > 0) { + resultArray.push({ + text: node.content, + attribute: 'content', + node: node.getAttributeNode('content') + }); + } + } + break; + case 'IMG': + if (typeof (node.alt) === 'string' && node.alt.trim().length > 0) { + resultArray.push({ + text: node.alt, + attribute: 'alt', + node: node.getAttributeNode('alt') + }); + } + break; + case 'INPUT': + /* + input,要对以下情况进行翻译 + placeholder + type=button、submit 的情况下的 value + */ + + //针对 type=button、submit 的情况下的 value + if (typeof (node.attributes.type) !== 'undefined' && node.attributes.type !== null && typeof (node.attributes.type.nodeValue) === 'string' && (node.attributes.type.nodeValue.toLowerCase() == 'button' || node.attributes.type.nodeValue.toLowerCase() == 'submit')) { + //取它的value + var input_value_node = node.attributes.value; + if (typeof (input_value_node) !== 'undefined' && input_value_node !== null && typeof (input_value_node.nodeValue) === 'string' && input_value_node.nodeValue.trim().length > 0) { + resultArray.push({ + text: input_value_node.nodeValue, + attribute: 'value', + node: input_value_node + }); + } + } + + //针对 placeholder + if (typeof (node.attributes['placeholder']) !== 'undefined' && typeof (node.attributes['placeholder'].nodeValue) === 'string' && node.attributes['placeholder'].nodeValue.trim().length > 0) { + resultArray.push({ + text: node.attributes['placeholder'].nodeValue, + attribute: 'placeholder', + node: node.attributes['placeholder'] + }); + } + break; + case 'TEXTAREA': + //针对 placeholder + if (typeof (node.attributes['placeholder']) !== 'undefined' && typeof (node.attributes['placeholder'].nodeValue) === 'string' && node.attributes['placeholder'].nodeValue.trim().length > 0) { + resultArray.push({ + text: node.attributes['placeholder'].nodeValue, + attribute: 'placeholder', + node: node.attributes['placeholder'] + }); + } + break; + } + + //判断是否是 translate.element.tagAttribute 自定义翻译属性的 + var divTagAttribute = translate.element.tagAttribute[nodename.toLowerCase()]; + if (typeof (divTagAttribute) !== 'undefined') { + //有这个标签的自定义翻译某个属性 + for (var ai = 0; ai < node.attributes.length; ai++) { + var arrtibuteNodeName = translate.element.getNodeName(node.attributes[ai]).toLowerCase(); + if (divTagAttribute.attribute.indexOf(arrtibuteNodeName) > -1 && divTagAttribute.condition(node)) { + //包含这个属性,且自定义判断条件满足,允许翻译 + //判定一下是否已经加入过了,如果没有加入过,才会加入。这里主要是针对input 标签进行判断,比如 input type="submit" 的,value值如果也被用户自定义翻译,那上面的value就已经加上了,不需要在加了 + var isAlreadyAdd = false; //true已经加入过了 + for (var ri = 0; ri < resultArray.length; ri++) { + if (resultArray[ri].node === node.attributes[ai]) { + //相同,则不在加入了 + isAlreadyAdd = true; + } + } + if (!isAlreadyAdd) { + resultArray.push({ + text: node.attributes[ai].nodeValue, + attribute: arrtibuteNodeName, + node: node.attributes[ai] + }); + } + } + } + } else { + //条件不满足,不在翻译的属性范围 + } + + + //所有元素都要判定的属性 - title 属性 + if (typeof (node['title']) === 'string' && node['title'].trim().length > 0) { + var titleNode = node.getAttributeNode('title'); + resultArray.push({ + text: titleNode.nodeValue, + attribute: 'title', + node: titleNode + }); + } + + + //最后判定 node 本身 + if (typeof (node.nodeValue) === 'string' && node.nodeValue.trim().length > 0) { + //返回传入的node本身 + resultArray.push({ + text: node.nodeValue, + attribute: '', + node: node + }); + } + + + return resultArray; + }, + /* + 进行翻译之后的渲染显示 + 注意,它会对node本身进行扫描的,需要进行通过文本翻译接口进行翻译的文本进行识别,比如 这个 node 其内容为: + 你是谁?你好世界 + 扫描完后,触发了自定义术语将文本分割成多个、或者未启用整体翻译,出现分割后的文本数组为 + ['你是谁','你','世界'] + 那如果命中缓存 '你' 后,进行替换时,就不能将 '你是谁' 给替换了,不然会造成字符串无需拆分,直接纯单词翻译,没有什么语义了。另外这样也会导致漏翻译的情况。 经过这次调整,将 translate.execute() 二次扫描直接给优化掉了,提高了语义通顺、自定义术语的精准 + 这个取值,是从 translate.node.get(node).translateTexts 中取这个要进行文本翻译的数组的。 + 当然,如果 translate.node.get(node).whole 为 true,本身就是整体翻译,那就没这些破事,直接替换就好了 + + + 参数: + node 当前翻译的node元素 + 注意,如果是对 input、textarea 的value进行翻译,而 value是通过js赋予的,那么这个value属性的值并不是一个单独的node,所以是为空的,此时要记录的node便是 input、textarea 这个node本身。 + originalText 翻译之前的内容文本 + resultText 翻译之后的内容文本 + attribute 存放要替换的属性,比如 a标签的title属性。 如果是直接替换node.nodeValue ,那这个没有 + 返回结果是一个数组,其中: + resultText: 翻译完成之后的text内容文本,注意,如果返回的是空字符串,那么则是翻译结果进行替换时,并没有成功替换,应该是翻译的过程中,这个node的值被其他js又赋予其他内容了。 + node: 进行翻译的目标node + participles: 分词,数组形态。默认不传则是没有其他分词需要保留的。 传入比如 ['你好','你是谁'] + 比如 translateOriginal 传入 '你' 时, text 中的 '你好','你是谁' 是不能被拆出'你'这个字进行替换的,不然就破坏了分词了 + + 注意,使用本set方法,不要用 返回的 text参数,要用 resultText 这个参数,这个才是翻译之后的文本 + */ + set: function (node, originalText, resultText, attribute, participles) { + return translate.element.nodeAnalyse.analyse(node, originalText, resultText, attribute, participles); + }, + /* + + 注意,这个不使用,只是服务于上面的get、set使用。具体使用用上面的get、set + + 1. 只传入 node: + 获取node中的要进行翻译的文本内容、以及要操作的实际node对象(这个node对象很可能是传入的node中的某个子node) + 返回结果是一个数组。其中: + ['text']:要进行翻译的text内容文本 + ['node']:要进行翻译的目标node + 注意,如果是对 input、textarea 的value进行翻译,而 value是通过js赋予的,那么这个value属性的值并不是一个单独的node,所以是为空的,此时要记录的node便是 input、textarea 这个node本身。 + 2. 传入 node、originalText、 resultText + 则是进行翻译之后的渲染显示 + + attribute : 进行替换渲染时使用,存放要替换的属性,比如 a标签的title属性。 如果是直接替换node.nodeValue ,那这个没有 + participles: 分词,数组形态。保障 originalText 不被拆乱了。 默认不传则是没有其他分词需要保留的。 传入比如 ['你好','你是谁'] + 比如 translateOriginal 传入 '你' 时, text 中的 '你好','你是谁' 是不能被拆出'你'这个字进行替换的,不然就破坏了分词了 + + 返回结果是一个数组,其中: + resultText: 翻译完成之后的text内容文本。 当使用 translate.element.nodeAnalyse.set 时才会有这个参数返回。 注意,如果返回的是空字符串,那么则是翻译结果进行替换时,并没有成功替换,应该是翻译的过程中,这个node的值被其他js又赋予其他内容了。 + text : 要进行翻译的text内容文本,当使用 translate.element.nodeAnalyse.get 时才会有这个参数的返回 + node: 要进行翻译的目标node + 注意,如果是对 input、textarea 的value进行翻译,而 value是通过js赋予的,那么这个value属性的值并不是一个单独的node,所以是为空的,此时要记录的node便是 input、textarea 这个node本身。 + */ + analyse: function (node, originalText, resultText, attribute, participles) { + var result = new Array(); //返回的结果 + result['node'] = node; + result['text'] = ''; + + var nodename = translate.element.getNodeName(node); + //console.log('nodeAnalyse.analyse: NodeName:'+nodename+', originalText:'+originalText+', resultText:'+resultText+', attribute:'+attribute+', node:'); + //console.log(node) + + //console.log('participles:'); + //console.log(participles); + if (attribute != null && typeof (attribute) == 'string' && attribute.length > 0) { + //这个node有属性,替换的是node的属性,而不是nodeValue + + var nodeAttributeValue; //这个 attribute 属性的值 + if ((nodename === 'INPUT' || nodename === 'TEXTAREA') && attribute.toLowerCase() == 'value') { + //如果是input\textarea 的value属性,那么要直接获取,而非通过 attribute ,不然用户自己输入的通过 attribute 是获取不到的 -- catl 赵阳 提出 + + nodeAttributeValue = node.value; + } else { + nodeAttributeValue = node[attribute]; + } + result['text'] = nodeAttributeValue; + + + //替换渲染 + if (typeof (originalText) != 'undefined' && originalText.length > 0) { + if (typeof (nodeAttributeValue) != 'undefined') { + //这种是主流框架,像是vue、element、react 都是用这种 DOM Property 的方式,更快 + var resultShowText = translate.util.textReplace(nodeAttributeValue, originalText, resultText, translate.to, participles); + translate.element.nodeAnalyse.analyseReplaceBefore_DateToTranslateNode(node, attribute, resultShowText); + + if ((nodename === 'INPUT' || nodename === 'TEXTAREA') && attribute.toLowerCase() == 'value') { + //input 的value 对于用户输入的必须用 .value 操作 + node.value = resultShowText; + } else { + node[attribute] = resultShowText; //2025.4.26 变更为此方式 + } + if (resultShowText.indexOf(resultText) > -1) { + result['resultText'] = resultShowText; + } else { + result['resultText'] = ''; + } + } + + /* 20250911 删除 + //这种 Html Attribute 方式 是 v3.12 版本之前一直使用的方式,速度上要慢于 上面的,为了向前兼容不至于升级出问题,后面可能会优化掉 + if(node.nodeType === 1){ //是 element 节点 + var htmlAttributeValue = node.getAttribute(attribute); + if(htmlAttributeValue != null && typeof(htmlAttributeValue) != 'undefined'){ + var resultShowText = translate.util.textReplace(htmlAttributeValue, originalText, resultText, translate.to); + //这个才是在v3.9.2 后要用的,上面的留着只是为了适配以前的 + node.setAttribute(attribute, resultShowText); + if(resultShowText.indexOf(resultText) > -1){ + result['resultText'] = resultShowText; + }else{ + result['resultText'] = ''; + } + } + } + */ + } + return result; + } + + + + //正常的node ,typeof 都是 object + + /* 这里是通用方法,不应该有限制 + //console.log(typeof(node)+node); + if(nodename == '#text'){ + //如果是普通文本,判断一下上层是否是包含在textarea标签中 + if(typeof(node.parentNode) != 'undefined'){ + var parentNodename = translate.element.getNodeName(node.parentNode); + //console.log(parentNodename) + if(parentNodename == 'TEXTAREA'){ + //是textarea标签,那将nodename 纳入 textarea的判断中,同时将判断对象交于上级,也就是textarea标签 + nodename = 'TEXTAREA'; + node = node.parentNode; + } + } + } + */ + + + //console.log(nodename) + //console.log(translate.element.getNodeName(node.parentNode)) + //console.log(node) + if (nodename == 'INPUT' || nodename == 'TEXTAREA') { + //console.log(node.attributes) + /* + 1. input、textarea 输入框,要对 placeholder 做翻译 + 2. input 要对 type=button 的情况进行翻译 + */ + if (node.attributes == null || typeof (node.attributes) == 'undefined') { + result['text'] = ''; + return result; + } + + //input,要对 type=button、submit 的情况进行翻译 + if (nodename == 'INPUT') { + if (typeof (node.attributes.type) != 'undefined' && typeof (node.attributes.type.nodeValue) != null && (node.attributes.type.nodeValue.toLowerCase() == 'button' || node.attributes.type.nodeValue.toLowerCase() == 'submit')) { + //console.log('----是 0) { + //替换渲染 + if (typeof (originalText) != 'undefined' && originalText.length > 0) { + var resultShowText = translate.util.textReplace(input_value_node.nodeValue, originalText, resultText, translate.to, participles); + translate.element.nodeAnalyse.analyseReplaceBefore_DateToTranslateNode(node, attribute, resultShowText); + + input_value_node.nodeValue = resultShowText; //2025.4.26 变更为此方式 + if (resultShowText.indexOf(resultText) > -1) { + result['resultText'] = resultShowText; + } else { + result['resultText'] = ''; + } + } + + result['text'] = input_value_node.nodeValue; + result['node'] = input_value_node; + return result; + } + } + } + //console.log(node) + + //input textarea 的 placeholder 情况 + if (typeof (node.attributes['placeholder']) != 'undefined') { + //console.log(node); + //替换渲染 + if (typeof (originalText) != 'undefined' && originalText.length > 0) { + var resultShowText = translate.util.textReplace(node.attributes['placeholder'].nodeValue, originalText, resultText, translate.to, participles); + translate.element.nodeAnalyse.analyseReplaceBefore_DateToTranslateNode(node, attribute, resultShowText); + + node.attributes['placeholder'].nodeValue = resultShowText; //2025.4.26 变更为此方式 + if (resultShowText.indexOf(resultText) > -1) { + result['resultText'] = resultShowText; + } else { + result['resultText'] = ''; + } + } + + result['text'] = node.attributes['placeholder'].nodeValue; + result['node'] = node.attributes['placeholder']; + return result; + //return node.attributes['placeholder'].nodeValue; + } + //console.log(node) + result['text'] = ''; + return result; + } + if (nodename == 'META') { + //meta标签,如是关键词、描述等 + if (typeof (node.name) != 'undefined' && node.name != null) { + var nodeAttributeName = node.name.toLowerCase(); //取meta 标签的name 属性 + var nodeAttributePropertyOri = node.getAttribute('property'); //取 property的值 + var nodeAttributeProperty = ''; + if (typeof (nodeAttributePropertyOri) != 'undefined' && nodeAttributePropertyOri != null && nodeAttributePropertyOri.length > 0) { + nodeAttributeProperty = nodeAttributePropertyOri.toLowerCase(); + } + if (nodeAttributeName == 'keywords' || nodeAttributeName == 'description' || nodeAttributeName == 'sharetitle' || nodeAttributeProperty == 'og:title' || nodeAttributeProperty == 'og:description' || nodeAttributeProperty == 'og:site_name' || nodeAttributeProperty == 'og:novel:latest_chapter_name') { + //替换渲染 + if (typeof (originalText) != 'undefined' && originalText != null && originalText.length > 0) { + var resultShowText = translate.util.textReplace(node.content, originalText, resultText, translate.to, participles); + translate.element.nodeAnalyse.analyseReplaceBefore_DateToTranslateNode(node, attribute, resultShowText); + + node.content = resultShowText; //2025.4.26 变更为此方式 + if (resultShowText.indexOf(resultText) > -1) { + result['resultText'] = resultShowText; + } else { + result['resultText'] = ''; + } + } + + result['text'] = node.content; + return result; + } + } + + result['text'] = ''; + return result; + } + + if (nodename == 'IMG') { + + if (typeof (node.alt) == 'undefined' || node.alt == null) { + result['text'] = ''; + return result; + } + + //替换渲染 + if (typeof (originalText) != 'undefined' && originalText.length > 0) { + var resultShowText = translate.util.textReplace(node.alt, originalText, resultText, translate.to, participles); + translate.element.nodeAnalyse.analyseReplaceBefore_DateToTranslateNode(node, attribute, resultShowText); + + node.alt = resultShowText; //2025.4.26 变更为此方式 + if (resultShowText.indexOf(resultText) > -1) { + result['resultText'] = resultShowText; + } else { + result['resultText'] = ''; + } + } + result['text'] = node.alt; + return result; + } + + + //其他的 + if (node.nodeValue == null || typeof (node.nodeValue) == 'undefined') { + result['text'] = ''; + } else if (node.nodeValue.trim().length == 0) { + //避免就是单纯的空格或者换行 + result['text'] = ''; + } else { + //替换渲染 + if (typeof (originalText) != 'undefined' && originalText != null && originalText.length > 0) { + //console.log(originalText+'|'); + var resultShowText = translate.util.textReplace(node.nodeValue, originalText, resultText, translate.to, participles); + translate.element.nodeAnalyse.analyseReplaceBefore_DateToTranslateNode(node, attribute, resultShowText); + + //console.log(resultShowText+'|'); + node.nodeValue = resultShowText; //2025.4.26 变更为此方式 + if (resultShowText.indexOf(resultText) > -1) { + result['resultText'] = resultShowText; + } else { + result['resultText'] = ''; + } + } + result['text'] = node.nodeValue; + } + return result; + }, + /* + 在 analyse set 设置到dom之前,先将数据同步到 translate.node 中进行记录 + + node: translate.element.nodeAnalyse.analyse中传入的node + attribute: translate.element.nodeAnalyse.analyse中传入的attribute + resultShowText: translate.element.nodeAnalyse.analyse 进行设置翻译后的文本渲染时,提前计算好这个node显示的所有文本,然后在赋予 dom,这里是计算好的node要整体显示的文本 + */ + analyseReplaceBefore_DateToTranslateNode: function (node, attribute, resultShowText) { + //console.log('analyseReplaceBefore_DateToTranslateNode: attribute:'+attribute+', resultShowText:'+resultShowText+', node:'); + //console.log(node); + + var translateNode = null; //当前操作的,要记录入 translate.node 中的,进行翻译的node + var translateNode_attribute = ''; //当前操作的是node中的哪个attribute,如果没有是node本身则是空字符串 + + if (typeof (attribute) === 'string' && attribute.length > 0) { + //是操作的元素的某个属性,这时要判断 是否是 input、textarea 的value属性 + if (attribute !== null && attribute === 'value') { + var nodeNameLowerCase = translate.element.getNodeName(node).toLowerCase(); + if ((nodeNameLowerCase === 'input' || nodeNameLowerCase === 'textarea')) { + translateNode = node; + translateNode_attribute = 'value'; + } + } + if (translateNode === null) { + translateNode = node.getAttributeNode(attribute); + translateNode_attribute = attribute; + } + } else { + //操作的就是node本身 + translateNode = node; + } + + if (translate.node.find(translateNode)) { + if (typeof (translate.node.get(translateNode).translateResults) === 'undefined') { + translate.node.get(translateNode).translateResults = {}; + } + translate.node.get(translateNode).translateResults[resultShowText] = 1; + translate.node.get(translateNode).resultText = resultShowText; + } else { + //翻译过程中,会有时间差,比如通过文本翻译api请求,这时node元素本身被其他js改变了,导致翻译完成后,原本的node不存在了 + //console.log('[debug] 数据异常,analyse - set 中发现 translate.node 中的 node 不存在,理论上应该只要被扫描了,被翻译了,到这里就一定会存在的,不存在怎么会扫描到交给去翻译呢'); + } + }, + }, + + /*js translate.element.iframe start*/ + iframe: { + isUse: false, //是否启用,对非跨域的iframe的页面也进行自动翻译。true则是启用。默认是false为不启用 + translateJsUrl: '', //设置载入的 translate.js 这个文件的url, iframe 中会自动 + //启用对同域的iframe也进行翻译(即使页面中没有引入 translate.js) + use: function (translateJsUrl) { + if (typeof (window.location.protocol) === 'string' && window.location.protocol.toLowerCase() === 'file:') { + console.log('ERROR: 您当前设置了 translate.element.iframe.use(...); 但是您当前的协议是file协议访问的,这个协议访问会存在跨域问题,所以您的设置没有生效。 您可以通过本地开一个访问服务,以 http、https 等正常请求的方式进行访问。'); + return; + } + translate.element.iframe.isUse = true; + translate.element.iframe.translateJsUrl = translateJsUrl; + }, + /* + 用于记录已经操作过的iframe + key: iframe 元素 + value: + addLoad: true 如果没有添加 load 的事件,这里是空的,也就是通过判断 typeof(iframeMap.get(iframe).addLoad) === 'boolean' && iframeMap.get(iframe).addLoad === true 来判断是否已经添加 load 事件了 + isTranslate: true 是否已经触发过 ifr.injectJs(); 翻译了, 如果已经触发过,则是true 也就是通过判断 typeof(iframeMap.get(iframe).isTranslate) === 'boolean' && iframeMap.get(iframe).isTranslate === true 来判断是否已经触发过 + */ + iframeMap: new Map(), + + /** + * 通过URL判断iframe是否未跨域(true=未跨域,false=跨域) + * @param {HTMLIFrameElement} iframe - iframe DOM对象 + * @returns {boolean} true=未跨域,false=跨域 + */ + isIframeSameOrigin: function (iframe) { + // 1. 先校验iframe参数有效性:不是有效DOM对象,直接返回false(跨域) + if (!iframe || !(iframe instanceof HTMLIFrameElement)) { + console.warn('传入的iframe不是有效的DOM对象'); + return false; + } + + // 2. 获取当前页面的origin + const currentOrigin = window.location.origin; + + // 3. 获取iframe的实际URL(优先取内部URL,跨域则取src,增加兜底) + let iframeUrl; + try { + // 同域时:获取iframe最终的URL(含重定向) + iframeUrl = iframe.contentDocument?.URL || iframe.contentWindow?.location.href; + } catch (e) { + // 跨域时:取src,若src为空则默认about:blank + iframeUrl = iframe.src || 'about:blank'; + } + + // 4. 特殊处理:about:blank 视为未跨域 + if (iframeUrl === 'about:blank') return true; + + // 5. 解析iframe URL的origin并对比(增加解析容错) + try { + const iframeOrigin = new URL(iframeUrl).origin; + return currentOrigin === iframeOrigin; + } catch (e) { + // 无效URL解析失败,默认视为跨域 + return false; + } + }, + + /* + 要执行注入时的对象。 + 每次注入一个iframe,都会new一个出来 + */ + iframeJsInjector: class { + // 存储要注入的 JS 地址(可选,也可在调用时传入) + translateJsUrl = ''; + iframe = null; + + // 构造函数:初始化 JS 地址 + constructor(iframe, translateJsUrl) { + this.translateJsUrl = translateJsUrl; + this.iframe = iframe; + } + + //是否已经注入了tranlate.js , true已经触发 importJsAndTranslateExecute(...) 注入 + isInjectJs = false; + + importJsAndTranslateExecute = function () { + //console.log('importJsAndTranslateExecute -> '+this.translateJsUrl); + if (this.isInjectJs === true) { + console.log('已导入了,不在继续导入'); + return; + } + if (!translate.element.iframe.isIframeSameOrigin(this.iframe)) { + //console.log('iframe跨域,忽略 - '); + //console.log(this.iframe); + return; + } + + var iframeContentWindow; + try { + iframeContentWindow = this.iframe.contentWindow; + } catch (e) { + console.error('注入失败(大概率跨域)', e); + return; + } + + this.isInjectJs = true; + try { + const iframeDoc = this.iframe.contentDocument || this.iframe.contentWindow.document; + // 用 iframe 新文档创建 script(此时是新文档,不是之前的 about:blank) + const script = iframeDoc.createElement('script'); + script.type = 'text/javascript'; + script.src = this.translateJsUrl; + + script.onload = function () { + //console.log('✅ JS 注入成功'); + + var parentConfigData = parent.translate.config.get(); + iframeContentWindow.translate.config.set(parentConfigData); + iframeContentWindow.translate.to = iframeContentWindow.translate.language.getCurrent(); + //iframeContentWindow.translate.time.use = true; + + setTimeout(function () { + iframeContentWindow.translate.execute(); + }, 10); + + } + script.onerror = function (err) { + console.log('失败:'); + console.log(err); + } + + // 插入到新文档的任意位置(无需 head,body/html 都可) + iframeDoc.documentElement.appendChild(script); + + } catch (e) { + console.error('注入失败(大概率跨域)', e); + } + } + + injectJs = function () { + if (typeof (this.iframe) === 'object') { + //存在于当前页面的dom中了 + if (typeof (this.iframe.contentDocument) === 'object') { + //有了dom了 + if (typeof (this.iframe.contentDocument.readyState) === 'string') { + //有了正常的状态了 + this.importJsAndTranslateExecute(); + } else { + console.log('iframe - ' + this.translateJsUrl + ' state is not string'); + } + } else { + console.log('iframe - ' + this.translateJsUrl + ' state is not string'); + } + } else { + console.log('iframe - ' + this.translateJsUrl + ' is not find (not object)'); + } + } + }, + + + /* + 对某个iframe进行翻译 + iframeTag: 传入 iframe 的对象,比如 document.getElementById('iframe') + */ + execute: function (iframeTag) { + if (translate.element.iframe.isUse === false) { + return; + } + if (translate.element.iframe.iframeMap.get(iframeTag) === null || typeof (translate.element.iframe.iframeMap.get(iframeTag)) === 'undefined') { + translate.element.iframe.iframeMap.set(iframeTag, {}); + } + + if (!translate.element.iframe.isIframeSameOrigin(iframeTag)) { + //console.log('iframe跨域,忽略 - '); + //console.log(this.iframeTag); + return; + } + + if (typeof (iframeTag.src) === 'string' && iframeTag.src.trim().length > 0) { + //是通过 src 加载内容的 + + // 先监听 iframe 的 load(确保 iframe 内部 window 存在) + //console.log(typeof(translate.element.iframe.iframeMap.get(iframeTag))); + if (typeof (translate.element.iframe.iframeMap.get(iframeTag).addLoad) !== 'boolean' || translate.element.iframe.iframeMap.get(iframeTag).addLoad !== true) { + //未添加过 load 事件,需要添加 + translate.element.iframe.iframeMap.get(iframeTag).addLoad = true; + iframeTag.addEventListener('load', function () { + console.log('----load url: ' + iframeTag.src); + var iframeWindow = iframeTag.contentWindow; + if (typeof (iframeWindow.translate) === 'object' && typeof (iframeWindow.translate.version) === 'string') { + //发现了iframe中已经成功引入了 translate.js ,将不在注入 + } else { + //iframe中没有发现 translate.js ,进行注入 + translate.element.iframe.iframeMap.get(iframeTag).isTranslate = true; + var ifr = new translate.element.iframe.iframeJsInjector(iframeTag, translate.element.iframe.translateJsUrl); + ifr.injectJs(); + } + }); + } + + + + } else { + //不通过src,根本就没有src参数,直接用js渲染赋予内容的,那么就不用监听了,直接强制赋予 + var ifr = new translate.element.iframe.iframeJsInjector(iframeTag, translate.element.iframe.translateJsUrl); + ifr.injectJs(); + } + + + + // 先监听 iframe 的 load(确保 iframe 内部 window 存在) + //iframeTag.addEventListener('load', function() { + // console.log('----load'); + //}); + } + }, + /*js translate.element.iframe end*/ + + //获取这个node元素的node name ,如果未发现,则返回''空字符串 + getNodeName: function (node) { + if (node == null || typeof (node) == 'undefined') { + return ''; + } + + if (node.nodeName == null || typeof (node.nodeName) == 'undefined') { + return ''; + } + + var nodename = node.nodeName; + if (typeof (node.nodeName) == 'string') { + return node.nodeName; + } else { + if (typeof (node.tagName) == 'string' && node.tagName.length > 0) { + return node.tagName; + } else { + translate.log('warn : get nodeName is null, this node ignore translate. node : '); + translate.log(node); + return ''; + } + } + }, + /* + 向下遍历node + 其中如果使用了自定义 textarea 、input 的 value 属性,则认为是 node 本身进行挂钩,而非其 value 值(value值并不是个node) + */ + whileNodes: function (uuid, node) { + if (node == null || typeof (node) == 'undefined') { + return; + } + + //如果这个uuid没有,则创建 + if (typeof (translate.nodeQueue[uuid]) == 'undefined' || translate.nodeQueue[uuid] == null) { + translate.nodeQueue[uuid] = new Array(); //创建 + translate.nodeQueue[uuid]['expireTime'] = Date.now() + 120 * 1000; //删除时间,10分钟后删除 + translate.nodeQueue[uuid]['list'] = new Array(); + //console.log('创建 --- '); + //console.log(uuid) + } + + //console.log('---'+typeof(node)+', '); + //判断是否是有title属性,title属性也要翻译 + if (typeof (node) == 'object' && typeof (node['title']) == 'string' && node['title'].trim().length > 0) { + //将title加入翻译队列 + //console.log('---'+node.title+'\t'+node.tagName); + //console.log(node) + //console.log('------------'); + + //判断当前元素是否在ignore忽略的tag、id、class name中 + if (!translate.ignore.isIgnore(node)) { + //不在忽略的里面,才会加入翻译 + //translate.addNodeToQueue(uuid, node, node['title'], 'title'); + translate.addNodeToQueue(uuid, node.getAttributeNode('title'), node['title'], ''); + } + } + + //v3.9.2 增加, 用户可自定义标签内 attribute 的翻译 + var nodeNameLowerCase = translate.element.getNodeName(node).toLowerCase(); + if (typeof (translate.element.tagAttribute[nodeNameLowerCase]) != 'undefined') { + //console.log('find:'+nodeNameLowerCase); + //console.log(translate.element.tagAttribute[nodeNameLowerCase]); + //console.log(translate.element.tagAttribute[nodeNameLowerCase].attribute); + + for (var attributeName_index in translate.element.tagAttribute[nodeNameLowerCase].attribute) { + if (!translate.element.tagAttribute[nodeNameLowerCase].attribute.hasOwnProperty(attributeName_index)) { + continue; + } + if (typeof (translate.element.tagAttribute[nodeNameLowerCase].condition) != 'undefined' && !translate.element.tagAttribute[nodeNameLowerCase].condition(node)) { + continue; + } + + var attributeName = translate.element.tagAttribute[nodeNameLowerCase].attribute[attributeName_index]; + //console.log(attributeName); + //console.log(node.getAttribute(attributeName)); + + //是否是 input、 textarea 的 value ,如果是 则是 true + var isInputValue = false; + if ((nodeNameLowerCase === 'input' || nodeNameLowerCase === 'textarea') && attributeName.toLowerCase() == 'value') { + //如果是input 的value属性,那么要直接获取,而非通过 attribute ,不然用户自己输入的通过 attribute 是获取不到的 - catl 赵阳 提出 + attributeValue = node.value; + DOMPropOrHTMLAttr = 'DOMProperty'; + isInputValue = true; + } else { + /* + * 默认是 HtmlAtrribute 也就是 HTML特性。取值有两个: + * HTMLAtrribute : HTML特性 + * DOMProperty : DOM属性 + */ + var DOMPropOrHTMLAttr = 'HTMLAtrribute'; + var attributeValue = node.getAttribute(attributeName); + if (typeof (attributeValue) == 'undefined' || attributeValue == null) { + //vue、element、react 中的一些动态赋值,比如 element 中的 el-select 选中后赋予显示出来的文本,getAttribute 就取不到,因为是改动的 DOM属性,所以要用这种方式才能取出来 + attributeValue = node[attributeName]; + DOMPropOrHTMLAttr = 'DOMProperty'; + } + if (typeof (attributeValue) == 'undefined' || attributeValue == null) { + //这个tag标签没有这个属性,忽略 + continue; + } + } + + + //if(typeof(node.getAttribute(attributeName)) == 'undefined' && typeof(node[attributeName]) == 'undefined'){ + // //这个tag标签没有这个 attribute,忽略 + // continue + //} + //判断当前元素是否在ignore忽略的tag、id、class name中 v3.15.7 增加 + if (!translate.ignore.isIgnore(node)) { + //加入翻译 + translate.addNodeToQueue(uuid, isInputValue ? node : node.getAttributeNode(attributeName), attributeValue, isInputValue ? 'value' : ''); + } + } + } + + + var childNodes = node.childNodes; + if (childNodes == null || typeof (childNodes) == 'undefined') { + return; + } + if (childNodes.length > 0) { + for (var i = 0; i < childNodes.length; i++) { + translate.element.whileNodes(uuid, childNodes[i]); + } + } else { + //单个了 + translate.element.findNode(uuid, node); + } + }, + findNode: function (uuid, node) { + if (node == null || typeof (node) == 'undefined') { + return; + } + if (node.nodeType === 2) { //是属性node,比如 div 的 title 属性的 node + if (node.ownerElement == null) { + return; + } + } else { //是元素了 + if (node.parentNode == null) { + return; + } + } + + /****** 判断忽略的class ******/ + /* + 这段理论上不需要了,因为在 translate.ignore.isIgnore 判断了 + var ignoreClass = false; //是否是被忽略的class,true是 + var parentNode = node.parentNode; + while(node != parentNode && parentNode != null){ + //console.log('node:'+node+', parentNode:'+parentNode); + if(parentNode.className != null){ + if(translate.ignore.class.indexOf(parentNode.className) > -1){ + //发现ignore.class 当前是处于被忽略的 class + ignoreClass = true; + } + } + + parentNode = parentNode.parentNode; + } + if(ignoreClass){ + //console.log('ignore class : node:'+node.nodeValue); + return; + } + */ + /**** 判断忽略的class结束 ******/ + + + + /**** 避免中途局部翻译,在判断一下 ****/ + //判断当前元素是否在ignore忽略的tag、id、class name中 + if (translate.ignore.isIgnore(node)) { + //console.log('node包含在要忽略的元素中:'); + //console.log(node); + return; + } + + //node分析,分析这个node的所有可翻译属性(包含自定义翻译属性 translate.element.tagAttribute ) + var nodeAnalyChild = translate.element.nodeAnalyse.gets(node); + //console.log(nodeAnalyChild); + for (var nci = 0; nci < nodeAnalyChild.length; nci++) { + translate.addNodeToQueue(uuid, nodeAnalyChild[nci].node, nodeAnalyChild[nci].text, ''); + } + /* + var nodeAnaly = translate.element.nodeAnalyse.get(node); + if(nodeAnaly['text'].length > 0){ + //有要翻译的目标内容,加入翻译队列 + console.log(nodeAnaly) + console.log('addNodeToQueue -- '+nodeAnaly['node']+', text:' + nodeAnaly['text']); + translate.addNodeToQueue(uuid, nodeAnaly['node'], nodeAnaly['text'], ''); + } + */ + + //console.log(nodeAnaly); + /* + //console.log(node.nodeName+', type:'+node.nodeType+', '+node.nodeValue); + var nodename = translate.element.getNodeName(node); + if(nodename == 'INPUT' || nodename == 'TEXTAREA'){ + //input 输入框,要对 placeholder 做翻译 + console.log('input---'+node.attributes); + if(node.attributes == null || typeof(node.attributes) == 'undefined'){ + return; + } + + if(typeof(node.attributes['placeholder']) != 'undefined'){ + //console.log(node.attributes['placeholder'].nodeValue); + //加入要翻译的node队列 + //translate.nodeQueue[translate.hash(node.nodeValue)] = node.attributes['placeholder']; + //加入要翻译的node队列 + //translate.addNodeToQueue(translate.hash(node.attributes['placeholder'].nodeValue), node.attributes['placeholder']); + translate.addNodeToQueue(uuid, node.attributes['placeholder'], node.attributes['placeholder'].nodeValue); + } + + //console.log(node.getAttribute("placeholder")); + }else if(nodename == 'META'){ + //meta标签,如是关键词、描述等 + if(typeof(node.name) != 'undefined' && node.name != null){ + var nodeAttributeName = node.name.toLowerCase(); //取meta 标签的name 属性 + //console.log(nodeName); + if(nodeAttributeName == 'keywords' || nodeAttributeName == 'description'){ + //关键词、描述 + translate.addNodeToQueue(uuid, node, node.content); + } + } + //console.log(node.name) + }else if(nodename == 'IMG'){ + //console.log('-------'+node.alt); + translate.addNodeToQueue(uuid, node, node.alt); + }else if(node.nodeValue != null && node.nodeValue.trim().length > 0){ + + //过滤掉无效的值 + if(node.nodeValue != null && typeof(node.nodeValue) == 'string' && node.nodeValue.length > 0){ + }else{ + return; + } + + //console.log(node.nodeValue+' --- ' + translate.language.get(node.nodeValue)); + + //console.log(node.nodeName); + //console.log(node.parentNode.nodeName); + //console.log(node.nodeValue); + //加入要翻译的node队列 + translate.addNodeToQueue(uuid, node, node.nodeValue); + //translate.addNodeToQueue(translate.hash(node.nodeValue), node); + //translate.nodeQueue[translate.hash(node.nodeValue)] = node; + //translate.nodeQueue[translate.hash(node.nodeValue)] = node.nodeValue; + //node.nodeValue = node.nodeValue+'|'; + + } + */ + + }, + /* + 将node转为element输出。 + 如果node是文本元素,则转化为这个文本元素所在的element元素 + 如果node是属性,则转化为这个属性所在的element元素 + 如果node本身就是元素标签,那就还是这样返回。 + + + nodes: node数组,传入如 [node1,node2, ...] 它里面可能包含 node.nodeType 1\2\3 等值 + + 返回这些node转化为所在元素后的数组,返回如 [element1, element2, ...] + 注意的是 + 1. 输出的一定是 element 元素,也就是 node.nodeType 一定等于1 + 2. 输出的元素数组不一定等于传入的nodes数组,也就是他们的数量跟下标并不是对应相等的 + + */ + nodeToElement: function (nodes) { + var elements = new Array(); //要改动的元素 + + //遍历所有node组合到 nodes. 这个不单纯只是遍历组合,它会判断如果是文本节点,则取它的父级元素。它组合的结果是元素的集合 + for (var r = 0; r < nodes.length; r++) { + var node = nodes[r]; + if (typeof (node) == 'undefined' || typeof (node.parentNode) == 'undefined') { + continue; + } + if (node.nodeType === 2) { + //是属性节点,可能是input、textarea 的 placeholder ,获取它的父元素 + var nodeParentElement = node.ownerElement; + if (nodeParentElement == null) { + continue; + } + elements.push(nodeParentElement); + } else if (node.nodeType === 3) { + //是文本节点 + var nodeParentElement = node.parentNode; + if (nodeParentElement == null) { + continue; + } + elements.push(nodeParentElement); + } else if (node.nodeType === 1) { + //元素节点了,直接加入 + elements.push(node); + } else { + //1\2\3 都不是,这不应该是 translate.js 中应该出现的 + translate.log('translate.element.nodeToElement 中,发现传入的node.nodeType 类型有异常,理论上不应该存在, node.nodeType:' + node.nodeType); + translate.log(node); + } + } + + return elements; + } + }, + + + + + + /* + * 将发现的元素节点加入待翻译队列 + * uuid execute方法执行的唯一id + * node 当前text所在的node + * text 当前要翻译的目标文本 + * attribute 是否是元素的某个属性。比如 a标签中的title属性, a.title 再以node参数传入时是string类型的,本身并不是node类型,所以就要传入这个 attribute=title 来代表这是a标签的title属性。同样第二个参数node传入的也不能是a.title,而是传入a这个node元素 + 如果不穿或者传入 '' 空字符串,则代表不是 attribute 属性,而是nodeValue 本身 + 注意, textarea、input 标签的 value 属性的特殊性,如果 node 是textarea、input ,那么value时这个 attribute 要传递 'value' 进来的 + */ + addNodeToQueue: function (uuid, node, text, attribute) { + //console.log('addNodeToQueue - params: uuid:'+uuid+', text:'+text+', attribute:'+attribute+', node:'); + //console.log(node); + + if (node == null || text == null || text.length == 0) { + return; + } + + + //console.log('find tag ignore : '+node.nodeValue+', '+node.nodeName+", "+node.nodeType+", "+node.tagName); + //console.log('addNodeToQueue into -- node:'+node+', text:'+text+', attribute:'+attribute); + var nodename = translate.element.getNodeName(node).toLowerCase(); + + //判断如果是被 注释的区域,不进行翻译 + if (nodename == '#comment') { + return; + } + //console.log('\t\t'+text); + //取要翻译字符的hash + var key = translate.util.hash(text); + /* + 如果是input 的 placeholder ,就会出现这个情况 + if(node.parentNode == null){ + console.log('node.parentNode == null'); + return; + } + */ + + //console.log(node.parentNode); + //console.log(node.parentNode.nodeName); + + //判断其内容是否是 script、style 等编程的文本,如果是,则不进行翻译,不然翻译后还会影响页面正常使用 + if (translate.util.findTag(text)) { + //console.log('find tag ignore : '+node.nodeValue+', '+node.nodeName+", "+node.nodeType+", "+node.tagName); + //console.log(node.parentNode.nodeName); + + //获取到当前文本是属于那个tag标签中的,如果是script、style 这样的标签中,那也会忽略掉它,不进行翻译 + if (node.parentNode == null) { + //没有上级了,或是没获取到上级,忽略 + return; + } + //去上级的tag name + var parentNodeName = translate.element.getNodeName(node.parentNode); + //node.parentNode.nodeName; + if (parentNodeName == 'SCRIPT' || parentNodeName == 'STYLE') { + //如果是script、style中发现的,那也忽略 + return; + } + } + //console.log(node.nodeValue); + + + /***** 记录这个node 到 translate.node.data,这也是node进入 translate.node.data 记录的第一入口 *****/ + var translateNode; //当前操作的,要记录入 translate.node 中的,进行翻译的node + var translateNode_attribute = ''; //当前操作的是node中的哪个attribute,如果没有是node本身则是空字符串 + if (typeof (attribute) === 'string' && attribute.length > 0) { + //是操作的元素的某个属性,这时要判断 是否是 input、textarea 的value属性 + if ((nodename === 'input' || nodename === 'textarea') && attribute !== null && attribute === 'value') { + translateNode = node; + translateNode_attribute = 'value'; + } else { + translateNode = node.getAttributeNode(attribute); + translateNode_attribute = attribute; + } + } else { + //操作的就是node本身 + translateNode = node; + } + if (translate.node.get(translateNode) == null) { + translate.node.set(translateNode, {}); + } + + //var nodeAttribute = translate.node.getAttribute(attribute); + //console.log(text+'-----:'); + //console.log(translate.node.get(translateNode)); + //if(typeof(translate.node.get(translateNode)[nodeAttribute.key]) == 'undefined'){ + // translate.node.get(node)[nodeAttribute.key] = {}; + //} + translate.node.get(translateNode).attribute = translateNode_attribute; + if (typeof (translate.node.get(translateNode).originalText) === 'string') { + //这个节点有过记录原始显示的文本了,那么不再对其进行后续的扫描,除非它有被触发过动态监听元素改变, --- 至于它有被触发过动态监听元素改变--后续想怎么判定 + //console.log(translate.node.get(node)[nodeAttribute.key].originalText+'\t又过了,不在翻译'); + return; + } else { + //没有过,是第一次,那么赋予值 + translate.node.get(translateNode).originalText = text; + } + //console.log(translateNode); + //console.log(translate.node.get(translateNode)); + /* + if(typeof(translate.node.get(node).translateTexts) != 'undefined'){ + //这个node之前已经被扫描过了,那么判断一下上次扫描的文本跟当前获取到的文本是否一致,如果一致,那就没必要进行翻译了 + //这个一致,是跟通过文本翻译接口的,翻译前或者翻译后的文本,任何一个相等,就都不需要被翻译 + for(var originalText in translate.node.get(node).translateTexts){ + if (!translate.node.get(node).translateTexts.hasOwnProperty(originalText)) { + continue; + } + if(originalText === text || (translate.node.get(node).translateTexts[originalText] != null && translate.node.get(node).translateTexts[originalText] === text)){ + console.log('这个node之前已经被翻译过了,有翻译结果,那么判断一下翻译结果跟当前获取到的文本是否一致,如果一致,那就没必要进行翻译了, text:'+text); + return; + } + } + } + */ + /* + // 将传入的 hitNomenclatureArray 的所有键值对添加到 translate.node.get(node).hitNomenclatureArray 中 + hitNomenclatureArray.forEach((value, key) => { + translate.node.get(node).hitNomenclatureArray.set(key, value); + }); + */ + /* + if(typeof(translate.node.get(node).originalText) == 'string' && translate.node.get(node).originalText === text){ + console.log('这个node之前已经被搜索节点并分析过了, text:'+text); + return; + } + */ + if (typeof (translate.node.get(translateNode).translateTexts) === 'undefined') { + translate.node.get(translateNode).translateTexts = {}; + } + /***** 自检完毕,准备进行翻译了 *****/ + + + //原本传入的text会被切割为多个小块 + var textArray = new Array(); + textArray.push(text); //先将主 text 赋予 ,后面如果对主text进行加工分割,分割后会将主text给删除掉 + //console.log(textArray); + + // 处理 ignore.regex + var temporaryIgnoreTexts = []; //仅仅针对当前text文本,通过 translate.ignore.textRegex 所产生的临时不翻译的文本,它并不能作用于其他节点的文本 + for (var ri = 0; ri < translate.ignore.textRegex.length; ri++) { + var regex = translate.ignore.textRegex[ri]; + for (var tai = 0; tai < textArray.length; tai++) { + var text = textArray[tai]; + //temporaryIgnoreTexts = text.match(regex) || [] + var matches = text.match(regex) || []; + temporaryIgnoreTexts = temporaryIgnoreTexts.concat(matches); + //translate.ignore.text = translate.ignore.text.concat(ignoreTexts) + } + } + + //将当前节点文本的 不翻译文本规则,重新组合到 temporaryIgnoreTextsByRegex + if (temporaryIgnoreTexts.length == 0) { + temporaryIgnoreTexts = translate.ignore.text; + } else { + //将其加入 translate.history.translateTexts 中 + temporaryIgnoreTexts.concat(translate.ignore.text); + for (var ti = 0; ti < temporaryIgnoreTexts.length; ti++) { + translate.history.translateText.add(temporaryIgnoreTexts[ti], temporaryIgnoreTexts[ti]); + } + } + + /**** v3.10.2.20241206 - 增加自定义忽略翻译的文本,忽略翻译的文本不会被翻译 - 当然这样会打乱翻译之后阅读的连贯性 ****/ + for (var ti = 0; ti < temporaryIgnoreTexts.length; ti++) { + if (temporaryIgnoreTexts[ti].trim().length == 0) { + continue; + } + + //textArray = translate.addNodeToQueueTextAnalysis(uuid, node, textArray, attribute, temporaryIgnoreTexts[ti], temporaryIgnoreTexts[ti]); + + //console.log(textArray); + textArray = translate.nomenclature.dispose(textArray, temporaryIgnoreTexts[ti], temporaryIgnoreTexts[ti], { + node: translateNode, + attribute: translateNode_attribute + }).texts; + //console.log(textArray); + } + + + /**** v3.10.2.20241206 - 自定义术语能力全面优化 - 当然这样会打乱翻译之后阅读的连贯性 ****/ + //判断是否进行了翻译,也就是有设置目标语种,并且跟当前语种不一致 + if (typeof (translate.temp_nomenclature) == 'undefined') { + translate.temp_nomenclature = new Array(); + } + if (typeof (translate.temp_nomenclature[translate.language.getLocal()]) == 'undefined') { + nomenclatureKeyArray = new Array(); + } + if (typeof (translate.nomenclature.data[translate.language.getLocal()]) != 'undefined' && typeof (translate.nomenclature.data[translate.language.getLocal()][translate.to]) != 'undefined') { + var nomenclatureKeyArray; + for (var nomenclatureKey in translate.nomenclature.data[translate.language.getLocal()][translate.to]) { + if (!translate.nomenclature.data[translate.language.getLocal()][translate.to].hasOwnProperty(nomenclatureKey)) { + continue; + } + //nomenclatureKey 便是自定义术语的原始文本,值是要替换为的文本 + //console.log(nomenclatureKey); + //自定义属于的指定的结果字符串 + var nomenclatureValue = translate.nomenclature.data[translate.language.getLocal()][translate.to][nomenclatureKey]; + + //console.log('----translate.nomenclature.dispose---'); + //console.log(textArray); + var nomenclatureDispose = translate.nomenclature.dispose(textArray, nomenclatureKey, nomenclatureValue, { + node: translateNode, + attribute: translateNode_attribute + }); + + textArray = nomenclatureDispose.texts; + if (nomenclatureDispose.find) { + //console.log('发现自定义术语,并已进行替换处理:'); + //console.log(nomenclatureDispose); + } + + if (typeof (nomenclatureKeyArray) != 'undefined') { + nomenclatureKeyArray.push(nomenclatureKey); + } + } + + if (typeof (translate.temp_nomenclature[translate.language.getLocal()]) == 'undefined') { + translate.temp_nomenclature[translate.language.getLocal()] = nomenclatureKeyArray; + } + } + /**** v3.10.2.20241206 - 自定义术语能力全面优化 - end ****/ + + + //记录 nodeHistory - 判断text是否已经被拆分了 + if (textArray.length > 0 && textArray[0] != text) { //主要是后面的是否相等,前面的>0只是避免代码报错 + translate.node.get(translateNode).whole = false; //已经被拆分了,不是整体翻译了 + //这时,也默认给其赋值操作,将自定义术语匹配后的结果进行赋予 + + for (var tai = 0; tai < textArray.length; tai++) { + translate.node.get(translateNode).translateTexts[textArray[tai]] = null; + } + } else { + translate.node.get(translateNode).whole = true; //未拆分,是整体翻译 + } + //成功加入到 nodeQueue 的对象。 如果长度为0,那就是还没有加入到 translate.nodeQueue 中,可能全被自定义术语命中了 + var addQueueObjectArray = []; + + //console.log(textArray); + for (var tai = 0; tai < textArray.length; tai++) { + if (textArray[tai].trim().length == 0) { + continue; + } + + /* 自定义术语 - 忽略翻译文本 , 在本方法的上面已经完成了识别,这里就不再需要了 + //判断是否出现在自定义忽略字符串 + if(translate.ignore.text.indexOf(textArray[tai].trim()) > -1){ + //console.log(textArray[tai]+' 是忽略翻译的文本,不翻译'); + continue; + } + */ + + /* 自定义术语,在本方法的上面已经完成了识别,这里就不再需要了 + //判断是否出现在自定义术语的 + if(typeof(translate.temp_nomenclature[translate.language.getLocal()]) != 'undefined'){ + if(translate.temp_nomenclature[translate.language.getLocal()].indexOf(textArray[tai].trim()) > -1){ + //console.log(textArray[tai]+' 是自定义术语,不翻译'); + continue; + } + } + */ + + var newAddQueueArray = translate.addNodeToQueueAnalysis(uuid, node, textArray[tai], attribute); + //console.log(newAddQueueArray) + Array.prototype.push.apply(addQueueObjectArray, newAddQueueArray); + } + + //console.log('成功加入进nodequeue的数量:'+addQueueObjectArray.length); + //console.log(addQueueObjectArray); + + if (addQueueObjectArray.length == 0) { + //没有加入到 nodeQueue 中,那么也就是在自定义术语这一层,就已经完成了渲染,此时要触发相关钩子 + // translate.node 记录 + + // 记录当前有 translate.js 所触发翻译之后渲染到dom界面显示的时间,13位时间戳 + translate.node.get(translateNode).lastTranslateRenderTime = Date.now(); + //将具体通过文本翻译接口进行翻译的文本记录到 translate.node.data + translate.node.get(translateNode).translateTexts = {}; //这里全部命中了,所以根本没有走翻译接口的文本 + //将翻译完成后要显示出的文本进行记录 + translate.node.get(translateNode).resultText = translate.element.nodeAnalyse.get(node, attribute).text; //直接获取当前node显示出来的文本作为最后的结果的文本 + + //将其加入 translate.history.translateTexts 中 + translate.history.translateText.add(translate.node.get(translateNode).originalText, translate.node.get(translateNode).resultText); + } + + }, + + + + /* + + 服务于上面的 addNodeToQueue ,用于区分不同type情况,进行调用此加入 translate.nodeQueue + uuid, node, attribute 这五个参数说明见 addNodeToQueue 的参数说明,相同 + + word 要实际进行翻译的文本,也就是要把它拿来进行通过后端翻译接口进行翻译的文本 + lang 当前要翻译的文本的语种,如 english + beforeText 参见 translate.nodeQueue 注释中第七维的解释 + afterText 参见 translate.nodeQueue 注释中第七维的解释 + + + 返回: + 加入 nodeQueue 后的对象。 + 这里跟addNodeQueueItem方法返回一样,只不过 addNodeQueueItem 方法返回的是一个,而这里是多个,数组的形式。 + 如果一个也没有加入到 nodeQueue,那么这里返回的数组长度便是0 + */ + addNodeToQueueAnalysis: function (uuid, node, text, attribute) { + //获取当前是什么语种 + //console.log('uuid:'+uuid+', text:'+text+', attribute:'+attribute+'node:'); + //console.log(node); + //var langs = translate.language.get(text); + var textRecognition = translate.language.recognition(text); + var langs = textRecognition.languageArray; + //console.log('langs'); + //console.log(langs); + + + //过滤掉要转换为的目标语种,比如要转为英语,那就将本来是英语的部分过滤掉,不用再翻译了 + if (typeof (langs[translate.to]) != 'undefined') { + delete langs[translate.to]; + } + + var isWhole = translate.whole.isWhole(node); + //console.log('isWhole:'+isWhole+', '+text); + + //记录成功加入 nodeQueue 的,如果加入了多个,那就是多个数组,如果长度为0,那就是啥也没加入了 + var addNodeQueueArray = []; + + if (!isWhole) { + //常规方式,进行语种分类 + + + /* if(this.nodeQueue[lang] == null || typeof(this.nodeQueue[lang]) == 'undefined'){ + this.nodeQueue[lang] = new Array(); + } + //创建二维数组 + if(this.nodeQueue[lang][key] == null || typeof(this.nodeQueue[lang][key]) == 'undefined'){ + this.nodeQueue[lang][key] = new Array(); + } + */ + //console.log(langs); + + for (var lang in langs) { + if (!langs.hasOwnProperty(lang)) { + continue; + } + //创建二维数组, key为语种,如 english + /* + 放到了 translate.addNodeQueueItem 进行判断 + if(translate.nodeQueue[uuid]['list'][lang] == null || typeof(translate.nodeQueue[uuid]['list'][lang]) == 'undefined'){ + translate.nodeQueue[uuid]['list'][lang] = new Array(); + } + */ + //console.log('|'+langs[lang].length); + //遍历出该语种下有哪些词需要翻译 + for (var word_index = 0; word_index < langs[lang].list.length; word_index++) { + //console.log('start:'+word_index) + //console.log(langs[lang].list[word_index]); + if (typeof (langs[lang].list[word_index]) == 'undefined' || typeof (langs[lang].list[word_index]['text']) == 'undefined') { + //理论上应该不会,但多加个判断 + continue; + } + var word = langs[lang].list[word_index]['text']; //要翻译的词 + var beforeText = langs[lang].list[word_index]['beforeText']; + var afterText = langs[lang].list[word_index]['afterText']; + + //console.log(lang+' - '+word+', attribute:'+attribute); + var addQueue = translate.addNodeQueueItem(uuid, node, word, attribute, lang, beforeText, afterText); + if (addQueue != null) { + addNodeQueueArray.push(addQueue); + } + + /* + var hash = translate.util.hash(word); //要翻译的词的hash + //创建三维数组, key为要通过接口翻译的文本词或句子的 hash (注意并不是node的文本,而是node拆分后的文本) + if(translate.nodeQueue[uuid]['list'][lang][hash] == null || typeof(translate.nodeQueue[uuid]['list'][lang][hash]) == 'undefined'){ + translate.nodeQueue[uuid]['list'][lang][hash] = new Array(); + + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'] = new Array(); + translate.nodeQueue[uuid]['list'][lang][hash]['original'] = word; + translate.nodeQueue[uuid]['list'][lang][hash]['translateText'] = translate.nomenclature.dispose(word); //自定义术语处理 + //translate.nodeQueue[uuid]['list'][lang][hash]['beforeText'] = beforeText; + //translate.nodeQueue[uuid]['list'][lang][hash]['afterText'] = afterText; + //translate.nodeQueue[uuid]['list'][lang][hash]['attribute'] = attribute; //放入 nodes[index][attribute] 元素中 + + //其中key: nodes 是第四维数组,里面存放具体的node元素对象 + + + //console.log(translate.nodeQueue[uuid]['list'][lang][hash]); + } + + var isEquals = false; //queue中是否已经加入过这个node了(当然是同一hash同一node情况) + if(typeof(node.isSameNode) != 'undefined'){ //支持 isSameNode 方法判断对象是否相等 + for(var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++){ + if(node.isSameNode(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'])){ + //相同,那就不用在存入了 + //console.log('相同,那就不用在存入了') + isEquals = true; + //console.log(node) + continue; + } + } + } + if(isEquals){ + //相同,那就不用在存入了 + continue; + } + + //往五维数组nodes中追加node元素 + var nodesIndex = translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex] = new Array(); + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['node']=node; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['attribute']=attribute; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['beforeText'] = beforeText; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['afterText'] = afterText; + + */ + + //console.log('end:'+word_index) + } + + } + + + + + } else { + //直接翻译整个元素内的内容,不再做语种分类 + var lang = translate.language.recognition_languageName_force(textRecognition); + //console.log(lang+' - '+text); + var addQueue = translate.addNodeQueueItem(uuid, node, text, attribute, lang, '', ''); + if (addQueue != null) { + addNodeQueueArray.push(addQueue); + } + } + + //console.log('-----'+addNodeQueueArray.length); + return addNodeQueueArray; + }, + + /* + + 服务于上面的 addNodeToQueue ,用于区分不同type情况,进行调用此加入 translate.nodeQueue + uuid, node, attribute 这五个参数说明见 addNodeToQueue 的参数说明,相同 + + word 要实际进行翻译的文本,也就是要把它拿来进行通过后端翻译接口进行翻译的文本 + lang 当前要翻译的文本的语种,如 english + beforeText 参见 translate.nodeQueue 注释中第七维的解释 + afterText 参见 translate.nodeQueue 注释中第七维的解释 + + 返回值判断 不为 null,则是成功加入了 nodeQueue ,返回加入后的 translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex] ,包含这些: + afterText: + attribute: + beforeText: + node: + + */ + addNodeQueueItem: function (uuid, node, word, attribute, lang, beforeText, afterText) { + //console.log('uuid:'+uuid+', word:'+word+', attribute:'+attribute+', lang:'+lang+', beforeText:'+beforeText+', afterText:'+afterText+', node:'); + //console.log(node); + + //创建二维数组, key为语种,如 english + if (translate.nodeQueue[uuid]['list'][lang] == null || typeof (translate.nodeQueue[uuid]['list'][lang]) == 'undefined') { + translate.nodeQueue[uuid]['list'][lang] = new Array(); + } + //console.log(word) + //var word = text; //要翻译的文本 + var hash = translate.util.hash(word); //要翻译的文本的hash + + //创建三维数组, key为要通过接口翻译的文本词或句子的 hash 。这里翻译的文本也就是整个node元素的内容了,不用在做拆分了 + if (translate.nodeQueue[uuid]['list'][lang][hash] == null || typeof (translate.nodeQueue[uuid]['list'][lang][hash]) == 'undefined') { + translate.nodeQueue[uuid]['list'][lang][hash] = new Array(); + + /* + * 创建四维数组,存放具体数据 + * key: nodes 包含了这个hash的node元素的数组集合,array 多个。其中 + nodes[index]['node'] 存放当前的node元素 + nodes[index]['attribute'] 存放当前hash,也就是翻译文本针对的是什么,是node本身(nodeValue),还是 node 的某个属性,比如title属性。如果这里不为空,那就是针对的属性操作的 + * key: original 原始的要翻译的词或句子,html加载完成但还没翻译前的文本,用于支持当前页面多次语种翻译切换而无需跳转 + * beforeText、afterText:见 translate.nodeQueue 的说明 + */ + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'] = new Array(); + translate.nodeQueue[uuid]['list'][lang][hash]['original'] = word; + //自定义术语处理在此前面已经执行过了,所以这个废弃,不需要处理自定义术语部分了 + //translate.nodeQueue[uuid]['list'][lang][hash]['translateText'] = translate.nomenclature.dispose(word); + translate.nodeQueue[uuid]['list'][lang][hash]['translateText'] = word; + //console.log(word) + + + + //其中key: nodes 是第四维数组,里面存放具体的node元素对象 + } + + + var isEquals = false; //queue中是否已经加入过这个node了(当然是同一hash同一node且同一 attribute的 情况) + if (typeof (node.isSameNode) != 'undefined') { //支持 isSameNode 方法判断对象是否相等 + for (var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++) { + if (node.isSameNode(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'])) { + //在判断 attribute 是否相同 + //console.log('attribute:'+attribute+", 对比的 :"+translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index].attribute) + if (attribute === translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index].attribute) { + //相同,那就不用在存入了 + isEquals = true; + } + //console.log(node) + continue; + } + } + } + if (isEquals) { + //相同,那就不用在存入了 + return null; + } + + //往五维数组nodes中追加node元素 + var nodesIndex = translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex] = new Array(); + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['node'] = node; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['attribute'] = attribute; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['beforeText'] = beforeText; + translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]['afterText'] = afterText; + + return translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][nodesIndex]; + /* + //记录这个node + if(translate.node.get(node) == null){ + translate.node.set(node, {}); + } + + if(typeof(translate.node.get(node).hitNomenclatureArray) == 'undefined'){ + translate.node.get(node).hitNomenclatureArray = new Map(); + } + translate.node.get(node).translateTexts[word] = null; //设置要进行通过文本翻译接口翻译的文字 + */ + + }, + + //全部翻译,node内容全部翻译,而不是进行语种提取,直接对node本身的全部内容拿出来进行直接全部翻译 + whole: { + isEnableAll: false, //是否开启对整个html页面的整体翻译,也就是整个页面上所有存在的能被翻译的全部会采用整体翻译的方式。默认是 false不开启 + + enableAll: function () { + translate.whole.isEnableAll = true; + }, + + /* + 一下三个,也就是 class tag id 分别存储加入的值。使用参考:http://translate.zvo.cn/42563.html + */ + class: [], + tag: [], + id: [], + + //运行时出现自检并在浏览器控制台提示性文本。 + //在执行翻译,也就是 execute() 时,会调用此方法。 + executeTip: function () { + if (translate.whole.class.length == 0 && translate.whole.tag.length == 0 && translate.whole.id.length == 0) { + + } else { + translate.log('您开启了 translate.whole 此次行为避开了浏览器端的文本语种自动识别,而是暴力的直接对某个元素的整个文本进行翻译,很可能会产生非常大的翻译量,请谨慎!有关每日翻译字符的说明,可参考: http://translate.zvo.cn/42557.html '); + } + + if (translate.whole.tag.indexOf('html') > -1) { + translate.log('自检发现您设置了 translate.whole.tag 其中有 html ,这个是不生效的,最大只允许设置到 body '); + } + }, + + //当前元素是属于全部翻译定义的元素 + /* + 传入一个元素,判断这个元素是否是被包含的。 这个会找父类,看看父类中是否包含在其之中。 + return true是在其中,false不再其中 + */ + isWhole: function (ele) { + + if (translate.whole.isEnableAll) { + return true; + } + + //如果设置了 class|tag|id 其中某个,或者 all=true ,那么就是启用,反之未启用 + if ((translate.whole.class.length == 0 && translate.whole.tag.length == 0 && translate.whole.id.length == 0) && translate.whole.isEnableAll == false) { + //未设置,那么直接返回false + return false; + } + if (ele == null || typeof (ele) == 'undefined') { + return false; + } + + + var parentNode = ele; + var maxnumber = 100; //最大循环次数,避免死循环 + while (maxnumber-- > 0) { + if (parentNode == null || typeof (parentNode) == 'undefined') { + //没有父元素了 + return false; + } + + //判断Tag + //var tagName = parentNode.nodeName.toLowerCase(); //tag名字,小写 + var nodename = translate.element.getNodeName(parentNode).toLowerCase(); //tag名字,小写 + if (nodename.length > 0) { + //有nodename + if (nodename == 'html' || nodename == '#document') { + //上层元素已经是顶级元素了,那肯定就不是了 + return false; + } + if (translate.whole.tag.indexOf(nodename) > -1) { + //发现ignore.tag 当前是处于被忽略的 tag + return true; + } + } + + + //判断class name + if (parentNode.className !== null && typeof (parentNode.className) === 'string') { + var classNames = parentNode.className; + if (classNames == null || typeof (classNames) != 'string') { + continue; + } + //console.log('className:'+typeof(classNames)); + //console.log(classNames); + classNames = classNames.trim().split(' '); + for (var c_index = 0; c_index < classNames.length; c_index++) { + if (classNames[c_index] != null && classNames[c_index].trim().length > 0) { + //有效的class name,进行判断 + if (translate.whole.class.indexOf(classNames[c_index]) > -1) { + //发现ignore.class 当前是处于被忽略的 class + return true; + } + } + } + } + + //判断id + if (parentNode.id != null && typeof (parentNode.id) != 'undefined') { + //有效的class name,进行判断 + if (translate.whole.id.indexOf(parentNode.id) > -1) { + //发现ignore.id 当前是处于被忽略的 id + return true; + } + } + + //赋予判断的元素向上一级 + parentNode = parentNode.parentElement; + } + + return false; + } + }, + + language: { + + + + /* + 英语的变种语种,也就是在英语26个字母的基础上加了点别的特殊字母另成的一种语言,而这些语言是没法直接通过识别字符来判断出是哪种语种的 + + 法语、意大利语、德语、葡萄牙语 + + 要废弃,用下面的 systems 、 name + */ + englishVarietys: ['french', 'italian', 'deutsch', 'portuguese'], + + /* + 语言的书写体系,分成哪几个语言体系。 + 这里区分,主要是单纯从文字组成长进行区分的。 + + 其中 + key : 语言体系的名字 + value: 语言体系的详细信息 + direction: 书写方向 (当前只是记录,无其他意义) + remark: 说明备注 (当前只是记录,无其他意义) + languages: 这个语言体系下,有哪些具体语种, translate.js 的语言标识 + + */ + systems: { + + // 拉丁字母体系 + latin: { + direction: "left-to-right", // 书写方向 + coreFeatures: "基础字母26个(A-Z),部分语言添加变音符号(如é、ñ、ü),从左到右书写", + languages: [ //包含的语种 + "english", "latin", "french", "spanish", "deutsch", "portuguese", + "italian", "越南语", "马来语", "印尼语", + "土耳其语", "波兰语", "荷兰语", "瑞典语", "非洲诸语(多数)", + "美洲诸语(多数)", "菲律宾语", "哈萨克语(现代拉丁化)" + ] + }, + + // 汉字体系(表意文字) + chinese: { + direction: "left-to-right", + coreFeatures: "表意文字,单字独立,可组合成词,笔画复杂,现代多横向书写", + languages: [ + "chinese_simplified", "chinese_traditional", "japanese", "korean" + ] + }, + + //阿拉伯字母体系 + arabic: { + direction: "right-to-left", + coreFeatures: "表意文字,单字独立,可组合成词,笔画复杂,现代多横向书写", + languages: [ + "阿拉伯语", "波斯语", "乌尔都语", "旁遮普语(巴基斯坦)", "豪萨语(西非)", "普什图语", + ] + }, + + //西里尔字母体系 + cyrillic: { + direction: "left-to-right", + coreFeatures: "源于希腊字母,字母形态独特(如п、в、м),部分字母与拉丁字母形似但发音不同", + languages: [ + "俄语", "乌克兰语", "白俄罗斯语", "保加利亚语", "塞尔维亚语(官方)" + ] + }, + + //泰语体系 + thai: { + direction: "left-to-right", + coreFeatures: "元音附标文字,字母弯曲优美,含音调符号(影响词义)", + languages: [ + "thai" + ] + }, + + //其他后续补充吧 + + }, + + /* + 生成 translate.language.english 这种语种对象,通过 translate.language.systems + */ + generateLanguageNameObject: function () { + var languages = new Map(); + for (var key in translate.language.systems) { + if (!translate.language.systems.hasOwnProperty(key)) { + continue; + } + for (var li = 0; li < translate.language.systems[key].languages.length; li++) { + //console.log(translate.language.systems[key].languages[li]) + languages.set(translate.language.systems[key].languages[li], { + system: key + }); + } + } + return languages; + }, + + /* + 语言表示:属性相关,他会在translate.js 加载完后自动初始化,从 translate.language.systems 中遍历出来,赋予 translate.language.name + 它里面的值为: + translate.language.map.get('english') = { + system:'latin' //所属系统语族 , 也就是 translate.language.systems[key] 的 key + } + + 它会在 translate.execute() 是进行初始化,通过触发 translate.language.generateLanguageNameObject 赋予值 + */ + map_data: null, //这是一个map + map: function () { + if (translate.language.map_data == null) { + translate.language.map_data = translate.language.generateLanguageNameObject(); + } + return translate.language.map_data; + }, + + + //当前本地语种,本地语言,默认是简体中文。设置请使用 translate.language.setLocal(...)。不可直接使用,使用需用 getLocal() + local: '', + + /* + * v3.12增加, 是否会翻译本地语种,默认是false,不会翻译。 + * 比如当前设置的本地语种是简体中文, 但是网页中也有一段英文, 如果设置了translate.to 为中文,也就是要以中文显示 默认是false的情况下,整个页面是不会被任何翻译的,也就是有的那段英文也不会进行任何翻译,依旧是显示英文。 + * 如果这里设置为 true, 则英文也会被翻译,只要不是中文的,都会被翻译为要显示的语种,也就是都会被翻译为中文。 + */ + translateLocal: false, + + /* + 翻译语种范围 + 比如传入 ['chinese_simplified','chinese_traditional','english'] 则表示仅对网页中的简体中文、繁体中文、英文 进行翻译,而网页中出现的其他的像是法语、韩语则不会进行翻译 + 如果为空 [],则是翻译时,翻译网页中的所有语种 + 设置方式为: translate.language.translateLanguagesRange = ['chinese_simplified','chinese_traditional'] + */ + translateLanguagesRange: [], + //传入语种。具体可传入哪些参考: http://api.translate.zvo.cn/doc/language.json.html + setLocal: function (languageName) { + //translate.setUseVersion2(); //Set to use v2.x version + translate.useVersion = 'v2'; + translate.language.local = languageName; + }, + //获取当前本地语种,本地语言,默认是简体中文。设置请使用 translate.language.setLocal(...) + getLocal: function () { + //判断是否设置了本地语种,如果没设置,自动给其设置 + if (translate.language.local == null || translate.language.local.length < 1) { + translate.language.autoRecognitionLocalLanguage(); + } + return translate.language.local; + }, + /* + 获取当前语种。 + 比如当前设置的本地语种是简体中文,用户并未切换其他语种,那么这个方法将返回本地当前的语种,也就是等同于 translate.language.getLocal() + 如果用户切换为英语进行浏览,那么这个方法将返回翻译的目标语种,也就是 english + */ + getCurrent: function () { + var to_storage = translate.storage.get('to'); + if (to_storage != null && typeof (to_storage) != 'undefined' && to_storage.length > 0) { + //之前有过使用,并且主动设置过目标语种 + return to_storage; + } + return translate.language.getLocal(); + }, + + + //如果第一次用,默认以什么语种显示。 + //比如本地当前语种是简体中文,这里设置为english,那么用户第一次使用时,会自动翻译为english进行显示。如果用户手动切换为其他语种比如韩语,那么就遵循用户手动切换的为主,显示韩语。 + defaultTo: '', + setDefaultTo: function (languageName) { + if (typeof (languageName) === 'string' && languageName.trim().length > 0) { + translate.language.defaultTo = languageName; + } + var to_storage = translate.storage.get('to'); + if (to_storage != null && typeof (to_storage) != 'undefined' && to_storage.length > 0) { + //之前有过使用,并且主动设置过目标语种,那么不进行处理 + } else { + //没有设置过,进行处理 + translate.storage.set('to', languageName); + translate.to = languageName; + } + }, + /* + 清除历史翻译语种的缓存 + */ + clearCacheLanguage: function () { + if (typeof (translate.language.setUrlParamControl_use) != 'undefined') { + if (translate.language.setUrlParamControl_use) { + translate.log('使用提示:') + translate.log('translate.language.setUrlParamControl(...) 的作用是 可以通过URL传一个语种,来指定当前页面以什么语种显示。 参考文档: http://translate.zvo.cn/4075.html'); + translate.log('translate.language.clearCacheLanguage() 是清除历史翻译语种缓存,也就是清除之前指定翻译为什么语种。 参考文档:http://translate.zvo.cn/4080.html') + translate.log('如果你执行了 translate.language.setUrlParamControl(...) 那么是要根据url传参来切换语种的,但是后面又出现了 translate.language.clearCacheLanguage() 它会阻止 translate.language.setUrlParamControl(...) 它的设置,即使有url传递翻译为什么语言,也会因为 translate.language.clearCacheLanguage() 给清除掉,使URL传参的语种不起任何作用。') + } + } + translate.to = ''; + translate.storage.set('to', ''); + }, + //标记已执行了 translate.language.setUrlParamControl 如果已经执行启用,则是true,默认是不启用是false + setUrlParamControl_use: false, + // translate.language.setUrlParamControl('language') 这里传入的 language 参数,默认不设置则是 language ,比如传入 lang ,那这个 setUrlParamControl_name 值便是 lang + setUrlParamControl_name: 'language', + //根据URL传参控制以何种语种显示 + //设置可以根据当前访问url的某个get参数来控制使用哪种语言显示。 + //比如当前语种是简体中文,网页url是http://translate.zvo.cn/index.html ,那么可以通过在url后面增加 language 参数指定翻译语种,来使网页内容以英文形态显示 http://translate.zvo.cn/index.html?language=english + setUrlParamControl: function (paramName) { + translate.language.setUrlParamControl_use = true; //标记已执行了 translate.language.setUrlParamControl ,仅仅只是标记,无其他作用 + if (typeof (paramName) == 'undefined' || paramName.length < 1) { + paramName = 'language'; + } + translate.language.setUrlParamControl_name = paramName; + var paramValue = translate.util.getUrlParam(paramName); + if (typeof (paramValue) == 'undefined') { + return; + } + if (paramValue == '' || paramValue == 'null' || paramValue == 'undefined') { + return; + } + + translate.storage.set('to', paramValue); + translate.to = paramValue; + }, + /* + 获取翻译区域的原始文本,翻译前的文本。 这里会把空白符等过滤掉,只返回纯显示的文本 + 也就是获取 translate.setDocument(...) 定义的翻译区域中,翻译前,要参与翻译的文本。 + 其中像是 translate.ignore.tag 这种忽略翻译的标签,这里也不会获取的,这里只是获取实际要参与翻译的文本。 + + 返回值: 字符串。 如果获取不到,则返回空字符串 '' + */ + getTranslateAreaText: function () { + //v3.16.1 优化,获取本地语种,针对开源中国只对 readme 部分进行翻译的场景,将针对设置的 translate.setDocument() 区域的元素的显示文本进行判定语种 + var translateAreaText = ''; //翻译区域内当前的文本 + + /** 构建虚拟容器,将要翻译的区域放入虚拟容器,以便后续处理 **/ + var virtualContainer = document.createElement('div'); // 创建虚拟容器,处理、判断也都是针对这个虚拟容器 + if (translate.documents != null && typeof (translate.documents) != 'undefined' && translate.documents.length > 0) { + // setDocuments 指定的 + for (var docs_index = 0; docs_index < translate.documents.length; docs_index++) { + var doc = translate.documents[docs_index]; + if (typeof (doc) != 'undefined' && doc != null && typeof (doc.innerText) != 'undefined' && doc.innerText != null && doc.innerText.length > 0) { + virtualContainer.appendChild(doc.cloneNode(true)); + } + } + } else { + //未使用 setDocuments指定,那就是整个网页了 + //return document.all; //翻译所有的 这是 v3.5.0之前的 + //v3.5.0 之后采用 拿 html的最上层的demo,而不是 document.all 拿到可能几千个dom + if (typeof (document.head) != 'undefined') { + virtualContainer.appendChild(document.head.cloneNode(true)); + } + if (typeof (document.body) != 'undefined') { + virtualContainer.appendChild(document.body.cloneNode(true)); + } + } + //console.log(virtualContainer); + + + /** 对虚拟容器中的元素进行处理,移除忽略的 tag (这里暂时就只是移除忽略的tag, 其他忽略的后续再加) **/ + // 遍历标签列表 + //console.log('---- remove element'); + for (var i = 0; i < translate.ignore.tag.length; i++) { + var tagName = translate.ignore.tag[i]; + var elements = virtualContainer.querySelectorAll(tagName); + // 将 NodeList 转换为数组 + var elementArray = Array.prototype.slice.call(elements); + // 遍历并移除每个匹配的元素 + for (var j = 0; j < elementArray.length; j++) { + var element = elementArray[j]; + if (element.parentNode) { + //console.log(element); + element.parentNode.removeChild(element); + } + } + } + //console.log('---- remove element end'); + + + /*** 取过滤完后的文本字符 ***/ + translateAreaText = virtualContainer.innerText; + if (translateAreaText == null || typeof (translateAreaText) == 'undefined' || translateAreaText.length < 1) { + //未取到,默认赋予简体中文 + translate.language.local = 'chinese_simplified'; + return ''; + } + // 移除所有空白字符(包括空格、制表符、换行符等) + translateAreaText = translateAreaText.replace(/\s/g, ''); + + //console.log('translateAreaText:\n'+translateAreaText); + return translateAreaText; + }, + //自动识别当前页面是什么语种 + autoRecognitionLocalLanguage: function () { + if (translate.language.local != null && translate.language.local.length > 2) { + //已设置过了,不需要再设置 + return translate.language.local; + } + + var translateAreaText = translate.language.getTranslateAreaText(); + + //默认赋予简体中文 + translate.language.local = 'chinese_simplified'; + var recognition = translate.language.recognition(translateAreaText); + //console.log(recognition); + translate.language.local = recognition.languageName; + return translate.language.local; + /* v3.1优化 + var langs = new Array(); //上一个字符的语种是什么,当前字符向上数第一个字符。格式如 ['language']='english', ['chatstr']='a', ['storage_language']='english' 这里面有3个参数,分别代表这个字符属于那个语种,其字符是什么、存入了哪种语种的队列。因为像是逗号,句号,一般是存入本身语种中,而不是存入特殊符号中。 + for(var i=0; i -1){ + newLangs.splice(index,1); //移除数组中的特殊字符 + } + + if(newLangs.length > 0){ + //找到排序出现频率最多的 + translate.language.local = newLangs[0]; + }else{ + //没有,默认赋予简体中文 + translate.language.local = 'chinese_simplified'; + } + */ + }, + + /* + * 获取当前字符是什么语种。返回值是一个语言标识,有 chinese_simplified简体中文、japanese日语、korean韩语、 + * str : node.nodeValue 或 图片的 node.alt 等 + * 如果语句长,会全句翻译,以保证翻译的准确性,提高可读性。 + * 如果语句短,会自动将特殊字符、要翻译的目标语种给过滤掉,只取出具体的要翻译的目标语种文本 + * + * 返回 存放不同语言的数组,格式如 + * [ + "english":[ + {beforeText: '', afterText: '', text: 'emoambue hag'}, + ...... + ], + "japanese":[ + {beforeText: ' ', afterText: ' ', text: 'ẽ '}, + ...... + ] + ] + * + */ + get: function (str) { + //将str拆分为单个char进行判断 + + var langs = new Array(); //当前字符串包含哪些语言的数组,其内如 english + var langStrs = new Array(); //存放不同语言的文本,格式如 ['english'][0] = 'hello' + var upLangs = []; //上一个字符的语种是什么,当前字符向上数第一个字符。格式如 ['language']='english', ['chatstr']='a', ['storage_language']='english' 这里面有3个参数,分别代表这个字符属于那个语种,其字符是什么、存入了哪种语种的队列。因为像是逗号,句号,一般是存入本身语种中,而不是存入特殊符号中。 + var upLangsTwo = []; //上二个字符的语种是什么 ,当前字符向上数第二个字符。 格式如 ['language']='english', ['chatstr']='a', ['storage_language']='english' 这里面有3个参数,分别代表这个字符属于那个语种,其字符是什么、存入了哪种语种的队列。因为像是逗号,句号,一般是存入本身语种中,而不是存入特殊符号中。 + + //var upLangs = ''; //上一个字符的语种是什么,格式如 english + for (var i = 0; i < str.length; i++) { + var charstr = str.charAt(i); + //console.log('charstr:'+charstr) + var lang = translate.language.getCharLanguage(charstr); + if (lang == '') { + //未获取到,未发现是什么语言 + //continue; + lang = 'unidentification'; + } + var result = translate.language.analyse(lang, langStrs, upLangs, upLangsTwo, charstr); + //console.log(result) + langStrs = result['langStrs']; + //记录上几个字符 + if (typeof (upLangs['language']) != 'undefined') { + upLangsTwo['language'] = upLangs['language']; + upLangsTwo['charstr'] = upLangs['charstr']; + upLangsTwo['storage_language'] = upLangs['storage_language']; + } + //upLangs['language'] = lang; + upLangs['language'] = result['storage_language']; + upLangs['charstr'] = charstr; + upLangs['storage_language'] = result['storage_language']; + //console.log(result['storage_language']) + //console.log(upLangs['language']); + langs.push(lang); + } + + //console.log(langStrs); + + //console.log(langs); + //console.log(langStrs); + + /* + //从数组中取出现频率最高的 + var newLangs = translate.util.arrayFindMaxNumber(langs); + + //移除当前翻译目标的语言。因为已经是目标预言了,不需要翻译了 + var index = newLangs.indexOf(translate.to); + if(index > -1){ + newLangs.splice(index,1); //移除 + } + + //移除特殊字符 + var index = newLangs.indexOf('specialCharacter'); + if(index > -1){ + newLangs.splice(index,1); //移除数组中的特殊字符 + } + + if(newLangs.length > 0){ + //还剩一个或多个,(如果是多个,那应该是这几个出现的频率一样,所以取频率最高的时返回了多个) + return newLangs[0]; + }else{ + //没找到,直接返回空字符串 + return ''; + } + */ + + + //去除特殊符号 + //for(var i = 0; i 0.008 , 那么认为当前是罗曼语族的中的某个语种, 在对其判定出具体是罗曼语族中的哪个语种赋予最终结果。 + */ + if (typeof (languagesSize['english']) != 'undefined' && typeof (languagesSize['romance']) != 'undefined' && data.languageName == 'english') { + if (languagesSize['romance'] / languagesSize['english'] > 0.008) { + //排定是罗曼语族了,那么判断一下到底是 法语、西班牙语、葡萄牙语、意大利语 中的哪一种呢 + + //先判定是否有设置本地语种是罗曼语族中其中的某一个 + if (typeof (translate.language.local) != 'undefined' && translate.language.local.length > 1) { + if (translate.language.englishVarietys.indexOf(translate.language.local) > -1) { + //发现当前设置的是小语种,那么将当前识别的语种识别为 本地设置的这个小语种。 + data.languageName = translate.language.local; + } + } + + if (data.languageName == 'english') { + //还是英语,那就是没有经过上面本地语种的判定,那进行罗曼语的具体语种识别 + + var romanceSentenceLanguage = translate.language.romanceSentenceAnaly(str); + if (romanceSentenceLanguage.length == 0) { + translate.log('语种识别异常,应该是 法语、西班牙语、葡萄牙语、意大利语 中的一种才是,除非是除了这四种语种之外的别的 罗曼语族 中的语种,当前已将 ' + str + '识别为英语。 你可以联系我们求助 https://translate.zvo.cn/4030.html'); + } else { + data.languageName = romanceSentenceLanguage; + } + } + } + } + + + /* + 日语判定 + 如果发现日语存在,且当前 data.languageName 认定不是日语,那么要判定一下: + 如果 日语的字符数/所有字符数 的字符数 > 0.08 , 那么认为当前是日语的 + */ + if (typeof (languagesSize['japanese']) != 'undefined' && data.languageName != 'japanese') { + if (languagesSize['japanese'] / allSize > 0.08) { + data.languageName = 'japanese' + } + } + + /* + 如果发现英语、简体中文或繁体中文 一起存在,且当前 data.languageName 认定是英语时,那么要判定一下: + 如果 (简体中文+繁体中文)的字符数/英语 > 0.05 , 那么认为当前是简体中文(不认为是繁体中文,因为下面还有 简体中文跟繁体中文的判定) + */ + if ((typeof (languagesSize['chinese_simplified']) != 'undefined' || typeof (languagesSize['chinese_traditional']) != 'undefined') && typeof (languagesSize['english']) != 'undefined' && data.languageName == 'english') { + var size = 0; + if (typeof (languagesSize['chinese_simplified']) != 'undefined') { + size = size + languagesSize['chinese_simplified']; + } + if (typeof (languagesSize['chinese_traditional']) != 'undefined') { + size = size + languagesSize['chinese_traditional']; + } + if (size / languagesSize['english'] > 0.05) { + data.languageName = 'chinese_simplified' + } + } + + + /* + 如果简体中文跟繁体中文一起出现,且当前 data.languageName 认定是简体中文(也就是简体中文字符占比最大),那么要判定一下繁体中文: + 如果 繁体中文的字符数/简体中文的字符数 > 0.08 , 那么认为当前是繁体中文的 + */ + if (typeof (languagesSize['chinese_simplified']) != 'undefined' && typeof (languagesSize['chinese_traditional']) != 'undefined' && data.languageName == 'chinese_simplified') { + if (languagesSize['chinese_traditional'] / languagesSize['chinese_simplified'] > 0.03) { + data.languageName = 'chinese_traditional' + } + } + /* if(langkeys.indexOf('chinese_simplified') > -1 && langkeys.indexOf('chinese_traditional') > -1){ + langsNumber['chinese_simplified'] = 0; + } */ + + + + return data; + }, + /* + 强制识别,这里目前咱是配合 translate.language.translateLocal 使用,当它为true时才会进行强制识别,不管比例,只要出现字符,就强制识别。 + 这个也是只能有大模型翻译、自动识别语种的翻译才使用它。 + + 比如: translate.language.recognition('你 @¿Lo que introduzco ahora es contenido español, ¿ se puede traducir en chino? Este texto está en inglés. Si desea ') + 会被识别为西班牙语,因为按照上面的逻辑,简体中文占得比重太小了,而西班牙语占比重大,所以是西班牙语。 + 但是如果当前要翻译为的语种是西班牙语,那么它根据比例识别出也是西班牙语,这句话是不会被翻译的,但是用户实际看上去,却是有显示 '你' 这个中文文字,是不合适的,所以不管是出现了多小的比重,都不能在含有 中文、日语的字符,不然不符合用户以西班牙语阅读的习惯,即使显示单个中文单词,那也属于刺眼的 + + 返回: + 当前 recognition 结果识别的语种,比如 english ,translate.js 的语言标识 + */ + recognition_languageName_force: function (recognition_result) { + + //未启用,那用 recognition 的结果 + if (!translate.language.translateLocal) { + return recognition_result.languageName; + } + if (translate.language.getLocal() == translate.language.getCurrent() && translate.language.translateLocal === false) { + //如果本地语种跟当前语种一致,且不进行强制翻译,那么肯定就不进行翻译的,直接原样返回 + return recognition_result.languageName; + } else { + //其他的情况就是要翻译了 + + //当前语种 + var currentLanguage = translate.language.getCurrent(); + + if (typeof (translate.language.map().get(currentLanguage)) != 'undefined' && typeof (translate.language.map().get(translate.language.getLocal())) != 'undefined') { + //本地语种跟当前语种都是有语族的 + + /* + 语族 ,当前文本中的文字包含多少语种 + key 是语族的名字,如 latin (如果 translate.language.map().get 中没有取到语族,那么这里就直接去掉) + value 是具体的语种名字,如 english 。 这里比如字符串中有英语也有西班牙语,那这里只会记录其中一个,因为主要记录的是key语族的名字 + */ + var languageSystem = {}; + //遍历当前有的语种 + for (var language in recognition_result.languageArray) { + // 必须加 hasOwnProperty 检查,避免遍历原型链上的属性 + if (!recognition_result.languageArray.hasOwnProperty(language)) { + continue; + } + + if (typeof (translate.language.map().get(language)) != 'undefined') { + languageSystem[translate.language.map().get(language).system] = language; + } + } + + if (translate.language.map().get(currentLanguage).system == 'latin') { + //要以拉丁语族显示,那如果其中字符有 chinese 语族的,那么要把这个语族的全部翻译 + + delete languageSystem['latin']; + var yuzuArray = Object.keys(languageSystem); + if (yuzuArray.length > 0) { + //发现还有其他语族的,那么以其他语族为主,目的是能一起翻译,那么直接返回第一个语族名即可 + return languageSystem[yuzuArray[0]]; + } + } + } + } + + //其他那就都是用 recognition 的结果 + return recognition_result.languageName; + }, + + /* + * 识别字符串是什么语种。它是 get() 的扩展,以代替get返回更多 + * str : 要识别的字符串 + * + * 返回 存放不同语言的数组,格式如 + * + { + languageName: 'english', + languageArray:[ + english:[ + list[ + {beforeText: ' ', afterText: ' ', text: 'hello word'}, + {beforeText: ' ', afterText: ' ', text: 'who?'}, + ], + number:12 + ], + japanese:[ + ...... + ] + ] + } + languageName 是当前字符串最终判定结果是什么语种。它的识别有以下特点: + 1. 如果出现英语跟中文、罗曼语族、德语等混合的情况,也就是不纯粹英语的情况,那么会以其他语种为准,而不是识别为英语。不论英语字符出现的比例占多少。 + 2. 如果出现简体中文跟繁体中文混合的情况,那么识别为繁体中文。不论简体中文字符出现的比例占多少。 + 3. 如果出现简体中文、繁体中文、日语混合的情况,那么识别为日语。不论简体中文、繁体中文出现的比例占多少。 2025.4.19 增加 + 4. 除了以上两种规则外,如果出现了多个语种,那么会识别为出现字符数量最多的语种当做当前句子的语种。(注意是字符数,而不是语种的数组数) + languageArray 对传入字符串进行分析,识别出都有哪些语种,每个语种的字符是什么 + * + */ + recognition: function (str) { + var langs = translate.language.get(str); + //var langkeys = Object.keys(langs); + //console.log(langkeys); + var langsNumber = []; //key 语言名, value 语言字符数 + var langsNumberOriginal = []; //同上,只不过这个不会进行清空字符数 + var allNumber = 0;//总字数 + + /** 进行字数统计相关 - start **/ + for (var key in langs) { + if (!langs.hasOwnProperty(key)) { + continue; + } + if (typeof (langs[key]) != 'object') { + continue; + } + var langStrLength = 0; + for (var ls = 0; ls < langs[key].length; ls++) { + langStrLength = langStrLength + langs[key][ls].text.length; + } + allNumber = allNumber + langStrLength; + langsNumber[key] = langStrLength; + langsNumberOriginal[key] = langStrLength; + } + /** 进行字数统计相关 - end **/ + + + + //从 langsNumber 中找出字数最多的来 + var maxLang = ''; //字数最多的语种 + var maxNumber = 0; + for (var lang in langsNumber) { + if (!langsNumber.hasOwnProperty(lang)) { + continue; + } + if (langsNumber[lang] > maxNumber) { + maxLang = lang; + maxNumber = langsNumber[lang]; + } + } + + //重新组合返回值的 languageArray + var languageArray = {}; + for (var lang in langs) { + if (!langs.hasOwnProperty(lang)) { + continue; + } + languageArray[lang] = {}; + languageArray[lang].number = langsNumberOriginal[lang]; + languageArray[lang].list = langs[lang]; + } + + var result = { + languageName: maxLang, + languageArray: languageArray + }; + + //最后进行一层简单的算法处理 + return translate.language.recognitionAlgorithm(str, result, langsNumber, allNumber); + }, + /* + 传入一个char,返回这个char属于什么语种,返回如 如果返回空字符串,那么表示未获取到是什么语种 + chinese_simplified 简体中文 + chinese_traditional 繁体中文 + russian 俄罗斯语 + english 英语 + romance 罗曼语族,它是 法语、西班牙语、意大利语、葡萄牙語 的集合,并不是单个语言 + specialCharacter 特殊字符,符号 + number 阿拉伯数字 + japanese 日语 + korean 韩语 + greek 希腊语 + thai 泰语 + arabic 阿拉伯语 + romanian 罗马尼亚语 + hebrew 希伯来语 + + */ + getCharLanguage: function (charstr) { + if (charstr == null || typeof (charstr) == 'undefined') { + return ''; + } + + if (this.russian(charstr)) { + return 'russian'; + } + if (this.english(charstr)) { + return 'english'; + } + if (this.romance(charstr)) { + return 'romance'; + } + if (this.specialCharacter(charstr)) { + return 'specialCharacter'; + } + if (this.number(charstr)) { + return 'number'; + } + + //中文的判断包含两种,简体跟繁体 + var chinesetype = this.chinese(charstr); + if (chinesetype == 'simplified') { + return 'chinese_simplified'; + } else if (chinesetype == 'traditional') { + return 'chinese_traditional'; + } + + if (this.japanese(charstr)) { + return 'japanese'; + } + if (this.korean(charstr)) { + return 'korean'; + } + if (this.greek(charstr)) { + return 'greek'; + } + if (this.thai(charstr)) { + return 'thai'; + } + if (this.arabic(charstr)) { + return 'arabic'; + } + if (this.romanian(charstr)) { + return 'romanian'; + } + if (this.hebrew(charstr)) { + return 'hebrew'; + } + //未识别是什么语种 + //console.log('not find is language , char : '+charstr+', unicode: '+charstr.charCodeAt(0).toString(16)); + return ''; + + }, + /* + * 对字符串进行分析,分析字符串是有哪几种语言组成。 + * language : 当前字符的语种,传入如 english + * langStrs : 操作的,如 langStrs['english'][0] = '你好' + * upLangs : 当前字符之前的上一个字符的语种是什么,当前字符向上数第一个字符。格式如 ['language']='english', ['chatstr']='a', ['storage_language']='english' 这里面有3个参数,分别代表这个字符属于那个语种,其字符是什么、存入了哪种语种的队列。因为像是逗号,句号,一般是存入本身语种中,而不是存入特殊符号中。 + * upLangsTwo : 当前字符之前的上二个字符的语种是什么 ,当前字符向上数第二个字符。 格式如 ['language']='english', ['chatstr']='a', ['storage_language']='english' 这里面有3个参数,分别代表这个字符属于那个语种,其字符是什么、存入了哪种语种的队列。因为像是逗号,句号,一般是存入本身语种中,而不是存入特殊符号中。 + * chatstr : 当前字符,如 h + */ + analyse: function (language, langStrs, upLangs, upLangsTwo, charstr) { + if (typeof (langStrs[language]) == 'undefined') { + langStrs[language] = new Array(); + } + var index = 0; //当前要存入的数组下标 + if (typeof (upLangs['storage_language']) == 'undefined') { + //第一次,那么还没存入值,index肯定为0 + //console.log('第一次,那么还没存入值,index肯定为0') + //console.log(upLangs['language']) + } else { + //console.log('analyse, charstr : '+charstr+', upLangs :'); + //console.log(upLangs); + //var isEqual = upLangs['storage_language'] == language; //上次跟当前字符是否都是同一个语种(这个字符跟这个字符前一个字符) + + /* + 英语每个单词之间都会有空格分割. 如果是英文的话,英文跟特殊字符还要单独判断一下,避免拆开,造成翻译不准,单个单词翻译的情况 + 所以如果上次的字符是英文或特殊符号,当前字符是特殊符号(逗号、句号、空格,然后直接笼统就吧特殊符号都算上吧),那么也将当次的特殊符号变为英文来进行适配 + 示例 + hello word 的 "o w" + hello word 的 " w" + hello word 的 "w " + this is a dog 的 " a " + */ + //console.log(language == 'specialCharacter'); + //如果两个字符类型不一致,但当前字符是英文或连接符时,进行判断 + /* + if(!isEqual){ + if(language == 'english' || translate.language.connector(charstr)){ + console.log('1.'+(language == 'english' || translate.language.connector(charstr))+', upLangs str:'+upLangs['charstr']); + //上一个字符是英文或连接符 + //console.log('teshu:'+translate.language.connector(upLangs['charstr'])+', str:'+upLangs['charstr']); + if(upLangs['language'] == 'english' || translate.language.connector(upLangs['charstr'])) { + console.log('2'); + //如果上二个字符不存在,那么刚开始,不再上面几种情况之中,直接不用考虑 + if(typeof(upLangsTwo['language']) != 'undefined'){ + console.log('3') + //上二个字符是空(字符串刚开始),或者是英文 + if(upLangsTwo['language'] == 'english' || translate.language.connector(upLangsTwo['charstr'])){ + //满足这三个条件,那就将这三个拼接到一起 + console.log('4/5: '+', two lang:'+upLangsTwo['language']+', str:'+upLangsTwo['charstr']) + isEqual = true; + if(language == 'specialCharacter' && upLangs['language'] == 'specialCharacter' && upLangsTwo['language'] == 'specialCharacter'){ + //如果三个都是特殊字符,或后两个是特殊字符,第一个是空(刚开始),那就归入特殊字符 + language = 'specialCharacter'; + //console.log('4') + }else{ + //不然就都归于英文中。 + //这里更改是为了让下面能将特殊字符(像是空格逗号等)也一起存入数组 + language = 'english'; + console.log(5) + } + } + } + } + } + } + */ + + /* + 不判断当前字符,而判断上个字符,是因为当前字符没法获取未知的下个字符。 + */ + //if(!isEqual){ + + //如果当前字符是连接符 + if (translate.language.connector(charstr)) { + language = upLangs['storage_language']; + /* + //判断上个字符是否存入了待翻译字符,如要将中文翻译为英文,而上个字符是中文,待翻译,那将连接符一并加入待翻译字符中去,保持句子完整性 + //判断依据是上个字符存储至的翻译字符语种序列,不是特殊字符,而且也不是要翻译的目标语种,那肯定就是待翻译的,将连接符加入待翻译中一起进行翻译 + if(upLangs['storage_language'] != 'specialCharacter' && upLangs['storage_language'] != translate.to){ + + language = upLangs['storage_language']; + console.log('teshu:'+charstr+', 当前字符并入上个字符存储翻译语种:'+upLangs['storage_language']); + } + */ + } + //} + + //console.log('isEqual:'+isEqual); + /* + if(isEqual){ + //跟上次语言一样,那么直接拼接 + index = langStrs[language].length-1; + //但是还有别的特殊情况,v2.1针对英文翻译准确度的适配,会有特殊字符的问题 + if(typeof(upLangs['storage_language']) != 'undefined' && upLangs['storage_language'] != language){ + //如果上个字符存入的翻译队列跟当前这个要存入的队列不一个的话,那应该是特殊字符像是逗号句号等导致的,那样还要额外一个数组,不能在存入之前的数组了 + index = langStrs[language].length; + } + }else{ + //console.log('新开'); + //当前字符跟上次语言不样,那么新开一个数组 + index = langStrs[language].length; + //console.log('++, inde:'+index+',lang:'+language+', length:'+langStrs[language].length) + } + */ + + //当前要翻译的语种跟上个字符要翻译的语种一样,那么直接拼接 + if (upLangs['storage_language'] == language) { + index = langStrs[language].length - 1; + } else { + //console.log('新开'); + //当前字符跟上次语言不样,那么新开一个数组 + index = langStrs[language].length; + } + } + if (typeof (langStrs[language][index]) == 'undefined') { + langStrs[language][index] = new Array(); + langStrs[language][index]['beforeText'] = ''; + langStrs[language][index]['afterText'] = ''; + langStrs[language][index]['text'] = ''; + } + langStrs[language][index]['text'] = langStrs[language][index]['text'] + charstr; + /* + 中文英文混合时,当中文+英文并没有空格间隔,翻译为英文时,会使中文翻译英文的结果跟原本的英文单词连到一块。这里就是解决这种情况 + 针对当前非英文(不需要空格分隔符,像是中文、韩语),但要翻译为英文(需要空格作为分割符号,像是法语等)时的情况进行判断 + */ + //if(translate.language.getLocal() != 'english' && translate.to == 'english'){ + //当前本地语种的语言是连续的,但翻译的目标语言不是连续的(空格间隔) + if (translate.language.wordBlankConnector(translate.language.getLocal()) == false && translate.language.wordBlankConnector(translate.to)) { + if ((upLangs['storage_language'] != null && typeof (upLangs['storage_language']) != 'undefined' && upLangs['storage_language'].length > 0)) { + //上个字符存在 + //console.log(upLangs['storage_language']); + if (upLangs['storage_language'] != 'specialCharacter') { + //上个字符不是特殊字符 (是正常语种。且不会是连接符,连接符都并入了正常语种) + + //if( upLangs['storage_language'] != 'english' && language == 'english'){ + //上个字符的语言是连续的,但当前字符的语言不是连续的(空格间隔) + if (translate.language.wordBlankConnector(upLangs['storage_language']) == false && translate.language.wordBlankConnector(language)) { + //上个字符不是英语,当前字符是英语,这种情况要在上个字符后面追加空格,因为当前字符是英文,就不会在执行翻译操作了 + //console.log(upLangs['language']); + langStrs[upLangs['storage_language']][langStrs[upLangs['storage_language']].length - 1]['afterText'] = ' '; + } else if (upLangs['storage_language'] == 'english' && language != 'english') { + //上个字符是英语,当前字符不是英语,直接在当前字符前面追加空格 + langStrs[language][index]['beforeText'] = ' '; + } + } + + + } + } + + var result = new Array(); + result['langStrs'] = langStrs; + result['storage_language'] = language; //实际存入了哪种语种队列 + //console.log(result); + //console.log(langStrs) + //console.log(charstr); + return result; + }, + + /* + * 不同于语言,这个只是单纯的连接符。比如英文单词之间有逗号、句号、空格, 汉字之间有逗号句号书名号的。避免一行完整的句子被分割,导致翻译不准确 + * 单独拿他出来,目的是为了更好的判断计算,提高翻译的准确率 + */ + connector: function (str) { + + /* + 通用的有 空格、阿拉伯数字 + 1.不间断空格\u00A0,主要用在office中,让一个单词在结尾处不会换行显示,快捷键ctrl+shift+space ; + 2.半角空格(英文符号)\u0020,代码中常用的; + 3.全角空格(中文符号)\u3000,中文文章中使用; + */ + if (/.*[\u0020\u00A0\u202F\u205F\u3000]+.*$/.test(str)) { + return true; + } + /* + U+0030 0 数字 0 + U+0031 1 数字 1 + U+0032 2 数字 2 + U+0033 3 数字 3 + U+0034 4 数字 4 + U+0035 5 数字 5 + U+0036 6 数字 6 + U+0037 7 数字 7 + U+0038 8 数字 8 + U+0039 9 数字 9 + */ + if (/.*[\u0030-\u0039]+.*$/.test(str)) { + return true + } + + + /* + 英文场景 + 英文逗号、句号 + 这里不包括() 因为这里面的基本属于补充,对语句前后并无强依赖关系 + + U+0021 ! 叹号 + U+0022 " 双引号 + U+0023 # 井号 + U+0024 $ 价钱/货币符号 + U+0025 % 百分比符号 + U+0026 & 英文“and”的简写符号 + U+0027 ' 引号 + U+002C , 逗号 + U+002D - 连字号/减号 + U+002E . 句号 + U+003A : 冒号 + U+003B ; 分号 + U+003F ? 问号 + U+0040 @ 英文“at”的简写符号 + + + */ + if (/.*[\u0021\u0022\u0023\u0024\u0025\u0026\u0027\u002C\u002D\u002E\u003A\u003B\u003F\u0040]+.*$/.test(str)) { + return true; + } + + /* + 中文标点符号 + 名称 Unicode 符号 + 句号 3002 。 + 问号 FF1F ? + 叹号 FF01 ! + 逗号 FF0C , + 顿号 3001 、 + 分号 FF1B ; + 冒号 FF1A : + 引号 300C 「 + 300D 」 + 引号 300E 『 + 300F 』 + 引号 2018 ‘ + 2019 ’ + 引号 201C “ + 201D ” + 括号 FF08 ( + FF09 ) + 括号 3014 〔 + 3015 〕 + 括号 3010 【 + 3011 】 + 破折号 2014 — + 省略号 2026 … + 连接号 2013 – + 间隔号 FF0E . + 书名号 300A 《 + 300B 》 + 书名号 3008 〈 + 3009 〉 + 键盘123前面的那个符号 · 00b7 + */ + if (/.*[\u3002\uFF1F\uFF01\uFF0C\u3001\uFF1B\uFF1A\u300C\u300D\u300E\u300F\u2018\u2019\u201C\u201D\uFF08\uFF09\u3014\u3015\u3010\u3011\u2014\u2026\u2013\uFF0E\u300A\u300B\u3008\u3009\u00b7]+.*$/.test(str)) { + return true; + } + + + + + //不是,返回false + return false; + }, + //语种的单词连接符是否需要空格,比如中文简体、繁体、韩文、日语都不需要空格,则返回false, 但是像是英文的单词间需要空格进行隔开,则返回true + //另外这也是区分是否使用标点符号 ,。还是 ,. 的 + //如果未匹配到,默认返回true + //language:语种,传入如 english + wordBlankConnector: function (language) { + if (language == null || typeof (language) == 'undefined') { + return true; + } + switch (language.trim().toLowerCase()) { + case 'chinese_simplified': + return false; + case 'chinese_traditional': + return false; + case 'korean': + return false; + case 'japanese': + return false; + } + //其他情况则返回true + return true; + }, + //繁体中文的字典,判断繁体中文就是通过此判断 + chinese_traditional_dict: '皚藹礙愛翺襖奧壩罷擺敗頒辦絆幫綁鎊謗剝飽寶報鮑輩貝鋇狽備憊繃筆畢斃閉邊編貶變辯辮鼈癟瀕濱賓擯餅撥缽鉑駁蔔補參蠶殘慚慘燦蒼艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟産闡顫場嘗長償腸廠暢鈔車徹塵陳襯撐稱懲誠騁癡遲馳恥齒熾沖蟲寵疇躊籌綢醜櫥廚鋤雛礎儲觸處傳瘡闖創錘純綽辭詞賜聰蔥囪從叢湊竄錯達帶貸擔單鄲撣膽憚誕彈當擋黨蕩檔搗島禱導盜燈鄧敵滌遞締點墊電澱釣調諜疊釘頂錠訂東動棟凍鬥犢獨讀賭鍍鍛斷緞兌隊對噸頓鈍奪鵝額訛惡餓兒爾餌貳發罰閥琺礬釩煩範販飯訪紡飛廢費紛墳奮憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔賦複負訃婦縛該鈣蓋幹趕稈贛岡剛鋼綱崗臯鎬擱鴿閣鉻個給龔宮鞏貢鈎溝構購夠蠱顧剮關觀館慣貫廣規矽歸龜閨軌詭櫃貴劊輥滾鍋國過駭韓漢閡鶴賀橫轟鴻紅後壺護滬戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃謊揮輝毀賄穢會燴彙諱誨繪葷渾夥獲貨禍擊機積饑譏雞績緝極輯級擠幾薊劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱緘繭檢堿鹼揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗漿蔣槳獎講醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較稭階節莖驚經頸靜鏡徑痙競淨糾廄舊駒舉據鋸懼劇鵑絹傑潔結誡屆緊錦僅謹進晉燼盡勁荊覺決訣絕鈞軍駿開凱顆殼課墾懇摳庫褲誇塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳壘類淚籬離裏鯉禮麗厲勵礫曆瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼鐐獵臨鄰鱗凜賃齡鈴淩靈嶺領餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫侖淪綸論蘿羅邏鑼籮騾駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚貿麽黴沒鎂門悶們錳夢謎彌覓綿緬廟滅憫閩鳴銘謬謀畝鈉納難撓腦惱鬧餒膩攆撚釀鳥聶齧鑷鎳檸獰甯擰濘鈕紐膿濃農瘧諾歐鷗毆嘔漚盤龐國愛賠噴鵬騙飄頻貧蘋憑評潑頗撲鋪樸譜臍齊騎豈啓氣棄訖牽扡釺鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬僑翹竅竊欽親輕氫傾頃請慶瓊窮趨區軀驅齲顴權勸卻鵲讓饒擾繞熱韌認紉榮絨軟銳閏潤灑薩鰓賽傘喪騷掃澀殺紗篩曬閃陝贍繕傷賞燒紹賒攝懾設紳審嬸腎滲聲繩勝聖師獅濕詩屍時蝕實識駛勢釋飾視試壽獸樞輸書贖屬術樹豎數帥雙誰稅順說碩爍絲飼聳慫頌訟誦擻蘇訴肅雖綏歲孫損筍縮瑣鎖獺撻擡攤貪癱灘壇譚談歎湯燙濤縧騰謄銻題體屜條貼鐵廳聽烴銅統頭圖塗團頹蛻脫鴕馱駝橢窪襪彎灣頑萬網韋違圍爲濰維葦偉僞緯謂衛溫聞紋穩問甕撾蝸渦窩嗚鎢烏誣無蕪吳塢霧務誤錫犧襲習銑戲細蝦轄峽俠狹廈鍁鮮纖鹹賢銜閑顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭銷曉嘯蠍協挾攜脅諧寫瀉謝鋅釁興洶鏽繡虛噓須許緒續軒懸選癬絢學勳詢尋馴訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顔閻豔厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠藥爺頁業葉醫銥頤遺儀彜蟻藝億憶義詣議誼譯異繹蔭陰銀飲櫻嬰鷹應纓瑩螢營熒蠅穎喲擁傭癰踴詠湧優憂郵鈾猶遊誘輿魚漁娛與嶼語籲禦獄譽預馭鴛淵轅園員圓緣遠願約躍鑰嶽粵悅閱雲鄖勻隕運蘊醞暈韻雜災載攢暫贊贓髒鑿棗竈責擇則澤賊贈紮劄軋鍘閘詐齋債氈盞斬輾嶄棧戰綻張漲帳賬脹趙蟄轍鍺這貞針偵診鎮陣掙睜猙幀鄭證織職執紙摯擲幟質鍾終種腫衆謅軸皺晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁莊裝妝壯狀錐贅墜綴諄濁茲資漬蹤綜總縱鄒詛組鑽緻鐘麼為隻兇準啟闆裡靂餘鍊', + /* + 中文判断 + 返回: + simplified:简体中文 + traditional:繁体中文 + 空字符串:不是中文 + */ + chinese: function (str) { + if (/.*[\u4e00-\u9fa5]+.*$/.test(str)) { + if (this.chinese_traditional_dict.indexOf(str) > -1) { + return 'traditional'; + } else { + return 'simplified'; + } + } else { + return ''; + } + }, + //是否包含日语,true:包含 + japanese: function (str) { + if (/.*[\u3040-\u309F\u30A0-\u30FF]+.*$/.test(str)) { + return true + } else { + return false; + } + }, + //是否包含韩语,true:包含 + korean: function (str) { + if (/.*[\uAC00-\uD7AF]+.*$/.test(str)) { + return true + } else { + return false; + } + }, + //是否包含俄语 + russian: function (str) { + // 正则表达式匹配俄语大小写字母(包含 Ё/ё,排除其他语言特有的西里尔字符) + //АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЮюЯя + //if(/^[А-Яа-яЁё]$/.test(str)){ + if (/^[\u0410-\u044F\u0401\u0451]$/.test(str)) { + return true + } else { + return false; + } + }, + //是否包含泰语 + thai: function (str) { + if (/^[\u0E01-\u0E59]$/.test(str)) { + return true + } else { + return false; + } + }, + //是否包含阿拉伯语 + arabic: function (str) { + /* + 阿拉伯语基本区块(U+0600–U+06FF) + 阿拉伯语补充区块(U+0750–U+077F) + */ + return /^[\u0600-\u06FF\u0750-\u077F]$/.test(str); + }, + //是否包含 罗马尼亚语 + romanian: function (str) { + /* + U+00C0–U+00FF:Latin-1 Supplement (包含带变音符号的字母,如 Ă/ă 的部分形式) + U+0100–U+017F:Latin Extended-A (包含罗马尼亚语特有字母 Ă/ă、Â/â、Î/î 等); + U+0218–U+021B:Latin Extended-B (包含 Ș/ș 和 Ț/ț,这是罗马尼亚语标志性字母) + */ + return /^[\u00C0-\u00FF\u0100-\u017F\u0218-\u021B]$/.test(str); + }, + //是否包含希腊语 + greek: function (str) { + const greekRegex = /^[\u0391-\u03A9\u03B1-\u03C9]$/; + //判断字符有 БВДЖЗИЙЛМНОПСТУФХЦЧШЩЪЫЬЮЯЇІ + if (/^[\u0391-\u03A9\u03B1-\u03C9]$/.test(str)) { + return true + } else { + return false; + } + }, + //希伯来语 + hebrew: function (str) { + return /^[\u0590-\u05FF]$/.test(str); + }, + //0-9 阿拉伯数字 + number: function (str) { + if (/.*[\u0030-\u0039]+.*$/.test(str)) { + return true; + } + return false; + }, + //是否包含英文,true:包含 + english: function (str) { + if (/.*[\u0041-\u005a]+.*$/.test(str)) { + return true; + } else if (/.*[\u0061-\u007a]+.*$/.test(str)) { + return true; + } else { + return false; + } + }, + //是否包含 罗曼语族 的特殊字符,因为 法语、西班牙语、意大利语、葡萄牙語 都属于这个语族,单纯判断特殊字符已经不能判断出到底属于哪个语种了 + romance_dict: ['é', 'è', 'ê', 'à', 'ç', 'œ', 'ñ', 'á', 'ó', 'ò', 'ì', 'ã', 'õ'], + romance: function (str) { + if (this.romance_dict.indexOf(str) > -1) { + return true; + } else { + return false; + } + }, + //对 罗曼语族 的句子进行分析,看它是属于 法语、西班牙语、意大利语、葡萄牙語 的哪个。注意这个是传入的整体的句子,不是传入的单个字符 + //返回识别的语种: french、spanish、italian、portuguese 如果都没有识别出来,则返回空字符串 + romanceSentenceAnaly: function (text) { + // 定义各语言的典型字母/符号权重 (可调整) + const langFeatures = { + 'french': { score: 0, chars: ['é', 'è', 'ê', 'à', 'ç', 'œ'] }, + 'spanish': { score: 0, chars: ['ñ', 'á', 'ó'], pairs: ['ll'] }, + 'italian': { score: 0, chars: ['ò', 'ì'], pairs: ['cc', 'ss'] }, + 'portuguese': { score: 0, chars: ['ã', 'õ'] } + }; + + // 逐字扫描 + 相邻配对检测 + for (let i = 0; i < text.length; i++) { + const char = text[i].toLowerCase(); + + // 单字匹配 + Object.keys(langFeatures).forEach(lang => { + if (langFeatures[lang].chars.includes(char)) { + langFeatures[lang].score += 1; + } + }); + + // 双字配对检测 (如 ll) + if (i < text.length - 1) { + const pair = text.slice(i, i + 2).toLowerCase(); + Object.keys(langFeatures).forEach(lang => { + const pairs = langFeatures[lang].pairs; + if (pairs && pairs.includes(pair)) { + langFeatures[lang].score += 2; // pair权重大于单字 + } + }); + } + } + + // 结果判定 (取最高分) + let maxLang = ''; + let maxScore = -1; + + Object.keys(langFeatures).forEach(lang => { + if (langFeatures[lang].score > maxScore) { + maxScore = langFeatures[lang].score; + maxLang = lang; + } + }); + + return maxLang || ''; + }, + /**romanceSentenceAnaly end**/ + + //是否包含特殊字符,包含,则是true + specialCharacter: function (str) { + //如:① ⑴ ⒈ + if (/.*[\u2460-\u24E9]+.*$/.test(str)) { + return true + } + + //如:┊┌┍ ▃ ▄ ▅ + if (/.*[\u2500-\u25FF]+.*$/.test(str)) { + return true + } + + //如:㈠ ㎎ ㎏ ㎡ + if (/.*[\u3200-\u33FF]+.*$/.test(str)) { + return true + } + + //如:与ANSI对应的全角字符 + if (/.*[\uFF00-\uFF5E]+.*$/.test(str)) { + return true + } + + //其它特殊符号 + if (/.*[\u2000-\u22FF]+.*$/.test(str)) { + return true + } + + // 、><等符号 + if (/.*[\u3001-\u3036]+.*$/.test(str)) { + return true; + } + + + + /* + U+0020 空格 + U+0021 ! 叹号 + U+0022 " 双引号 + U+0023 # 井号 + U+0024 $ 价钱/货币符号 + U+0025 % 百分比符号 + U+0026 & 英文“and”的简写符号 + U+0027 ' 引号 + U+0028 ( 开 左圆括号 + U+0029 ) 关 右圆括号 + U+002A * 星号 + U+002B + 加号 + U+002C , 逗号 + U+002D - 连字号/减号 + U+002E . 句号 + U+002F / 左斜杠 + */ + if (/.*[\u0020-\u002F]+.*$/.test(str)) { + return true; + } + + /* + U+003A : 冒号 + U+003B ; 分号 + U+003C < 小于符号 + U+003D = 等于号 + U+003E > 大于符号 + U+003F ? 问号 + U+005B [ 开 方括号 + U+005C \ 右斜杠 + U+005D ] 关 方括号 + U+005E ^ 抑扬(重音)符号 + U+005F _ 底线 + U+0060 ` 重音符 + U+007B { 开 左花括号 + U+007C | 直线 + U+007D } 关 右花括号 + U+007E ~ 波浪纹 + */ + if (/.*[\u003B\u003B\u003C\u003D\u003E\u003F\u005B\u005C\u005D\u005E\u005F\u0060\u007B\u007C\u007D\u007E]+.*$/.test(str)) { + return true; + } + + //空白字符,\u0009\u000a + https://cloud.tencent.com/developer/article/2128593 + if (/.*[\u0009\u000a\u0020\u00A0\u1680\u180E\u202F\u205F\u3000\uFEFF]+.*$/.test(str)) { + return true; + } + if (/.*[\u2000-\u200B]+.*$/.test(str)) { + return true; + } + + /* + 这些字符主要是 罕见的拉丁字母变体 ,通常用于: + 某些非洲语言或方言; + 古文字、语音学符号; + 特殊排版或装饰性字体。 + */ + if (/.*[\u2C60-\u2C77]+.*$/.test(str)) { + return true; + } + + + return false; + }, + /* + 文本翻译的替换。 + + @Deprecated 2025.4.26 最新的在 translate.util.textReplace + + text: 原始文本,翻译的某句或者某个词就在这个文本之中 + translateOriginal: 翻译的某个词或句,在翻译之前的文本 + translateResult: 翻译的某个词或句,在翻译之后的文本,翻译结果 + language: 显示的语种,这里是对应的 translateResult 这个文本的语种。 也就是最终替换之后要显示给用户的语种。比如将中文翻译为英文,这里也就是英文。 这里会根据显示的语种不同,来自主决定是否前后加空格进行分割。 另外这里传入的语种也是 translate.js 的语种标识 + + (注意,如果 translateResult 中发现 translateOriginal 的存在,将不进行任何处理,因为没必要了,还会造成死循环。直接将 text 返回) + + 使用此方法: + var text = '你世好word世界'; + var translateOriginal = '世'; + var translateResult = '世杰'; //翻译结果 + translate.language.textTranslateReplace(text, translateOriginal, translateResult, 'english'); + + */ + textTranslateReplace: function (text, translateOriginal, translateResult, language) { + return translate.util.textReplace(text, translateOriginal, translateResult, language); + } + }, + //用户第一次打开网页时,自动判断当前用户所在国家使用的是哪种语言,来自动进行切换为用户所在国家的语种。 + //如果使用后,第二次在用,那就优先以用户所选择的为主 + executeByLocalLanguage: function () { + //先读用户自己浏览器的默认语言 + var browserDefaultLanguage = translate.util.browserDefaultLanguage(); + if (typeof (browserDefaultLanguage) != 'undefined' && browserDefaultLanguage.length > 0) { + translate.changeLanguage(browserDefaultLanguage); + return; + } + + if (typeof (translate.request.api.ip) != 'string' || translate.request.api.ip == null || translate.request.api.ip.length < 1) { + return; + } + + //如果用户浏览器没读到默认语言,或者默认语言没有对应到translate.js支持的语种,那么在采用ip识别的方式 + translate.request.post(translate.request.api.ip, {}, function (responseData, requestData) { + //console.log(responseData); + if (responseData.result != 1) { + translate.log('==== ERROR 获取当前用户所在区域异常 ===='); + translate.log(data.info); + translate.log('==== ERROR END ===='); + } else { + translate.storage.set('to', responseData.language); //设置目标翻译语言 + translate.to = responseData.language; //设置目标语言 + //translate.selectLanguageTag + translate.execute(); //执行翻译 + } + }, null); + }, + + util: { + + /* + 针对 textReplace 处理时对句子生成其全角、半角状态的处理 的 逆向处理 + + text: 要处理的文本句子 + language: 目标语言,如 english + 返回数组。 + + 比如 + text 传入的是 : + ,是吗。 + language 传入的是 english + 那么返回的数组是: + [ + ",是吗。", + ", 是吗。", + ",是吗. ", + ", 是吗. ", + ] + */ + text_full_half_width_generate: function (text, language) { + //console.log(text); + + if (typeof (text) === 'undefined') { + return [text]; + } + if (text.trim().length == 0) { + return [text]; + } + + //文字之间需要空格,也就是半角标点符号,像是英语,法语, 则是true + var requireSpace = translate.language.wordBlankConnector(language); + + /**** 判断 findText 的开始字符跟结束字符是否包含着 特殊符号 ,:。 因为在 translate.util.textReplace 替换时,会根据当前语种,自动将前后有句号等符号时进行中英的符号转换,此时如果 findText 传入的带有句号的,比如 “你好,” 而实际上text的内容是已经被替换过,就会导致 “你好,” 找不到,而 “你好,” 能找到 ****/ + var punctuationMarks_fullWidth = [',', ':', '。']; //标点符号-全角,用于中文等语种 + var punctuationMarks_halfWidth = [',', ':', '.']; //标点符号-半角,用于英文等语种 + + //如果要替换的文本只是原文本中的一部分,那么就需要进行处理了 + var findText = text; + + //取第一个字符 + var findTextFirstChar = findText.charAt(0); + //取最后一个字符 + var findTextLastChar = findText.charAt(findText.length - 1); + + /* + * translateOriginal 生成的用于替换的变种,可能是多个,比如 “你好,世界。” 中的 ",世界" 在翻译为英文情况时,会出现这几种变种: + * , 世界。 + * , 世界. + * ,世界。 + * ,世界. + * 根据不同的中英文,标点符号后面是否跟空格也不同 + */ + var originalArray = []; + originalArray.push(text); //首先把当前的加入进去 + + //翻译替换为半角标点符号,如英语 + if (requireSpace) { + + //第一个发现全角字符, 转为半角处理 + if (punctuationMarks_fullWidth.indexOf(findTextFirstChar) > -1) { + var processFirstCharText = punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextFirstChar)] + ' ' + findText.substring(1, findText.length); + originalArray.push(processFirstCharText); + + //第一个处理后,寻找最后一个全角字符转为半角处理 + if (punctuationMarks_fullWidth.indexOf(findTextLastChar) > -1) { + originalArray.push(processFirstCharText.substring(0, processFirstCharText.length - 1) + punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextLastChar)] + ' '); + originalArray.push(processFirstCharText.substring(0, processFirstCharText.length - 1) + punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextLastChar)]); + } + } + + //将最后一个全角字符转为半角处理 + if (punctuationMarks_fullWidth.indexOf(findTextLastChar) > -1) { + originalArray.push(findText.substring(0, findText.length - 1) + punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextLastChar)] + ' '); + originalArray.push(findText.substring(0, findText.length - 1) + punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextLastChar)]); + } + } else { + //翻译替换为全角标点符号,如中文 + + //第一个发现半字符, 转为全角处理。这里不用跟上面似的追加去除空格的,因为 textReplace_service 只为了阅读方便追加空格,并没有做去空格处理。 + if (punctuationMarks_halfWidth.indexOf(findTextFirstChar) > -1) { + var processLastCharText = punctuationMarks_fullWidth[punctuationMarks_halfWidth.indexOf(findTextFirstChar)] + findText.substring(1, findText.length); + originalArray.push(processLastCharText); + + //判断第二个字符是否是空格,如果是,那可能是自动有英转中时追加的空格,这也要考虑把空格去掉的情况 + if (processLastCharText.charAt(1) === ' ') { + originalArray.push(processLastCharText.substring(0, 1) + processLastCharText.substring(2, findText.length)); + } + + //第一个处理后,寻找最后一个半角字符转为全角处理 + if (punctuationMarks_halfWidth.indexOf(findTextLastChar) > -1) { + originalArray.push(processLastCharText.substring(0, processLastCharText.length - 1) + punctuationMarks_fullWidth[punctuationMarks_halfWidth.indexOf(findTextLastChar)]); + + //判断第二个字符是否是空格,如果是,那可能是自动有英转中时追加的空格,这也要考虑把空格去掉的情况 + if (processLastCharText.charAt(1) === ' ') { + originalArray.push(processLastCharText.substring(0, 1) + processLastCharText.substring(2, processLastCharText.length - 1) + punctuationMarks_fullWidth[punctuationMarks_halfWidth.indexOf(findTextLastChar)]); + } + } + } + + //将最后一个全角字符转为半角处理 + if (punctuationMarks_halfWidth.indexOf(findTextLastChar) > -1) { + originalArray.push(findText.substring(0, findText.length - 1) + punctuationMarks_fullWidth[punctuationMarks_halfWidth.indexOf(findTextLastChar)]); + } + } + //console.log(originalArray); + return originalArray; + }, + + /* + 文本替换,将替换完毕的结果返回 + 自定义术语等都是通过这个来进行替换 + 2025.4.26 从 language 中 拿到这里 + + text: 原始文本,翻译的某句或者某个词就在这个文本之中 + translateOriginal: 翻译的某个词或句,在翻译之前的文本 + translateResult: 翻译的某个词或句,在翻译之后的文本,翻译结果 + language: 显示的语种,这里是对应的 translateResult 这个文本的语种。 也就是最终替换之后要显示给用户的语种。比如将中文翻译为英文,这里也就是英文。 这里会根据显示的语种不同,来自主决定是否前后加空格进行分割。 另外这里传入的语种也是 translate.js 的语种标识 + participles: 分词,数组形态。默认不传则是没有其他分词需要保留的。 传入比如 ['你好','你是谁'] + 比如 translateOriginal 传入 '你' 时, text 中的 '你好','你是谁' 是不能被拆出'你'这个字进行替换的,不然就破坏了分词了 + + (注意,如果 translateResult 中发现 translateOriginal 的存在,将不进行任何处理,因为没必要了,还会造成死循环。直接将 text 返回) + + 使用此方法: + var text = '你世好word世界'; + var translateOriginal = '世'; + var translateResult = '世杰'; //翻译结果 + translate.util.textReplace(text, translateOriginal, translateResult, 'english'); //没有分词,正常替换 + translate.util.textReplace(text, translateOriginal, translateResult, 'english',['世界','好word']); //有分词,要保留分词结构,不能被拆分替换,不能拆分分词的语义 + + */ + textReplace: function (text, translateOriginal, translateResult, language, participles) { + //console.log('----text:'+text.replace(/\t/g, '\\t').replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/ /g, '[空白符]')+', translateOriginal:'+translateOriginal+', translateResult:'+translateResult+',\tparticiples:'); + //console.log(participles); + + //如果要替换的源文本直接就是整个文本,那也就不用在做什么判断了,直接将 翻译的结果文本返回就好了 + if (text == translateOriginal) { + return translateResult; + } + + //console.log('participles ---- 处理'); + //console.log(participles); + if (typeof (participles) === 'object') { + for (var pi = participles.length; pi >= 0; pi--) { + var participlesItemArray = translate.util.text_full_half_width_generate(participles[pi], language); + if (participlesItemArray.length > 1) { + //被拆了,要合并 + participlesItemArray.shift(); // 移除第一个,也就是原本的participles中的元素 + participles = participles.concat(participlesItemArray); + } + } + } + + + /* + //文字之间需要空格,也就是半角标点符号,像是英语,法语, 则是true + var requireSpace = translate.language.wordBlankConnector(language); + + //如果要替换的文本只是原文本中的一部分,那么就需要进行处理了 + var findText = translateOriginal; + */ + + + /**** 判断 findText 的开始字符跟结束字符是否包含着 特殊符号 ,:。 因为在 translate.util.textReplace 替换时,会根据当前语种,自动将前后有句号等符号时进行中英的符号转换,此时如果 findText 传入的带有句号的,比如 “你好,” 而实际上text的内容是已经被替换过,就会导致 “你好,” 找不到,而 “你好,” 能找到 ****/ + /* + var punctuationMarks_fullWidth = [',',':','。']; //标点符号-全角,用于中文等语种 + var punctuationMarks_halfWidth = [',',':','.']; //标点符号-半角,用于英文等语种 + + //取第一个字符 + var findTextFirstChar = findText.charAt(0); + //取最后一个字符 + var findTextLastChar = findText.charAt(findText.length-1); + */ + + /* + * translateOriginal 生成的用于替换的变种,可能是多个,比如 “你好,世界。” 中的 ",世界" 在翻译为英文情况时,会出现这几种变种: + * , 世界。 + * , 世界. + * ,世界。 + * ,世界. + * 根据不同的中英文,标点符号后面是否跟空格也不同 + */ + var originalArray = translate.util.text_full_half_width_generate(translateOriginal, language); + /* + var originalArray = []; + originalArray.push(translateOriginal); //首先把当前的加入进去 + + + + //翻译替换为半角标点符号,如英语 + if(requireSpace){ + + //第一个发现全角字符, 转为半角处理 + if(punctuationMarks_fullWidth.indexOf(findTextFirstChar) > -1){ + var processFirstCharText = punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextFirstChar)]+' '+findText.substring(1, findText.length); + originalArray.push(processFirstCharText); + + //第一个处理后,寻找最后一个全角字符转为半角处理 + if(punctuationMarks_fullWidth.indexOf(findTextLastChar) > -1){ + originalArray.push(processFirstCharText.substring(0, processFirstCharText.length-1)+punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextLastChar)]); + } + } + + //将最后一个全角字符转为半角处理 + if(punctuationMarks_fullWidth.indexOf(findTextLastChar) > -1){ + originalArray.push(findText.substring(0, findText.length-1)+punctuationMarks_halfWidth[punctuationMarks_fullWidth.indexOf(findTextLastChar)]); + } + }else{ + //翻译替换为全角标点符号,如中文 + + //第一个发现半字符, 转为全角处理。这里不用跟上面似的追加去除空格的,因为 textReplace_service 只为了阅读方便追加空格,并没有做去空格处理。 + if(punctuationMarks_halfWidth.indexOf(findTextFirstChar) > -1){ + var processLastCharText = punctuationMarks_fullWidth[punctuationMarks_halfWidth.indexOf(findTextFirstChar)]+' '+findText.substring(1, findText.length); + originalArray.push(processLastCharText); + + //第一个处理后,寻找最后一个半角字符转为全角处理 + if(punctuationMarks_halfWidth.indexOf(findTextLastChar) > -1){ + originalArray.push(processLastCharText.substring(0, processLastCharText.length-1)+punctuationMarks_fullWidth[punctuationMarks_halfWidth.indexOf(findTextLastChar)]); + } + } + + //将最后一个全角字符转为半角处理 + if(punctuationMarks_halfWidth.indexOf(findTextLastChar) > -1){ + originalArray.push(findText.substring(0, findText.length-1)+punctuationMarks_fullWidth[punctuationMarks_halfWidth.indexOf(findTextLastChar)]); + } + } + */ + + for (var i = 0; i < originalArray.length; i++) { + if (text.indexOf(originalArray[i]) > -1) { + text = translate.util.textReplace_service(text, originalArray[i], translateResult, language, participles); + } + } + + return text; + }, + /* + 它服务于上面的 textReplace,不需要直接使用这个 + + */ + textReplace_service: function (text, translateOriginal, translateResult, language, participles) { + //console.log('----text:'+text+', translateOriginal:'+translateOriginal+', translateResult:'+translateResult+", participles:"); + //console.log(participles); + //如果要替换的源文本直接就是整个文本,那也就不用在做什么判断了,直接将 翻译的结果文本返回就好了 + if (text == translateOriginal) { + return translateResult; + } + + /* + + //当前替换后,替换结果结束位置的下标。 + //一开始还没进行替换,那么这个下标就是 0 + //比如 你好吗 中的 好 替换为 "好的" 那最后结果为 "你好的吗" ,这里是 “的” 的下标 2 + let currentReplaceEndIndex = 0; + + //while最大循环次数30次,免得出现未知异常导致死循环 + let maxWhileNumber = 30; + */ + + var indexArray = translate.util.findParticiple(text, translateOriginal, participles); + for (var i = indexArray.length - 1; i > -1; i--) { + //console.log('text:'+text+'\tcurrentReplaceEndIndex:'+currentReplaceEndIndex); + + //通过 translate.util.replaceFromIndex 进行替换时的 index 开始位置 。 比如如果下面识别前面的一个字符,要变为, 那也就是要继续向前一位,这里就要 -1 + let replaceIndex = indexArray[i]; + //要替换的结果文本(这个文本可能前面有加空格或者后面有加空格的) + let replaceResultText = '' + translateResult; + //替换的文本 ,这里有可能会追加上某些标点符号,所以单独也列出来,而不是使用方法中传入的 translateOriginal + let replaceOriginalText = '' + translateOriginal; + + + //根据不同的语种,如果有的语种需要加空格来进行区分单词,那么也要进行空格的判定 + if (translate.language.wordBlankConnector(language)) { + //let originalIndex = text.indexOf(translateOriginal, currentReplaceEndIndex); //翻译之前,翻译的单词在字符串中的起始坐标(0开始) + let originalIndex = indexArray[i]; + //console.log("originalIndex: "+originalIndex); + + //要先判断后面,不然先判断前面,加了后它的长度就又变了 + + //判断它后面是否还有文本 + var afterCharIndex = indexArray[i] + translateOriginal.length; //translateOriginal之后的第一个文本的index下标 + if (afterCharIndex < text.length) { + let char = text.charAt(afterCharIndex); + //console.log(translateOriginal+' after char : '+char+", index:"+afterCharIndex); + if (/。/.test(char)) { + replaceResultText = replaceResultText + '. '; + replaceOriginalText = translateOriginal + '。'; + } else if (/,/.test(char)) { + replaceResultText = replaceResultText + ', '; + replaceOriginalText = translateOriginal + ','; + } else if (/:/.test(char)) { + replaceResultText = replaceResultText + ': '; + replaceOriginalText = translateOriginal + ':'; + } else if ([' ', '\n', '\t', ']', '|', '_', '-', '/'].indexOf(char) !== -1) { + // 如果后面的字符是 这些字符,那么不用添加空格隔开 + } else { + //补充上一个空格,用于将两个单词隔开。 不过 ,如果当前 replaceResultText 的最后一个字符也是空格,那就不需要再加空格了。 这里就只判断空格就好了,至于其他的换行等基本不会出现这个情况,所以不考虑 + if (replaceResultText.length > 0 && replaceResultText.charAt(replaceResultText.length - 1) == ' ') { + //replaceResultText 本身有值,且最后一个字符就是空格,就不需要再追加空格进行隔开了 + } else { + replaceResultText = replaceResultText + ' '; + } + } + } + + //判断它前面是否还有文本 + if (originalIndex > 0) { + let char = text.charAt(originalIndex - 1); + //console.log(char); + + if (/。/.test(char)) { + replaceIndex--; + replaceResultText = '. ' + replaceResultText; + replaceOriginalText = '。' + replaceOriginalText; + } else if (/,/.test(char)) { + replaceIndex--; + replaceResultText = ', ' + replaceResultText; + replaceOriginalText = ',' + replaceOriginalText; + } else if (/:/.test(char)) { + replaceIndex--; + replaceResultText = ': ' + replaceResultText; + replaceOriginalText = ':' + replaceOriginalText; + } else if ([' ', '\n', '\t', '[', '|', '_', '-', '/'].indexOf(char) !== -1) { + // 如果前面的字符是 这些字符,那么不用添加空格隔开 + //console.log('不需要空格隔开的'); + } else { + //补充上一个空格,用于将两个单词隔开。 不过 ,如果当前 replaceResultText 的第一个字符也是空格,那就不需要再加空格了。 这里就只判断空格就好了,至于其他的换行等基本不会出现这个情况,所以不考虑 + if (replaceResultText.length > 0 && replaceResultText.charAt(0) == ' ') { + //replaceResultText 本身有值,且最后一个字符就是空格,就不需要再追加空格进行隔开了 + } else { + replaceResultText = ' ' + replaceResultText; + } + //console.log('before add space : '+replaceResultText); + } + } + } else { + //如果是其他语种比如英语法语翻译为中文、日文,那么标点符号也要判断的,这个因为目前这个场景还没咋遇到,就不判断了,遇到了在加。 + + } + //console.log('replaceOriginalText: '+ replaceOriginalText+" --> replaceResultText: "+replaceResultText); + + let replaceResult = translate.util.replaceFromIndex(text, replaceIndex, replaceOriginalText, replaceResultText); + + if (replaceResult.replaceEndIndex < 1) { + translate.log('translate.util.findParticiple 中已经发现了,但是实际没有替换,出现异常了!理论上这是不应该出现的。 text:' + text + ' , index:' + indexArray[i] + ', translateOriginal:' + translateOriginal); + } else { + text = replaceResult.text; + } + } + + //console.log(text); + return text; + }, + /* + 从一个字符串中, 寻找某个分词。这个分词不能破坏其他分词。 + text: 原始文本,翻译的某句或者某个词就在这个文本之中 + findText: 寻找的分词文本 + participles: 分词,数组形态。默认不传则是没有其他分词需要保留的。 传入比如 ['你好','你是谁'] + 比如 translateOriginal 传入 '你' 时, text 中的 '你好','你是谁' 是不能被拆出'你'这个字进行替换的,不然就破坏了分词了 + + + return 返回寻找到的分词文本在 text 中的下标数组(下标是从0开始) + 比如: [0, 3, 6] 便是在 text 中的0下标出现了这个 findParticiple 寻找的分词文本 + 如果没有发现,则返回 [] 空数组 + 注意,它里面的元素都是按照顺序由小往大,顺序排的 + + */ + findParticiple: function (text, findText, translateTexts) { + var resultArray = []; + + //兼容 translateTexts 不传入的情况 + if (typeof (translateTexts) == 'undefined' || translateTexts == null) { + translateTexts = []; + } + + /*****1. 先过滤,过滤掉 translateTexts 中 不包含 translateOriginal、 以及文本长度小于等于 translateOriginal 这个分词的情况*****/ + var newTranslateTexts = []; + for (var i = 0; i < translateTexts.length; i++) { + if (translateTexts[i].indexOf(findText) != -1 && translateTexts[i].length > findText.length) { + newTranslateTexts.push(translateTexts[i]); + } + } + //console.log('包含'+findText+'的分词:'); + //console.log(newTranslateTexts) + + //当前替换后,替换结果结束位置的下标。 + //一开始还没进行替换,那么这个下标就是 0 + //比如 你好吗 中的 好 替换为 "好的" 那最后结果为 "你好的吗" ,这里是 “的” 的下标 2 + var currentReplaceEndIndex = 0; + + // TODO 【原方案】 + // //while最大循环次数30次,免得出现未知异常导致死循环 + // var maxWhileNumber = 30; + // + // // 识别,indexOf 逐个识别 '你' ,识别到之后,再跟 其他比如 '你是谁' 进行判断,比如 '你是谁' 就要讲 indexOf 的下标+2 来截取这text中的三个字符,去跟 '你是谁' 判定,以判定是否是一个正常的不能拆分的分词 + // while(text.indexOf(findText, currentReplaceEndIndex) > -1 && maxWhileNumber-- > 0){ + // var index = text.indexOf(findText, currentReplaceEndIndex); + // + // var findParticiple = false; //发现是其他分词了是true,没发现可以替换则是false + // console.log('index -> ', index) + // + // //进行其他分词发现策略(旧:将句子按下标进行拆分,判断出是否属于分词) + // if(newTranslateTexts.length > 0){ + // //发现的这个词可能是其他分词中的一部分,这个要判断当前index是否是其他分词的一部分。 这里要进行遍历 newTranslateTexts 逐个取出进行对比 + // + // for(var j = 0; j < newTranslateTexts.length; j++){ + // //判断 newTranslateTexts[j] 这个分词中包含的 findText 这个文本,这个文本是在 newTranslateTexts[j] 的下标的多少 + //注意,这里有bug + //当前替换后,替换结果结束位置的下标。 + //一开始还没进行替换,那么这个下标就是 0 + //比如 你好吗 中的 好 替换为 "好的" 那最后结果为 "你好的吗" ,这里是 “的” 的下标 2、 + // var indexInNewTranslateTexts = newTranslateTexts[j].indexOf(findText); + // // 因为 newTranslateTexts 是通过筛选包含 findText 而出的,所以它肯定是包含的,有下标的 + // // 这里要从 text 中,根据 indexInNewTranslateTexts 及 原本 findText 的 index,在这个index的前或者后,追加几个文本,这追加的文本长度,也就是根据 indexInNewTranslateTexts 以及 newTranslateTexts[j] 的长度 + // + // //这里准备要根据 newTranslateTexts[j] 、 indexInNewTranslateTexts ,来定义从 text 中去取 对应 newTranslateTexts[j] 的长度,以判断当前index是否是取的 newTranslateTexts[j] 这个分词的 + // var length = newTranslateTexts[j].length; + // var split_text = text.substring(index-indexInNewTranslateTexts, index-indexInNewTranslateTexts + length); + // if(split_text == newTranslateTexts[j]){ + // //说明当前index是取的 newTranslateTexts[j] 这个分词的,那这个就不能替换,要忽略 + // //console.log('当前是其他分词,不能直接替换 : '+newTranslateTexts[j]); + // findParticiple = true; + // break; + // } + // console.log('split_text -> ', split_text); + // console.log('newTranslateTexts[j] -> ', newTranslateTexts[j]); + // console.log('split_text == newTranslateTexts[j] -> ', split_text == newTranslateTexts[j]); + // console.log('indexInNewTranslateTexts -> ', indexInNewTranslateTexts); + // console.log('length -> ', length); + // console.log('index-indexInNewTranslateTexts -> ', index-indexInNewTranslateTexts); + // console.log('index-index-indexInNewTranslateTexts + length -> ', index-indexInNewTranslateTexts + length); + // } + // } + // + // console.log('findParticiple -> ', findParticiple); + // if(!findParticiple){ + // resultArray.push(index); + // } + // currentReplaceEndIndex = index+findText.length; + // console.log(" ---------- ") + // } + + // 【方案1】使用下标数组记录位置 + let flagArr = translate.util.participleIndexFind(text, newTranslateTexts); + + // while最大循环次数30次,免得出现未知异常导致死循环 + var maxWhileNumber = 300; + + // 识别,indexOf 逐个识别 '你' ,识别到之后,再跟 其他比如 '你是谁' 进行判断,比如 '你是谁' 就要讲 indexOf 的下标+2 来截取这text中的三个字符,去跟 '你是谁' 判定,以判定是否是一个正常的不能拆分的分词 + while (text.indexOf(findText, currentReplaceEndIndex) > -1 && maxWhileNumber-- > 0) { + var index = text.indexOf(findText, currentReplaceEndIndex); + + var findParticiple = false; //发现是其他分词了是true,没发现可以替换则是false + + // 遍历分词,获取出在原句子中的位置,根据下标对比判断是否属于分词 + if (newTranslateTexts.length > 0 && flagArr.length > 0) { + // 发现的这个词可能是其他分词中的一部分,这个要判断当前index是否是其他分词的一部分。 这里要进行遍历 flagArr,如果index在此数组中的范围内说明属于其他分词 + for (var j = 0; j < flagArr.length; j++) { + // 取出子数组,标记了分词在原文中的位置 + let flagItem = flagArr[j]; + if (index >= flagItem.start && index <= flagItem.end) { + // 说明当前index是取的 flagArr[j] 这个分词的,那这个就不能替换,要忽略 + findParticiple = true; + break; + } + } + } + + if (!findParticiple) { + resultArray.push(index); + } + currentReplaceEndIndex = index + findText.length; + } + + + + /* + 这里需要将下面的 9、7 这个下标找出来,然后进行替换。 注意要先从后进行替换,避免从前替换,之后的下标长度出现变化 + */ + + //text = translate.util.replaceFromIndex(text, 9, translateOriginal, translateResult).text; + //text = translate.util.replaceFromIndex(text, 7, translateOriginal, translateResult).text; + + + //return text; + + return resultArray; + }, + /** + * 方案1:使用下标数组来标记分词位置 + * 传入原文和分词内容数组,返回分词在原文中的下标数组 + * 例如: + * text 传入 "只有那些敢于追求梦想的人,才能实现梦想。" + * newTranslateTexts 传入 ["梦想", "敢于追求"] + * 则输出 [{start: 4, end: 7}, {"start": 8, "end": 9}, {"start": 17, "end": 18}] + * @param text 原文。字符串 + * @param newTranslateTexts 分词内容数组 + * @returns 分词所在的下标范围的数组。格式为 [{"start": 1, "end": 2}] + */ + participleIndexFind: function (text, newTranslateTexts) { + //console.log('text: '+text+', newTranslateTexts: '); + //console.log(newTranslateTexts); + let indexArr = []; + // 遍历分词 + for (let i = newTranslateTexts.length - 1; i >= 0; i--) { + // 取出分词 + let word = newTranslateTexts[i]; + // 找出分词在原文中出现的所有位置 + let startIndex = 0; // 起始位置 + while (text.indexOf(word, startIndex) > -1) { + // 开始的下标 + let index = text.indexOf(word, startIndex); + // 结束的下标 + let endIndex = index + word.length - 1; + // 封装成数组,存入二维数组中 + let item = { + start: index, + end: endIndex + } + indexArr.push(item); + // 改变起始位置 + startIndex = index + word.length - 1; + } + } + //console.log(indexArr); + return indexArr; + }, + /* + js 的 replace 能力,这个是可以指定从第几个字符开始进行replace + 1. 这里可以 replaceText 本身包含着 originalText + 2. originalText 可以出现多次 + + @param + text 要进行替换的原始文本 + index 要从 text 的哪个下标开始。 (第一个字符下标是0) + originalText 要替换的文本,被替换的文本 + replaceText 替换为的文本,将 originalText 替换为什么 + replaceFromIndex('你好吗?你也好?', 0, '你', '你是谁'); + + @return 对象 + text 替换的结果 + replaceEndIndex 当前替换后,替换结果结束位置的下标。 + 如果没进行替换,那么这个下标就是 0 + 比如 你好吗 中的 好 替换为 "好的" 那最后结果为 "你好的吗" ,这里是 “的” 的下标 2 + */ + replaceFromIndex: function (text, index, originalText, replaceText) { + const before = text.slice(0, index); + const after = text.slice(index); + const originalTextIndex = after.indexOf(originalText); + if (originalTextIndex > -1) { + const replacedAfter = after.replace(originalText, replaceText); + return { + text: before + replacedAfter, + replaceEndIndex: index + originalTextIndex + replaceText.length + } + } else { + //没有发现可替换的字符,那么就原样返回 + //console.log('after:'+after); + //console.log(text+originalText); + return { + text: before, + replaceEndIndex: 0 + }; + } + }, + + /* 生成一个随机UUID,复制于 https://gitee.com/mail_osc/kefu.js */ + uuid: function () { + var d = new Date().getTime(); + if (window.performance && typeof window.performance.now === "function") { + d += performance.now(); //use high-precision timer if available + } + var uuid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + return uuid; + }, + + //判断字符串中是否存在tag标签。 true存在 + findTag: function (str) { + var reg = /<[^>]+>/g; + return reg.test(str); + }, + //传入一个数组,从数组中找出现频率最多的一个返回。 如果多个频率出现的次数一样,那会返回多个 + arrayFindMaxNumber: function (arr) { + + // 储存每个元素出现的次数 + var numbers = {} + + // 储存出现最多次的元素 + var maxStr = [] + + // 储存最多出现的元素次数 + var maxNum = 0 + + for (var i = 0, len = arr.length; i < len; i++) { + if (!numbers[arr[i]]) { + numbers[arr[i]] = 1 + } else { + numbers[arr[i]]++ + } + + if (numbers[arr[i]] > maxNum) { + maxNum = numbers[arr[i]] + } + } + + for (var item in numbers) { + if (!numbers.hasOwnProperty(item)) { + continue; + } + if (numbers[item] === maxNum) { + maxStr.push(item) + } + } + + return maxStr; + }, + //对字符串进行hash化,目的取唯一值进行标识 + hash: function (str) { + if (str == null || typeof (str) == 'undefined') { + return str; + } + var hash = 0, i, chr; + if (str.length === 0) { + return hash; + } + + for (i = 0; i < str.length; i++) { + chr = str.charCodeAt(i); + hash = ((hash << 5) - hash) + chr; + hash |= 0; // Convert to 32bit integer + } + return hash + ''; + }, + //去除一些指定字符,如换行符。 如果传入的是null,则返回空字符串 + charReplace: function (str) { + + if (str == null) { + return ''; + } + str = str.trim(); + str = str.replace(/\t|\n|\v|\r|\f/g, ''); //去除换行符等 + //str = str.replace(/&/g, "%26"); //因为在提交时已经进行了url编码了 + return str; + }, + //RegExp相关 + regExp: { + // new RegExp(pattern, resultText); 中的 pattern 字符串的预处理 + pattern: function (str) { + str = str.replace(/\\/g, '\\\\'); //这个一定要放在第一个,不然会被下面的影响 + //str = str.replace(/'/g,'\\\''); + str = str.replace(/\"/g, '\\\"'); + //str = str.replace(/./g,'\\\.'); + str = str.replace(/\?/g, '\\\?'); + str = str.replace(/\$/g, '\\\$'); + str = str.replace(/\(/g, '\\\('); + str = str.replace(/\)/g, '\\\)'); + str = str.replace(/\|/g, '\\\|'); + str = str.replace(/\+/g, '\\\+'); + str = str.replace(/\*/g, '\\\*'); + str = str.replace(/\[/g, '\\\['); + str = str.replace(/\]/g, '\\\]'); + str = str.replace(/\^/g, '\\\^'); + str = str.replace(/\{/g, '\\\{'); + str = str.replace(/\}/g, '\\\}'); + return str; + }, + // new RegExp(pattern, resultText); 中的 resultText 字符串的预处理 + resultText: function (str) { + //str = str.replace(/"/g,"\""); + //str = str.replace(/'/g,"\\\'"); + //str = str.replace(/"/g,"\\\""); + return str; + } + }, + //获取URL的GET参数。若没有,返回"" + getUrlParam: function (name) { + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + var r = window.location.search.substr(1).match(reg); + if (r != null) return unescape(r[2]); return ""; + }, + /** + * 同步加载JS,加载过程中会阻塞,加载完毕后继续执行后面的。 + * url: 要加载的js的url + */ + synchronizesLoadJs: function (url) { + var xmlHttp = null; + if (window.ActiveXObject) {//IE + try { + //IE6以及以后版本中可以使用 + xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + //IE5.5以及以后版本可以使用 + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + } else if (window.XMLHttpRequest) { + //Firefox,Opera 8.0+,Safari,Chrome + xmlHttp = new XMLHttpRequest(); + } + //采用同步加载 + xmlHttp.open("GET", url, false); + //发送同步请求,如果浏览器为Chrome或Opera,必须发布后才能运行,不然会报错 + xmlHttp.send(null); + //4代表数据发送完毕 + if (xmlHttp.readyState == 4) { + //0为访问的本地,200到300代表访问服务器成功,304代表没做修改访问的是缓存 + if ((xmlHttp.status >= 200 && xmlHttp.status < 300) || xmlHttp.status == 0 || xmlHttp.status == 304) { + var myBody = document.getElementsByTagName("HTML")[0]; + var myScript = document.createElement("script"); + myScript.language = "javascript"; + myScript.type = "text/javascript"; + try { + //IE8以及以下不支持这种方式,需要通过text属性来设置 + myScript.appendChild(document.createTextNode(xmlHttp.responseText)); + } catch (ex) { + myScript.text = xmlHttp.responseText; + } + myBody.appendChild(myScript); + return true; + } else { + return false; + } + } else { + return false; + } + }, + + /*js translate.util.loadMsgJs start*/ + //加载 msg.js + loadMsgJs: function () { + if (typeof (msg) != 'undefined') { + return; + } + translate.util.synchronizesLoadJs('https://res.zvo.cn/msg/msg.js'); + }, + /*js translate.util.loadMsgJs end*/ + /* + 对一个对象,按照对象的key的长度进行排序,越长越在前面 + */ + objSort: function (obj) { + // 获取对象数组的所有 key,并转换为普通数组 + var keys = Array.from(Object.keys(obj)); + //var keys = [].slice.call(Object.keys(obj)); //适配es5 + + // 对 key 数组进行排序 + keys.sort(function (a, b) { + return b.length - a.length; + }); + + // 定义一个新的对象数组,用来存储排序后的结果 + var sortedObj = new Array(); + + // 遍历排序后的 key 数组,将对应的值复制到新的对象数组中,并删除原来的对象数组中的键值对 + for (var key of keys) { + sortedObj[key] = obj[key]; + } + return sortedObj; + }, + /* + 将 2.11.3.20231232 转化为 2011003 + 转化时会去掉最后一个日期的字符 + */ + versionStringToInt: function (versionString) { + var vs = versionString.split('\.'); + var result = 0; + result = parseInt(vs[0]) * 1000 * 1000 + result; + result = parseInt(vs[1]) * 1000 + result; + result = parseInt(vs[2]) + result; + + return result; + }, + /** + * 将一个 JSONArray 数组,按照文字长度进行拆分。 + * 比如传入的 array 数组的文字长度是6200,传入的 stringLength 是2000,那么就是将 array 数组拆分为多个长度不超出2000的数组返回。 + * 如果传入了 maxSize = 5 那么会对拆分后的数组的长度进行判断,如果数组内元素超过5,那么还要进行缩短,拆分后的数组不允许超过这个数 + * 也就是拆分后的数组有两重限制,一是限制转化为文本形式的长度、再就是拆分后本身数组的大小。 + * + * 注意,这个长度是指 array.toString() 后的长度,也就是包含了 [""] 这种符号的长度 + * @param array 要被拆分的数组,其内都是String类型,传入格式如 ["你好","世界"] + * @param stringLength 要被拆分的数组转化为字符串之后的长度 + * @param maxSize 被拆分的数组最大包含多少个,数组大小最大允许多大,要小于等于这个数。 如果设置为0则是不启用这个,不对拆分后的数组进行判断。 + * @return 被拆分后的数组列表 + * @author 刘晓腾 + */ + split: function (array, size, maxSize) { + let orgsize = size; + let list = []; + // 数组长度小于size,直接进行返回 + if (JSON.stringify(array).length <= size) { + list.push(array); + } else { + // 转换成String + let arrayStr = JSON.stringify(array).trim().substring(1, JSON.stringify(array).length - 1); + + // 判断size和字符串长度的差值,如果为1或者2,就直接拆成两段 + if (JSON.stringify(array).length - size <= 2) { + size = size - 4; + // 拆两段 + let str1 = arrayStr.substring(0, arrayStr.lastIndexOf("\",\"") + 1); + let str2 = arrayStr.substring(arrayStr.lastIndexOf("\",\"") + 2); + list.push(JSON.parse("[" + str1 + "]")); + list.push(JSON.parse("[" + str2 + "]")); + } else { + size = size - 2; + // 拆多段 + let index = 0; + while (index - arrayStr.length < 0) { + // 按照指定大小拆一段 + let s = ""; + if ((index + size) - arrayStr.length >= 0) { + s = arrayStr.substring(index); + } else { + s = arrayStr.substring(index, (index + size)); + } + // 结尾长度默认为字符串长度 + let endIndex = s.length; + // 因为下次开始的第一个字符可能会是逗号,所以下次开始需要+1 + let startNeedAdd = 1; + // 判断最后一个字符是否为双引号 + if (s.endsWith("\"")) { + // 判断倒数第二个是否为逗号 + if (s.endsWith("\",\"")) { + // 删除两个字符 + endIndex -= 2; + } else if (!s.startsWith("\"")) { + // 如果开头不是引号,需要补一个引号,这就导致会超长,所以结尾就要找指定字符的 + // 找出最后一个指定字符的位置 + let la = s.lastIndexOf("\",\""); + endIndex = la + 1; + } + } else if (s.endsWith("\",")) { + // 判断是否为逗号,是的话删除一个字符 + endIndex -= 1; + } else { + // 都不是,那就是内容结尾 + // 找出最后一个指定字符的位置 + let la = s.lastIndexOf("\",\""); + endIndex = la + 1; + // 内容超长,endIndex就会变成0,这时需要手动赋值 + if (endIndex <= 0) { + // 看看是否以引号开头,如果不是,需要拼两个引号 + if (s.startsWith("\"")) { + // 拼一个引号,-1 + endIndex = s.length - 1; + } else { + // 拼两个引号,-2 + endIndex = s.length - 2; + } + if (!s.endsWith("\"")) { + // 开始不是逗号了,不能-1 + startNeedAdd = 0; + } + } + } + // 根据处理的结尾长度进行第二次拆分 + let s2 = ""; + if (endIndex - s.length > 0 || endIndex - 0 == 0) { + s2 = s; + endIndex = endIndex + s2.length; + } else { + s2 = s.substring(0, endIndex); + } + if (!s2.startsWith("\"") && !s2.startsWith(",\"")) { + // 拼一个引号 + s2 = "\"" + s2; + } + if (!s2.endsWith("\"")) { + // 拼一个引号 + s2 = s2 + "\""; + } + // 计算下次循环开始的长度 + index += (endIndex + startNeedAdd); + // 加到list + s2 = "[" + s2 + "]"; + try { + list.push(JSON.parse(s2)); + } catch (e) { + // 遇到错误,略过一个字符 + index = index - (endIndex + startNeedAdd) + 1; + } + } + } + } + // 设置了maxSize,进行处理 + if (maxSize && maxSize > 0) { + list = translate.util._splitMaxSize(list, orgsize, maxSize); + } + return list; + }, + /** + * 针对split函数中maxSize的处理 + * private + * @param array 已拆分的二维数组 + * @param size 拆分的长度 + * @param maxSize 元素数量 + * @author 刘晓腾 + */ + _splitMaxSize: function (array, size, maxSize) { + // console.log("------ splitMaxSize run ------") + + // 返回的数据 + let list = []; + // 暂存的数组,用来存储每次遍历时超出的数据 + let tmp = []; + + // 遍历二维数组 + array.forEach(function (arr, index) { + // 累加数组 + arr = tmp.concat(arr); + // 计算元素数量 + let length = arr.length; + // 数组中元素数量大于maxSize,对多余的元素进行移除 + if (length > maxSize) { + // 第一个数组,包含前N个元素 + let firstArray = arr.slice(0, maxSize); + // 第二个数组,包含剩下的元素 + let secondArray = arr.slice(maxSize); + + // 处理长度 + let len = 1; + while (JSON.stringify(firstArray).length > size) { + // 长度超过限制,进行处理 + firstArray = arr.slice(0, maxSize - len); + secondArray = arr.slice(maxSize - len); + len++; + if (len >= arr.length + 1) { + break; + } + } + + // 第一个数组记录 + list.push(firstArray); + // 第二个数组暂存 + tmp.length = 0; + tmp = secondArray; + } else { + // 没超,只处理长度 + // 处理长度 + let firstArray = arr; + let secondArray = []; + let len = 1; + while (JSON.stringify(firstArray).length > size) { + // 长度超过限制,进行处理 + firstArray = arr.slice(0, maxSize - len); + secondArray = arr.slice(maxSize - len); + len++; + if (len >= arr.length + 1) { + break; + } + } + + // 第一个数组记录 + list.push(firstArray); + // 第二个数组暂存 + tmp.length = 0; + tmp = secondArray; + } + + }); + + // 临时数组中还有元素,也要进行处理 + if (tmp.length > 0) { + let tmpl = []; + tmpl.push(tmp); + // 递归处理 + let l = translate.util._splitMaxSize(tmpl, size, maxSize); + list = list.concat(l); + } + + return list; + }, + /* + 浏览器的语种标识跟translate.js的语种标识的对应 + key: 浏览器的语种标识 + value: translate.js 的语种标识 + */ + browserLanguage: { + 'zh': 'chinese_simplified', + 'zh-CN': 'chinese_simplified', + 'zh-TW': 'chinese_traditional', + 'zh-HK': 'chinese_traditional', + 'co': 'corsican', + 'gn': 'guarani', + 'rw': 'kinyarwanda', + 'ha': 'hausa', + 'no': 'norwegian', + 'nl': 'dutch', + 'yo': 'yoruba', + 'en': 'english', + 'en-US': 'english', + 'kok': 'gongen', + 'la': 'latin', + 'ne': 'nepali', + 'fr': 'french', + 'cs': 'czech', + 'haw': 'hawaiian', + 'ka': 'georgian', + 'ru': 'russian', + 'fa': 'persian', + 'bho': 'bhojpuri', + 'hi': 'hindi', + 'be': 'belarusian', + 'sw': 'swahili', + 'is': 'icelandic', + 'yi': 'yiddish', + 'tw': 'twi', + 'ga': 'irish', + 'gu': 'gujarati', + 'km': 'khmer', + 'sk': 'slovak', + 'he': 'hebrew', + 'kn': 'kannada', + 'hu': 'hungarian', + 'ta': 'tamil', + 'ar': 'arabic', + 'bn': 'bengali', + 'az': 'azerbaijani', + 'sm': 'samoan', + 'af': 'afrikaans', + 'id': 'indonesian', + 'da': 'danish', + 'sn': 'shona', + 'bm': 'bambara', + 'lt': 'lithuanian', + 'vi': 'vietnamese', + 'mt': 'maltese', + 'tk': 'turkmen', + 'as': 'assamese', + 'ca': 'catalan', + 'si': 'singapore', + 'ceb': 'cebuano', + 'gd': 'scottish-gaelic', + 'sa': 'sanskrit', + 'pl': 'polish', + 'gl': 'galician', + 'lv': 'latvian', + 'uk': 'ukrainian', + 'tt': 'tatar', + 'cy': 'welsh', + 'ja': 'japanese', + 'fil': 'filipino', + 'ay': 'aymara', + 'lo': 'lao', + 'te': 'telugu', + 'ro': 'romanian', + 'ht': 'haitian_creole', + 'doi': 'dogrid', + 'sv': 'swedish', + 'mai': 'maithili', + 'th': 'thai', + 'hy': 'armenian', + 'my': 'burmese', + 'ps': 'pashto', + 'hmn': 'hmong', + 'dv': 'dhivehi', + 'lb': 'luxembourgish', + 'sd': 'sindhi', + 'ku': 'kurdish', + 'tr': 'turkish', + 'mk': 'macedonian', + 'bg': 'bulgarian', + 'ms': 'malay', + 'lg': 'luganda', + 'mr': 'marathi', + 'et': 'estonian', + 'ml': 'malayalam', + 'de': 'deutsch', + 'sl': 'slovene', + 'ur': 'urdu', + 'pt': 'portuguese', + 'ig': 'igbo', + 'ckb': 'kurdish_sorani', + 'om': 'oromo', + 'el': 'greek', + 'es': 'spanish', + 'fy': 'frisian', + 'so': 'somali', + 'am': 'amharic', + 'ny': 'nyanja', + 'pa': 'punjabi', + 'eu': 'basque', + 'it': 'italian', + 'sq': 'albanian', + 'ko': 'korean', + 'tg': 'tajik', + 'fi': 'finnish', + 'ky': 'kyrgyz', + 'ee': 'ewe', + 'hr': 'croatian', + 'kri': 'creole', + 'qu': 'quechua', + 'bs': 'bosnian', + 'mi': 'maori' + }, + /* + 获取浏览器中设置的默认使用语言 + 返回的是 translate.js 的语言唯一标识 + 如果返回的是空字符串,则是没有匹配到(可能是没有获取到本地语言,也可能是本地语言跟translate.js 翻译通道没有对应上) + */ + browserDefaultLanguage: function () { + var language = navigator.language || navigator.userLanguage; + if (typeof (language) == 'string' && language.length > 0) { + var tLang = translate.util.browserLanguage[language]; + if (typeof (tLang) == 'undefined') { + //没有在里面 + translate.log('browser default language : ' + language + ', translate.js current translate channel not support this language '); + } else { + return tLang; + } + } + + //将其转化为 translate.js 的语言id,比如简体中文是 chinese_simplified 、 英语是 english + return ''; + }, + /* + 对输入的文本 text 进行判断,判断它里面是否有url存在。如果有url存在,对其进行截取,将url跟非url进行截取处理。 + 比如传入 “这个示例:https://www.ungm.org/Public/Notice/261001,其他得示例是 http://api.translate.zvo.cn 我呢” + 那么返回的截取结果为: + { + "https://www.ungm.org/Public/Notice/261001":"1", + "http://api.translate.zvo.cn":"1", + ",其他得示例是 ":"0", + "这个示例:":"0" + " 我呢":"0" + } + 其中的key 为截取的文本,value 的值是1或0, 1代表当前key的文本是网址,0则不是网址 + */ + urlSplitByText: function (text) { + // 匹配 http/https 的 URL 正则表达式(包含常见 URL 符号,排除中文等非 ASCII 字符) + const urlRegex = /(https?:\/\/[\w\-._~:\/?#[\]@!$&'()*+;=%]+(?=[\s\u4e00-\u9fa5,。;,!?]|$))/gi; + + // 使用正则表达式分割文本,保留URL + const parts = text.split(urlRegex); + + // 结果对象 + let result = {}; + + // 添加非URL部分,并标记为 0 + for (let i = 0; i < parts.length; i++) { + if (i % 2 === 0) { + // 非URL部分 + if (parts[i] !== "") { + result[parts[i]] = "0"; + } + } else { + // URL部分 + result[parts[i]] = "1"; + } + } + + return result; + }, + + /*js translate.util.getElementPosition start*/ + /* + 计算一个元素在浏览器中的坐标系,其绝对定位、以及实际显示出来所占用的区域,宽、高 + */ + getElementPosition: function (node) { + // 获取元素的边界矩形信息(相对于视口) + const rect = node.getBoundingClientRect(); + + // 获取当前页面的滚动位置(兼容不同浏览器) + const scrollX = window.scrollX || document.documentElement.scrollLeft; + const scrollY = window.scrollY || document.documentElement.scrollTop; + + // 计算元素在文档中的起始坐标 + const startX = rect.left + scrollX; + const startY = rect.top + scrollY; + + // 计算元素的宽度和高度 + const width = rect.right - rect.left; + const height = rect.bottom - rect.top; + + // 计算元素在文档中的结束坐标 + const endX = startX + width; + const endY = startY + height; + + // 返回包含所有信息的对象(使用ES5兼容语法) + return { + startX: startX, + startY: startY, + endX: endX, + endY: endY, + width: width, + height: height + }; + }, + /*js translate.util.getElementPosition end*/ + + /*js translate.util.compareStringsIgnoringNumbers start*/ + /* + 比较两个字符串,是否除了数字之外,其他的完全一致。 + 实测 i5 双核 2.4G ,计算1亿次 - 7s + + ["abc123def", "abc456def", true], + ["hello7world", "hello8world", true], + ["test123", "test", true], + ["123test", "test", true], + ["abc", "def", false], + ["a1b2c3", "a4b5c", false], + ["", "", true], + ["123", "456", true], + ["你好123世界", "3你好1世界", true], + ["你好123世界", "你好世界4", true], + */ + compareStringsIgnoringNumbers: function (a, b) { + let i = 0, j = 0; + const lenA = a.length, lenB = b.length; + + while (i < lenA || j < lenB) { + // 跳过a中的数字 (0-9的ASCII码是48-57) + while (i < lenA && a.charCodeAt(i) >= 48 && a.charCodeAt(i) <= 57) { + i++; + } + + // 跳过b中的数字 + while (j < lenB && b.charCodeAt(j) >= 48 && b.charCodeAt(j) <= 57) { + j++; + } + + // 检查是否有一个字符串还有非数字字符而另一个已经结束 + if ((i < lenA) !== (j < lenB)) { + return false; + } + + // 如果都结束了,返回true + if (i >= lenA && j >= lenB) { + return true; + } + + // 比较当前非数字字符 + if (a[i] !== b[j]) { + return false; + } + + i++; + j++; + } + + return true; + } + /*js translate.util.compareStringsIgnoringNumbers end*/ + + }, + //机器翻译采用哪种翻译服务 + service: { + /* + name填写的值,参考 translate.service.use 的注释 + */ + name: 'translate.service', + + /*js translate.service.use start*/ + /* + 其实就是设置 translate.service.name + 可以设置为: + + translate.service 自行部署的translate.service 翻译API服务,部署参考: https://translate.zvo.cn/391129.html + client.edge 使用无服务器的翻译,有edge浏览器接口提供翻译服务 + siliconflow 使用指点云提供的服务器、硅基流动提供的AI算力进行大模型翻译 + giteeAI 使用 giteeAI , 亚洲、美洲、欧洲 网络节点覆盖 + + */ + use: function (serviceName) { + if (typeof (translate.enterprise) != 'undefined' && translate.enterprise.isUse == true) { + translate.log('您已启用了企业级翻译通道 translate.enterprise.use(); (文档:https://translate.zvo.cn/4087.html) , 所以您设置的 translate.service.use(\'' + serviceName + '\'); (文档:https://translate.zvo.cn/4081.html) 将失效不起作用,有企业级翻译通道全部接管。'); + return; + } + //console.log('--'+serviceName); + if (typeof (serviceName) == 'string') { + translate.service.name = serviceName; + if (serviceName != 'translate.service') { + //增加元素整体翻译能力 + translate.whole.enableAll(); + + if (serviceName.toLowerCase() == 'giteeai') { + //设定翻译接口为GiteeAI的 + translate.request.api.host = ['https://giteeai.zvo.cn/', 'https://deutsch.enterprise.api.translate.zvo.cn:1000/', 'https://api.translate.zvo.cn:1000/', 'https://america.api.translate.zvo.cn:1000/']; + return; + } + if (serviceName.toLowerCase() == 'siliconflow') { + //设定翻译接口为硅基流动的 + translate.request.api.host = ['https://siliconflow.zvo.cn/', 'https://america.api.translate.zvo.cn:1414/', 'https://deutsch.enterprise.api.translate.zvo.cn:1414/']; + return; + } + } + } + }, + /*js translate.service.use end*/ + + /*js translate.service.edge start*/ + //客户端方式的edge提供机器翻译服务 + edge: { + api: { //edge浏览器的翻译功能 + translate: 'https://edge.microsoft.com/translate/translatetext?from={from}&to={to}&isEnterpriseClient=false' //翻译接口 + }, + language: { + + json: [{ "id": "ukrainian", "name": "Україна", "serviceId": "uk" }, { "id": "norwegian", "name": "Norge", "serviceId": "no" }, { "id": "welsh", "name": "Iaith Weleg", "serviceId": "cy" }, { "id": "dutch", "name": "nederlands", "serviceId": "nl" }, { "id": "japanese", "name": "日本語", "serviceId": "ja" }, { "id": "filipino", "name": "Pilipino", "serviceId": "fil" }, { "id": "english", "name": "English", "serviceId": "en" }, { "id": "lao", "name": "ກະຣຸນາ", "serviceId": "lo" }, { "id": "telugu", "name": "తెలుగుName", "serviceId": "te" }, { "id": "romanian", "name": "Română", "serviceId": "ro" }, { "id": "nepali", "name": "नेपालीName", "serviceId": "ne" }, { "id": "french", "name": "Français", "serviceId": "fr" }, { "id": "haitian_creole", "name": "Kreyòl ayisyen", "serviceId": "ht" }, { "id": "czech", "name": "český", "serviceId": "cs" }, { "id": "swedish", "name": "Svenska", "serviceId": "sv" }, { "id": "russian", "name": "Русский язык", "serviceId": "ru" }, { "id": "malagasy", "name": "Malagasy", "serviceId": "mg" }, { "id": "burmese", "name": "ဗာရမ်", "serviceId": "my" }, { "id": "pashto", "name": "پښتوName", "serviceId": "ps" }, { "id": "thai", "name": "คนไทย", "serviceId": "th" }, { "id": "armenian", "name": "Արմենյան", "serviceId": "hy" }, { "id": "chinese_simplified", "name": "简体中文", "serviceId": "zh-CHS" }, { "id": "persian", "name": "Persian", "serviceId": "fa" }, { "id": "chinese_traditional", "name": "繁體中文", "serviceId": "zh-CHT" }, { "id": "kurdish", "name": "Kurdî", "serviceId": "ku" }, { "id": "turkish", "name": "Türkçe", "serviceId": "tr" }, { "id": "hindi", "name": "हिन्दी", "serviceId": "hi" }, { "id": "bulgarian", "name": "български", "serviceId": "bg" }, { "id": "malay", "name": "Malay", "serviceId": "ms" }, { "id": "swahili", "name": "Kiswahili", "serviceId": "sw" }, { "id": "oriya", "name": "ଓଡିଆ", "serviceId": "or" }, { "id": "icelandic", "name": "ÍslandName", "serviceId": "is" }, { "id": "irish", "name": "Íris", "serviceId": "ga" }, { "id": "khmer", "name": "ភាសា​ខ្មែរName", "serviceId": "km" }, { "id": "gujarati", "name": "ગુજરાતી", "serviceId": "gu" }, { "id": "slovak", "name": "Slovenská", "serviceId": "sk" }, { "id": "kannada", "name": "ಕನ್ನಡ್Name", "serviceId": "kn" }, { "id": "hebrew", "name": "היברית", "serviceId": "he" }, { "id": "hungarian", "name": "magyar", "serviceId": "hu" }, { "id": "marathi", "name": "मराठीName", "serviceId": "mr" }, { "id": "tamil", "name": "தாமில்", "serviceId": "ta" }, { "id": "estonian", "name": "eesti keel", "serviceId": "et" }, { "id": "malayalam", "name": "മലമാലം", "serviceId": "ml" }, { "id": "inuktitut", "name": "ᐃᓄᒃᑎᑐᑦ", "serviceId": "iu" }, { "id": "arabic", "name": "بالعربية", "serviceId": "ar" }, { "id": "deutsch", "name": "Deutsch", "serviceId": "de" }, { "id": "slovene", "name": "slovenščina", "serviceId": "sl" }, { "id": "bengali", "name": "বেঙ্গালী", "serviceId": "bn" }, { "id": "urdu", "name": "اوردو", "serviceId": "ur" }, { "id": "azerbaijani", "name": "azerbaijani", "serviceId": "az" }, { "id": "portuguese", "name": "português", "serviceId": "pt" }, { "id": "samoan", "name": "lifiava", "serviceId": "sm" }, { "id": "afrikaans", "name": "afrikaans", "serviceId": "af" }, { "id": "tongan", "name": "汤加语", "serviceId": "to" }, { "id": "greek", "name": "ελληνικά", "serviceId": "el" }, { "id": "indonesian", "name": "IndonesiaName", "serviceId": "id" }, { "id": "spanish", "name": "Español", "serviceId": "es" }, { "id": "danish", "name": "dansk", "serviceId": "da" }, { "id": "amharic", "name": "amharic", "serviceId": "am" }, { "id": "punjabi", "name": "ਪੰਜਾਬੀName", "serviceId": "pa" }, { "id": "albanian", "name": "albanian", "serviceId": "sq" }, { "id": "lithuanian", "name": "Lietuva", "serviceId": "lt" }, { "id": "italian", "name": "italiano", "serviceId": "it" }, { "id": "vietnamese", "name": "Tiếng Việt", "serviceId": "vi" }, { "id": "korean", "name": "한국어", "serviceId": "ko" }, { "id": "maltese", "name": "Malti", "serviceId": "mt" }, { "id": "finnish", "name": "suomi", "serviceId": "fi" }, { "id": "catalan", "name": "català", "serviceId": "ca" }, { "id": "croatian", "name": "hrvatski", "serviceId": "hr" }, { "id": "bosnian", "name": "bosnian", "serviceId": "bs-Latn" }, { "id": "polish", "name": "Polski", "serviceId": "pl" }, { "id": "latvian", "name": "latviešu", "serviceId": "lv" }, { "id": "maori", "name": "Maori", "serviceId": "mi" }], + /* + 获取map形式的语言列表 + key为 translate.service 的 name + value为serviceId + + */ + getMap: function () { + if (typeof (translate.service.edge.language.map) == 'undefined') { + translate.service.edge.language.map = new Array(); + for (var i = 0; i < translate.service.edge.language.json.length; i++) { + var item = translate.service.edge.language.json[i]; + translate.service.edge.language.map[item.id] = item.serviceId; + } + } + return translate.service.edge.language.map; + } + }, + /** + * edge 进行翻译。 这个传入参数跟 translate.request.post 是一样的 + * @param path 请求的path(path,传入的是translate.request.api.translate 这种的,需要使用 getUrl 来组合真正请求的url ) + * @param data 请求的参数数据 + * @param func 请求完成的回调,传入如 function(data){ console.log(data); } + */ + translate: function (path, data, func, abnormalFunc) { + var textArray = JSON.parse(decodeURIComponent(data.text)); + let translateTextArray = translate.util.split(textArray, 40000, 900); + + + var appendXhrData = { + "from": data.from + '', + "to": data.to, + "text": data.text + }; + var from = data.from; + if (from != 'auto') { + if (from == 'romance') { + //这里额外加了一个罗曼语族(romance)会自动认为是法语(fr) + from = 'fr'; + } else { + from = translate.service.edge.language.getMap()[data.from]; + } + } + + var to = translate.service.edge.language.getMap()[data.to]; + var transUrl = translate.service.edge.api.translate.replace('{from}', from).replace('{to}', to); + + //如果翻译量大,要拆分成多次翻译请求 + for (var tai = 0; tai < translateTextArray.length; tai++) { + /* + var json = []; + for(var i = 0; i 1) { + //这一次翻译呗拆分了多次请求,那么要进行补全数组,使数组个数能一致 + + /* + + 注意这里根据数组的长度来判断当前属于第几个数组, + 有几率会是拆分的数组,其中有两组的长度是一样的, + 这样的话是有问题的,只不过几率很小,就先这样了 + 但终归还是留了个坑 -- 记录 + + */ + + var currentIndex = -1; //当前翻译请求属于被拆分的第几个的数组下标,从0开始的 + for (var cri = 0; cri < translateTextArray.length; cri++) { + if (translateTextArray[cri].length - d.text.length == 0) { + currentIndex = cri; + break; + } + } + + //进行对前后进行补齐数组 + if (currentIndex < 0) { + translate.log('------ERROR--------'); + translate.log('翻译内容过多,进行拆分,但拆分判断出现异常,currentIndex:-1 请联系 http://translate.zvo.cn/43006.html 说明'); + } + //前插入空数组填充 + for (var addbeforei = 0; addbeforei < currentIndex; addbeforei++) { + var beforeItemArrayLength = translateTextArray[addbeforei].length; + //console.log('beforeItemArrayLength:'+beforeItemArrayLength); + for (var bi = 0; bi < beforeItemArrayLength; bi++) { + d.text.unshift(null); + } + } + //后插入空数组填充 + for (var addafteri = translateTextArray.length - 1; addafteri > currentIndex; addafteri--) { + var afterItemArrayLength = translateTextArray[addafteri].length; + for (var bi = 0; bi < afterItemArrayLength; bi++) { + d.text.push(null); + } + } + + } + + func(d); + }, 'post', true, { + 'Content-Type': 'application/json' + }, abnormalFunc, true); + + + } + + + + + + + } + } + /*js translate.service.edge end*/ + }, + //request请求来源于 https://github.com/xnx3/request + request: { + /* + 将通过翻译接口进行翻译请求(/translate.json)的信息记录到 translate.js 本身中 + key uuid 每次 translate.execute() 触发生成的uuid + value + time: 触发后加入到 data 中的时间,13位时间戳 + list: 对象集合,translate.execute() 的触发会发起多次翻译请求,根据识别的语种不同,发起多次网络请求,这里记录的是多次网络请求 + [ + 'english':{ //当前请求是将什么语种进行翻译,也就是 translate.json 请求中的 from 参数 + to: chinese_simplified, //当前请求要翻译为什么语种,也就是 translate.json 请求中的 to 参数 + texts:['你好', '世界', ...], //当前请求要进行翻译的具体文本 + nodes:[node1, node2, ...] //当前请求要翻译的文本所在的node集合,也就是有哪些node中的文本参与了 通过API接口进行翻译文本 + }, + 'korean':{ + ... + }, + ... + ] + + 后面要将 translate.translateRequest 合并到这里面 + */ + data: {}, + //相关API接口方面 + api: { + /** + * 翻译接口请求的域名主机 host + * 格式注意前面要带上协议如 https:// 域名后要加 / + * v2.8.2 增加数组形态,如 ['https://api.translate.zvo.cn/','xxxxx'] + */ + //host:'https://api.translate.zvo.cn/', + host: ['https://api.translate.zvo.cn/', 'https://america.api.translate.zvo.cn/'], + //host的备用接口,格式同host,可以填写多个,只不过这里是数组格式。只有当主 host 无法连通时,才会采用备host来提供访问。如果为空也就是 [] 则是不采用备方案。 + //backupHost:['',''], + language: 'language.json', //获取支持的语种列表接口 + translate: 'translate.json', //翻译接口 + ip: 'ip.json', //根据用户当前ip获取其所在地的语种 + connectTest: 'connectTest.json', //用于 translate.js 多节点翻译自动检测网络连通情况 + init: 'init.json', //获取最新版本号,跟当前版本进行比对,用于提醒版本升级等使用 + + }, + /* + v3.18.35.20250920 增加 + + hosts: 主机域名数组,数组形式,可传入多个主机,传入格式如 ['https://api.translate.zvo.cn/','https://api2.translate.zvo.cn/'] 一定注意最后还有个 / + 其中数组的第一个将被优先使用,第一个是主的,可靠性要更高的 + */ + setHost: function (hosts) { + translate.service.use('translate.service'); + + if (typeof translate.request.api.host == 'string') { + //单个,那么赋予数组形式 + //translate.request.speedDetectionControl.hostQueue = [{"host":translate.request.api.host, time:0 }]; + translate.request.api.host = [hosts]; + } else { + translate.request.api.host = hosts; + } + + translate.request.speedDetectionControl.state = 0; //设置为未进行测速 + + translate.storage.set('speedDetectionControl_hostQueue', ''); + translate.request.speedDetectionControl.hostQueue = []; + translate.request.speedDetectionControl.checkHostQueue = new Array() + //translate.request.speedDetectionControl.checkResponseSpeed_Storage(host, 0) + + //进行对host测速 + translate.request.speedDetectionControl.checkResponseSpeed(); + + // init.json 的请求 + translate.temp_request_init = undefined; + setTimeout(function () { + translate.request.initRequest(); + }, 3000); + + }, + + /* + 发起 init.json 的请求 + 这个应该在translate.execute 未执行完之前就要触发,最好在 setHost() 时、或者刚加载后越早触发越好 + 它触发多次时,只有第一次才会正常执行。 + */ + initRequest: function () { + //初始化请求 + if (typeof (translate.request.api.init) == 'string' && translate.request.api.init != null && translate.request.api.init.length > 0) { + if (typeof (translate.temp_request_init) == 'undefined') { + translate.temp_request_init = 1; + } else { + //第二次以及之后执行,都直接给返回不允许在执行了 + return; + } + + try { + translate.request.send( + translate.request.api.init, + {}, + {}, + function (data) { + if (data.result == 0) { + translate.log('translate.js init 初始化异常:' + data.info); + return; + } else if (data.result == 1) { + //服务端返回的最新版本 + var newVersion = translate.util.versionStringToInt(data.version); + //当前translate.js的版本 + var currentVersion = translate.util.versionStringToInt(translate.version.replace('v', '')); + + if (newVersion > currentVersion) { + translate.log('Tip : translate.js find new version : ' + data.version); + } + } + }, + 'post', + true, + null, + function (data) { + //console.log('eeerrr'); + }, + false + ); + } catch (e) { + } + } + }, + + /* + 追加参数, v3.15.9.20250527 增加 + 所有通过 translate.request.send 进行网络请求的,都会追加上这个参数 + 默认是空,没有任何追加参数。 + + 设置方式: https://translate.zvo.cn/471711.html + translate.request.appendParams = { + key1:'key1', + key2:'key2' + } + */ + appendParams: { + + }, + /* + 追加header头的参数, v3.15.13 增加 + 所有通过 translate.request.send 进行网络请求的,都会追加上这个参数 + 默认是空,没有任何追加参数。 + + 设置方式: https://translate.zvo.cn/471711.html + translate.request.appendHeaders = { + key1:'key1', + Aauthorization:'Bearer xxxxxxxxxx' + } + */ + appendHeaders: { + + }, + /* + 请求后端接口的响应。无论是否成功,都会触发此处。 + 另外当 xhr.readyState==4 的状态时才会触发。 + 此处会在接口请求响应后、且在translate.js处理前就会触发 + @param xhr XMLHttpRequest 接口请求 + + */ + response: function (xhr) { + //console.log('response------'); + //console.log(xhr); + }, + + + /* + 速度检测控制中心, 检测主备翻译接口的响应速度进行排列,真正请求时,按照排列的顺序进行请求 + v2.8.2增加 + + storage存储方面 + storage存储的key 存的什么 + speedDetectionControl_hostQueue hostQueue + speedDetectionControl_hostQueueIndex 当前要使用的是 hostQueue 中的数组下标。如果没有,这里默认视为0 + speedDetectionControl_lasttime 最后一次执行速度检测的时间戳,13位时间戳 + + + + */ + speedDetectionControl: { + /* + 当前测速的状态, + 0 尚未进行 + 1 进行中 + 2 已测速完毕 + + 这个也是用于判断是否为0,来避免多次发起测速情况 + */ + state: 0, + + /* + + 进行 connect主节点缩减的时间,单位是毫秒. + 这个是进行 translate.request.speedDetectionControl.checkResponseSpeed() 节点测速时,translate.request.api.host 第一个元素是默认的主节点。 + 主节点在实际测速完后,会减去一定的时间,以便让用户大部分时间可以使用主节点,而不必走分节点。 + 例如主节点实际响应速度 3500 毫秒,那么会减去这里设置的2000毫秒,记为 1500 毫秒 + 当然如果是小于这里设置的2000毫秒,那么会记为0毫秒。 + 这样再跟其他分节点的响应时间进行对比,主节点只要不是响应超时,就会有更大的几率被选中为实际使用的翻译的节点 + + 这里的单位是毫秒。 + v2.10.2.20231225 增加 + */ + hostMasterNodeCutTime: 2000, + + /* + 翻译的队列,这是根据网络相应的速度排列的,0下标为请求最快,1次之... + 其格式为: + [ + { + "host":"xxxxxxxx", + "time":123 //这里的单位是毫秒 + }, + { + "host":"xxxxxxxx", + "time":123 //这里的单位是毫秒 + } + ] + */ + hostQueue: [], + hostQueueIndex: -1, //当前使用的 hostQueue的数组下标, -1表示还未初始化赋予值,不可直接使用,通过 getHostQueueIndex() 使用 + disableTime: 1000000, //不可用的时间,storage中存储的 speedDetectionControl_hostQueue 其中 time 这里,如果值是 这个,便是代表这个host处于不可用状态 + + /* + 设置当前使用的翻译通道 host + 适用于 进行中时,中途切临时换翻译通道。 + */ + setCurrentHost: function (host) { + translate.storage.set('speedDetectionControl_hostQueue', ''); + translate.request.api.host = host; + translate.request.speedDetectionControl.checkHostQueue = new Array(); + translate.request.speedDetectionControl.checkResponseSpeed_Storage(host, 0); + }, + + //获取 host queue 队列 + getHostQueue: function () { + if (translate.request.speedDetectionControl.hostQueue.length == 0) { + //还没有,先从本地存储中取,看之前是否已经设置过了 + // 只有经过真正的网络测速后,才会加入 storage 的 hostQueue + var storage_hostQueue = translate.storage.get('speedDetectionControl_hostQueue'); + if (storage_hostQueue == null || typeof (storage_hostQueue) == 'undefined' || storage_hostQueue == '') { + //本地存储中没有,也就是之前没设置过,是第一次用,那么直接讲 translate.request.api.host 赋予之 + //translate.request.api.host + + if (typeof (translate.request.api.host) == 'string') { + //单个,那么赋予数组形式 + //translate.request.speedDetectionControl.hostQueue = [{"host":translate.request.api.host, time:0 }]; + translate.request.api.host = ['' + translate.request.api.host]; + } + + //数组形态,多个,v2.8.2 增加多个,根据优先级返回 + translate.request.speedDetectionControl.hostQueue = []; + for (var i = 0; i < translate.request.api.host.length; i++) { + var h = translate.request.api.host[i]; + //console.log(h); + translate.request.speedDetectionControl.hostQueue[i] = { "host": h, time: 0 }; + } + //console.log(translate.request.speedDetectionControl.hostQueue); + + } else { + //storage中有,那么赋予 + translate.request.speedDetectionControl.hostQueue = JSON.parse(storage_hostQueue); + //console.log(storage_hostQueue); + //console.log(translate.request.speedDetectionControl.hostQueue[0].time); + } + + //console.log(translate.request.speedDetectionControl.hostQueue) + + /* + 当页面第一次打开初始化这个时才会进行测速,另外测速也是要判断时间的,五分钟一次 + 进行测速 + */ + var lasttime = translate.storage.get('speedDetectionControl_lasttime'); + if (lasttime == null || typeof (lasttime) == 'undefined') { + lasttime = 0; + } + var updateTime = 60000; //1分钟检测一次 + if (new Date().getTime() - lasttime > updateTime) { + translate.request.speedDetectionControl.checkResponseSpeed(); + } + + } + + + return translate.request.speedDetectionControl.hostQueue; + }, + + /* + 服务于 checkResponseSpeed 用于将测试结果存入 storage + time: 当前接口请求的耗时,单位是毫秒。如果是 1000000 那么表示这个接口不可用 + */ + checkResponseSpeed_Storage: function (host, time) { + + translate.request.speedDetectionControl.checkHostQueue.push({ "host": host, "time": time }); + //按照time进行排序 + translate.request.speedDetectionControl.checkHostQueue.sort((a, b) => a.time - b.time); + + //存储到 storage 持久化 + translate.storage.set('speedDetectionControl_hostQueue', JSON.stringify(translate.request.speedDetectionControl.checkHostQueue)); + translate.storage.set('speedDetectionControl_lasttime', new Date().getTime()); + + translate.request.speedDetectionControl.hostQueue = translate.request.speedDetectionControl.checkHostQueue; + }, + + /* + 执行测试响应速度动作 + */ + checkResponseSpeed: function () { + translate.request.speedDetectionControl.state = 1; //设置为进行测速中 + + var headers = { + 'content-type': 'application/x-www-form-urlencoded', + }; + + if (typeof (translate.request.api.connectTest) != 'string' || translate.request.api.connectTest == null || translate.request.api.connectTest.length < 1) { + return; + } + + + translate.request.speedDetectionControl.checkHostQueue = []; //用于实际存储 + translate.request.speedDetectionControl.checkHostQueueMap = []; //只是map,通过key取值,无其他作用 + + if (typeof (translate.request.api.host) == 'string') { + //单个,那么赋予数组形式 + translate.request.api.host = ['' + translate.request.api.host]; + } + + for (var i = 0; i < translate.request.api.host.length; i++) { + var host = translate.request.api.host[i]; + // 获取当前时间的时间戳 + translate.request.speedDetectionControl.checkHostQueueMap[host] = { + start: new Date().getTime() + }; + + + try { + translate.request.send( + host + translate.request.api.connectTest, + { host: host }, + { host: host }, + function (data) { + //只要其中某个取得响应,都代表测速完成 + translate.request.speedDetectionControl.state = 2; + + var host = data.info; + var map = translate.request.speedDetectionControl.checkHostQueueMap[host]; + var time = new Date().getTime() - map.start; + + if (translate.request.api.host[0] == host) { + //console.log('如果是第一个,那么是主的,默认允许缩减2000毫秒,也就是优先使用主的'); + time = time - translate.request.speedDetectionControl.hostMasterNodeCutTime; + if (time < 0) { + time = 0; + } + } + + translate.request.speedDetectionControl.checkResponseSpeed_Storage(host, time); + /* + translate.request.speedDetectionControl.checkHostQueue.push({"host":host, "time":time }); + //按照time进行排序 + translate.request.speedDetectionControl.checkHostQueue.sort((a, b) => a.time - b.time); + + //存储到 storage 持久化 + translate.storage.set('speedDetectionControl_hostQueue',JSON.stringify(translate.request.speedDetectionControl.checkHostQueue)); + translate.storage.set('speedDetectionControl_lasttime', new Date().getTime()); + + translate.request.speedDetectionControl.hostQueue = translate.request.speedDetectionControl.checkHostQueue; + //console.log(translate.request.speedDetectionControl.hostQueue); + */ + }, + 'post', + true, + headers, + function (data) { + //只要其中某个取得响应,都代表测速完成 + translate.request.speedDetectionControl.state = 2; + + //translate.request.speedDetectionControl.checkResponseSpeed_Storage(host, time); + var hostUrl = data.requestURL.replace(translate.request.api.connectTest, ''); + translate.request.speedDetectionControl.checkResponseSpeed_Storage(hostUrl, translate.request.speedDetectionControl.disableTime); + }, + false + ); + } catch (e) { + //console.log('e0000'); + translate.log(e); + //time = 300000; //无法连接的,那么赋予 300 秒吧 + } + + } + + }, + + //获取当前使用的host的数组下标 + getHostQueueIndex: function () { + if (translate.request.speedDetectionControl.hostQueueIndex < 0) { + //页面当前第一次使用,赋予值 + //先从 storage 中取 + var storage_index = translate.storage.get('speedDetectionControl_hostQueueIndex'); + if (typeof (storage_index) == 'undefined' || storage_index == null) { + //存储中不存在,当前用户(浏览器)第一次使用,默认赋予0 + translate.request.speedDetectionControl.hostQueueIndex = 0; + translate.storage.set('speedDetectionControl_hostQueueIndex', 0); + } else { + translate.request.speedDetectionControl.hostQueueIndex = storage_index; + } + } + return translate.request.speedDetectionControl.hostQueueIndex; + }, + + //获取当前要使用的host + getHost: function () { + var queue = translate.request.speedDetectionControl.getHostQueue(); + //console.log(queue); + var queueIndex = translate.request.speedDetectionControl.getHostQueueIndex(); + if (queue.length > queueIndex) { + //正常,没有超出越界 + + } else { + //异常,下标越界了!,固定返回最后一个 + translate.log('异常,下标越界了!index:' + queueIndex); + queueIndex = queue.length - 1; + } + //console.log(queueIndex); + return queue[queueIndex].host; + }, + + }, + //生成post请求的url + getUrl: function (path) { + var currentHost = translate.request.speedDetectionControl.getHost(); + var url = currentHost + path + '?v=' + translate.version; + //console.log('url: '+url); + return url; + }, + /** + * post请求 + * @param path 请求的path(path,传入的是translate.request.api.translate 这种的,需要使用 getUrl 来组合真正请求的url ) + * @param data 请求的参数数据,传入如 + * { + * from: "chinese_simplified", + * text: "%5B%22%E4%BD%A0%E5%A5%BD%EF%BC%8C%E6%88%91", + * to: "chinese_traditional + * } + * + * @param func 请求完成的回调,也就是只要响应码是 200 ,则会触发这个方法。 传入如 function(responseData, requestData){ console.log(responseData); } + * 其中的参数: + * responseData 响应的数据 + * requestData post请求所携带的数据 + * 注意,是响应数据是第一个参数,请求数据是第二个参数。 以向前兼容 + * @param abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url + */ + post: function (path, data, func, abnormalFunc) { + var headers = { + 'content-type': 'application/x-www-form-urlencoded', + }; + if (typeof (data) == 'undefined') { + return; + } + + //企业级翻译自动检测 + if (typeof (translate.enterprise) != 'undefined') { + translate.enterprise.automaticAdaptationService(); + } + + // ------- edge start -------- + var url = translate.request.getUrl(path); + //if(url.indexOf('edge') > -1 && path == translate.request.api.translate){ + if (translate.service.name == 'client.edge') { + if (path == translate.request.api.translate) { + translate.service.edge.translate(path, data, func, abnormalFunc); + return; + } + if (path == translate.request.api.language) { + var d = {}; + d.info = 'SUCCESS'; + d.result = 1; + d.list = translate.service.edge.language.json; + func(d); + return; + } + + //return; + } + // ------- edge end -------- + + this.send(path, data, data, func, 'post', true, headers, abnormalFunc, true); + }, + /** + * 发送请求 + * url 请求的url或者path(path,传入的是translate.request.api.translate 这种的,需要使用 getUrl 来组合真正请求的url ) + * data 请求的数据,如 {"author":"管雷鸣",'site':'www.guanleiming.com'} + * appendXhrData 附加到 xhr.data 中的对象数据,传入比如 {"from":"english","to":"japanese"} ,他会直接赋予 xhr.data + * func 请求完成的回调,也就是只要响应码是 200 ,则会触发这个方法。 传入如 function(requestData, responseData){ console.log(responseData); } + * 其中的参数: + * requestData post请求所携带的数据 + * responseData 响应的数据 + * method 请求方式,可传入 post、get + * isAsynchronize 是否是异步请求, 传入 true 是异步请求,传入false 是同步请求。 如果传入false,则本方法返回xhr + * headers 设置请求的header,传入如 {'content-type':'application/x-www-form-urlencoded'}; + * abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url + * showErrorLog 是否控制台打印出来错误日志,true打印, false 不打印 + */ + send: function (url, data, appendXhrData, func, method, isAsynchronize, headers, abnormalFunc, showErrorLog) { + //post提交的参数 + var params = ''; + + if (data == null || typeof (data) == 'undefined') { + data = {}; + } + + if (typeof (data) == 'string') { + params = data; //payload 方式 , edge 的方式 + } else { + //表单提交方式 + + //加入浏览器默认语种 v3.6.1 增加,以便更好的进行自动切换语种 + data.browserDefaultLanguage = translate.util.browserDefaultLanguage(); + + //追加附加参数 + for (var apindex in translate.request.appendParams) { + if (!translate.request.appendParams.hasOwnProperty(apindex)) { + continue; + } + data[apindex] = translate.request.appendParams[apindex]; + } + + if (typeof (translate.enterprise) != 'undefined') { + //加入key + if (typeof (translate.enterprise.key) != 'undefined' && typeof (translate.enterprise.key) == 'string' && translate.enterprise.key.length > 0) { + data.key = translate.enterprise.key; + } + } + + //组合参数 + for (var index in data) { + if (!data.hasOwnProperty(index)) { + continue; + } + if (params.length > 0) { + params = params + '&'; + } + params = params + index + '=' + data[index]; + } + } + if (url.indexOf('https://') == 0 || url.indexOf('http://') == 0) { + //采用的url绝对路径 + } else { + //相对路径,拼接上host + url = translate.request.getUrl(url); + } + + var xhr = null; + try { + xhr = new XMLHttpRequest(); + } catch (e) { + xhr = new ActiveXObject("Microsoft.XMLHTTP"); + } + xhr.data = appendXhrData; + //2.调用open方法(true----异步) + xhr.open(method, url, isAsynchronize); + //设置headers + if (headers != null) { + for (var index in headers) { + if (!headers.hasOwnProperty(index)) { + continue; + } + xhr.setRequestHeader(index, headers[index]); + } + } + + //追加附加参数 + for (var ahindex in translate.request.appendHeaders) { + if (!translate.request.appendHeaders.hasOwnProperty(ahindex)) { + continue; + } + xhr.setRequestHeader(ahindex, translate.request.appendHeaders[ahindex]); + } + + if (translate.service.name != 'client.edge') { + xhr.setRequestHeader('currentpage', window.location.href + ''); + } + xhr.send(params); + //4.请求状态改变事件 + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + translate.request.response(xhr); //自定义响应的拦截 + + if (xhr.status == 200) { + //请求正常,响应码 200 + var json = null; + if (typeof (xhr.responseText) == 'undefined' || xhr.responseText == null) { + //相应内容为空 + } else { + //响应内容有值 + if (xhr.responseText.indexOf('{') > -1 && xhr.responseText.indexOf('}') > -1) { + //应该是json格式 + try { + json = JSON.parse(xhr.responseText); + } catch (e) { + translate.log(e); + } + } + } + + if (json === null) { + func(xhr.responseText); + } else { + func(json, xhr.data); + } + } else { + if (showErrorLog) { + if (url.indexOf(translate.request.api.connectTest) > -1) { + //测试链接速度的不在报错里面 + } else { + + //判断是否是v2版本的翻译,如果是 translate.service 模式并且没有使用企业级翻译,参会提示 + //2024.3月底开始,翻译使用量增加的太快,开源的翻译服务器有点扛不住经常出故障,所以直接把这个提示加到这里 + if (translate.service.name == 'translate.service') { + translate.log('----- translate.js 提示 -----\n翻译服务响应异常,解决这种情况可以有两种方案:\n【方案一】:使用采用最新版本 3.16.0及更高版本,js引用文件为 https://cdn.staticfile.net/translate.js/3.16.0/translate.js 并且使用 client.edge 模式 (增加一行设置代码就好,可参考 https://translate.zvo.cn/4081.html ),这样就不会再出现这种情况了,而且这个方案也是完全免费的。 \n【方案二】:采用企业级稳定翻译通道 ,但是这个相比于 方案一 来说,是有一定的收费的,大概一年600,这个就是专门为了高速及高稳定准备的,而相比于这个方案二,方案一则是全免费的。 因为方案二我们是部署了两个集群,而每个集群又下分了数个网络节点,包含中国大陆、香港、美国、欧洲、 等多个州,充分保障稳定、高效,同样也产生了不少成本,所以才需要付费。更多信息说明可以参考: http://translate.zvo.cn/4087.html \n【方案三】:私有部署你自己的翻译通道,并且启用内存级翻译缓存,毫秒级响应,但是需要依赖一台1核2G服务器,是最推荐的方式。具体参考:https://translate.zvo.cn/391129.html\n-------------'); + } + + //console.log(xhr); + translate.log('------- translate.js service api response error --------'); + translate.log(' http code : ' + xhr.status); + translate.log(' response : ' + xhr.response); + translate.log(' request url : ' + url); + translate.log(' request data : ' + JSON.stringify(data)); + translate.log(' request method : ' + method); + translate.log('---------------------- end ----------------------'); + } + + } + xhr.requestURL = url; + if (abnormalFunc != null) { + abnormalFunc(xhr); + } + } + } + } + return xhr; + }, + /* + + 手动进行翻译操作。参数说明: + texts: 可传入要翻译的文本、以及文本数组。 比如要一次翻译多个句子,那就可以传入数组的方式 + function: 翻译完毕后的处理函数。传入如 function(data){ console.log(data); } + 注意,返回的data.result 为 1,则是翻译成功。 为0则是出错,可通过data.info 得到错误原因。 更详细说明参考: http://api.zvo.cn/translate/service/20230807/translate.json.html + + abnormalFunc: 翻译失败后的处理函数。传入如 function(xhr){ console.log(xhr); } + 注意,这里的 xhr 是 XMLHttpRequest 对象,可以通过 xhr.status 获取响应状态码,通过 xhr.responseText 获取响应内容。 + + 使用案例一: + translate.request.translateText('你好,我是翻译的内容', function(data){ + //打印翻译结果 + console.log(data); + }, function(xhr){ + //打印翻译失败后的信息 + console.log(xhr); + }); + + 使用案例二: + var texts = ['我是翻译的第一句','我是翻译的第二句','我是翻译的第三句']; + translate.request.translateText(texts, function(data){ + //打印翻译结果 + console.log(data); + }, function(xhr){ + //打印翻译失败后的信息 + console.log(xhr); + }); + + 使用案例三: + var obj = { + from:'chinese_simplified', + to:'english', + texts: ['我是翻译的第一句','我是翻译的第二句','我是翻译的第三句'] + } + translate.request.translateText(obj, function(data){ + //打印翻译结果 + console.log(data); + }, function(xhr){ + //打印翻译失败后的信息 + console.log(xhr); + }); + */ + translateText: function (obj, func, abnormalFunc) { + var texts = new Array(); + var from = translate.language.getLocal(); + var to = translate.language.getCurrent(); + + if (typeof (obj) == 'string') { + //案例一的场景,传入单个字符串 + texts[0] = obj; + } else { + //不是字符串了,而是对象了,判断是案例二还是案例三 + + var type = Object.prototype.toString.call(obj); + //console.log(type); + if (type == '[object Array]') { + //案例二 + texts = obj; + } else if (type == '[object Object]') { + //案例三 + if (typeof (obj.texts) == 'undefined') { + translate.log('translate.request.translateText 传入的值类型异常,因为你没有传入 obj.texts 要翻译的具体文本! 请查阅文档: https://translate.zvo.cn/4077.html'); + } + if (typeof (obj.texts) == 'string') { + //单个字符串 + texts = [obj.texts]; + } else { + //多个字符串,数组形态 + texts = obj.texts; + } + if (typeof (obj.from) == 'string' && obj.from.length > 0) { + from = obj.from; + } + if (typeof (obj.to) == 'string' && obj.to.length > 0) { + to = obj.to; + } + } else { + translate.log('translate.request.translateText 传入的值类型错误,请查阅文档: https://translate.zvo.cn/4077.html'); + return; + } + } + //console.log(obj); + //返回的翻译结果,下标跟 obj.texts 一一对应的 + var translateResultArray = new Array(); + + // 筛选需要翻译的文本及其原始索引 + var apiTranslateText = []; + var apiTranslateArray = {}; + for (var i = 0; i < texts.length; i++) { + //判断是否在浏览器缓存中出现了 + var hash = translate.util.hash(texts[i]); + var cache = translate.storage.get('hash_' + to + '_' + hash); + //console.log(hash+'\t'+texts[i]+'\t'+cache); + if (cache != null && cache.length > 0) { + //缓存中发现了这个得结果,那这个就不需要再进行翻译了 + translateResultArray[i] = cache; + } else { + translateResultArray[i] = ''; + apiTranslateText.push(texts[i]); + apiTranslateArray[hash] = i; + } + } + if (apiTranslateText.length == 0) { + //没有需要进行通过网络API翻译的任务了,全部命中缓存,那么直接返回 + var data = { + from: from, + to: to, + text: translateResultArray, + result: 1 + }; + //console.log(data); + func(data); + return; + } + + + + //还有需要进行通过API接口进行翻译的文本,需要调用翻译接口 + if (typeof (translate.request.api.translate) != 'string' || translate.request.api.translate == null || translate.request.api.translate.length < 1) { + //用户已经设置了不掉翻译接口进行翻译 + return; + } + + var url = translate.request.api.translate; + var data = { + from: from, + to: to, + text: encodeURIComponent(JSON.stringify(apiTranslateText)) + }; + //console.log(apiTranslateText); + translate.request.post(url, data, function (responseData, requestData) { + //console.log(responseData); + //console.log(data); + if (responseData.result != 1) { + translate.log('=======ERROR START======='); + translate.log('from : ' + requestData.from); + translate.log('to : ' + requestData.to); + translate.log('translate text array : ' + texts); + translate.log('response error info: ' + responseData.info); + translate.log('=======ERROR END ======='); + //return; + } + + for (var i = 0; i < responseData.text.length; i++) { + //将翻译结果以 key:hash value翻译结果的形式缓存 + var hash = translate.util.hash(apiTranslateText[i]); + translate.storage.set('hash_' + to + '_' + hash, responseData.text[i]); + //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储 + if (translate.offline.fullExtract.isUse) { + translate.offline.fullExtract.set(hash, apiTranslateText[i], data.to, responseData.text[i]); + } + + //进行组合数据到 translateResultArray + translateResultArray[apiTranslateArray[hash]] = responseData.text[i]; + } + responseData.text = translateResultArray; + + func(responseData); + }, (function (xhr) { + if (abnormalFunc && typeof (abnormalFunc) == 'function') { + abnormalFunc(xhr); + } + })); + }, + listener: { + //是否已经启动过 translate.request.listener.addListener() 开始监听了,开始了则是true,默认没开始则是false + isStart: false, + //用户的代码里是否启用了 translate.request.listener.start() ,true:启用 + use: false, + minIntervalTime: 800, // 两次触发的最小间隔时间,单位是毫秒,这里默认是800毫秒。最小填写时间为 200毫秒 + lasttime: 0,// 最后一次触发执行 translate.execute() 的时间,进行执行的那一刻,而不是执行完。13位时间戳 + /* + 设置要在未来的某一时刻执行,单位是毫秒,13位时间戳。 + 执行时如果当前时间大于这个数,则执行,并且将这个数置为0。 + 会有一个循环执行函数每间隔200毫秒触发一次 + */ + executetime: 0, + /* + 进行翻译时,延迟翻译执行的时间 + 当ajax请求结束后,延迟这里设置的时间,然后自动触发 translate.execute() 执行 + */ + delayExecuteTime: 200, + /* + 满足ajax出发条件,设置要执行翻译。 + 注意,设置这个后并不是立马就会执行,而是加入了一个执行队列,避免1秒请求了10次会触发10次执行的情况 + */ + addExecute: function () { + var currentTime = Date.now(); + if (translate.request.listener.lasttime == 0) { + //是第一次,lasttime还没设置过,那么直接设置执行时间为当前时间 + translate.request.listener.executetime = currentTime; + translate.request.listener.lasttime = 1; + } else { + //不是第一次了 + + if (translate.request.listener.executetime > 1) { + //当前有执行队列等待,不用再加入执行等待了 + //console.log('已在执行队列,不用再加入了 '+currentTime); + } else { + //执行队列中还没有,可以加入执行命令 + + if (currentTime < translate.request.listener.lasttime + translate.request.listener.minIntervalTime) { + //如果当前时间小于最后一次执行时间+间隔时间,那么就是上次才刚刚执行过,这次执行的太快了,那么赋予未来执行翻译的时间为最后一次时间+间隔时间 + translate.request.listener.executetime = translate.request.listener.lasttime + translate.request.listener.minIntervalTime; + //console.log('addexecute - < 如果当前时间小于最后一次执行时间+间隔时间,那么就是上次才刚刚执行过,这次执行的太快了,那么赋予未来执行翻译的时间为最后一次时间+间隔时间'); + } else { + translate.request.listener.executetime = currentTime; + //console.log('addexecute -- OK '); + } + } + + + } + + + }, + /* + 自定义是否会被触发的方法判断 + url 当前ajax请求的url,注意是这个url请求完毕获取到200相应的内容时才会触发此方法 + 返回值 return true; 默认是不管什么url,全部返回true,表示会触发翻译自动执行 translate.execute; ,如果你不想让某个url触发翻译,那么你可以自行在这个方法中用代码进行判断,然后返回false,那么这个url将不会自动触发翻译操作。 + */ + trigger: function (url) { + return true; + }, + + /*js translate.request.listener.start start*/ + /* + 启动根据ajax请求来自动触发执行翻译,避免有时候有的框架存在漏翻译的情况。 + 这个只需要执行一次即可,如果执行多次,只有第一次会生效 + */ + start: function () { + translate.request.listener.use = true; + }, + /*js translate.request.listener.start end*/ + + // 当 translate.execute() 触发时,也就是触发了生命周期的 start 时,才会启动这里。这里要在翻译进行后才能触发,不然提前出发会导致跟用户设置的启动时间不相符造成异常 + addListener: function () { + if (translate.request.listener.use == false) { + //根本就没设置启用,直接推出 + return; + } + + //确保这个方法只会触发一次,不会过多触发 + if (typeof (translate.request.listener.isStart) != 'undefined' && translate.request.listener.isStart == true) { + return; + } else { + translate.request.listener.isStart = true; + } + + //增加一个没100毫秒检查一次执行任务的线程 + setInterval(function () { + var currentTime = Date.now(); + //console.log(translate.request.listener.executetime) + if (translate.request.listener.executetime > 1 && currentTime > translate.request.listener.executetime + translate.request.listener.delayExecuteTime) { + translate.request.listener.executetime = 0; + translate.request.listener.lasttime = currentTime; + if (translate.executeTriggerNumber > 0) { //已经执行过了 translate.execute() ,那么才会触发 + try { + //console.log('translate.request.listener.start ... 执行翻译 --'+currentTime); + translate.execute(); + } catch (e) { + translate.log(e); + } + } + } + }, 100); + + if (typeof (PerformanceObserver) == 'undefined') { + translate.log('因浏览器版本较低, translate.request.listener.start() 中 PerformanceObserver 对象不存在,浏览器不支持,所以 translate.request.listener.start() 未生效。'); + return; + } + + const observer = new PerformanceObserver((list) => { + var translateExecute = false; //是否需要执行翻译 true 要执行 + for (var e = 0; e < list.getEntries().length; e++) { + var entry = list.getEntries()[e]; + //console.log(entry) + + if (entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest') { + var url = entry.name; + //console.log(url); + //判断url是否是当前translate.js本身使用的 + if (typeof (translate.request.api.host) == 'string') { + translate.request.api.host = [translate.request.api.host]; + } + var ignoreUrl = false; // 是否是忽略的url true是 + + //translate.service 模式判断 + for (var i = 0; i < translate.request.api.host.length; i++) { + if (url.indexOf(translate.request.api.host[i]) > -1) { + //是,那么直接忽略 + ignoreUrl = true; + break; + } + } + //client.edge 判断 translate.service.edge可能会被精简translate.js定制时给直接干掉,所以提前加个判断 + if (typeof (translate.service.edge) != 'undefined') { + if (url.indexOf('edge.microsoft.com/translate/translatetext') > -1) { + ignoreUrl = true; + } + } + + if (ignoreUrl) { + //console.log('忽略:'+url); + continue; + } + if (translate.request.listener.trigger()) { + //正常,会触发翻译,也是默认的 + } else { + //不触发翻译,跳过 + continue; + } + + translateExecute = true; + break; + } + } + if (translateExecute) { + //console.log('translate.request.listener.addExecute() -- '+Date.now()); + translate.request.listener.addExecute(); + } + }); + + //v3.15.14.20250617 增加 + // 优先使用 entryTypes 兼容 ES5 的写法 + + var supportedTypes = PerformanceObserver.supportedEntryTypes; + if (supportedTypes) { + var hasResource = false; + for (var i = 0; i < supportedTypes.length; i++) { + if (supportedTypes[i] === "resource") { + hasResource = true; + break; + } + } + if (hasResource) { + try { + observer.observe({ entryTypes: ["resource"] }); + return; + } catch (e) { + translate.log("PerformanceObserver entryTypes 失败,尝试 type 参数"); + } + } + } + + + // 回退到 type 参数 + try { + observer.observe({ type: "resource", buffered: true }); + translate.log("使用 PerformanceObserver type"); + } catch (e) { + translate.log("当前浏览器不支持 PerformanceObserver 的任何参数, translate.request.listener.start() 未启动"); + } + + } + + } + }, + //存储,本地缓存 + storage: { + /*js translate.storage.IndexedDB start*/ + //对浏览器的 IndexedDB 操作 + IndexedDB: { + db: null, + // 初始化数据库 + initDB: function () { + const self = this; + return new Promise((resolve, reject) => { + const DB_NAME = 'translate.js'; + const STORE_NAME = 'kvStore'; + const DB_VERSION = 1; + + const request = indexedDB.open(DB_NAME, DB_VERSION); + + request.onupgradeneeded = function (event) { + const upgradedDb = event.target.result; + if (!upgradedDb.objectStoreNames.contains(STORE_NAME)) { + upgradedDb.createObjectStore(STORE_NAME, { keyPath: 'key' }); + } + }; + + request.onsuccess = function (event) { + self.db = event.target.result; + resolve(); + }; + + request.onerror = function (event) { + reject('IndexedDB 打开失败'); + }; + }); + }, + /* + 存储键值对 + 使用方式: + await translate.storage.indexedDB.set("user_001", { name: "Alice" }); + */ + set: async function (key, value) { + if (!this.db) await this.initDB(); + + return new Promise((resolve, reject) => { + const tx = this.db.transaction('kvStore', 'readwrite'); + const store = tx.objectStore('kvStore'); + const item = { key, value }; + const request = store.put(item); + + request.onsuccess = () => resolve(); + request.onerror = () => reject('写入失败'); + }); + }, + /* + 获取键对应的值 + 使用方式: + var user = await translate.storage.indexedDB.get("user_001"); + */ + get: async function (key) { + if (!this.db) await this.initDB(); + + return new Promise((resolve, reject) => { + const tx = this.db.transaction('kvStore', 'readonly'); + const store = tx.objectStore('kvStore'); + const request = store.get(key); + + request.onsuccess = () => { + const result = request.result; + resolve(result ? result.value : undefined); + }; + + request.onerror = () => reject('读取失败'); + }); + }, + /* + 列出针对key进行模糊匹配的所有键值对 + 使用方式: + const users = await translate.storage.IndexedDB.list("*us*r*"); + 其中传入的key可以模糊搜索,其中的 * 标识另个或多个 + */ + list: async function (key = '') { + if (!this.db) await this.initDB(); + + return new Promise((resolve, reject) => { + const tx = this.db.transaction('kvStore', 'readonly'); + const store = tx.objectStore('kvStore'); + const request = store.openCursor(); + const results = []; + + // 将通配符 pattern 转换为正则表达式 + const regexStr = '^' + key.replace(/\*/g, '.*') + '$'; + const regex = new RegExp(regexStr); + + request.onsuccess = (event) => { + const cursor = event.target.result; + if (cursor) { + if (regex.test(cursor.key)) { + results.push({ key: cursor.key, value: cursor.value.value }); + } + cursor.continue(); + } else { + resolve(results); + } + }; + + request.onerror = () => reject('游标读取失败'); + }); + } + }, + /*js translate.storage.IndexedDB end*/ + + set: function (key, value) { + localStorage.setItem(key, value); + }, + get: function (key) { + return localStorage.getItem(key); + } + + }, + //针对图片进行相关的语种图片替换 + images: { + /* 要替换的图片队列,数组形态,其中某个数组的: + key:"/uploads/allimg/160721/2-160H11URA25-lp.jpg"; //旧图片,也就是原网站本身的图片。也可以绝对路径,会自动匹配 img src 的值,匹配时会进行完全匹配 + value:"https://xxx.com/abc_{language}.jpg" //新图片,要被替换为的新图片。新图片路径需要为绝对路径,能直接访问到的。其中 {language} 会自动替换为当前要显示的语种。比如你要将你中文网站翻译为繁体中文,那这里会自动替换为:https://xxx.com/abc_chinese_traditional.jpg 有关{language}的取值,可查阅 http://api.translate.zvo.cn/doc/language.json.html 其中的语言标识id便是 + */ + queues: [], + + /* + 向图片替换队列中追加要替换的图片 + 传入格式如: + + translate.images.add({ + "/uploads/a.jpg":"https://www.zvo.cn/a_{language}.jpg", + "/uploads/b.jpg":"https://www.zvo.cn/b_{language}.jpg", + }); + + 参数说明: + key //旧图片,也就是原网站本身的图片。也可以绝对路径,会自动匹配 img src 的值,匹配时会进行完全匹配 + value //新图片,要被替换为的新图片。新图片路径需要为绝对路径,能直接访问到的。其中 {language} 会自动替换为当前要显示的语种。比如你要将你中文网站翻译为繁体中文,那这里会自动替换为:https://xxx.com/abc_chinese_traditional.jpg 有关{language}的取值,可查阅 http://api.translate.zvo.cn/doc/language.json.html 其中的语言标识id便是 + */ + add: function (queueArray) { + /* + translate.images.queues[translate.images.queues.length] = { + old:oldImage, + new:newImage + } + */ + for (var key in queueArray) { + if (!queueArray.hasOwnProperty(key)) { + continue; + } + translate.images.queues[key] = queueArray[key]; + } + }, + //执行图片替换操作,将原本的图片替换为跟翻译语种一样的图片 + execute: function () { + //console.log(translate.images.queues); + if (Object.keys(translate.images.queues).length < 1) { + //如果没有,那么直接取消图片的替换扫描 + return; + } + + /*** 寻找img标签中的图片 ***/ + var imgs = document.getElementsByTagName('img'); + for (var i = 0; i < imgs.length; i++) { + var img = imgs[i]; + if (typeof (img.src) == 'undefined' || img.src == null || img.src.length == 0) { + continue; + } + var imgSrc = img.getAttribute('src'); //这样获取到的才是src原始的值,不然 img.src 是拿到一个绝对路径 + + for (var key in translate.images.queues) { + var oldImage = key; //原本的图片src + var newImage = translate.images.queues[key]; //新的图片src,要替换为的 + //console.log('queue : '+oldImage + ' , img.src: '+imgSrc); + if (oldImage == imgSrc) { + //console.log('发现匹配图片:'+imgSrc); + /* + //判断当前元素是否在ignore忽略的tag、id、class name中 + if(translate.ignore.isIgnore(node)){ + console.log('node包含在要忽略的元素中:'); + console.log(node); + continue; + } + */ + + //没在忽略元素里,可以替换 + newImage = newImage.replace(new RegExp('{language}', 'g'), translate.to); + img.src = newImage; + } + } + + } + + + /********** 还要替换style中的背景图 */ + // 获取当前网页中所有的元素 + var elems = document.getElementsByTagName("*"); + // 遍历每个元素,检查它们是否有背景图 + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + // 获取元素的计算后样式 + var style = window.getComputedStyle(elem, null); + // 获取元素的背景图URL + var bg = style.backgroundImage; + // 如果背景图不为空,打印出来 + if (bg != "none") { + //console.log(bg); + var old_img = translate.images.gainCssBackgroundUrl(bg); + //console.log("old_img:"+old_img); + if (typeof (translate.images.queues[old_img]) != 'undefined') { + //存在 + var newImage = translate.images.queues[old_img]; + newImage = newImage.replace(new RegExp('{language}', 'g'), translate.to); + //更换翻译指定图像 + elem.style.backgroundImage = 'url("' + newImage + '")'; + } else { + //console.log('发现图像'+old_img+', 但未做语种适配'); + } + } + } + + + + + }, + //取css中的背景图,传入 url("https://xxx.com/a.jpg") 返回里面单纯的url + gainCssBackgroundUrl: function (str) { + // 使用indexOf方法,找到第一个双引号的位置 + var start = str.indexOf("\""); + // 使用lastIndexOf方法,找到最后一个双引号的位置 + var end = str.lastIndexOf("\""); + // 如果找到了双引号,使用substring方法,截取中间的内容 + if (start != -1 && end != -1) { + var url = str.substring(start + 1, end); // +1是为了去掉双引号本身 + //console.log(url); // https://e-assets.gitee.com/gitee-community-web/_next/static/media/mini_app.2e6b6d93.jpg!/quality/100 + return url; + } + return str; + } + }, + /*js translate.reset start*/ + /* + 对翻译结果进行复原。比如当前网页是简体中文的,被翻译为了英文,执行此方法即可复原为网页本身简体中文的状态,而无需在通过刷新页面来实现 + config 可不传,则是直接恢复到默认未翻译前的状态。 + { + selectLanguageRefreshRender:true, //是否重新渲染select选择语言到原始未翻译前的状态,默认不设置则是true,进行重新渲染 + notTranslateTip:true //如果当前未执行过翻译,然后触发的 translate.reset() ,是否在控制台打印友好提示,提示未执行翻译,还原指令忽略, true则是正常打印这个提示, false则是不打印这个提示 + } + */ + reset: function (config) { + if (typeof (config) == 'undefined') { + config = {}; + } + if (typeof (config.selectLanguageRefreshRender) == 'undefined') { + config.selectLanguageRefreshRender = true; + } + if (typeof (config.notTranslateTip) == 'undefined') { + config.notTranslateTip = true; + } + + + /* + for(var lang in translate.nodeQueue[lastUuid].list){ + if (!translate.nodeQueue[lastUuid].list.hasOwnProperty(lang)) { + continue; + } + //console.log(lang); + + for(var hash in translate.nodeQueue[lastUuid].list[lang]){ + if (!translate.nodeQueue[lastUuid].list[lang].hasOwnProperty(hash)) { + continue; + } + var item = translate.nodeQueue[lastUuid].list[lang][hash]; + //console.log(item); + for(var index in item.nodes){ + if (!item.nodes.hasOwnProperty(index)) { + continue; + } + //console.log(item.nodes[index]); + //item.nodes[index].node.nodeValue = item.original; + var currentShow = translate.storage.get('hash_'+currentLanguage+'_'+hash); //当前显示出来的文字,也就是已经翻译后的文字 + //console.log('hash_'+lang+'_'+hash+' -- '+currentShow); + if(typeof(currentShow) == 'undefined'){ + continue; + } + if(currentShow == null){ + continue; + } + if(currentShow.length == 0){ + continue; + } + // v3.16.5 针对gitee 的 readme 接入优化 + if(typeof(item.nodes[index].node) == 'undefined'){ + continue; + } + + var attribute = typeof(item.nodes[index].node.attribute) == 'undefined' ? null:item.nodes[index].node.attribute; + var analyse = translate.element.nodeAnalyse.analyse(item.nodes[index].node, '', '', attribute); + translate.element.nodeAnalyse.analyse(item.nodes[index].node, analyse.text, item.original, attribute); + } + } + } + + */ + + //清除 translate.listener + translate.listener.reset(); + + //translate.temp_listenerStartInterval = undefined; //设置为尚未启动 + translate.init_first_trigger_execute = undefined; //translate.init 的 execute钩子,设置为未初始化状态 + + + /** 使用基于 translate.node 的还原 **/ + for (let key of translate.node.data.keys()) { + if (!translate.node.get(key) == null) { + continue; + } + //for(var attr in translate.node.get(key)){ + //if (!translate.node.get(key).hasOwnProperty(attr)) { + // continue; + //} + + //var analyse = translate.element.nodeAnalyse.get(key,translate.node.get(key).attribute); + if (typeof (translate.node.get(key).originalText) !== 'string') { + continue; + } + //translate.element.nodeAnalyse.analyse(key, analyse.text, translate.node.get(key).originalText, translate.node.get(key).attribute); + + //标注此次改动是有 translate.js 导致的 -- 这里就不用标记了,因为先已经移除了 translate.listener.observer 监听,所以不会再监听到还原的操作了 + + //是否是 input、 textarea 的 value ,如果是 则是 true + var isInputValue = false; + if (typeof (translate.node.get(key).attribute) === 'string' && translate.node.get(key).attribute === 'value') { + //可能是input\textarea 的value + var nodename = translate.element.getNodeName(key).toLowerCase(); + if (nodename === 'input' || nodename === 'textarea') { + key.value = translate.node.get(key).originalText; + isInputValue = true; + } + } + if (!isInputValue) { + key.nodeValue = translate.node.get(key).originalText; + } + //} + } + + + //清除 node 中的记录 + if (translate.node.data != null) { + translate.node.data.clear(); + } + + //清除 translate.nodeQueue 的记录 + translate.nodeQueue = {}; + + //清除 time 的记录 + if (typeof (translate.time.execute.data) != 'undefined') { + translate.time.execute.data = {}; + } + + //清除设置storage中的翻译至的语种 + translate.storage.set('to', ''); + translate.to = null; + + //清除文本翻译记录 + if (translate.history.translateText.originalMap !== null) { + translate.history.translateText.originalMap.clear(); + } + if (translate.history.translateText.resultMap !== null) { + translate.history.translateText.resultMap.clear(); + } + + + //重新绘制 select 选择语言 + if (config.selectLanguageRefreshRender) { + translate.selectLanguageTag.refreshRender(); + } + + + //清除正在进行的 translate.execute() 的执行状态记录 + translate.state = 0; + + }, + /*js translate.reset end*/ + + /*js translate.selectionTranslate start*/ + /* + 划词翻译,鼠标在网页中选中一段文字,会自动出现对应翻译后的文本 + 有网友 https://gitee.com/huangguishen 提供。 + 详细使用说明参见:https://translate.zvo.cn/4072.html + */ + selectionTranslate: { + //是否启用,默认是false,不启用。如果启用,则是 translate.selectionTranslate.start(); + use: false, + selectionX: 0, + selectionY: 0, + callTranslate: function (event) { + let curSelection = window.getSelection(); + //相等认为没有划词 + if (curSelection.anchorOffset == curSelection.focusOffset) return; + let translateText = window.getSelection().toString(); + + //还有需要进行通过API接口进行翻译的文本,需要调用翻译接口 + if (typeof (translate.request.api.translate) != 'string' || translate.request.api.translate == null || translate.request.api.translate.length < 1) { + //用户已经设置了不掉翻译接口进行翻译 + translate.log('已设置了不使用 translate 翻译接口,翻译请求被阻止'); + return; + } + + //简单Copy原有代码了 + var url = translate.request.api.translate + var data = { + from: translate.language.getLocal(), + to: translate.to, + text: encodeURIComponent(JSON.stringify([translateText])) + }; + translate.request.post(url, data, function (responseData, requestData) { + if (responseData.result != 1) { + translate.log('translate.selectionTranslate network response error : ' + responseData.info); + return; + }; + let curTooltipEle = document.querySelector('#translateTooltip') + curTooltipEle.innerText = responseData.text[0]; + curTooltipEle.style.top = selectionY + 20 + "px"; + curTooltipEle.style.left = selectionX + 50 + "px"; + curTooltipEle.style.display = ""; + }, null); + }, + start: function () { + translate.selectionTranslate.use = true; + + //新建一个tooltip元素节点用于显示翻译 + let tooltipEle = document.createElement('span'); + tooltipEle.innerText = ''; + tooltipEle.setAttribute('id', 'translateTooltip'); + tooltipEle.setAttribute('style', 'background-color:black;color:#fff;text-align:center;border-radius:6px;padding:5px;position:absolute;z-index:999;top:150%;left:50%; '); + //把元素节点添加到body元素节点中成为其子节点,放在body的现有子节点的最后 + document.body.appendChild(tooltipEle); + //监听鼠标按下事件,点击起始点位置作为显示翻译的位置点 + document.addEventListener('mousedown', (event) => { selectionX = event.pageX; selectionY = event.pageY; }, false); + //监听鼠标弹起事件,便于判断是否处于划词 + document.addEventListener('mouseup', translate.selectionTranslate.callTranslate, false); + //监听鼠标点击事件,隐藏tooltip,此处可优化 + document.addEventListener('click', (event) => { document.querySelector('#translateTooltip').style.display = "none" }, false); + } + }, + /*js translate.selectionTranslate end*/ + + /*js translate.enterprise start*/ + /* + 企业级翻译服务 + 注意,这个企业级翻译中的不在开源免费之中,企业级翻译服务追求的是高稳定,这个是收费的!详情可参考:http://translate.zvo.cn/43262.html + + */ + enterprise: { + //默认不启用企业级,除非设置了 translate.enterprise.use() 这里才会变成true + isUse: false, + use: function () { + translate.enterprise.isUse = true; //设置为使用企业级翻译服务 + + //主节点额外权重降低,更追求响应速度 + translate.request.speedDetectionControl.hostMasterNodeCutTime = 300; + translate.request.api.host = ['https://america-enterprise-api-translate.zvo.cn/', 'https://beijing.enterprise.api.translate.zvo.cn/', 'https://deutsch.enterprise.api.translate.zvo.cn/', 'https://america.api.translate.zvo.cn:666/', 'https://api.translate.zvo.cn:666/', 'https://api.translate.zvo.cn:888/']; + + if (translate.service.name == 'client.edge') { + translate.service.name = 'translate.service'; + translate.log('您已启用了企业级翻译通道 translate.enterprise.use(); (文档:https://translate.zvo.cn/4087.html) , 所以您设置的 translate.service.use(\'client.edge\'); (文档:https://translate.zvo.cn/4081.html) 将失效不起作用,有企业级翻译通道全部接管。'); + return; + } + }, + /* + 自动适配翻译服务通道,如果当前所有网络节点均不可用,会自动切换到 edge.client 进行使用 + 这个会在 post请求 执行前开始时进行触发 + */ + automaticAdaptationService: function () { + if (!translate.enterprise.isUse) { + return; + } + var hosts = translate.request.speedDetectionControl.getHostQueue(); + //console.log(hosts); + if (hosts.length > 0) { + if (hosts[0].time + 1 > translate.request.speedDetectionControl.disableTime) { + //所有节点都处于不可用状态,自动切换到 client.edge 模式 + translate.service.name = 'client.edge'; + } + } + }, + /* 企业级翻译通道的key, v3.12.3.20250107 增加,针对打包成APP的场景 */ + key: '', + }, + /*js translate.enterprise end*/ + + /* + 如果使用的是 translate.service 翻译通道,那么翻译后的语种会自动以小写的方式进行显示。 + 如果你不想将翻译后的文本全部以小写显示,而是首字母大写,那么可以通过此方法设置一下 + v3.8.0.20240828 增加 + 目前感觉应该用不到,所以先忽略 + */ + /* + notConvertLowerCase:function(){ + + }, + */ + + + /*js translate.progress start*/ + /* + 翻译执行的进展相关 + 比如,浏览器本地缓存没有,需要走API接口的文本所在的元素区域,出现 记载中的动画蒙版,给用户以友好的使用提示 + */ + progress: { + style: ` + /* CSS部分 */ + /* 灰色水平加载动画 */ + .translate_api_in_progress { + position: relative; + overflow: hidden; /* 隐藏超出部分的动画 */ + } + + /* 蒙版层 */ + .translate_api_in_progress::after { + content: ''; + position: absolute; + top: 0; + left: 0%; + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 1); /* 半透明白色遮罩 */ + z-index: 2; + } + + /* 水平加载条动画 */ + .translate_api_in_progress::before { + content: ''; + position: absolute; + top: 50%; + left: 0%; + width: 100%; + height:100%; /* 细线高度 */ + background: linear-gradient( + 90deg, + transparent 0%, + #e8e8e8 25%, /* 浅灰色 */ + #d0d0d0 50%, /* 中灰色 */ + #e8e8e8 75%, /* 浅灰色 */ + transparent 100% + ); + background-size: 200% 100%; + animation: translate_api_in_progress_horizontal-loader 3.5s linear infinite; + z-index: 3; + translate: 0 -50%; + } + + @keyframes translate_api_in_progress_horizontal-loader { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } + } + `, + + /* + 通过文本翻译API进行的 + */ + api: { + isTip: true,//是否显示ui的提示,true显示,false不显示 + use: false, //默认不使用,translate.progress.api.startUITip(); 可以设置为启用 + setUITip: function (tip) { + translate.progress.api.isTip = tip; + }, + //移除子元素(无限级别)中的所有 class name 的loading 遮罩 + //level 层级,数字,比如第一次调用,传入1, 第一次里面产生的第二次调用,这里就是2 + removeChildClass: function (node, level) { + + //判断是否有子元素,判断其两级子元素,是否有加了loading遮罩了 + var childNodes = node.childNodes; + if (childNodes == null || typeof (childNodes) == 'undefined') { + + } else if (childNodes.length > 0) { + for (var i = 0; i < childNodes.length; i++) { + translate.progress.api.removeChildClass(childNodes[i], level + 1); + } + } + + if (level == 1) { + //第一次调用,是不删除本身的class name + return; + } + if (typeof (node) == 'undefined') { + return; + } + if (typeof (node.className) != 'string') { + return; + } + if (node.className.indexOf('translate_api_in_progress') < -1) { + return; + } + node.className = node.className.replace(/translate_api_in_progress/g, ''); + }, + + /* + config: 可设置的一些参数 + { + maskLayerMinWidth:10.0 //当翻译时,需要请求网络,此时翻译的文本上会出现遮罩层显示一个进行中的动画,这个动画出现在的元素,最小宽度是多少。如果不设置,默认是10,也就是10像素,也就是当元素大于等于10像素时,才会在上面显示这个进行中的动画。而小于10像素宽度的元素,则是空白一片什么也不显示。 它支持设置float类型的值 + } + + + */ + startUITip: function (config) { + translate.progress.api.use = true; + + if (typeof (config) === 'undefined') { + config = {}; + } + if (typeof (config.maskLayerMinWidth) !== 'number') { + config.maskLayerMinWidth = 10; + } + + //创建隐藏文字的 style + var translatejsTextElementHidden = document.getElementById('translatejs-text-element-hidden'); + if (typeof (translatejsTextElementHidden) == 'undefined' || translatejsTextElementHidden == null) { + const style = document.createElement('style'); + // 设置 style 元素的文本内容为要添加的 CSS 规则 + style.textContent = ' .translatejs-text-element-hidden, .translatejs-text-element-hidden[type="text"]::placeholder{color: transparent !important; -webkit-text-fill-color: transparent !important; text-shadow: none !important;} '; + style.id = 'translatejs-text-element-hidden'; + // 将 style 元素插入到 head 元素中 + document.head.appendChild(style); + } + + // 创建一个 遮罩层加载中动画的 style 元素 + var translatejsMaskLayerAnimation = document.getElementById('translatejs-mask-layer-animation'); + if (typeof (translatejsMaskLayerAnimation) == 'undefined' || translatejsMaskLayerAnimation == null) { + const style = document.createElement('style'); + // 设置 style 元素的文本内容为要添加的 CSS 规则 + style.textContent = translate.progress.style; + style.id = 'translatejs-mask-layer-animation'; + // 将 style 元素插入到 head 元素中 + document.head.appendChild(style); + } + + + if (translate.progress.api.isTip) { + //translate.listener.execute.renderStartByApi.push(function(uuid, from, to){ + translate.lifecycle.execute.translateNetworkBefore.push(function (data) { + var startTime = new Date().getTime(); + + //取出当前变动的node,对应的元素 + var elements = translate.element.nodeToElement(data.nodes); + //console.log(elements) + + //隐藏所有node的文本 + for (var r = 0; r < elements.length; r++) { + elements[r].className = elements[r].className + ' translatejs-text-element-hidden'; + } + + var rects = translate.visual.getRects(elements); + //console.log(rects) + var rectsOneArray = translate.visual.rectsToOneArray(rects); + + //排序 + var sortRects = translate.visual.coordinateSort(rectsOneArray); + //console.log(sortRects); + + //过滤,比如过滤掉宽度非常小的,不然显示出来会很丑 + // 1. 收集需要删除的下标 + const indicesToRemove = []; + for (let i = 0; i < sortRects.length; i++) { + if (sortRects[i].width < config.maskLayerMinWidth) { + indicesToRemove.push(i); + } + } + // 2. 移除宽度极小的rects元素 + for (var di = indicesToRemove.length - 1; di > -1; di--) { + //console.log(sortRects[indicesToRemove[di]]); + sortRects.splice(indicesToRemove[di], 1); + } + + //去除空间重叠 + var spaceEORects = translate.visual.rectsSpaceEliminateOverlap(sortRects); + //console.log('计算耗时:'+(new Date().getTime() - startTime)); + + //var rectLineSplit = translate.visual.filterRectsByLineInterval(spaceEORects.rects, 1); + var rectLineSplit = spaceEORects.rects; + //var rectLineSplit = sortRects; + for (var r = 0; r < rectLineSplit.length; r++) { + //判断这个元素的父级是否已经添加了,可能存在检测到多个本地语种,然后中文转英语后,又出现了日语转英语。 这里避免第二次日语转英语时,跟第一次中文转英语重复,导致出现样式过渡动画的重叠 + var parentNode = rectLineSplit[r].node.parentNode; + if (typeof (parentNode) !== 'undefined' && typeof (parentNode.className) === 'string' && parentNode.className.indexOf('translate_api_in_progress') > -1) { + //上级已经有了,那么就不需要再加动画了 + } else { + //上级没有加,那么这个才能考虑加 + if (typeof (rectLineSplit[r].node.className) === 'string' && rectLineSplit[r].node.className.indexOf('translate_api_in_progress') > -1) { + //已经存在了,就不继续加了 + } else { + rectLineSplit[r].node.className = rectLineSplit[r].node.className + ' translate_api_in_progress'; + } + } + } + //console.log('计算+渲染耗时:'+(new Date().getTime() - startTime)); + }); + + translate.lifecycle.execute.translateNetworkAfter.push(function (data) { + //取出当前变动的node,对应的元素 + var elements = translate.element.nodeToElement(data.nodes); + + for (var r = 0; r < elements.length; r++) { + if (typeof (elements[r].className) === 'string') { + if (elements[r].className.indexOf('translatejs-text-element-hidden') > -1) { + elements[r].className = elements[r].className.replace(/translatejs-text-element-hidden/g, ''); + } + if (elements[r].className.indexOf('translate_api_in_progress') > -1) { + elements[r].className = elements[r].className.replace(/translate_api_in_progress/g, ''); + } + } + } + + + }); + + } + } + } + }, + /*js translate.progress end*/ + + /*js dispose start*/ + /* + 对js对象内的值进行翻译,可以是JS定义的 对象、数组、甚至是单个具体的值 + */ + js: { + + /* + jsString 传入的js对象的字符串格式 + targetLanguage 翻译为的目标语言 + successFunction 执行成功后触发,传入格式 function(obj){ console.log(obj); } 其中 obj 是翻译之后的结果 + failureFunction 执行失败后触发,传入格式 function(failureInfo){ console.log(failureInfo); } 其中 failureInfo 是失败原因 + + 示例: + + var str = ` + { + "hello":"你好", + "word":"单词", + "你是谁": [ + "世界", + "大海" + ] + } + ` + translate.js.transString(str,'english',function(obj){ console.log(obj); }, function(failureInfo){ console.log(failureInfo); }); + + */ + transString: function (jsString, targetLanguage, successFunction, failureFunction) { + let jsObject; + try { + jsObject = JSON.parse(jsString); + } catch (e) { + try { + jsObject = eval('(' + jsString + ')'); + } catch (e) { + translate.log(e) + failureFunction(e); + return; + } + } + translate.js.transObject(jsObject, targetLanguage, successFunction, failureFunction); + }, + + /* + jsObject 传入的js对象,支持对象、数组等 + targetLanguage 翻译为的目标语言 + successFunction 执行成功后触发,传入格式 function(obj){ console.log(obj); } 其中 obj 是翻译之后的结果 + failureFunction 执行失败后触发,传入格式 function(failureInfo){ console.log(failureInfo); } 其中 failureInfo 是失败原因 + + 示例: + + var obj = { + "hello":"你好", + "word":"单词", + "世界":["世界","大海"] + }; + translate.js.transObject(obj,'english',function(obj){ console.log(obj); }, function(failureInfo){ console.log(failureInfo); }); + + */ + transObject: function (jsObject, targetLanguage, successFunction, failureFunction) { + let tj_find = translate.js.find(jsObject); + let kvs = tj_find.stringResult; + + /**** 第二步,将文本值进行翻译 ***/ + //先将其 kvs 的key 取出来 + var texts = new Array(); + for (const key in kvs) { + texts.push(key); + } + + /* + 它主要用于拆分场景,如果不需要拆分,它用不到 + 下标对应,上面 texts 的原始下标跟拆分后的下标对应 + key 新数组的下标 + value 对象,包含: + index: 旧数组的下标 + original: 翻译的原始文本 + isSplit: 是否是被拆分的, true是,false不是 + + */ + var originalArrayIndexMap = new Array(); + + var obj = { + from: 'auto', + to: targetLanguage, + texts: texts + } + + if (translate.ignore.text.length > 0) { //有设置忽略翻译的文本 + var newTexts = new Array(); //新组合的 + + //组合 split 切割 + var splitStrng = ''; + for (var ig = 0; ig < translate.ignore.text.length; ig++) { + if (translate.ignore.text[ig].trim().length == 0) { + continue; + } + var ignoretext = translate.ignore.text[ig]; + if (ignoretext.indexOf('.') > -1) { + ignoretext = ignoretext.replaceAll(/\./g, "\\."); + } + if (ignoretext.indexOf('$') > -1) { + ignoretext = ignoretext.replaceAll(/\$/g, "\\$"); + } + + if (splitStrng != '') { + splitStrng = splitStrng + '|'; + } + splitStrng = splitStrng + ignoretext; + } + var regex = new RegExp(splitStrng, 'g'); // 创建正则表达式对象,添加'g'修饰符表示全局匹配 + //console.log(regex); + + for (var tai = 0; tai < texts.length; tai++) { + + var isFind = false; //是否发现匹配进行拆分了,true是 + + //发现了忽略翻译的文本,将其单独抽取出来,不进行翻译 + //进行拆分 + var splits = texts[tai].split(regex); + if (splits.length > 1) { + isFind = true; //拆分了 + for (var s = 0; s < splits.length; s++) { + if (splits[s].length > 0) { + newTexts.push(splits[s]); + originalArrayIndexMap[newTexts.length - 1] = { + index: tai, + original: splits[s], + isSplit: true + }; + } + } + } else { + //没有拆分,那就原样加入 + newTexts.push(texts[tai]); + originalArrayIndexMap[newTexts.length - 1] = { + index: tai, + original: texts[tai], + isSplit: false + }; + } + + } + obj.texts = newTexts; + } + //console.log(originalArrayIndexMap); + + translate.request.translateText(obj, function (data) { + //打印翻译结果 + //console.log(data); + if (typeof (data.result) == 'undefined' || data.result == 0) { + failureFunction('network connect failure'); + return; + } + if (data.result == 0) { + failureFunction(data.info); + return; + } + + /**** 第三步,将翻译结果赋予 jsObject ***/ + var translatedTexts; //跟最初拆分前的 texts 下标一一对应 + + //判断是否有过分割 + if (translate.ignore.text.length > 0) { //有过分割,进行合并 + translatedTexts = new Array(); + + for (var i = 0; i < data.text.length; i++) { + var originalTextIndex = originalArrayIndexMap[i].index; //最初分割前的原数组下标 + if (translatedTexts.length < originalTextIndex + 1) { + translatedTexts.push(texts[originalTextIndex]); + } + translatedTexts[originalTextIndex] = translate.util.textReplace(translatedTexts[originalTextIndex], originalArrayIndexMap[i].original, data.text[i], data.to); + } + } else { + translatedTexts = data.text; // 直接获取翻译结果数组赋予 + } + + if (translatedTexts && translatedTexts.length === texts.length) { + texts.forEach((originalText, index) => { + const translatedText = translatedTexts[index]; // 根据索引获取翻译结果 + const paths = kvs[originalText]; // 获取该文本的路径数组 + if (paths && paths.length > 0) { + paths.forEach(path => { + translate.js.setValueByPath(jsObject, path, translatedText); // 更新 jsObject + }); + } + }); + } else { + console.error("翻译结果长度不匹配或为空"); + } + + if (Object.keys(tj_find.functionResult).length > 0) { + for (var sf in tj_find.functionResult) { + if (!tj_find.functionResult.hasOwnProperty(sf)) { + continue; + } + translate.js.setValueByPath(jsObject, sf, tj_find.functionResult[sf]); // 更新 jsObject + } + } + successFunction(jsObject); + //console.log("翻译后的 jsObject:", jsObject); + }); + }, + setValueByPath: function (obj, path, value) { + const parts = path.replace(/\[(\d+)\]/g, '.$1').split('.'); + let current = obj; + for (let i = 0; i < parts.length - 1; i++) { + current = current[parts[i]]; + } + current[parts[parts.length - 1]] = value; + }, + /* + 对js对象进行翻译 + obj: 可以是JS定义的 对象、数组、甚至是单个具体的值 + + var obj = { + "hello":"你好", + "word":"单词", + "世界":["世界","大海"] + }; + translate.js.find(obj); + + 返回值: + { + stringResult: + functionResult: + } + + */ + find: function (obj, parentKey = '') { + let kvs = {}; //stringResult + let frs = {}; //functionResult + + if (typeof obj === 'object' && obj !== null) { + if (Array.isArray(obj)) { + obj.forEach((item, index) => { + const currentKey = parentKey ? `${parentKey}[${index}]` : `[${index}]`; + const tj_find = translate.js.find(item, currentKey); + const subKvs = tj_find.stringResult; + for (const [text, paths] of Object.entries(subKvs)) { + if (!kvs[text]) { + kvs[text] = []; + } + kvs[text] = kvs[text].concat(paths); + } + + const subFrs = tj_find.functionResult; + for (var sf in subFrs) { + if (!subFrs.hasOwnProperty(sf)) { + continue; + } + frs[sf] = subFrs[sf]; + } + }); + } else { + + for (const key in obj) { + const currentKey = parentKey ? `${parentKey}.${key}` : key; + if (typeof obj[key] === 'object' && obj[key] !== null) { + const tj_find = translate.js.find(obj[key], currentKey); + const subKvs = tj_find.stringResult; + for (const [text, paths] of Object.entries(subKvs)) { + if (!kvs[text]) { + kvs[text] = []; + } + kvs[text] = kvs[text].concat(paths); + } + const subFrs = tj_find.functionResult; + for (var sf in subFrs) { + if (!subFrs.hasOwnProperty(sf)) { + continue; + } + frs[sf] = subFrs[sf]; + } + + } else if (typeof obj[key] === 'string') { + if (typeof kvs[obj[key]] === 'undefined') { + kvs[obj[key]] = []; + } + kvs[obj[key]].push(currentKey); + } else if (typeof (obj[key]) == 'function') { + //value是一个方法,那么也将他返回 + frs[currentKey] = obj[key]; + } + } + } + } else if (typeof obj === 'string') { + if (typeof kvs[obj] === 'undefined') { + kvs[obj] = []; + } + kvs[obj].push(parentKey); + } + return { + stringResult: kvs, + functionResult: frs + }; + }, + /* + 将 translate.js.transString 执行结果的 obj 对象 转化为 字符串输出 + 这个可以直接输出到 textarea 中显示 + + obj: js对象 + formatSupplementaryCharLength: 对这个js对象进行格式化自动补充字符的长度,比如 2、 4 + + 2025.10.10 优化传入参数 + obj:{ + jsObject: 原本的obj参数, 也就是js对象 + formatSupplementaryCharLength: 对这个js对象进行格式化自动补充字符的长度,比如 2、 4 ,默认不设置则是4 + functionBodyHandle: 针对值是function函数类型时,可以自定义对函数体的源码进行处理,它是传入 function 类型的,比如: + functionBodyHandle: function(functionBody){ + functionBody = functionBody+'123'; + return functionBody; + } + 传入值是函数体的string类型的源码内容 + 返回值是修改过后最新的函数体的string类型的源码内容 + 这是 2025.10.10 新增参数,应对layui的 i18n 全自动翻译函数体中的字符串文本 + } + */ + objToString: function (obj, formatSupplementaryCharLength) { + if (typeof (obj) === 'object') { + if (typeof (obj.jsObject) === 'object') { + //是 2025.10.10 以后的新版本 + } else { + //是 2025.10.10 以前的旧版本 + var newObj = { + jsObject: obj + } + obj = newObj; + } + } else { + obj = {}; + } + if (typeof (formatSupplementaryCharLength) === 'number') { + obj.formatSupplementaryCharLength = formatSupplementaryCharLength; + } + //未设置,就赋予默认值4 + if (typeof (obj.formatSupplementaryCharLength) !== 'number') { + obj.formatSupplementaryCharLength = 4; + } + + // 自定义replacer函数,将函数转换为字符串 + let jsonStr = JSON.stringify(obj.jsObject, (key, value) => { + if (typeof value === 'function') { + // 将函数转换为其源代码字符串 + var funcString = value.toString(); + if (typeof (funcString) === 'string' && funcString.length > 0) { + funcString = funcString.replace(/\n/g, '___TRANSLATEJS_LINE_BREAK___'); + } + return funcString; + } else { + return value; + } + + return result; + }, obj.formatSupplementaryCharLength); + + + //对 function 的函数体进行处理 + // 将转义的\n替换为实际的换行符 -- 20251009 优化,去掉换行符替换,layui 工具中发现这样会将原本文本中的换行符替换掉,而是调整为仅仅针对function方法进行针对替换 + // 逐行判断,判断其中哪一行的value是function,要将function的字符串格式变为function函数格式 + if (jsonStr.indexOf('___TRANSLATEJS_LINE_BREAK___') > -1) { + const lines = jsonStr.split('\n'); + for (var li = 0; li < lines.length; li++) { + // 检查当前行是否包含特定标记 + if (lines[li].includes('___TRANSLATEJS_LINE_BREAK___')) { + lines[li] = lines[li].replace(/___TRANSLATEJS_LINE_BREAK___/g, '\n'); //将其替换为原本的换行符 + + // 查找值部分(假设格式是 "key": "function...") + const valueMatch = lines[li].match(/"[^"]+":\s*"([^"]+)"/); + if (valueMatch && valueMatch[1]) { + // 替换换行标记为实际换行 + let functionStr = valueMatch[1].replace(/___TRANSLATEJS_LINE_BREAK___/g, '\n'); + + // 将函数字符串转换为实际函数 + try { + // 使用Function构造函数创建函数更安全一些 + const functionParts = functionStr.match(/function\s*([^\(]*)\(([^)]*)\)\s*\{([\s\S]*)\}/); + + if (functionParts) { + var [, name, params, body] = functionParts; + if (typeof (obj.functionBodyHandle) === 'function') { + body = obj.functionBodyHandle(body); + } + // 替换原行中的字符串为函数表达式 + lines[li] = lines[li].replace(`"${valueMatch[1]}"`, `function${name}(${params}){${body}}`); + } + } catch (e) { + console.error('转换函数时出错:', e); + } + } + } + } + jsonStr = lines.join('\n'); + } + + return jsonStr; + } + }, + /*js dispose end*/ + + /*js translate.network start*/ + /* + 网络请求数据拦截并翻译 + 当用户触发ajax请求时,它可以针对ajax请求中的某个参数,进行获取,并进行翻译,将翻译后的文本赋予这个参数,然后再放开请求。 + + 使用场景如: + 搜索场景,原本是中文的页面,翻译为英文后,给美国人使用,美国人使用时,进行搜索,输入的是英文,然后点击搜索按钮,发起搜索。 + 然后此会拦截网络请求,将请求中用户输入的搜索文本的内容提取出来,识别它输入的是中文还是英文,如果不是本地的语种中文,那就将其翻译为中文,然后再赋予此请求的这个参数中,然后再放开这次请求。 + 这样请求真正到达服务端接口时,服务端接受到的搜索的文本内容实际就是翻译后的中文文本,而不是用户输入的英文文本。 + + 何时自动进行翻译: + 1. 当前用户没有进行切换语言 + 2. 切换语言了,但是输入的文本的语言是不需要进行翻译的, 输入的文本本身就是本地的语言 + 这两种情况那就不需要拦截翻译 + + + */ + network: { + //是否启用, true为启用 ,通过 translate.network.use(); 设置启用。 更多说明: https://translate.zvo.cn/479724.html + isUse: false, + + // 原始方法保存 + originalOpen: XMLHttpRequest.prototype.open, + originalSend: XMLHttpRequest.prototype.send, + setRequestHeaderOriginal: XMLHttpRequest.prototype.setRequestHeader, + + // 规则配置 + rules: [ + { + url: /https:\/\/www\.guanleiming\.com\/a\/b\/.html/, + methods: ['GET', 'POST'], + params: ['a', 'b1'] + } + ], + //根据 当前请求的url 跟 method 来判断当前请求是否符合规则, + //如果符合,则返回符合的 rule 规则,也就是 translate.network.rules 中配置的某个。 + //如果没有找到符合的,则返回 null + getRuleMatch: function (url, method) { + for (let i = 0; i < translate.network.rules.length; i++) { + const rule = translate.network.rules[i]; + + // 检查 URL 是否匹配 + if (typeof (rule.url) == 'undefined' && rule.url == '') { + translate.log('WARINNG : translate.network.rule find url is null:'); + translate.log(rule); + continue; + } + //console.log(rule); + const isUrlMatch = rule.url.test(url); + if (!isUrlMatch) { + continue; + } + + // 检查方法是否匹配(忽略大小写) + const isMethodMatch = rule.methods.includes(method.toUpperCase()); + if (!isMethodMatch) { + continue; + } + + return rule; + } + + return null; + }, + use: function () { + translate.network.isUse = true; + + // 应用Hook + XMLHttpRequest.prototype.open = function (...args) { + return translate.network.hookOpen.apply(this, args); + }; + + XMLHttpRequest.prototype.send = function (...args) { + return translate.network.hookSend.apply(this, args); + }; + + // 劫持 setRequestHeader 方法 + XMLHttpRequest.prototype.setRequestHeader = function (...args) { + return translate.network.setRequestHeader.apply(this, args); + }; + + translate.network.fetch.use(); + }, + // 私有工具方法 + _translateText(text) { + if (translate.language.getLocal() == translate.language.getCurrent() || (typeof (text) == 'string' && text.length > 0 && translate.language.recognition(text).languageName == translate.language.getLocal())) { + /* + 1. 没有进行切换语言 + 2. 切换语言了,但是输入的文本的语言是不需要进行翻译的, 输入的文本本身就是本地的语言 + + 这两种情况那就不需要拦截翻译 + */ + + return new Promise((resolve, reject) => { + const obj = { + from: 'auto', + to: translate.language.getLocal(), + text: [text] + }; + + resolve(obj); + }); + } else { + //有进行切换了,那进行翻译,将其他语种翻译为当前的本地语种 + return new Promise((resolve, reject) => { + const obj = { + from: 'auto', + to: translate.language.getLocal(), + texts: [text] + }; + + //console.log('翻译请求:', obj); + translate.request.translateText(obj, function (data) { + if (data.result === 1) { + resolve(data); + } else { + reject(data); + } + }); + }); + } + + }, + //劫持 setRequestHeader + setRequestHeader: function (header, value) { + if (this._requestContext) { + this._requestContext.headers = this._requestContext.headers || {}; + this._requestContext.headers[header] = value; + } + + return translate.network.setRequestHeaderOriginal.call(this, header, value); + }, + // 请求处理工具 + RequestHandler: { + async handleGet(url, rule) { + //console.log(url); + //console.log(rule); + if (typeof (rule.params) == 'undefined' && typeof (rule.params.length) == 'undefined' && rule.params.length < 1) { + translate.log('WARINNG: rule not find params , rule : '); + translate.log(rule); + rule.params = []; + } + + + try { + const urlObj = new URL(url, window.location.origin); + const params = urlObj.searchParams; + //console.log(rule.params); + + //for (const paramName in rule.params) { + for (var p = 0; p < rule.params.length; p++) { + var paramName = rule.params[p]; + //console.log(paramName); + if (params.has(paramName)) { + const original = params.get(paramName); + const translateResultData = await translate.network._translateText(original); + + if (typeof (translateResultData) == 'undefined') { + translate.log('WARINNG: translateResultData is undefined'); + } else if (typeof (translateResultData.result) == 'undefined') { + translate.log('WARINNG: translateResultData.result is undefined'); + } else if (translateResultData.result != 1) { + translate.log('WARINNG: translateResultData.result failure : ' + translateResultData.info); + } else { + params.set(paramName, decodeURIComponent(translateResultData.text[0])); + } + + } + } + + return urlObj.toString(); + } catch (e) { + console.warn('GET处理失败:', e); + return url; + } + }, + + async handleForm(body, rule) { + try { + const params = new URLSearchParams(body); + const modified = { ...params }; + + for (const paramName of rule.params) { + if (params.has(paramName)) { + const original = params.get(paramName); + const translated = await translate.network._translateText(original); + modified[paramName] = translated; + } + } + + return new URLSearchParams(modified).toString(); + } catch (e) { + console.warn('表单处理失败:', e); + return body; + } + }, + + async handleJson(body, rule) { + try { + const json = JSON.parse(body); + const modified = { ...json }; + + for (const paramName of rule.params) { + if (modified.hasOwnProperty(paramName)) { + const original = modified[paramName]; + modified[paramName] = await translate.network._translateText(original); + } + } + + return JSON.stringify(modified); + } catch (e) { + console.warn('JSON处理失败:', e); + return body; + } + } + }, + + // 请求上下文管理 + _requestContext: null, + + + + // Hook open 方法 + hookOpen(method, url, async, user, password) { + let matchedRule = null; + this._requestContext = { + method: method.toUpperCase(), + originalUrl: url, + async: async, + user: user, + password: password, + matchedRule: translate.network.getRuleMatch(url, method) + }; + + return translate.network.originalOpen.call(this, method, url, async, user, password); + }, + + // Hook send 方法 + hookSend(body) { + const ctx = this._requestContext; + if (!ctx || !ctx.matchedRule) { + return translate.network.originalSend.call(this, body); + } + + const processRequest = async () => { + let modifiedBody = body; + const method = ctx.method; + + try { + // 处理GET请求 + //if (method === 'GET') { + const newUrl = await translate.network.RequestHandler.handleGet(ctx.originalUrl, ctx.matchedRule); + translate.network.originalOpen.call(this, method, newUrl, ctx.async, ctx.user, ctx.password); + //} + + // 恢复请求头 + if (ctx.headers) { + for (const header in ctx.headers) { + translate.network.setRequestHeaderOriginal.call(this, header, ctx.headers[header]); + } + } + + // 处理POST请求 + if (method === 'POST') { + if (typeof (body) != 'undefined' && body != null && body.length < 2000) { + var isJsonBody = false; //是否是json格式的数据,是否json已经处理了, true 是 + if (body.trim().indexOf('[') == 0 || body.trim().indexOf('{') == 0) { + //可能是json + try { + modifiedBody = await translate.network.RequestHandler.handleJson(body, ctx.matchedRule); + isJsonBody = true; + } catch (je) { + isJsonBody = false; + } + } + if (!isJsonBody) { + try { + modifiedBody = await translate.network.RequestHandler.handleForm(body, ctx.matchedRule); + } catch (je) { + } + } + } + } + } catch (e) { + console.warn('请求处理异常:', e); + } + + translate.network.originalSend.call(this, modifiedBody); + }; + + // 异步处理 + if (ctx.async !== false) { + processRequest.call(this); + } else { + console.warn('同步请求不支持翻译拦截'); + translate.network.originalSend.call(this, body); + } + }, + //fetch请求 + fetch: { + originalFetch: window.fetch, + + // 保存原始 fetch 方法 + use: function () { + const self = this; + window.fetch = function (...args) { + return self.hookFetch.apply(self, args); + }; + }, + + // 拦截 fetch 请求 + hookFetch: async function (input, init) { + const request = new Request(input, init); + const url = request.url; + const method = request.method; + + // 获取匹配规则 + const rule = translate.network.getRuleMatch(url, method); + if (!rule) { + return this.originalFetch.call(window, request); + } + + // 初始化请求上下文 + const ctx = { + method, + url, + headers: {}, + rule, + isModified: false + }; + + // 保存请求头 + request.headers.forEach((value, key) => { + ctx.headers[key] = value; + }); + + this._requestContext = ctx; + + try { + const newUrl = await translate.network.RequestHandler.handleGet(url, rule); + // 处理 GET 请求 + if (method === 'GET') { + + const newRequest = new Request(newUrl, { + method, + headers: new Headers(ctx.headers), + mode: request.mode, + credentials: request.credentials, + cache: request.cache, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy + }); + return this.originalFetch.call(window, newRequest); + } + + // 处理 POST 请求 + if (method === 'POST') { + let body = null; + if (request.body) { + body = await request.clone().text(); + } + + const contentType = request.headers.get('Content-Type'); + let modifiedBody = body; + + if (typeof (body) != 'undefined' && body != null && body.length < 2000) { + var isJsonBody = false; //是否是json格式的数据,是否json已经处理了, true 是 + if (body.trim().indexOf('[') == 0 || body.trim().indexOf('{') == 0) { + //可能是json + try { + modifiedBody = await translate.network.RequestHandler.handleJson(body, rule); + isJsonBody = true; + } catch (je) { + isJsonBody = false; + } + } + if (!isJsonBody) { + try { + modifiedBody = await translate.network.RequestHandler.handleForm(body, rule); + } catch (je) { + } + } + } + + const newRequest = new Request(newUrl, { + method, + headers: new Headers(ctx.headers), + body: modifiedBody, + mode: request.mode, + credentials: request.credentials, + cache: request.cache, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy + }); + + return this.originalFetch.call(window, newRequest); + } + + // 其他方法直接返回原始请求 + return this.originalFetch.call(window, request); + } catch (e) { + console.warn('fetch 请求处理异常:', e); + return this.originalFetch.call(window, request); + } + }, + // 请求上下文管理 + _requestContext: null + + } + }, + + /*js translate.network end*/ + + + /*js translate.visual start*/ + /* + 人眼所看到的纯视觉层的处理 + */ + visual: { + /** + * 获取一组节点的视觉矩形信息 + * @param nodes - 节点数组,格式如 : + * [node1,node2,node3] + * @returns 返回的是二维数组,其中第一维度跟输入的 nodes 下标一一对应。 + * 其中第二维度,是应对换行的情况。比如 node1 没有换行,那第二维度就只有一个 + * node2 有换行,有三行,那么第二维度就有三个,每行一个。 这个也是每行都有一个 开始坐标(x,y)、结束坐标(x,y) + * + */ + getRects: function (nodes) { + /* + + return nodes.map(node => { + if (!node) return null; + + let rect; + if (node.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + range.selectNodeContents(node); + const rects = range.getClientRects(); + //console.log(rect); + rect = rects.length > 0 ? rects[0] : null; + } else if (node.nodeType === Node.ELEMENT_NODE) { + rect = node.getBoundingClientRect(); + } + + return rect ? { + node, + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + width: rect.width, + height: rect.height + } : null; + }); + */ + + return nodes.map(node => { + if (!node) return []; // 节点不存在时返回空数组 + + let rects = []; + if (node.nodeType === Node.TEXT_NODE) { + // 处理文本节点:获取所有行的矩形 + const range = document.createRange(); + range.selectNodeContents(node); + const clientRects = range.getClientRects(); + // 转换为数组并处理每个行矩形 + rects = Array.from(clientRects).map(rect => ({ + node, + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + width: rect.width, + height: rect.height, + lineIndex: Array.from(clientRects).indexOf(rect) // 增加行索引,方便区分第几行 + })); + } else if (node.nodeType === Node.ELEMENT_NODE) { + // 处理元素节点:获取元素整体矩形(保持原有逻辑) + const rect = node.getBoundingClientRect(); + rects = rect ? [{ + node, + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + width: rect.width, + height: rect.height + }] : []; + } + + return rects; + }); + }, + /** + * 将 translate.visual.getRects 获取到的二维坐标数据转为一维坐标 + */ + rectsToOneArray: function (rects) { + // 将 reacts 二维数组转化为 一维数组,以便对一维数组进行排序 + var oneArrayRects = new Array(); + for (var r = 0; r < rects.length; r++) { + for (var twoR = 0; twoR < rects[r].length; twoR++) { + oneArrayRects.push(rects[r][twoR]); + } + } + return oneArrayRects; + }, + /** + * 按行间隔筛选rects数组中的节点 + * @param rects 一维的矩形信息数组(包含node和坐标信息),也就是 translate.visual.rectsToOneArray(translate.visual.getRects(nodes)); 取得的信息。它并不需要提前排序 + * @param line - 间隔行数,1表示每行都取,2表示隔一行取一个,3表示隔2行取一个,以此类推 + * @returns 筛选后的矩形信息数组,并按照 top 的值有小往大排序 + */ + filterRectsByLineInterval: function (rects, line) { + // 验证输入 + if (!Array.isArray(rects) || typeof line !== 'number' || line < 1) { + console.error('输入参数无效,请确保rects是数组且line是大于0的数字'); + return []; + } + + // 1. 先处理所有矩形,计算每行的基准线(使用top作为主要依据) + // 为每个矩形添加行标识临时属性 + const processedRects = rects.map(rect => { + if (!rect || rect.top === undefined) { + return null; // 过滤无效矩形 + } + return { + ...rect, + // 计算行基准(使用top的整数部分,处理可能的浮点精度问题) + rowBase: Math.round(rect.top) + }; + }).filter(Boolean); // 移除null值 + + // 2. 按行基准分组(完全相同的rowBase属于同一行) + const rowMap = new Map(); + processedRects.forEach(rect => { + const key = rect.rowBase; + if (!rowMap.has(key)) { + rowMap.set(key, []); + } + rowMap.get(key).push(rect); + }); + + // 3. 将Map转换为数组并按行基准排序(确保从上到下的顺序) + const lineGroups = Array.from(rowMap.entries()) + .sort((a, b) => a[0] - b[0]) // 按行基准升序排序 + .map(entry => entry[1]); // 提取每组的矩形数组 + + // 4. 按间隔行数筛选行组,并只保留每行的第一个元素 + const filtered = []; + lineGroups.forEach((group, index) => { + if (index % line === 0 && group.length > 0) { + // 保留每行的第一个元素 + filtered.push(group[0]); + } + }); + + // 调试:打印所有行组的基准值和数量,方便验证 + /* + console.log('行分组基准与数量:', lineGroups.map((g, i) => ({ + rowBase: g[0].rowBase, + top: g[0].top, + count: g.length, + isSelected: i % line === 0 // 是否被选中 + }))); + */ + + return filtered; + }, + /* + 对传入的 rects 进行重叠识别排除,将重叠的、且面积小的删掉。 + 说明: + * - 认为“重叠”必须在水平和垂直两个方向均严格交叉,交叉的位置比如水平或垂直产生了2个像素或超过2个像素的重叠,也就是面积上实际上已经重叠了。 + * 所以如果两个矩形仅在边界上相接(例如 a.bottom === b.top 或 a.right === b.left)则不视为重叠,甚至稍微重叠不超过2像素也不视为重叠, 不会删除任何一方。 + * - 决定保留哪一个:保留面积更大的矩形;若面积相等,则保留在排序中先出现的那个(确定性)。 + * - 性能优化:先按 left 升序排序,比较时只与那些 left < current.right 的后续矩形比较(剪枝)。 + * - 不做原地 splice(避免 O(n^2) 的移动开销),而是用布尔标记 removed[],最后重建结果数组。 + + @param rects 一维的矩形信息数组(包含node和坐标信息),比如 translate.visual.coordinateSort(rects); 排序后取得的信息。 + 输入: rects: [{left, top, right, bottom}, ...] + @return 返回排除重叠的坐标数组。 + { + rects: 保留的不互相覆盖的矩形数组, + removes: rects中被移除的矩形数组 + } + + */ + rectsSpaceEliminateOverlap: function (inputRects) { + if (!Array.isArray(inputRects) || inputRects.length === 0) { + return { rects: [], removes: [] }; + } + + const pixelThreshold = 2; + const EPS = 1e-6; + + const areaOf = r => + Math.max(0, r.right - r.left) * Math.max(0, r.bottom - r.top); + + const intersectionWH = (a, b) => ({ + w: Math.min(a.right, b.right) - Math.max(a.left, b.left), + h: Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top) + }); + + const rectsWithIndex = inputRects.map((r, idx) => { + let { left, top, right, bottom } = r; + if (right < left) { + [left, right] = [right, left]; + } + if (bottom < top) { + [top, bottom] = [bottom, top] + }; + return { r: { left, top, right, bottom }, idx }; + }); + + rectsWithIndex.sort((A, B) => { + if (Math.abs(A.r.left - B.r.left) > EPS) { + return A.r.left - B.r.left; + } + if (Math.abs(A.r.top - B.r.top) > EPS) { + return A.r.top - B.r.top; + } + if (Math.abs(A.r.right - B.r.right) > EPS) { + return A.r.right - B.r.right; + } + return A.r.bottom - B.r.bottom; + }); + + const n = rectsWithIndex.length; + const removed = new Array(n).fill(false); + const areas = rectsWithIndex.map(x => areaOf(x.r)); + + for (let i = 0; i < n; i++) { + if (removed[i]) { + continue; + } + const Ai = rectsWithIndex[i].r; + const Ai_area = areas[i]; + + for (let j = i + 1; j < n; j++) { + if (removed[j]) { + continue; + } + const Bj = rectsWithIndex[j].r; + + // ---- 优先检测包含(几何方式,带阈值) + const A_contains_B = + Ai.left <= Bj.left + pixelThreshold && + Ai.top <= Bj.top + pixelThreshold && + Ai.right >= Bj.right - pixelThreshold && + Ai.bottom >= Bj.bottom - pixelThreshold; + + const B_contains_A = + Bj.left <= Ai.left + pixelThreshold && + Bj.top <= Ai.top + pixelThreshold && + Bj.right >= Ai.right - pixelThreshold && + Bj.bottom >= Ai.bottom - pixelThreshold; + + if (A_contains_B || B_contains_A) { + if (A_contains_B && !B_contains_A) { + removed[j] = true; + continue; + } + if (B_contains_A && !A_contains_B) { + removed[i] = true; + break; + } + // 双包含(几乎重合)按面积或顺序 + const Bj_area = areas[j]; + if (Ai_area >= Bj_area) { + removed[j] = true; + } else { + removed[i] = true; + break; + } + } + + // ---- 剪枝 ---- + if (Bj.left >= Ai.right - EPS) { + break; + } + + // ---- 检查普通重叠 ---- + const { w, h } = intersectionWH(Ai, Bj); + if (w <= pixelThreshold || h <= pixelThreshold) { + continue + }; + + const Bj_area = areas[j]; + if (Ai_area > Bj_area) { + removed[j] = true; + } else if (Bj_area > Ai_area) { + removed[i] = true; + break; + } else { + removed[j] = true; + } + } + } + + const keeps = [], removes = []; + const sortedToOrig = rectsWithIndex.map(x => x.idx); + const origToSorted = new Map(); + for (let p = 0; p < n; p++) { + origToSorted.set(sortedToOrig[p], p); + } + for (let origIdx = 0; origIdx < inputRects.length; origIdx++) { + const pos = origToSorted.get(origIdx); + if (pos === undefined || !removed[pos]) { + keeps.push(inputRects[origIdx]); + } else { + removes.push(inputRects[origIdx]); + } + } + + return { rects: keeps, removes }; + }, + + /* + 对一组坐标进行排序 + 按开始坐标从左到右、从上到下排序 + @param rects translate.visual.getRects获取到的坐标数据 + */ + coordinateSort: function (rects) { + // 按从左到右、从上到下排序 + const sortedRects = rects + .filter(rect => rect !== null) + .sort((a, b) => { + if (Math.abs(a.top - b.top) < 5) { // 同一行 + return a.left - b.left; + } + return a.top - b.top; + }); + return sortedRects; + }, + + /** + * 查找左右紧邻的矩形对 + * @param rects translate.visual.getRects 获取到的坐标数据,转化为 一维数组 后传入 + * @returns {Array<{before: Object, after: Object}>} - 左右紧邻的矩形对数组 + */ + afterAdjacent: function (rects) { + //进行从左到右-从上到下进行排序 + var sortedRects = translate.visual.coordinateSort(rects); + + const adjacentPairs = []; + //按行分组的矩形 + const lineGroups = translate.visual.groupRectsByLine(sortedRects); + + // 检查每行中的所有紧邻元素对 + lineGroups.forEach(line => { + for (let i = 0; i < line.length; i++) { + for (let j = i + 1; j < line.length; j++) { + const prev = line[i]; + const next = line[j]; + + // 如果后续元素与当前元素不紧邻,则后续其他元素也不可能紧邻 + if (!translate.visual.areHorizontallyAdjacent(prev, next)) { + break; + } + + adjacentPairs.push({ before: prev, after: next }); + } + } + }); + + return adjacentPairs; + }, + /** + * 按行分组矩形 + * @param rects - 排序后的矩形数组 @param rects translate.visual.coordinateSort 获取到的坐标数据 + * @returns {Object[][]} - 按行分组的矩形 + */ + groupRectsByLine: function (rects) { + const lineGroups = []; + let currentLine = []; + + rects.forEach(rect => { + if (currentLine.length === 0) { + currentLine.push(rect); + } else { + const lastRect = currentLine[currentLine.length - 1]; + // 如果在同一行,则添加到当前行 + if (Math.abs(rect.top - lastRect.top) < 5) { + currentLine.push(rect); + } else { + // 否则开始新的一行 + lineGroups.push(currentLine); + currentLine = [rect]; + } + } + }); + + // 添加最后一行 + if (currentLine.length > 0) { + lineGroups.push(currentLine); + } + + return lineGroups; + }, + /** + * 判断两个矩形是否水平紧邻 + * @param {Object} rect1 - 第一个矩形 + * @param {Object} rect2 - 第二个矩形 + * @returns {boolean} - 是否水平紧邻 + */ + areHorizontallyAdjacent: function (rect1, rect2) { + // 检查垂直方向是否有重叠(在同一行) + const verticalOverlap = Math.min(rect1.bottom, rect2.bottom) - Math.max(rect1.top, rect2.top); + + // 检查水平间距是否在阈值范围内 + const horizontalGap = rect2.left - rect1.right; + + return verticalOverlap > 0 && Math.abs(horizontalGap) < 1; // 允许1px误差 + }, + /** + * 找到需要在节点文本末尾添加空格的节点 + * @param {Array<{before: Object, after: Object}>} adjacentPairs - 左右紧邻的矩形对数组 + * @returns {Node[]} - 需要添加空格的节点数组 + */ + afterAddSpace: function (adjacentPairs) { + + const nodesToAddSpace = []; + + adjacentPairs.forEach(pair => { + const { before, after } = pair; + const beforeNode = before.node; + const afterNode = after.node; + + // 获取计算样式 + const beforeStyle = window.getComputedStyle( + beforeNode.nodeType === Node.TEXT_NODE ? beforeNode.parentElement : beforeNode + ); + + const afterStyle = window.getComputedStyle( + afterNode.nodeType === Node.TEXT_NODE ? afterNode.parentElement : afterNode + ); + + // 检查间距是否由CSS属性引起 + const hasRightSpacing = parseFloat(beforeStyle.marginRight) > 0 || + parseFloat(beforeStyle.paddingRight) > 0; + + const hasLeftSpacing = parseFloat(afterStyle.marginLeft) > 0 || + parseFloat(afterStyle.paddingLeft) > 0; + + // 如果没有明确的间距,且后一个节点的开始非空白符,则需要添加空格 + if (!hasRightSpacing && !hasLeftSpacing) { + //判断 before 节点的最后一个字符是否是空白符 + if (typeof (beforeNode.textContent) == 'string' && typeof (afterNode.textContent) == 'string') { + if (/\s$/.test(beforeNode.textContent)) { + //before 最后一个字符是空格,则不需要追加空格符了 + } else if (/^\s/.test(afterNode.textContent)) { + //after 节点的开始第一个字符是空白符,那么也不需要追加空格符了 + } else { + //这里就需要对 beforeNode 追加空格了 + nodesToAddSpace.push(beforeNode); + } + } + } + }); + + return nodesToAddSpace; + }, + /** + * 主函数:处理翻译后的空格调整 + * @param {Node[]} nodes - 节点数组 + */ + adjustTranslationSpaces: function (nodes) { + + //先判断当前要显示的语种,是否需要用空格进行间隔单词,如果本身不需要空格间隔,像是中文,那就根本不需要去计算视觉距离 + if (!translate.language.wordBlankConnector(translate.to)) { + return; + } + + //var startTime = Date.now(); + // 1. 获取节点视觉矩形 + const rects = translate.visual.getRects(nodes); + + // 将 reacts 二维数组转化为 一维数组,以便对一维数组进行排序 + var oneArrayRects = translate.visual.rectsToOneArray(rects); + + //console.log('rects:'); + //console.log(rects); + //console.log('将 reacts 二维数组转化为一维数组 oneArrayRects:'); + //console.log(oneArrayRects); + + // 2. 查找左右紧邻的矩形对 + const adjacentPairs = translate.visual.afterAdjacent(oneArrayRects); + //console.log('adjacentPairs:'); + //console.log(adjacentPairs); + + // 3. 确定需要添加空格的节点 + const nodesToAddSpace = translate.visual.afterAddSpace(adjacentPairs); + //console.log('nodesToAddSpace:'); + //console.log(nodesToAddSpace); + + // 4. 添加非断行空格 + nodesToAddSpace.forEach(node => { + // 确保只修改文本内容,不影响HTML结构 + if (node.nodeType === Node.TEXT_NODE) { + + //判断它的最后一个字符是否是空格,如果不是空格,才有必要加空格符 + if (node.textContent.length === 0 || node.textContent.substring(node.textContent.length - 1, node.textContent.length) !== '\u00A0') { + + //找到它对应的 translate.node.data 的数据,先将其进行改动 - 目的是 listener 监听改动知道这是translate.js自己改的 - 以及 让 translate.node 的数据对应起来 + if (translate.node.get(node) !== null) { + if (typeof (translate.node.get(node).resultText) !== 'string') { + //没有resultText这个属性,如果翻译失败或者本身是特殊字符比如数字,不需要被翻译,是没有这个属性的,那这里默认赋予 originalText 给他,以做记录,免得被listener监听 + translate.node.get(node).resultText = translate.node.get(node).originalText; + } + translate.node.get(node).resultText = translate.node.get(node).resultText + '\u00A0'; + + if (typeof (translate.node.get(node).translateResults) === 'undefined') { + translate.node.get(node).translateResults = {}; + } + translate.node.get(node).translateResults[translate.node.get(node).resultText] = 1; + + translate.node.get(node).lastTranslateRenderTime = Date.now(); + } + + //console.log(node.textContent+'-->'+node.textContent.substring(node.textContent.length -1, node.textContent.length)); + node.textContent = node.textContent + '\u00A0'; + } + + //console.log(translate.node.get(node)) + } else if (node.nodeType === Node.ELEMENT_NODE) { + // 如果是元素节点,修改其最后一个子节点(假设是文本节点) + const lastChild = node.lastChild; + if (lastChild && lastChild.nodeType === Node.TEXT_NODE) { + //判断它的最后一个字符是否是空格,如果不是空格,才有必要加空格符 + if (lastChild.textContent.length === 0 || lastChild.textContent.substring(lastChild.textContent.length - 1, lastChild.textContent.length) !== '\u00A0') { + //找到它对应的 translate.node.data 的数据,先将其进行改动 - 目的是 listener 监听改动知道这是translate.js自己改的 - 以及 让 translate.node 的数据对应起来 + if (translate.node.get(lastChild) !== null) { + if (typeof (translate.node.get(lastChild).resultText) === 'string') { + translate.node.get(lastChild).resultText = translate.node.get(lastChild).resultText + '\u00A0'; + translate.node.get(lastChild).translateResults[translate.node.get(node).resultText] = 1; + translate.node.get(lastChild).lastTranslateRenderTime = Date.now(); + } + } + lastChild.textContent = lastChild.textContent + '\u00A0'; + } + } + } + }); + //var endTime = Date.now(); + //console.log('visual recognition time: '+(endTime-startTime)+'ms'); + }, + /* + 通过 translate.nodeQueue[uuid] 中的uuid,来传入这个 translate.nodeQueue[uuid] 中所包含涉及到的所有node (除特殊字符外 ,也就是 translate.nodeQueue[uuid].list 下 特殊字符那一类是不会使用的) + */ + adjustTranslationSpacesByNodequeueUuid: function (uuid) { + var nodes = []; + for (var from in translate.nodeQueue[uuid].list) { + if (!translate.nodeQueue[uuid].list.hasOwnProperty(from)) { + continue; + } + //空的,也就是有数字标点符号等这一类,也要加入,因为也要算入视觉间隔中去,比如 我有9个,其中的9如果不算的话,翻译后 my have9ge 就没有间隔了 + //if(from.length < 1){ + // continue; + //} + if (typeof (translate.nodeQueue[uuid].list[from]) === 'undefined') { + continue; + } + for (var hash in translate.nodeQueue[uuid].list[from]) { + if (!translate.nodeQueue[uuid].list[from].hasOwnProperty(hash)) { + continue; + } + for (var nodeindex in translate.nodeQueue[uuid].list[from][hash].nodes) { + if (!translate.nodeQueue[uuid].list[from][hash].nodes.hasOwnProperty(nodeindex)) { + continue; + } + var node = translate.nodeQueue[uuid].list[from][hash].nodes[nodeindex].node; + nodes.push(node); + } + } + } + translate.visual.adjustTranslationSpaces(nodes); + }, + /* + 通过 translate.nodeQueue 中最后一次执行的 uuid,来获取这个 translate.nodeQueue[uuid] 中所包含涉及到的所有node (除特殊字符外 ,也就是 translate.nodeQueue[uuid].list 下 特殊字符那一类是不会使用的) + */ + adjustTranslationSpacesByLastNodequeueUuid: function (uuid) { + var uuid = ''; + for (var uuid_index in translate.nodeQueue) { + uuid = uuid_index; + break; + } + if (typeof (uuid) == 'string' && uuid.length > 1) { + translate.visual.adjustTranslationSpacesByNodequeueUuid(uuid); + } + }, + + /** + * 隐藏当前网页的所有文本 + * + */ + hideText: { + style: ` + /* 文本隐藏核心样式 - 仅隐藏文本内容 */ + + html.translatejs-text-hidden p, html.translatejs-text-hidden div, html.translatejs-text-hidden small, + html.translatejs-text-hidden h1, html.translatejs-text-hidden h2, html.translatejs-text-hidden h3, + html.translatejs-text-hidden h4, html.translatejs-text-hidden h5, html.translatejs-text-hidden h6, + html.translatejs-text-hidden span, html.translatejs-text-hidden a, html.translatejs-text-hidden b, + html.translatejs-text-hidden strong, html.translatejs-text-hidden i, html.translatejs-text-hidden em, + html.translatejs-text-hidden mark, + html.translatejs-text-hidden blockquote, html.translatejs-text-hidden ul, html.translatejs-text-hidden ol, + html.translatejs-text-hidden li, html.translatejs-text-hidden table, html.translatejs-text-hidden th, + html.translatejs-text-hidden td, html.translatejs-text-hidden label, html.translatejs-text-hidden button, + html.translatejs-text-hidden input, html.translatejs-text-hidden select, html.translatejs-text-hidden textarea { + color: transparent !important; + text-shadow: none !important; + transition: none !important; + } + + /* 隐藏占位符文字 */ + html.translatejs-text-hidden ::placeholder { + color: transparent !important; + } + + /* 确保媒体元素不受影响 */ + img, video, iframe, canvas, svg, + object, embed, picture, source { + color: initial !important; + } + + /* 忽略隐藏的元素保持可见 */ + .ignore-hidden { + color: inherit !important; + } + `, + + /** + * 当点击切换语言按钮后,会刷新当前页面,然后再进行翻译。 + * 这时会出现刷新当前页面后,会先显示原本的文本,然后再翻译为切换为的语种,体验效果有点欠缺。 + * 这个得作用就是增强用户视觉的体验效果,在页面初始化加载时,如果判定需要翻译,那么会隐藏所有网页中的文本 。 + * 这个需要在body标签之前执行,需要在head标签中执行此。也就是加载 translate.js 以及触发此都要放到head标签中 + * + * id 唯一标识,可能会隐藏多次,或者同一时间出发多次不同的元素隐藏,每次隐藏跟显示都是根据这个id唯一标识来的, 字符串类型。 如果没有,默认就是 translatejs-text-hidden + */ + hide: function (id) { + const style = document.createElement('style'); + + if (typeof (id) == 'undefined' || id == null || id.length == 0) { + id = 'translatejs-text-hidden'; + style.textContent = translate.visual.hideText.style; + } else { + //有值 + id = 'translatejs-text-hidden-' + id; + style.textContent = translate.visual.hideText.style.replace(/translatejs-text-hidden/g, id).replace(/\/\*(.*)\*\//g, ' ').replace(/\n/g, ' '); + } + style.id = id; + document.head.appendChild(style); + document.documentElement.classList.add(id); + }, + /** + * 撤销隐藏状态,将原本的文本正常显示出来 + * + * id 同 hide 的 + */ + show: function (id) { + if (typeof (id) == 'undefined' || id == null || id.length == 0) { + id = 'translatejs-text-hidden'; + } else { + //有值 + id = 'translatejs-text-hidden-' + id; + } + + //删除html 的 class name + document.documentElement.classList.remove(id); + //删除 style + var style_translatejs_text_hidden = document.getElementById(id); + if (typeof (style_translatejs_text_hidden) != null && style_translatejs_text_hidden != null) { + style_translatejs_text_hidden.remove(); + } + } + }, + + /* + 这个主要是配合下面的,如果下面的 webPageLoadTranslateBeforeHiddenText 触发,则自动设置此处为true,为启用切换语种或刷新页面后先隐藏原本的文本 + 它只是提供判断使用,不可直接设置操作 + */ + webPageLoadTranslateBeforeHiddenText_use: false, + + /** + 网页加载,且要进行翻译时,翻译之前,隐藏当前网页的文本。 + 当点击切换语言按钮后,会刷新当前页面,然后再进行翻译。 + 这时会出现刷新当前页面后,会先显示原本的文本,然后再翻译为切换为的语种,体验效果有点欠缺。 + + 这个得作用就是增强用户视觉的体验效果,在页面初始化加载时,如果判定需要翻译,那么会隐藏所有网页中的文本 。 + 他会先隐藏网页所有文本,然后再第一次 translate.execute 执行时,在扫描完节点, + 1. 将扫描到的几种语种的文本全部发送网络请求之后,(也就是已经触发了发送网络请求的文本node已经处于隐藏状态), 才会去掉整个网页文本的隐藏。 + 2. 在第一次 translate.execute 执行渲染完毕后,去掉整个网页文本的隐藏。 + 3. 在 dom + + 这个需要在body标签之前执行,需要在head标签中执行此。也就是加载 translate.js 以及触发此都要放到head标签中 + + config 参数,配置项,默认不传 + { + inHeadTip:true, //警告要在head中触发的控制台消息提醒,true是如果发现就打印这个提醒。 默认不设置便是true + } + */ + webPageLoadTranslateBeforeHiddenText: function (config) { + if (typeof (config) == 'undefined') { + config = {}; + } + if (typeof (config.inHeadTip) == 'undefined') { + config.inHeadTip = true; + } + + //标记,当前启用整体隐藏文本的能力 + translate.visual.webPageLoadTranslateBeforeHiddenText_use = true; + + if (typeof (document.body) == 'undefined' || document.body == null) { + //正常,body还没加载 + } else { + if (config.inHeadTip) { + translate.log('警告: translate.visual.webPageLoadTranslateBeforeHiddenText() 要在 head 标签中触发才能达到最好的效果!'); + } + } + if (translate.language.local == '') { + translate.log('提醒:在使用 translate.visual.webPageLoadTranslateBeforeHiddenText() 之前,请先手动设置你的本地语种,参考: http://translate.zvo.cn/4066.html 如果你不设置本地语种,则不管你是否有切换语言,网页打开后都会先短暂的不显示文字'); + } + + if (translate.language.local == '' || translate.language.translateLocal == true || translate.language.local != translate.language.getCurrent()) { + //如果当前触发翻译,才会出现这个隐藏文本,因为取消隐藏必须要 translate.execute() 触发后才会取消隐藏 + + translate.visual.hideText.hide(); + + /* + // 创建定时器,每10ms执行一次,以保持最顶层 html 标签上的class 不被项目或框架本身自动给覆盖掉 + //针对 60HZ刷新率,避免人眼视觉上出现屏闪,所以使用 10ms + translate.visual.hideText.htmlAppendClassIntervalId = setInterval(function(){ + document.documentElement.classList.add('translatejs-text-hidden'); + }, 10); + */ + + //设置发起网络请求前,记录发起了几次翻译请求,避免发起了多次,但是第一次执行完了就显示文本了,但是后几次还在翻译中,还是会出现显示原文的情况 + //translate.lifecycle.execute.translateNetworkBefore.push(function(uuid, from, to, texts){ + translate.lifecycle.execute.translateNetworkBefore.push(function (data) { + if (typeof (translate.visual.hideText.first_translate_request_uuid) == 'undefined') { + //是第一次翻译请求,记录其uuid + translate.visual.hideText.first_translate_request_uuid = data.uuid; + } + + //只有第一次通过网络翻译接口请求才会记录uuid + if (translate.visual.hideText.first_translate_request_uuid == data.uuid) { + if (typeof (translate.visual.hideText.first_translate_request_number) == 'undefined') { + translate.visual.hideText.first_translate_request_number = 0; + } + translate.visual.hideText.first_translate_request_number++; + //console.log('translate.visual.hideText.first_translate_request_number++ from:'+from+', ++ after number: '+translate.visual.hideText.first_translate_request_number); + } + }); + + //设置翻译完成后,移除隐藏文本的css 的class name + translate.lifecycle.execute.renderFinish.push(function (uuid, to) { + //console.log('renderFinish : '+uuid); + if (typeof (translate.visual.hideText.first_translate_request_uuid) == 'undefined') { + //为空,那么可能是已经触发过浏览器缓存了,所有翻译的文本在浏览器缓存中都有,就不必再发起网络请求了 + + + } else { + //是发起过网络请求的,要计算请求数,所有的语种都翻译完后才能显示文本 + if (translate.visual.hideText.first_translate_request_uuid != uuid) { + //不是同一个uuid的,那也就是并不是第一次翻译了,而这个 webPageLoadTranslateBeforeHiddenText 针对的是页面加载后第一次翻译的避免原文一闪的情况 + return; + } + } + /* + 销毁定时器 - 不要删,预留 + if(typeof(translate.visual.hideText.htmlAppendClassIntervalId) != 'undefined'){ + clearInterval(translate.visual.hideText.htmlAppendClassIntervalId); + console.log("translate.visual.hideText.htmlAppendClassIntervalId 已销毁 : "+translate.visual.hideText.htmlAppendClassIntervalId); + } + */ + + translate.visual.hideText.show(); + }); + } + + //translate.execute 触发执行结束触发 + translate.lifecycle.execute.finally.push(function (data) { + if (data.triggerNumber < 3) { + //只有在第一次、第二次 触发后才会隐藏文本,这里避免只第一次,是万一第一次出现异常,网页在空白不显示内容了,多触发几次也不会影响多少性能。而且这个是对网页整体进行显示的,只有页面初始化打开的时候才会用到这个相关的隐藏跟显示, 正常网络请求使用的就不是这个了 + translate.visual.hideText.show(); + //console.log('隐藏 translate.visual.hideText.show();'); + } + }); + + + } + + + + + + }, + /*js translate.visual end*/ + + /* + 历史, 20250924 增加 + + */ + history: { + /* + 翻译文本相关,map的初始化在 translate.init() 中进行 + 只有当正常翻译且翻译完成(成功)的,才会记录到这里 + 比如 自定义忽略翻译文字 ‘你好’ ,元素的内容为 ‘你好世界’,它会将 你好、你好世界 这两个都加入进去 + */ + translateText: { + /* + 以翻译结果为 key 的 map + value: + original 翻译的原文 + */ + resultMap: null, + /* + 以翻译原文为 key 的 map + value: + result 翻译的结果 + */ + originalMap: null, + + /* + 加入一条翻译记录 + */ + add: function (original, result) { + //console.log(original +' - '+result); + translate.history.translateText.resultMap.set(result, original); + translate.history.translateText.originalMap.set(original, result); + } + }, + + }, + + /* + 记录打印翻译执行的耗时情况 + */ + time: { + // 执行 translate.execute() 的时间相关 + execute: { + //true启用, false不启用,默认是不启用状态,不要直接调用,而是使用 translate.time.execute.start(); + isUse: false, + + /* + key: uuid ,也就是 每次 translate.execute() 都会创建一个uuid + value: 执行 translate.execute() 的耗时,分为几部分: + all: 总耗时,单位是毫秒,从触发 translate.execute() 到所有的接口请求渲染完毕的耗时 + + + */ + data: {}, + + /* + 启动耗时打印 + */ + start: function () { + if (translate.time.execute.isUse) { + //已经启动过了,不需要再启动了 + translate.log('translate.time.execute.start() 已经启动过了,不需要再启动了'); + } + + translate.time.execute.data.isUse = true; + + //翻译开始 + translate.lifecycle.execute.start.push(function (uuid, to) { + if (typeof (translate.time.execute.data[uuid]) == 'undefined') { + translate.time.execute.data[uuid] = {}; + } + translate.time.execute.data[uuid].startTime = new Date().getTime(); + }); + + //发起网络请求前 + translate.lifecycle.execute.translateNetworkBefore.push(function (data) { + translate.time.execute.data[data.uuid].translateNetworkBeforeTime = new Date().getTime(); + }); + + /* + //发起网络请求后 + translate.lifecycle.execute.translateNetworkAfter.push(function(data){ + translate.time.execute.data[data.uuid].translateNetworkBeforeTime = new Date().getTime(); + }); + */ + + //翻译完成(渲染全部语种都完成) + translate.lifecycle.execute.renderFinish.push(function (uuid, to) { + translate.time.execute.data[uuid].finishTime = new Date().getTime(); + translate.time.execute.data[uuid].allTime = translate.time.execute.data[uuid].finishTime - translate.time.execute.data[uuid].startTime; + + + /*** 取当前 translate.execute() 翻译,进行翻译的文本跟翻译的原语种 - start ***/ + var translateTexts = new Array(); //翻译的文本的数组,翻译的原文本 + var translateLanguages = new Array(); //翻译的语种数组 + + var queueValue = translate.nodeQueue[uuid]; + //console.log(queueValue); + for (var lang in translate.nodeQueue[uuid].list) { + if (!translate.nodeQueue[uuid].list.hasOwnProperty(lang)) { + continue; + } + if (typeof (lang) != 'string' || lang.length < 1) { + continue; + } + + translateLanguages.push(lang); + + for (var hash in translate.nodeQueue[uuid].list[lang]) { + if (!translate.nodeQueue[uuid].list[lang].hasOwnProperty(hash)) { + continue; + } + translateTexts.push(translate.nodeQueue[uuid].list[lang][hash].original); + } + + } + + //console.log(translateTexts) + //console.log(translateLanguages) + /*** 取当前 translate.execute() 翻译,进行翻译的文本跟翻译的原语种 - end ***/ + + translate.time.execute.data[uuid].translateLanguages = translateLanguages; + translate.time.execute.data[uuid].translateTexts = translateTexts; + + + translate.log('[time][translate.execute()] ' + translate.time.execute.data[uuid].allTime + 'ms ' + (typeof (translate.time.execute.data[uuid].translateNetworkBeforeTime) != 'undefined' ? '(search&cache ' + (translate.time.execute.data[uuid].translateNetworkBeforeTime - translate.time.execute.data[uuid].startTime) + 'ms)' : '') + (translateTexts.length > 0 ? (' , [' + translateLanguages + '] : (' + translateTexts.length + ')[' + translateTexts.slice(0, 3) + (translateTexts.length > 3 ? ', ...' : '') + ']') : '')); + }); + }, + + }, + + use: false, //true启用, false不启用,默认是不启用状态 + + + printTime: 0, //打印耗时大于这个的,默认是0,也就是全部打印。单位是毫秒。 比如设置为 100 ,则只打印耗时大于等于100毫秒的动作 + + /** + * 增加一条日志记录 + * functionName 触发调用此处log的方法名,传入如 translate.execute + * remark 备注文字,说明 + */ + log: function (remark) { + if (translate.time.use == false) { + return; + } + + var timestamp = new Date().getTime(); // 例如:1725053445123 + + var usetime = 0; //跟上一次记录的间隔耗时,单位是毫秒 + if (typeof (translate.time.temp_lasttime) != 'undefined') { + usetime = timestamp - translate.time.temp_lasttime; + } + translate.time.temp_lasttime = timestamp; + + if (usetime < translate.time.printTime) { + //不需要打印 + return; + } + + var functionName = ''; + try { + // 创建一个Error对象来获取调用栈 + var error = new Error(); + // 解析调用栈,获取调用者信息 + // 不同环境下调用栈的索引可能不同,这里做了兼容处理 + var stackLines = error.stack.split('\n'); + //console.log(stackLines); + var callerLine = stackLines[2] || stackLines[3]; // 兼容不同环境 + + // 从调用栈中提取方法名 + var functionMatch = callerLine.match(/at (\S+)/); + + if (functionMatch && functionMatch[1]) { + functionName = functionMatch[1]; + } + } catch (e) { + // 如果获取调用栈失败,使用原始log方法 + translate.log(e); + } + + functionName = functionName.replace('Object.', 'translate.'); + translate.log(functionName + '() ' + usetime + ' -> ' + remark); + } + + }, + + /* + 容错 + */ + faultTolerance: { + + // 优化文本节点创建的拦截逻辑 + // 在对 continew-admin-ui 框架进行适配时,发现有tip鼠标提示场景,而且是出现在table中的,一下就会出来十个,它的渲染跟 translate.listener.start(); 监听有几率会出现一直循环的情况,也就是 translate.listener.start(); 将文本翻译了,然后vue自动给渲染还原,然后 translate.listener.start(); 继续给翻译,造成性能损耗。这里就是处理这种情况的 + documentCreateTextNode: { + /* + 原本的 document.createTextNode + 如果不为null,则是已开启,也就是已经触发了 translate.faultTolerance.documentCreateTextNode.enable(); + 如果为null,则是未开启,有两种可能 + 1. 未触发 translate.faultTolerance.documentCreateTextNode.enable(); + 2. 触发了 translate.faultTolerance.documentCreateTextNode.disable(); + */ + originalCreateTextNode: null, + + /* + 发生改动操作的文本节点 + key: node + value: + */ + node: null, + + /* + 启用此容错的能力 + 如果触发此启用,那么会根据用户切换语言及设置,自动进行判定是否介入 + */ + use: function () { + if (translate.faultTolerance.documentCreateTextNode.node == null) { + translate.faultTolerance.documentCreateTextNode.node = new Map(); + } + + //当用户点击切换语言时触发 + translate.lifecycle.changeLanguage.push(function (to) { + if (translate.isTranslate(to)) { + //需要触发翻译 + translate.faultTolerance.documentCreateTextNode.enable(); + //console.log('translate.faultTolerance.documentCreateTextNode enable'); + } else { + //不在翻译,禁用,释放 + translate.faultTolerance.documentCreateTextNode.disable(); + //console.log('translate.faultTolerance.documentCreateTextNode disable'); + } + }); + + //当第一次打开页面执行翻译时,触发 + translate.lifecycle.execute.start.push(function (data) { + if (translate.executeNumber === 0) { + //console.log('这是打开页面后,第一次触发 translate.execute() ,因为translate.executeNumber 记录的是translate.execute() 执行完的次数。'); + if (translate.isTranslate(data.to)) { + //console.log('data to -->'+data.to); + //需要触发翻译 + translate.faultTolerance.documentCreateTextNode.enable(); + } + } + }); + }, + + /* + 启用 + 可多次调用,如果多次调用,第一次启用,之后的都会不做任何处理 + */ + enable: function () { + + //如果已开启,那就不需要再重复启用了 + if (translate.faultTolerance.documentCreateTextNode.originalCreateTextNode != null) { + return; + } + + + translate.faultTolerance.documentCreateTextNode.originalCreateTextNode = document.createTextNode; + document.createTextNode = function (text) { + var isTrans = false; //是否进行了翻译处理,true是 + var originalText = null; //原本要创建node的文本,如果 isTrans为true,这里才会赋予 + + if (translate.executeTriggerNumber > 0) { + //已经触发过翻译执行了,那么才会启用这个能力 + + if (typeof (text) === 'string' && text.length > 0) { + var textTranslateResult = translate.history.translateText.originalMap.get(text); + if (typeof (textTranslateResult) === 'string' && textTranslateResult.length > 0) { + // 直接更新text + originalText = text; + text = textTranslateResult; + //console.log('创建文本节点: '+textTranslateResult); + isTrans = true; + } + } + } + + // 创建文本节点 - 使用[text]数组代替arguments,使代码更明确和现代 + const textNode = translate.faultTolerance.documentCreateTextNode.originalCreateTextNode.call(this, text); + if (isTrans) { + //console.log(textNode); + translate.faultTolerance.documentCreateTextNode.node.set(textNode, { + originalText: originalText, + resultText: text + }); + //将其记录到 translate.node.data + translate.node.set(textNode, { + attribute: "", + originalText: originalText, + resultText: text, + translateTexts: {}, //这里因为直接从缓存中取的,没有走网络接口,所以这里直接空 + whole: true, + translateResults: { + [originalText]: 1 + }, + lastTranslateRenderTime: Date.now() + }); + + + } + + return textNode; + }; + }, + /* + 禁用。不再做任何处理,释放性能 + */ + disable: function () { + if (translate.faultTolerance.documentCreateTextNode.originalCreateTextNode != null) { + document.createTextNode = translate.faultTolerance.documentCreateTextNode.originalCreateTextNode; + translate.faultTolerance.documentCreateTextNode.originalCreateTextNode = null; + } + } + } + }, + + /* + 快速接入,在head中引入使用,它集成了 translate.execute() 进去 + + 需要提前做的: + //需要提前设置本地语种(当前网页的语种) + translate.language.setLocal('chinese_simplified'); + + 建议做的: + //设置机器翻译服务通道,相关说明参考 http://translate.zvo.cn/545867.html + translate.service.use('client.edge'); + + */ + quickUse: function () { + //网页打开时自动隐藏文字,翻译完成后显示译文 http://translate.zvo.cn/549731.html + translate.visual.webPageLoadTranslateBeforeHiddenText(); + + //启用翻译中的遮罩层 http://translate.zvo.cn/407105.html + translate.progress.api.startUITip(); + + //开启页面元素动态监控,js改变的内容也会被翻译,参考文档: http://translate.zvo.cn/4067.html + translate.listener.start(); + + //网页ajax请求触发自动翻译 http://translate.zvo.cn/4086.html + translate.request.listener.start(); + + //url参数后可以加get方式传递 language 参数的方式控制当前网页以什么语种显示 http://translate.zvo.cn/4075.html + translate.language.setUrlParamControl(); + + //本地语种也进行强制翻译 http://translate.zvo.cn/289574.html + translate.language.translateLocal = true; + + //元素的内容整体翻译能力配置 ,提高翻译的语义 https://translate.zvo.cn/4078.html + translate.whole.enableAll(); + + //dom加载完毕后立即触发翻译 + document.addEventListener('DOMContentLoaded', function () { + translate.execute();//完成翻译初始化,进行翻译 + + setTimeout(function () { + translate.execute();//完成翻译初始化,进行翻译 + }, 500); + setTimeout(function () { + translate.execute();//完成翻译初始化,进行翻译 + }, 2000); + }); + + }, + + /*js translate.recycle start*/ + /* + 自动回收 translate.js 本身记录的相关信息,避免某些页面有循环触发,停留页面过长导致数据持续堆积 + + translate.nodeQueue + translate.node.data + + */ + recycle: function () { + var currentTime = new Date().getTime(); //当前时间 + //var before_second = 120; //要删除往前多少秒的数据 + + + /*** translate.nodeQueue ****/ + var nodeQueueDeleteArray = []; //要删除的nodeQueue,其中存储的是 uuid + for (var uuid in translate.nodeQueue) { + if (!translate.nodeQueue.hasOwnProperty(uuid)) { + continue; + } + var expireTime = translate.nodeQueue[uuid].expireTime; + if (expireTime + 120 < currentTime) { + nodeQueueDeleteArray.push(uuid); + } + } + for (var qi = 0; qi < nodeQueueDeleteArray.length; qi++) { + delete translate.nodeQueue[nodeQueueDeleteArray[qi]]; + //console.log('delete nodeQueue -> '+nodeQueueDeleteArray[qi]); + } + + + /*** translate.node.data ****/ + translate.node.refresh(); + + /*** translate.time.execute.data ****/ + var timeExecuteDeleteArray = []; //要删除的,其中存储的是 uuid + for (var uuid in translate.time.execute.data) { + if (!translate.time.execute.data.hasOwnProperty(uuid)) { + continue; + } + if (typeof (translate.time.execute.data[uuid].finishTime) == 'undefined') { + //还没执行完 + continue; + } + var finishTime = translate.time.execute.data[uuid].finishTime; + if (finishTime + 120 < currentTime) { + timeExecuteDeleteArray.push(uuid); + } + } + for (var ti = 0; ti < timeExecuteDeleteArray.length; ti++) { + delete translate.time.execute.data[timeExecuteDeleteArray[ti]]; + //console.log('delete translate.time.execute.data -> '+timeExecuteDeleteArray[ti]); + } + + + + }, + /*js translate.recycle end*/ + + /*js translate.init start*/ + /* + 初始化,如版本检测、初始数据加载、map声明、监听启动 等 + 会自动在 translate.js 加载完自动触发执行 + */ + init: function () { + + // 确保初始化只进行一次 + if (typeof (translate.init_execute) != 'undefined') { + return; + } + translate.init_execute = '已进行'; + + //初始化 translate.node.data + if (translate.node.data == null) { + translate.node.data = new Map(); + } + //初始化 历史 + if (translate.history.translateText.resultMap == null) { + translate.history.translateText.resultMap = new Map(); + } + if (translate.history.translateText.originalMap == null) { + translate.history.translateText.originalMap = new Map(); + } + //语系相关 + if (translate.language.name == null) { + translate.language.generateLanguageNameObject(); + } + + //监听,当第一次触发 translate.execute() 时,执行 + translate.lifecycle.execute.start.push(function (uuid, to) { + //只在第一次触发时,才会做一些初始化 + if (typeof (translate.init_first_trigger_execute) != 'undefined') { + return; + } + translate.init_first_trigger_execute = 1; + + //将自定义术语加入 translate.history.translateTexts 中 + //console.log(translate.nomenclature.data); + for (var currentLanguage in translate.nomenclature.data) { + if (!translate.nomenclature.data.hasOwnProperty(currentLanguage)) { + continue; + } + for (var targetLanguage in translate.nomenclature.data[currentLanguage]) { + if (!translate.nomenclature.data[currentLanguage].hasOwnProperty(targetLanguage)) { + continue; + } + for (var originalText in translate.nomenclature.data[currentLanguage][targetLanguage]) { + if (!translate.nomenclature.data[currentLanguage][targetLanguage].hasOwnProperty(originalText)) { + continue; + } + translate.history.translateText.add(originalText, translate.nomenclature.data[currentLanguage][targetLanguage][originalText]); + } + } + } + //将忽略翻译的文本(固定的,非正则)加入 translate.history.translateTexts 中 + for (var ignore_i = 0; ignore_i < translate.ignore.text.length; ignore_i++) { + translate.history.translateText.add(translate.ignore.text[ignore_i], translate.ignore.text[ignore_i]); + } + + + + //进行判断,DOM是否加载完成了,如果未加载完成就触发了 translate.execute 执行,那么弹出警告提示 + if (document.readyState == 'loading') { + translate.log('WARNING : The dom triggered translate.exece() before it was fully loaded, which does not comply with usage standards. The execution of translate.exece() should be done after the DOM is loaded'); + translate.log('警告:DOM 在完全加载之前触发了 translate.execute() ,这不符合使用规范,容易出现异常。你应该检查一下你的代码,translate.execute() 的执行应该在DOM加载完成后'); + } + + + //translate.listener.start() 的触发。 + if (translate.listener.use == true && translate.listener.isStart == false) { + if (typeof (translate.listener.start) != 'undefined') { + translate.listener.addListener(); + } + } + + //translate.request.lilstener.start() 触发 + if (translate.request.listener.use == true && translate.request.listener.isStart == false) { + translate.request.listener.addListener(); + } + }); + + //产生的数据回收,避免一直扩大占用内存 + if (typeof (translate.recycle) != 'undefined') { + // 创建定时器,每1分钟执行一次 translate.recycle 进行清理数据存储 + setInterval(translate.recycle, 60 * 1000); + } + + }, + /*js translate.init end*/ + +} +/* + 将页面中的所有node节点,生成其在当前页面的唯一标识字符串uuid + 开源仓库: https://github.com/xnx3/nodeuuid.js + 原理: 当前节点的nodeName + 当前节点在父节点下,属于第几个 tagName ,然后追个向父级进行取,将node本身+父级+父父级+.... 拼接在一起 + 注意,如果动态添加一个节点到第一个,那么其他节点就会挤下去导致节点标记异常 +*/ +var nodeuuid = { + index: function (node) { + var parent = node.parentElement; + if (parent == null) { + return ''; + } + + var childs; + if (typeof (node.tagName) == 'undefined') { + //console.log('undefi'); + childs = parent.childNodes; + //console.log(Array.prototype.indexOf.call(childs, node)); + } else { + // 使用querySelectorAll()方法获取所有与node元素相同标签名的子节点 + //childs = parent.querySelectorAll(node.tagName); + + // 不使用querySelectorAll,手动遍历子节点来找到相同标签名的子节点 + childs = []; + var allChilds = parent.childNodes; + for (var i = 0; i < allChilds.length; i++) { + if (allChilds[i].tagName === node.tagName) { + childs.push(allChilds[i]); + } + } + } + var index = Array.prototype.indexOf.call(childs, node); + //console.log('--------'+node.tagName); + return node.nodeName + "" + (index + 1); + }, + uuid: function (node) { + var uuid = ''; + var n = node; + while (n != null) { + var id = nodeuuid.index(n); + //console.log(id); + if (id != '') { + if (uuid != '') { + uuid = '_' + uuid; + } + uuid = id + uuid; + } + //console.log(uuid) + n = n.parentElement; + } + return uuid; + } +} + + +/*js copyright-notice start*/ +//延迟触发,方便拦截自定义 +setTimeout(function () { + translate.log('------ translate.js ------\nTwo lines of js html automatic translation, page without change, no language configuration file, no API Key, SEO friendly! Open warehouse : https://github.com/xnx3/translate \n两行js实现html全自动翻译。 无需改动页面、无语言配置文件、无API Key、对SEO友好!完全开源,代码仓库:https://gitee.com/mail_osc/translate'); +}, 3000); +/*js copyright-notice end*/ + +//初始化 +try { + translate.init(); +} catch (e) { } + +/*js amd-cmd-commonjs start*/ +/*兼容 AMD、CMD、CommonJS 规范 - start*/ +/** + * 兼容 AMD、CMD、CommonJS 规范 + * node 环境使用:`npm i i18n-jsautotranslate` 安装包 + */ +; (function (root, factory) { + if (typeof define === 'function' && define.amd) { + define([], () => factory()); + } else if (typeof module === 'object' && module.exports) { + module.exports = factory(); + } else { + if (typeof (root) != 'undefined') { + root['translate'] = factory(); + } + } +})(this, function () { + return translate; +}); +/*兼容 AMD、CMD、CommonJS 规范 - end*/ +/*js amd-cmd-commonjs end*/ + +/** + * 导出 translate 到全局变量 + */ +if (typeof window !== 'undefined') { + window.translate = translate; +} +export default translate; \ No newline at end of file diff --git a/src/plugins/twikoo-scroll-protection.js b/src/plugins/twikoo-scroll-protection.js new file mode 100644 index 0000000..41d8dc8 --- /dev/null +++ b/src/plugins/twikoo-scroll-protection.js @@ -0,0 +1,350 @@ +/** + * 强力滚动保护脚本 + * 通过劫持 window.scrollTo 和相关滚动方法来阻止意外的滚动跳转 + * 专门解决 Twikoo 评论系统的滚动问题 + */ + +(() => { + // 保存原始的滚动方法 + const originalScrollTo = window.scrollTo; + const originalScrollBy = window.scrollBy; + const originalScrollIntoView = Element.prototype.scrollIntoView; + + // 滚动保护状态 + const scrollProtection = { + enabled: false, + allowedY: null, + startTime: 0, + duration: 0, + timeout: null, + }; + + // 检测是否为TOC导航触发的滚动 + function checkIsTOCNavigation() { + // 检查调用堆栈,看是否来自TOC组件 + const stack = new Error().stack; + if (stack && (stack.includes('handleAnchorClick') || stack.includes('TOC.astro'))) { + return true; + } + + // 检查最近是否有TOC点击事件 + if (window.tocClickTimestamp && Date.now() - window.tocClickTimestamp < 1000) { + return true; + } + + // 检查是否在TOC元素上 + const activeElement = document.activeElement; + if (activeElement && activeElement.closest('#toc, .table-of-contents')) { + return true; + } + + return false; + } + + // 启动滚动保护 + function enableScrollProtection(duration = 3000, currentY = null) { + scrollProtection.enabled = true; + scrollProtection.allowedY = + currentY !== null ? currentY : window.scrollY || window.pageYOffset; + scrollProtection.startTime = Date.now(); + scrollProtection.duration = duration; + + // 清除之前的定时器 + if (scrollProtection.timeout) { + clearTimeout(scrollProtection.timeout); + } + + // 设置保护结束时间 + scrollProtection.timeout = setTimeout(() => { + scrollProtection.enabled = false; + console.log("[强力滚动保护] 保护期结束"); + }, duration); + + console.log( + `[强力滚动保护] 启动保护 ${duration}ms,允许Y位置:`, + scrollProtection.allowedY, + ); + } + + // 检查滚动是否被允许 + function isScrollAllowed(x, y) { + if (!scrollProtection.enabled) { + return true; + } + + // 检查是否是TOC或MD导航触发的滚动 + const isTOCNavigation = checkIsTOCNavigation(); + if (isTOCNavigation) { + console.log('[强力滚动保护] 检测到TOC导航,允许滚动'); + return true; + } + + // 允许小幅度的滚动调整(±50像素) + const tolerance = 50; + const allowedY = scrollProtection.allowedY; + + if (Math.abs(y - allowedY) <= tolerance) { + return true; + } + + // 如果尝试滚动到顶部(y < 100)而当前位置在更下方,阻止 + if (y < 100 && allowedY > 100) { + console.log( + "[强力滚动保护] 阻止滚动到顶部,目标Y:", + y, + "允许Y:", + allowedY, + ); + return false; + } + + return true; + } + + // 劫持 window.scrollTo + window.scrollTo = (x, y) => { + // 处理参数为对象的情况 + if (typeof x === "object") { + const options = x; + x = options.left || 0; + y = options.top || 0; + } + + if (isScrollAllowed(x, y)) { + originalScrollTo.call(window, x, y); + } else { + console.log("[强力滚动保护] 阻止 scrollTo:", x, y); + // 如果被阻止,滚动到允许的位置 + originalScrollTo.call(window, x, scrollProtection.allowedY); + } + }; + + // 劫持 window.scrollBy + window.scrollBy = (x, y) => { + const currentY = window.scrollY || window.pageYOffset; + const targetY = currentY + y; + + if (typeof x === "object") { + const options = x; + x = options.left || 0; + y = options.top || 0; + } + + if (isScrollAllowed(x, targetY)) { + originalScrollBy.call(window, x, y); + } else { + console.log("[强力滚动保护] 阻止 scrollBy:", x, y); + } + }; + + // 劫持 Element.scrollIntoView + Element.prototype.scrollIntoView = function (options) { + if (!scrollProtection.enabled) { + originalScrollIntoView.call(this, options); + return; + } + + // 在保护期内,尝试阻止 scrollIntoView + const rect = this.getBoundingClientRect(); + const currentY = window.scrollY || window.pageYOffset; + const targetY = currentY + rect.top; + + if (isScrollAllowed(0, targetY)) { + originalScrollIntoView.call(this, options); + } else { + console.log("[强力滚动保护] 阻止 scrollIntoView"); + } + }; + + // 监听 Twikoo 相关的交互事件 + document.addEventListener( + "click", + (event) => { + const target = event.target; + + // 检查是否点击了TOC导航 + if (target.closest('#toc, .table-of-contents') && target.closest('a[href^="#"]')) { + window.tocClickTimestamp = Date.now(); + console.log('[强力滚动保护] 检测到TOC导航点击'); + return; // 不启动保护,允许TOC正常工作 + } + + // 检查是否点击了 Twikoo 相关元素 + if ( + target.closest("#tcomment") || + target.matches( + ".tk-action-icon, .tk-submit, .tk-cancel, .tk-preview, .tk-owo, .tk-admin, .tk-edit, .tk-delete, .tk-reply, .tk-expand", + ) || + target.closest( + ".tk-action-icon, .tk-submit, .tk-cancel, .tk-preview, .tk-owo, .tk-admin, .tk-edit, .tk-delete, .tk-reply, .tk-expand", + ) + ) { + // 立即启动保护 + enableScrollProtection(4000); // 增加保护时间到4秒 + console.log("[强力滚动保护] 检测到 Twikoo 交互,启动保护"); + } + + // 特别检查管理面板相关操作(包括关闭操作) + if ( + target.matches( + ".tk-admin-panel, .tk-admin-overlay, .tk-modal, .tk-dialog, .tk-admin-close, .tk-close", + ) || + target.closest( + ".tk-admin-panel, .tk-admin-overlay, .tk-modal, .tk-dialog, .tk-admin-close, .tk-close", + ) || + target.classList.contains("tk-admin") || + target.closest(".tk-admin") + ) { + enableScrollProtection(6000); // 管理面板操作保护更长时间 + console.log("[强力滚动保护] 检测到 Twikoo 管理面板操作,启动长期保护"); + } + + // 检查是否点击了遮罩层(通常用于关闭模态框) + if ( + target.classList.contains("tk-overlay") || + target.classList.contains("tk-mask") || + target.matches('[class*="overlay"]') || + target.matches('[class*="mask"]') || + target.matches('[class*="backdrop"]') + ) { + // 检查是否在 Twikoo 区域内 + const tcommentEl = document.querySelector("#tcomment"); + if ( + tcommentEl && + (target.closest("#tcomment") || tcommentEl.contains(target)) + ) { + enableScrollProtection(4000); + console.log("[强力滚动保护] 检测到 Twikoo 遮罩层点击,启动保护"); + } + } + }, + true, + ); // 使用捕获阶段 + + // 监听表单提交 + document.addEventListener( + "submit", + (event) => { + if (event.target.closest("#tcomment")) { + enableScrollProtection(4000); + console.log("[强力滚动保护] 检测到 Twikoo 表单提交,启动保护"); + } + }, + true, + ); + + // 监听键盘事件(特别是 ESC 键,用于关闭管理面板) + document.addEventListener( + "keydown", + (event) => { + if (event.key === "Escape" || event.keyCode === 27) { + // 检查是否在 Twikoo 区域内有活动的管理面板 + const tcommentEl = document.querySelector("#tcomment"); + if (tcommentEl) { + // 检查是否有可见的管理面板或模态框 + const adminPanel = tcommentEl.querySelector( + ".tk-admin-panel, .tk-modal, .tk-dialog, [class*='admin'], [class*='modal']", + ); + if (adminPanel && adminPanel.offsetParent !== null) { + // 面板可见,启动保护 + enableScrollProtection(3000); + console.log( + "[强力滚动保护] 检测到 ESC 键关闭 Twikoo 管理面板,启动保护", + ); + } + } + } + }, + true, + ); + + // 监听 DOM 变化,检测管理面板的关闭 + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.type === "childList" || mutation.type === "attributes") { + const target = mutation.target; + + // 检查是否是 Twikoo 相关的 DOM 变化 + if (target.closest && target.closest("#tcomment")) { + // 检查是否有元素被移除或隐藏(可能是面板关闭) + if ( + mutation.removedNodes.length > 0 || + (mutation.type === "attributes" && + mutation.attributeName === "style") + ) { + enableScrollProtection(2000); + console.log( + "[强力滚动保护] 检测到 Twikoo DOM 变化(可能是面板关闭),启动保护", + ); + } + } + } + }); + }); + + // 开始监听 DOM 变化 + if (document.body) { + observer.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ["style", "class"], + }); + } else { + document.addEventListener("DOMContentLoaded", () => { + observer.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ["style", "class"], + }); + }); + } + + // 提供全局接口 + window.scrollProtectionManager = { + enable: enableScrollProtection, + disable: () => { + scrollProtection.enabled = false; + if (scrollProtection.timeout) { + clearTimeout(scrollProtection.timeout); + } + console.log("[强力滚动保护] 手动停止保护"); + }, + isEnabled: () => scrollProtection.enabled, + getStatus: () => ({ ...scrollProtection }), + // 新增:强制保护模式(用于调试) + forceProtect: (duration = 10000) => { + enableScrollProtection(duration); + console.log(`[强力滚动保护] 强制保护模式启动 ${duration}ms`); + }, + // 新增:获取当前滚动位置 + getCurrentScroll: () => { + return { + x: window.scrollX || window.pageXOffset, + y: window.scrollY || window.pageYOffset, + }; + }, + // 新增:检测 Twikoo 状态 + checkTwikooStatus: () => { + const tcomment = document.querySelector("#tcomment"); + if (!tcomment) return { exists: false }; + + const adminPanels = tcomment.querySelectorAll( + ".tk-admin-panel, .tk-modal, .tk-dialog, [class*='admin'], [class*='modal']", + ); + const visiblePanels = Array.from(adminPanels).filter( + (panel) => panel.offsetParent !== null, + ); + + return { + exists: true, + adminPanelsCount: adminPanels.length, + visiblePanelsCount: visiblePanels.length, + hasVisiblePanels: visiblePanels.length > 0, + }; + }, + }; + + console.log("[强力滚动保护] 初始化完成"); +})(); \ No newline at end of file diff --git a/src/plugins/umami-share.js b/src/plugins/umami-share.js new file mode 100644 index 0000000..516079a --- /dev/null +++ b/src/plugins/umami-share.js @@ -0,0 +1,109 @@ +(function (global) { + const cacheKey = 'umami-share-cache'; + const cacheTTL = 3600_000; // 1h + + /** + * 获取网站统计数据 + * @param {string} baseUrl - Umami Cloud API基础URL + * @param {string} apiKey - API密钥 + * @param {string} websiteId - 网站ID + * @returns {Promise} 网站统计数据 + */ + async function fetchWebsiteStats(baseUrl, apiKey, websiteId) { + // 检查缓存 + const cached = localStorage.getItem(cacheKey); + if (cached) { + try { + const parsed = JSON.parse(cached); + if (Date.now() - parsed.timestamp < cacheTTL) { + return parsed.value; + } + } catch { + localStorage.removeItem(cacheKey); + } + } + + const currentTimestamp = Date.now(); + const statsUrl = `${baseUrl}/v1/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}`; + + const res = await fetch(statsUrl, { + headers: { + 'x-umami-api-key': apiKey + } + }); + + if (!res.ok) { + throw new Error('获取网站统计数据失败'); + } + + const stats = await res.json(); + + // 缓存结果 + localStorage.setItem(cacheKey, JSON.stringify({ timestamp: Date.now(), value: stats })); + + return stats; + } + + /** + * 获取特定页面的统计数据 + * @param {string} baseUrl - Umami Cloud API基础URL + * @param {string} apiKey - API密钥 + * @param {string} websiteId - 网站ID + * @param {string} urlPath - 页面路径 + * @param {number} startAt - 开始时间戳 + * @param {number} endAt - 结束时间戳 + * @returns {Promise} 页面统计数据 + */ + async function fetchPageStats(baseUrl, apiKey, websiteId, urlPath, startAt = 0, endAt = Date.now()) { + const statsUrl = `${baseUrl}/v1/websites/${websiteId}/stats?startAt=${startAt}&endAt=${endAt}&url=${encodeURIComponent(urlPath)}`; + + const res = await fetch(statsUrl, { + headers: { + 'x-umami-api-key': apiKey + } + }); + + if (!res.ok) { + throw new Error('获取页面统计数据失败'); + } + + return await res.json(); + } + + /** + * 获取 Umami 网站统计数据 + * @param {string} baseUrl - Umami Cloud API基础URL + * @param {string} apiKey - API密钥 + * @param {string} websiteId - 网站ID + * @returns {Promise} 网站统计数据 + */ + global.getUmamiWebsiteStats = async function (baseUrl, apiKey, websiteId) { + try { + return await fetchWebsiteStats(baseUrl, apiKey, websiteId); + } catch (err) { + throw new Error(`获取Umami统计数据失败: ${err.message}`); + } + }; + + /** + * 获取特定页面的 Umami 统计数据 + * @param {string} baseUrl - Umami Cloud API基础URL + * @param {string} apiKey - API密钥 + * @param {string} websiteId - 网站ID + * @param {string} urlPath - 页面路径 + * @param {number} startAt - 开始时间戳(可选) + * @param {number} endAt - 结束时间戳(可选) + * @returns {Promise} 页面统计数据 + */ + global.getUmamiPageStats = async function (baseUrl, apiKey, websiteId, urlPath, startAt, endAt) { + try { + return await fetchPageStats(baseUrl, apiKey, websiteId, urlPath, startAt, endAt); + } catch (err) { + throw new Error(`获取Umami页面统计数据失败: ${err.message}`); + } + }; + + global.clearUmamiShareCache = function () { + localStorage.removeItem(cacheKey); + }; +})(window); \ No newline at end of file diff --git a/src/styles/albums.css b/src/styles/albums.css new file mode 100644 index 0000000..811e58b --- /dev/null +++ b/src/styles/albums.css @@ -0,0 +1,246 @@ +/* + * 相册模块样式 + */ + + +/* 相册卡片动画 */ +.album-card { + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.album-card:hover { + translate: 0 -4px; +} + + +/* 照片网格布局 */ +.photo-gallery { + animation: fadeInUp 0.6s ease-out; +} + +.photo-item { + transition: all 0.3s ease; +} + + +/* 瀑布流布局优化 */ +.masonry-layout .photo-item { + page-break-inside: avoid; + break-inside: avoid; +} + + +/* 照片悬停效果 */ +.photo-container { + position: relative; + overflow: hidden; + border-radius: 0.5rem; +} + +.photo-image { + transition: transform 0.3s ease; + width: 100%; + height: 100%; + object-fit: cover; +} + +.photo-overlay { + position: absolute; + inset: 0; + background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent); + opacity: 0; + transition: opacity 0.3s ease; +} + +.photo-item:hover .photo-overlay { + opacity: 1; +} + +.photo-info { + translate: 0 100%; + transition: transform 0.3s ease; +} + +.photo-item:hover .photo-info { + translate: 0 0; +} + + +/* 灯箱样式 */ +.lightbox { + backdrop-filter: blur(8px); + z-index: 9999; +} + +.lightbox-content { + max-width: 95vw; + max-height: 95vh; +} + +.lightbox-image-container { + min-height: 60vh; +} + +#lightbox-image { + max-width: 100%; + max-height: 80vh; + object-fit: contain; + border-radius: 0.5rem; +} + + +/* 灯箱按钮 */ +.lightbox button { + backdrop-filter: blur(4px); + transition: all 0.2s ease; +} + +.lightbox button:hover { + background-color: rgba(0, 0, 0, 0.7); + scale: 1.05; +} + + +/* 灯箱信息面板 */ +#lightbox-info { + backdrop-filter: blur(8px); + border-radius: 0.5rem; + max-height: 30vh; + overflow-y: auto; +} + + +/* 响应式设计 */ +@media (max-width: 768px) { + .albums-grid { + grid-template-columns: 1fr; + } + + .masonry-layout { + columns: 1; + } + + .photo-gallery[data-columns="3"], + .photo-gallery[data-columns="4"] { + grid-template-columns: repeat(2, 1fr); + } + + .lightbox-content { + padding: 1rem; + } + + #lightbox-prev, + #lightbox-next { + width: 2.5rem; + height: 2.5rem; + } + + #lightbox-info { + position: static; + margin-top: 1rem; + } +} + +@media (max-width: 512px) { + .photo-gallery { + grid-template-columns: 1fr !important; + } + + .masonry-layout { + columns: 1; + } +} + + +/* 加载动画 */ +@keyframes fadeInUp { + from { + opacity: 0; + translate: 0 30px; + } + to { + opacity: 1; + translate: 0 0; + } +} + + +/* 图片懒加载占位符 */ +.photo-image[loading="lazy"] { + background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); + background-size: 200% 100%; + animation: loading 1.5s infinite; +} + +@keyframes loading { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } +} + + +/* 深色模式适配 */ +@media (prefers-color-scheme: dark) { + .photo-image[loading="lazy"] { + background: linear-gradient(90deg, #2a2a2a 25%, #1a1a1a 50%, #2a2a2a 75%); + background-size: 200% 100%; + } +} + + +/* 标签筛选动画 */ +.album-filter-tag { + position: relative; + overflow: hidden; +} + +.album-filter-tag::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s; +} + +.album-filter-tag:hover::before { + left: 100%; +} + + +/* 相册卡片内容对齐 */ +.album-card .p-4 { + display: flex; + flex-direction: column; + height: 100%; +} + +.album-card h3 { + flex-grow: 1; +} + + +/* 打印样式 */ +@media print { + .lightbox, + .album-filter-tag, + button { + display: none !important; + } + + .photo-gallery { + display: block !important; + columns: 2; + column-gap: 1rem; + } + + .photo-item { + break-inside: avoid; + margin-bottom: 1rem; + } +} \ No newline at end of file diff --git a/src/styles/anime.css b/src/styles/anime.css new file mode 100644 index 0000000..02ffee7 --- /dev/null +++ b/src/styles/anime.css @@ -0,0 +1,361 @@ +@reference "tailwindcss"; + +/* 追番页面专用样式 - 使用页面特定的选择器避免全局影响 */ + +/* 只在包含 anime-page 类的页面中应用这些样式 */ +.anime-page .anime-header { + background: var(--card-bg); + border: 1px solid var(--line-divider); + position: relative; + backdrop-filter: blur(10px); +} + +/* 统计卡片样式 */ +.anime-page .stat-card { + @apply bg-white/50 dark:bg-white/5 backdrop-blur-xs rounded-xl p-4 flex items-center gap-3 transition-all duration-300 hover:scale-105 hover:shadow-lg; + border: 1px solid var(--line-divider); + background: linear-gradient(135deg, var(--card-bg) 0%, var(--card-bg-transparent) 100%); +} + +.anime-page .stat-card:hover { + translate: 0 -2px; + scale: 1.02; + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); +} + +.anime-page .stat-icon { + @apply w-12 h-12 rounded-lg flex items-center justify-center text-white text-xl font-bold shadow-md; + background: linear-gradient(135deg, var(--primary), oklch(from var(--primary) calc(l + 0.1) c calc(h + 30))); +} + +.anime-page .stat-content { + @apply flex-1; +} + +.anime-page .stat-number { + @apply text-2xl font-bold text-black/90 dark:text-white/90; + background: linear-gradient(135deg, var(--primary), oklch(from var(--primary) calc(l + 0.1) c calc(h + 30))); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.anime-page .stat-label { + @apply text-sm text-black/75 dark:text-white/75; +} + +/* 动漫网格布局 */ +.anime-page .anime-grid { + @apply grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6; +} + +/* 动漫卡片样式 */ +.anime-page .anime-card { + @apply relative overflow-hidden transition-all duration-500 hover:scale-[1.02]; + background: var(--card-bg); + border: 1px solid var(--line-divider); + border-radius: var(--radius-large); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); + backdrop-filter: blur(10px); +} + +.anime-page .anime-card:hover { + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); + border-color: var(--primary); +} + +.anime-page .anime-card-inner { + @apply p-0; +} + +/* 封面容器 */ +.anime-page .anime-cover-container { + @apply relative overflow-hidden; + aspect-ratio: 16/9; + background: linear-gradient(135deg, var(--primary)/10, var(--primary)/5); +} + +.anime-page .anime-cover-link { + @apply block w-full h-full relative overflow-hidden; +} + +.anime-page .anime-cover { + @apply w-full h-full object-cover transition-all duration-700; + filter: brightness(0.9) contrast(1.1); +} + +.anime-page .anime-cover-link:hover .anime-cover { + @apply scale-110; +} + +.anime-page .anime-cover-overlay { + @apply absolute inset-0 bg-linear-to-t from-black/60 via-transparent to-transparent opacity-0 transition-all duration-500 flex items-center justify-center; +} + +.anime-page .anime-cover-link:hover .anime-cover-overlay { + @apply opacity-100; +} + +.anime-page .play-button { + @apply w-16 h-16 rounded-full bg-white/20 backdrop-blur-xs flex items-center justify-center text-white scale-75 transition-all duration-500; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); +} + +.anime-page .anime-cover-link:hover .play-button { + @apply scale-100; +} + +.anime-page .play-button:hover { + background: var(--primary); + scale: 1.1; +} + +/* 状态标签 */ +.anime-page .anime-status { + @apply absolute top-3 left-3 px-3 py-1 rounded-full text-xs font-medium flex items-center gap-1 backdrop-blur-xs; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +.anime-page .status-icon { + @apply text-xs; +} + +.anime-page .status-text { + @apply font-medium; +} + +/* 评分标签 */ +.anime-page .anime-rating { + @apply absolute top-3 right-3 bg-black/50 backdrop-blur-xs text-white px-2 py-1 rounded-full text-sm flex items-center gap-1; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); +} + +.anime-page .rating-text { + @apply font-medium; +} + +/* 内容区域 */ +.anime-page .anime-content { + @apply p-6; + background: linear-gradient(to bottom, transparent, var(--card-bg)/50); +} + +.anime-page .anime-title { + @apply text-xl font-bold text-black/90 dark:text-white/90 mb-2; + background: linear-gradient(135deg, var(--deep-text), var(--primary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.anime-page .anime-description { + @apply text-black/75 dark:text-white/75 text-sm mb-4; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +/* 进度条 */ +.anime-page .anime-progress { + @apply mb-4; +} + +.anime-page .progress-info { + @apply flex justify-between items-center mb-2 text-sm; +} + +.anime-page .progress-text { + @apply text-black/75 dark:text-white/75 font-medium; +} + +.anime-page .progress-percent { + @apply text-(--primary) font-bold; +} + +.anime-page .progress-bar { + @apply w-full h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden; + background: linear-gradient(90deg, var(--btn-regular-bg), var(--btn-regular-bg-hover)); +} + +.anime-page .progress-fill { + @apply h-full transition-all duration-1000 ease-out; + background: linear-gradient(90deg, var(--primary), oklch(from var(--primary) calc(l + 0.1) c calc(h + 30))); + box-shadow: 0 0 10px var(--primary)/50; +} + +/* 元信息 */ +.anime-page .anime-meta { + @apply space-y-2 text-sm; +} + +.anime-page .meta-row { + @apply flex items-center justify-between; +} + +.anime-page .meta-label { + @apply text-black/50 dark:text-white/50 font-medium; +} + +.anime-page .meta-value { + @apply text-black/75 dark:text-white/75; +} + +.anime-page .genre-tags { + @apply flex gap-1 flex-wrap; +} + +.anime-page .genre-tag { + @apply px-2 py-1 bg-(--btn-regular-bg) text-black/75 dark:text-white/75 rounded-md text-xs font-medium transition-all duration-300 hover:bg-(--primary) hover:text-white; + border: 1px solid var(--line-divider); +} + +.anime-page .genre-tag:hover { + translate: 0 -1px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +/* 响应式调整 */ +@media (max-width: 768px) { + .anime-page .anime-grid { + @apply grid-cols-1; + } + + .anime-page .stat-card { + @apply p-3; + } + + .anime-page .stat-icon { + @apply w-10 h-10 text-lg; + } + + .anime-page .stat-number { + @apply text-xl; + } + + .anime-page .anime-content { + @apply p-4; + } + + .anime-page .anime-title { + @apply text-lg; + } +} + +/* 暗色主题优化 */ +:root.dark .anime-page .anime-card { + @apply shadow-lg shadow-black/20; + background: linear-gradient(135deg, var(--card-bg), var(--card-bg-transparent)); +} + +:root.dark .anime-page .anime-cover-overlay { + @apply bg-linear-to-t from-black/80 via-black/20 to-transparent; +} + +:root.dark .anime-page .stat-card { + background: linear-gradient(135deg, var(--card-bg)/80, var(--card-bg-transparent)); + border-color: var(--line-divider); +} + +/* 动画效果 */ +.anime-page .anime-card { + animation: fadeInUp 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards; + opacity: 0; + translate: 0 30px; +} + +.anime-page .anime-card:nth-child(1) { animation-delay: 0.1s; } +.anime-page .anime-card:nth-child(2) { animation-delay: 0.2s; } +.anime-page .anime-card:nth-child(3) { animation-delay: 0.3s; } +.anime-page .anime-card:nth-child(4) { animation-delay: 0.4s; } +.anime-page .anime-card:nth-child(5) { animation-delay: 0.5s; } +.anime-page .anime-card:nth-child(6) { animation-delay: 0.6s; } + +@keyframes fadeInUp { + from { + opacity: 0; + translate: 0 30px; + scale: 0.95; + } + to { + opacity: 1; + translate: 0 0; + scale: 1; + } +} + +/* 统计卡片动画 */ +.anime-page .stat-card { + animation: slideInLeft 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards; + opacity: 0; + translate: -30px 0; +} + +.anime-page .stat-card:nth-child(1) { animation-delay: 0.1s; } +.anime-page .stat-card:nth-child(2) { animation-delay: 0.2s; } +.anime-page .stat-card:nth-child(3) { animation-delay: 0.3s; } +.anime-page .stat-card:nth-child(4) { animation-delay: 0.4s; } + +@keyframes slideInLeft { + from { + opacity: 0; + translate: -30px 0; + } + to { + opacity: 1; + translate: 0 0; + } +} + +/* 特殊效果 */ +.anime-page .anime-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 1px; + background: linear-gradient(90deg, transparent, var(--primary), transparent); + opacity: 0; + transition: opacity 0.3s ease; +} + +.anime-page .anime-card:hover::before { + opacity: 1; +} + +/* 毛玻璃效果增强 */ +.anime-page .anime-header, +.anime-page .stat-card, +.anime-page .anime-card { + backdrop-filter: blur(20px) saturate(180%); + -webkit-backdrop-filter: blur(20px) saturate(180%); +} + +/* 渐变边框效果 */ +.anime-page .anime-card { + position: relative; + background: var(--card-bg); +} + +.anime-page .anime-card::after { + content: ''; + position: absolute; + inset: 0; + padding: 1px; + background: linear-gradient(135deg, var(--primary)/20, transparent, var(--primary)/20); + border-radius: inherit; + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask-composite: xor; + -webkit-mask-composite: xor; + opacity: 0; + transition: opacity 0.3s ease; +} + +.anime-page .anime-card:hover::after { + opacity: 1; +} \ No newline at end of file diff --git a/src/styles/banner.css b/src/styles/banner.css new file mode 100644 index 0000000..806f9ed --- /dev/null +++ b/src/styles/banner.css @@ -0,0 +1,483 @@ +/* + * Banner 组件样式 + * Banner Component Styles + * 包含 Banner 模式下的所有响应式样式和动画效果 + */ + +/** + * 基础样式 + */ + +/* 淡入上移动画 */ +@keyframes fadeInUp { + from { + opacity: 0; + translate: 0 30px; + } + to { + opacity: 1; + translate: 0 0; + } +} + +/* 初始加载中且未开始恢复时,高度归零;退出 Banner 模式时,高度归零 */ +html.is-loading:not(.banner-restoring) #banner-wrapper, +html.banner-transitioning #banner-wrapper, +html.banner-hiding #banner-wrapper { + height: 0 !important; +} + +/* 退出动画时,强制子组件同步上移,避免主内容区域出现“两段式”位移 */ +html.banner-hiding #main-grid { + translate: none !important; +} +html.banner-hiding #top-row { + height: 0 !important; +} +html.banner-hiding #sidebar-sticky { + top: 1rem !important; +} + +/* 切换模式时隐藏标题,以便后续触发动画 */ +html.banner-transitioning .banner-title, +html.banner-transitioning .banner-subtitle { + opacity: 0 !important; +} + +/* 标题样式 */ +.banner-title { + text-shadow: 0px 3px 12px rgba(0, 0, 0, 0.36), 0 0 24px color-mix(in srgb, var(--primary), transparent 48%); + font-weight: bold; + opacity: 0; +} +.banner-subtitle { + text-shadow: 0px 3px 6px rgba(0, 0, 0, 0.36), 0 0 12px color-mix(in srgb, var(--primary), transparent 48%); + opacity: 0; +} +/* 标题动画 */ +.show-initial-animation .banner-title, +.show-banner-animation .banner-title { + animation: fadeInUp 1s ease-out forwards; +} +.show-initial-animation .banner-subtitle, +.show-banner-animation .banner-subtitle { + animation: fadeInUp 1s ease-out 0.3s both; +} +/* 动画结束后的状态 */ +html:not(.is-loading):not(.show-initial-animation):not(.show-banner-animation) .banner-title, +html:not(.is-loading):not(.show-initial-animation):not(.show-banner-animation) .banner-subtitle { + opacity: 1; +} + +/* 页面背景平滑过渡(Fullscreen 与 Banner 模式切换时) */ +body { + transition: background-color 0.6s ease, background-image 0.6s ease; +} +html.is-wallpaper-transitioning body { + transition: background-color 0.6s ease, background-image 0.6s ease !important; +} + +/** + * + */ + + /* Ken Burns 效果 */ +@keyframes ken-burns { + from { + scale: 1.0; + translate: 0 0 0; + } + to { + scale: 1.2; + translate: 0 0 0; + } +} + +/* 桌面端 */ +@media (min-width: 1280px) { + .banner-text-overlay { + align-items: center !important; /* 垂直居中 */ + justify-content: center !important; /* 水平居中 */ + padding: 2rem !important; + text-align: center !important; /* 文字居中对齐 */ + } + .banner-text-overlay > div { + margin-bottom: 0 !important; + width: 75% !important; + text-align: center !important; /* 确保文字居中 */ + } + + /* 确保轮播容器有正确的 overflow 设置 */ + #banner-carousel { + overflow: hidden !important; + } + /* 图片容器 */ + .carousel-item img, + #banner img { + object-position: center center !important; /* 确保图片居中显示 */ + transition: transform 1.2s ease-out !important; + } + /* 轮播图片过渡 */ + .carousel-item { + transition: opacity 1.2s ease-in-out !important; + } + .carousel-item.ken-burns-enabled { + transform-origin: center center !important; /* 确保缩放从中心开始 */ + scale: 1.0; + translate: 0 0 0; + } + .carousel-item.ken-burns-enabled.is-animating { + animation: ken-burns 12s linear forwards !important; + } + .carousel-item:not(.ken-burns-enabled) { + scale: 1.0; + translate: 0 0 0; /* 取消默认缩放 */ + } + /* 当前图片缩放效果 */ + .carousel-item.opacity-100 { + opacity: 1 !important; + } + /* 非当前图片缩放效果 */ + .carousel-item.opacity-0 { + opacity: 0 !important; + } +} + + +/* 移动端轮播图片 */ +@media (max-width: 1279px) { + /* 确保轮播容器有正确的 overflow 设置 */ + #banner-carousel { + overflow: hidden !important; + } + /* 图片容器 */ + .carousel-item img, + #banner img { + object-position: center center !important; /* 确保图片居中显示 */ + transition: transform 1.2s ease-out !important; + } + /* 轮播图片过渡 */ + .carousel-item { + transition: opacity 1.2s ease-in-out !important; + } + .carousel-item.ken-burns-enabled { + transform-origin: center center !important; /* 确保缩放从中心开始 */ + scale: 1.0; + } + .carousel-item.ken-burns-enabled.is-animating { + animation: ken-burns 12s linear forwards !important; + } + .carousel-item:not(.ken-burns-enabled) { + scale: 1.0; /* 取消默认缩放 */ + } + /* 当前图片缩放效果 */ + .carousel-item.opacity-100 { + opacity: 1 !important; + } + /* 非当前图片缩放效果 */ + .carousel-item.opacity-0 { + opacity: 0 !important; + } +} + +/* 移动端 banner 性能 */ +@media (max-width: 1279px) { + .banner-container { + /* 启用硬件加速 */ + translate: 0 0 0; + will-change: transform, opacity; + /* 渲染性能 */ + contain: layout style paint; + /* 减少重绘 */ + backface-visibility: hidden; + -webkit-backface-visibility: hidden; + } + /* 图片 */ + .banner-container img { + /* 图片渲染 */ + image-rendering: -webkit-optimize-contrast; + image-rendering: crisp-edges; + /* 防止图片拖拽 */ + -webkit-user-drag: none; + -khtml-user-drag: none; + -moz-user-drag: none; + -o-user-drag: none; + /* 触摸 */ + pointer-events: none; + } + + .banner-text-overlay { + /* 文字渲染 */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; + /* 减少重排 */ + contain: layout style; + } + + .carousel-item.ken-burns-enabled { + /* 硬件加速与缩放维持 */ + scale: 1.0; + translate: 0 0 0; + will-change: transform, opacity; + /* 触摸响应 */ + touch-action: pan-y; + -webkit-touch-callout: none; + -webkit-user-select: none; + user-select: none; + } + .carousel-item:not(.ken-burns-enabled) { + scale: 1.0; + translate: 0 0 0; + will-change: transform, opacity; + /* 触摸响应 */ + touch-action: pan-y; + -webkit-touch-callout: none; + -webkit-user-select: none; + user-select: none; + } + + /* 轮播指示器 */ + .carousel-indicators { + position: absolute; + bottom: 20px; + left: 50%; + translate: -50% 0; + display: flex; + gap: 8px; + z-index: 10; + } + + .carousel-indicator { + width: 8px; + height: 8px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.5); + transition: all 0.3s ease; + cursor: pointer; + } + .carousel-indicator.active { + background: rgba(255, 255, 255, 0.9); + scale: 1.2; + } +} + +/* 移动端暗色模式 */ +@media (max-width: 1279px) and (prefers-color-scheme: dark) { + .banner-text-overlay { + background: linear-gradient( + to top, + rgba(0, 0, 0, 0.8) 0%, + rgba(0, 0, 0, 0.4) 50%, + transparent 100% + ); + } +} + +/* 移动端横屏 */ +@media (max-width: 1279px) and (orientation: landscape) { + .banner-text-overlay { + padding: 1rem 1.5rem; + align-items: center !important; /* 垂直居中 */ + justify-content: center !important; /* 水平居中 */ + text-align: center !important; /* 文字居中对齐 */ + } + + .banner-title { + font-size: 2.2rem !important; /* 增大字体大小 */ + line-height: 1.3; + } + + .banner-subtitle { + font-size: 0.9rem; + margin-top: 0.5rem; + } +} + +/* 平板 */ +@media (min-width: 768px) and (max-width: 1279px) { + /* 横幅文本覆盖层 */ + .banner-text-overlay { + align-items: center !important; /* 垂直居中 */ + justify-content: center !important; /* 水平居中 */ + padding: 2rem !important; + text-align: center !important; /* 文字居中对齐 */ + } + /* 文本容器 */ + .banner-text-overlay > div { + margin-bottom: 0 !important; /* 移除底部边距,保持居中 */ + width: 85% !important; + text-align: center !important; /* 确保文字居中 */ + } + + /* 标题文本 */ + .banner-title { + font-size: 4rem !important; + line-height: 1.1 !important; + margin-bottom: 1rem !important; + } + + /* 副标题文本 */ + .banner-subtitle { + font-size: 1.5rem !important; + line-height: 1.4 !important; + } +} + +/* 中屏手机 */ +@media (min-width: 513px) and (max-width: 768px) { + /* 横幅文本覆盖层 */ + .banner-text-overlay { + align-items: center !important; /* 垂直居中 */ + justify-content: center !important; /* 水平居中 */ + padding: 1.5rem !important; + text-align: center !important; /* 文字居中对齐 */ + } + /* 文本容器 */ + .banner-text-overlay > div { + margin-bottom: 0 !important; /* 移除底部边距,保持居中 */ + width: 90% !important; + text-align: center !important; /* 确保文字居中 */ + } + + /* 标题文本 */ + .banner-title { + font-size: 3.8rem !important; /* 增大字体大小 */ + line-height: 1.1 !important; + margin-bottom: 0.75rem !important; + } + + /* 副标题文本 */ + .banner-subtitle { + font-size: 1.125rem !important; + line-height: 1.4 !important; + } +} + +/* 小屏手机 */ +@media (max-width: 512px) { + /* 横幅文本覆盖层 */ + .banner-text-overlay { + align-items: center !important; /* 垂直居中 */ + justify-content: center !important; /* 水平居中 */ + padding: 1rem !important; + text-align: center !important; /* 文字居中对齐 */ + } + /* 文本容器 */ + .banner-text-overlay > div { + margin-bottom: 0 !important; /* 移除底部边距,保持居中 */ + width: 95% !important; /* 增加文本宽度利用率 */ + text-align: center !important; /* 确保文字居中 */ + } + + /* 标题文本 */ + .banner-title { + font-size: 3.2rem !important; /* 增大字体大小 */ + line-height: 1.1 !important; + margin-bottom: 0.5rem !important; + } + + /* 副标题文本 */ + .banner-subtitle { + font-size: 1rem !important; + line-height: 1.3 !important; + } +} + +/** + * 波浪 + */ + + /* 波浪动画 */ +@keyframes wave { + 0% { + translate: -90px 0 0; + } + 100% { + translate: 85px 0 0; + } +} + +/* 波浪与背景同步切换 */ +#header-waves { + /* 确保波浪容器与页面背景在同一合成层 */ + isolation: isolate; + /* 优化渲染性能 - 移除 strict containment 改用 none */ + contain: none; + /* 精确对齐 */ + margin-bottom: -1px; +} + +/* 统一波浪动画 */ +#header-waves .parallax use { + animation-name: wave; + animation-duration: 25s; + animation-timing-function: cubic-bezier(0.5, 0.5, 0.45, 0.5); + animation-iteration-count: infinite; + transform: translateZ(0); + will-change: transform; + backface-visibility: hidden; +} +/* 分层动画时序(替代内联 style) */ +#header-waves .parallax use:nth-child(1) { + animation-duration: 7s; + animation-delay: -2s; +} +#header-waves .parallax use:nth-child(2) { + animation-duration: 10s; + animation-delay: -3s; +} +#header-waves .parallax use:nth-child(3) { + animation-duration: 13s; + animation-delay: -4s; +} +#header-waves .parallax use:nth-child(4) { + animation-duration: 20s; + animation-delay: -5s; +} + +#header-waves .waves { + /* 确保 SVG 完整渲染(svg 本身即为 .waves) */ + width: 100%; + height: 100%; + display: block; + /* 确保水波纹完整显示 */ + overflow: visible; + z-index: 5; + /* 硬件加速,确保与背景同步渲染 */ + transform: translateZ(0); + will-change: transform; + backface-visibility: hidden; + /* 优化渲染性能 - 移除 strict containment 改用 none */ + contain: none; +} + +/* 波浪填充色主题切换 */ +#header-waves .waves use { + /* 确保填充色与页面背景同步更新 */ + will-change: fill; +} + +/* 主题切换时的额外保护 */ +.theme-changing #header-waves, +.theme-changing #header-waves svg, +.theme-changing #header-waves use { + /* 在主题切换期间禁用所有可能的渲染延迟 */ + will-change: auto; + transform: translateZ(0); + backface-visibility: hidden; +} + +/* 移动端水波纹特殊 */ +@media (max-width: 1023px) { + #header-waves { + /* 确保水波纹容器不被裁剪 */ + overflow: visible; + z-index: 5; + } + + #header-waves .waves { + /* 移动端SVG */ + min-height: 60px; + } +} \ No newline at end of file diff --git a/src/styles/expressive-code.css b/src/styles/expressive-code.css new file mode 100644 index 0000000..9214097 --- /dev/null +++ b/src/styles/expressive-code.css @@ -0,0 +1,11 @@ +@reference "tailwindcss"; + +.expressive-code { + .frame { + @apply shadow-none!; + } + + .title { + font-family: "JetBrains Mono Variable", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + } +} \ No newline at end of file diff --git a/src/styles/fancybox.css b/src/styles/fancybox.css new file mode 100644 index 0000000..30e6a0a --- /dev/null +++ b/src/styles/fancybox.css @@ -0,0 +1,121 @@ +/** + * Fancybox 自定义样式 + */ + +.fancybox__container { + --fancybox-bg: rgba(0, 0, 0, 0.9); + --fancybox-thumbs-width: 64px; + --fancybox-thumbs-ratio: 1; + --fancybox-thumbs-border-radius: 4px; +} + +.fancybox__toolbar { + background: linear-gradient(to bottom, rgba(0, 0, 0, 0.7), transparent); + padding: 8px; + backdrop-filter: blur(4px); +} + +.fancybox__caption { + background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent); + color: white; + font-size: 1rem; + padding: 1rem; + text-align: center; + backdrop-filter: blur(4px); + border-radius: 8px; + margin: 0 1rem 1rem 1rem; +} + +.fancybox__nav { + --carousel-button-svg-width: 24px; + --carousel-button-svg-height: 24px; +} + +.fancybox__thumbs { + background: rgba(0, 0, 0, 0.7); + padding: 2px; + border-radius: 8px; + backdrop-filter: blur(4px); +} + +.fancybox__thumb { + border-radius: 4px; + overflow: hidden; + border: 2px solid transparent; + transition: all 0.2s ease; +} +.fancybox__thumb.is-loading { + background: rgba(255, 255, 255, 0.1); +} +.fancybox__thumb:hover { + border-color: rgba(255, 255, 255, 0.5); + scale: 1.05; +} +.fancybox__thumb.is-active { + border-color: #fff; +} + +.fancybox__button { + background: rgba(0, 0, 0, 0.5); + border-radius: 50%; + width: 44px; + height: 44px; + transition: all 0.2s ease; + backdrop-filter: blur(4px); + border: 1px solid rgba(255, 255, 255, 0.1); +} +.fancybox__button:hover { + background: rgba(0, 0, 0, 0.7); + scale: 1.1; + border-color: rgba(255, 255, 255, 0.3); +} +.fancybox__button svg { + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.5)); +} + +.fancybox__infobar { + color: white; + font-size: 0.9rem; + padding: 0 8px; +} + +/** + * 响应式设计 + */ + +@media (max-width: 768px) { + .fancybox__toolbar { + padding: 4px; + } + + .fancybox__button { + width: 36px; + height: 36px; + } + + .fancybox__caption { + font-size: 0.9rem; + padding: 0.5rem; + margin: 0 0.5rem 0.5rem 0.5rem; + } + + .fancybox__thumbs { + --fancybox-thumbs-width: 48px; + } +} + +@media (max-width: 480px) { + .fancybox__button { + width: 32px; + height: 32px; + } + + .fancybox__caption { + font-size: 0.8rem; + padding: 0.4rem; + } + + .fancybox__thumbs { + --fancybox-thumbs-width: 40px; + } +} \ No newline at end of file diff --git a/src/styles/grid.css b/src/styles/grid.css new file mode 100644 index 0000000..133bdd3 --- /dev/null +++ b/src/styles/grid.css @@ -0,0 +1,71 @@ +/* 当banner被禁用时的布局样式 */ +.no-banner-layout { + top: 5.5rem !important; + min-height: calc(100vh - 5.5rem) !important; +} + +/* 隐藏已收起横幅或非横幅模式时的图片版权描述 */ +.no-banner-layout #banner-credit { + display: none !important; +} + + +/* 手机端无侧边栏布局优化 */ +@media (max-width: 768px) { + .mobile-no-sidebar { + display: block !important; + width: 100% !important; + } + .mobile-no-sidebar main { + width: 100% !important; + max-width: 100% !important; + margin: 0 !important; + padding-left: 0 !important; + padding-right: 0 !important; + } + .mobile-no-sidebar #content-wrapper { + width: 100% !important; + max-width: 100% !important; + margin: 0 !important; + } + + /* 修复双侧边栏模式在移动端的布局问题 */ + .mobile-both-sidebar { + /* 确保在移动端使用单列布局 */ + grid-template-columns: 1fr !important; + /* 确保左右padding对称 */ + padding-left: 1rem !important; + padding-right: 1rem !important; + } + /* 确保移动端主内容区域居中且全宽 */ + .mobile-both-sidebar main { + grid-column: 1 / -1 !important; + width: 100% !important; + margin: 0 auto !important; + } + /* 移动端footer也要居中 */ + .mobile-both-sidebar .footer { + grid-column: 1 / -1 !important; + } +} + +/* 小屏手机无侧边栏布局优化 */ +@media (max-width: 512px) {/* 修复双侧边栏模式在移动端的布局问题 */ + .mobile-both-sidebar { + /* 确保在移动端使用单列布局 */ + grid-template-columns: 1fr !important; + /* 确保左右padding对称 */ + padding-left: 0.75rem !important; + padding-right: 0.75rem !important; + } + /* 确保移动端主内容区域居中且全宽 */ + .mobile-both-sidebar main { + grid-column: 1 / -1 !important; + width: 100% !important; + margin: 0 auto !important; + } + /* 移动端footer也要居中 */ + .mobile-both-sidebar .footer { + grid-column: 1 / -1 !important; + } +} \ No newline at end of file diff --git a/src/styles/main.css b/src/styles/main.css new file mode 100644 index 0000000..b78aa1d --- /dev/null +++ b/src/styles/main.css @@ -0,0 +1,700 @@ +@import 'tailwindcss'; + +/* 导入相册样式 */ +@import './albums.css' layer(base); +/* 导入追番页面样式 */ +@import './anime.css' layer(base); +/* 导入动过渡样式 */ +@import './transition.css' layer(base); + +@plugin '@tailwindcss/typography'; + + +@theme { + --breakpoint-sm: 512px; + --breakpoint-md: 768px; + --breakpoint-lg: 1280px; + --breakpoint-xl: 1920px; + + --transition-duration-300: 300ms; + --transition-duration-600: 600ms; +} + + +@custom-variant dark (&:is(.dark *)); + + +/* + The default border color has changed to `currentcolor` in Tailwind CSS v4, + so we've added these compatibility styles to make sure everything still + looks the same as it did with Tailwind CSS v3. + + If we ever want to remove these styles, we need to add an explicit border + color utility to any element that depends on these defaults. +*/ +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} + + +@utility is-theme-transitioning { + /* 主题过渡保护类 - 临时禁用所有过渡动画 */ + & * { + transition: none !important; + } + & *::before { + transition: none !important; + } + & *::after { + transition: none !important; + } + + /* 波浪效果精确同步处理 */ + & svg use { + /* 禁用过渡但保持动画 */ + transition: none; + /* 强制立即继承页面背景色 */ + fill: currentColor; + } + + /* 导航栏主题切换保护 - 完全禁用过渡以确保性能 */ + & #navbar > div { + transition: none !important; + backdrop-filter: none !important; + } + & #navbar[data-transparent-mode] > div { + transition: none !important; + backdrop-filter: none !important; + } + & #navbar[data-transparent-mode].scrolled > div { + transition: none !important; + backdrop-filter: none !important; + } + & body.wallpaper-transparent #navbar > div { + transition: none !important; + backdrop-filter: none !important; + } + & body.wallpaper-transparent #navbar[data-transparent-mode] > div { + transition: none !important; + backdrop-filter: none !important; + } + & body.wallpaper-transparent #navbar[data-transparent-mode].scrolled > div { + transition: none !important; + backdrop-filter: none !important; + } + & #banner-wrapper ~ * #navbar > div { + transition: none !important; + backdrop-filter: none !important; + } + & #banner-wrapper ~ * #navbar[data-transparent-mode] > div { + transition: none !important; + backdrop-filter: none !important; + } + & body:has(#banner-wrapper) #navbar > div { + transition: none !important; + backdrop-filter: none !important; + } + & body:has(#banner-wrapper) #navbar[data-transparent-mode] > div { + transition: none !important; + backdrop-filter: none !important; + } + + /* 导航栏相关浮动面板的过渡禁用 */ + & .dropdown-content { + transition: none !important; + backdrop-filter: none !important; + } + & .float-panel { + transition: none !important; + backdrop-filter: none !important; + } + & #display-setting { + transition: none !important; + backdrop-filter: none !important; + } + & #nav-menu-panel { + transition: none !important; + backdrop-filter: none !important; + } + & #translate-panel { + transition: none !important; + backdrop-filter: none !important; + } + & #search-panel { + transition: none !important; + backdrop-filter: none !important; + } + + /* 波浪容器的颜色传递 */ + & #header-waves { + /* 设置当前颜色为页面背景色,供SVG继承 */ + color: var(--page-bg); + /* 确保与页面在同一合成层 */ + isolation: isolate; + /* 优化渲染性能 - 移除 strict containment 改用 none */ + contain: none; + /* GPU层合成 */ + translate: 0 0 0; + /* 确保没有背景色 */ + background: transparent; + } + + & #header-waves use { + /* 保持动画连续性 */ + will-change: transform; + /* GPU优化 */ + translate: 0 0 0; + } +} + +@utility scrolled { + .is-theme-transitioning &#navbar[data-transparent-mode] > div { + transition: none !important; + backdrop-filter: none !important; + } + + .is-theme-transitioning + body.wallpaper-transparent + &#navbar[data-transparent-mode] + > div { + transition: none !important; + backdrop-filter: none !important; + } +} + +@utility wallpaper-transparent { + .is-theme-transitioning &body #navbar > div { + transition: none !important; + backdrop-filter: none !important; + } + + .is-theme-transitioning &body #navbar[data-transparent-mode] > div { + transition: none !important; + backdrop-filter: none !important; + } + + .is-theme-transitioning &body #navbar[data-transparent-mode].scrolled > div { + transition: none !important; + backdrop-filter: none !important; + } + + /* 全屏壁纸模式下的半透明效果 */ + & .card-base { + @apply bg-(--card-bg-transparent); + } + + & .float-panel { + @apply bg-(--card-bg-transparent); + } + + & #navbar > div { + @apply bg-(--card-bg-transparent) backdrop-blur-xs; + } + + & .btn-card { + @apply bg-(--card-bg-transparent); + } + + & ~ * .music-player .mini-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + & ~ * .music-player .expanded-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + & ~ * .music-player .playlist-panel { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + & body .music-player .mini-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + & body .music-player .expanded-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + & body .music-player .playlist-panel { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } +} + +@utility dropdown-content { + /* 导航栏相关浮动面板的过渡禁用 */ + .is-theme-transitioning & { + transition: none !important; + backdrop-filter: none !important; + } + @apply bg-(--float-panel-bg) rounded-(--radius-large) shadow-xl dark:shadow-none border border-black/5 dark:border-white/10 py-2 min-w-48; +} + +@utility float-panel { + .is-theme-transitioning & { + transition: none !important; + backdrop-filter: none !important; + } + + .wallpaper-transparent & { + @apply bg-(--card-bg-transparent); + } + @apply top-21 rounded-(--radius-large) overflow-hidden bg-(--float-panel-bg) transition-colors duration-150 shadow-xl dark:shadow-none; +} + +@utility card-base { + @apply rounded-(--radius-large) overflow-hidden bg-(--card-bg) transition-colors duration-150; + + /* 全屏壁纸模式下的半透明效果 */ + .wallpaper-transparent & { + @apply bg-(--card-bg-transparent); + } +} + +@utility card-base-transparent { + @apply rounded-(--radius-large) overflow-hidden bg-(--card-bg-transparent) backdrop-blur-xs transition-colors duration-150; +} + +@utility btn-card { + .wallpaper-transparent & { + @apply bg-(--card-bg-transparent); + } + @apply transition-colors duration-150 flex items-center justify-center bg-(--card-bg) hover:bg-(--btn-card-bg-hover) + active:bg-(--btn-card-bg-active); + &.disabled { + @apply pointer-events-none text-black/10 dark:text-white/10; + } +} + +@utility music-player { + .wallpaper-transparent ~ * & .mini-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + .wallpaper-transparent ~ * & .expanded-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + .wallpaper-transparent ~ * & .playlist-panel { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + body.wallpaper-transparent & .mini-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + body.wallpaper-transparent & .expanded-player { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + body.wallpaper-transparent & .playlist-panel { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } +} + +@utility mini-player { + .wallpaper-transparent ~ * .music-player & { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + body.wallpaper-transparent .music-player & { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } +} + +@utility expanded-player { + .wallpaper-transparent ~ * .music-player & { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + body.wallpaper-transparent .music-player & { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } +} + +@utility playlist-panel { + .wallpaper-transparent ~ * .music-player & { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } + + body.wallpaper-transparent .music-player & { + background-color: var(--card-bg-transparent) !important; + backdrop-filter: blur(8px) !important; + } +} + +@utility card-shadow { + @apply drop-shadow-sm; +} + +@utility expand-animation { + @apply relative before:ease-out before:transition active:bg-none hover:before:bg-(--btn-plain-bg-hover) active:before:bg-(--btn-plain-bg-active) z-0 + before:absolute before:rounded-[inherit] before:inset-0 before:scale-[0.85] hover:before:scale-100 before:-z-10; +} + +@utility link { + @apply transition-colors duration-150 rounded-md p-1 -m-1 expand-animation; +} + +@utility link-lg { + @apply transition-colors duration-150 rounded-md p-1.5 -m-1.5 expand-animation; +} + +@utility float-panel-closed { + @apply -translate-y-1 opacity-0 pointer-events-none; +} + +@utility search-panel { + & mark { + @apply bg-transparent text-(--primary); + } +} + +@utility disabled { + &.btn-card { + @apply pointer-events-none text-black/10 dark:text-white/10; + } +} + +@utility btn-plain { + @apply transition-colors duration-150 relative flex items-center justify-center bg-none + text-black/75 hover:text-(--primary) dark:text-white/75 dark:hover:text-(--primary); + &:not(.scale-animation) { + @apply hover:bg-(--btn-plain-bg-hover) active:bg-(--btn-plain-bg-active); + } + &.scale-animation { + @apply expand-animation; + } + &:hover .iconify { + @apply text-(--primary)!; + } + &:hover svg { + @apply text-(--primary)!; + } + &:hover span { + @apply text-(--primary)!; + } +} + +@utility iconify { + .btn-plain:hover & { + @apply text-(--primary)!; + } + .current-theme-btn & { + @apply text-(--primary)!; + } +} + +@utility btn-regular { + @apply transition-colors duration-150 flex items-center justify-center bg-(--btn-regular-bg) hover:bg-(--btn-regular-bg-hover) active:bg-(--btn-regular-bg-active) + text-(--btn-content) dark:text-white/75; +} + +@utility current-theme-btn { + @apply text-(--primary)! bg-(--btn-plain-bg-hover)! hover:bg-(--btn-plain-bg-hover)! active:bg-(--btn-plain-bg-hover)!; + & .iconify { + @apply text-(--primary)!; + } + & svg { + @apply text-(--primary)!; + } + & span { + @apply text-(--primary)!; + } + & .text-sm { + @apply text-(--primary)!; + } + & .text-lg { + @apply text-(--primary)!; + } +} + +@utility text-sm { + .current-theme-btn & { + @apply text-(--primary)!; + } +} + +@utility text-lg { + .current-theme-btn & { + @apply text-(--primary)!; + } +} + +@utility link-underline { + @apply transition-colors duration-150 underline decoration-2 decoration-dashed decoration-(--link-underline) + hover:decoration-(--link-hover) active:decoration-(--link-active) underline-offset-4; +} + +@utility hide-scrollbar { + scrollbar-width: none; + -ms-overflow-style: none; + &::-webkit-scrollbar { + display: none; + } +} + +@utility text-90 { + @apply text-black/90 dark:text-white/90; +} + +@utility text-75 { + @apply text-black/75 dark:text-white/75; +} + +@utility text-50 { + @apply text-black/50 dark:text-white/50; +} + +@utility text-30 { + @apply text-black/30 dark:text-white/30; +} + +@utility text-25 { + @apply text-black/25 dark:text-white/25; +} + +@utility dropdown-container { + /* 下拉菜单样式 */ + @apply relative; + + &:hover .dropdown-menu { + @apply opacity-100 visible pointer-events-auto translate-y-0; + } + + &:focus-within .dropdown-menu { + @apply opacity-100 visible pointer-events-auto translate-y-0; + } + + &:hover .dropdown-arrow { + @apply rotate-180; + } + + &:focus-within .dropdown-arrow { + @apply rotate-180; + } + + /* 无障碍支持 */ + &:focus-within .dropdown-menu { + @apply opacity-100 visible pointer-events-auto translate-y-0; + } +} + +@utility dropdown-menu { + @apply absolute top-full left-0 pt-2 opacity-0 invisible pointer-events-none transition-all duration-200 ease-out translate-y-[-8px] z-50; + + .dropdown-container:hover & { + @apply opacity-100 visible pointer-events-auto translate-y-0; + } + + .dropdown-container:focus-within & { + @apply opacity-100 visible pointer-events-auto translate-y-0; + } + + /* 无障碍支持 */ + .dropdown-container:focus-within & { + @apply opacity-100 visible pointer-events-auto translate-y-0; + } +} + +@utility dropdown-arrow { + .dropdown-container:hover & { + @apply rotate-180; + } + + .dropdown-container:focus-within & { + @apply rotate-180; + } +} + +@utility dropdown-item { + @apply flex items-center justify-between px-4 py-2.5 text-black/75 dark:text-white/75 hover:text-(--primary) hover:bg-(--btn-plain-bg-hover) transition-colors duration-150 font-medium; + + &:first-child { + @apply rounded-t-[calc(var(--radius-large)-0.5rem)]; + } + + &:last-child { + @apply rounded-b-[calc(var(--radius-large)-0.5rem)]; + } + + &:focus { + @apply outline-hidden; + } +} + +@utility mobile-submenu { + /* 移动端菜单样式 */ + @apply max-h-0 overflow-hidden transition-all duration-300 ease-in-out; + + .mobile-dropdown[data-expanded='true'] & { + @apply max-h-96; + } +} + +@utility mobile-dropdown { + &[data-expanded='true'] .mobile-submenu { + @apply max-h-96; + } + + &[data-expanded='true'] .mobile-dropdown-arrow { + @apply rotate-180; + } + + & button:focus { + @apply outline-hidden; + } +} + +@utility mobile-dropdown-arrow { + .mobile-dropdown[data-expanded='true'] & { + @apply rotate-180; + } +} + +@utility meta-icon { + @apply w-8 h-8 transition-colors duration-150 rounded-md flex items-center justify-center bg-(--btn-regular-bg) + text-(--btn-content) mr-2; +} + +@utility with-divider { + @apply before:content-['/'] before:ml-1.5 before:mr-1.5 before:text-(--meta-divider) before:text-sm + before:font-medium first-of-type:before:hidden before:transition-colors before:duration-150; +} + +@utility btn-regular-dark { + @apply flex items-center justify-center + bg-[oklch(0.45_0.01_var(--hue))] hover:bg-[oklch(0.50_0.01_var(--hue))] active:bg-[oklch(0.55_0.01_var(--hue))] + dark:bg-[oklch(0.30_0.02_var(--hue))] dark:hover:bg-[oklch(0.35_0.03_var(--hue))] dark:active:bg-[oklch(0.40_0.03_var(--hue))]; + &.success { + @apply bg-[oklch(0.75_0.14_var(--hue))] dark:bg-[oklch(0.75_0.14_var(--hue))]; + } +} + +@utility success { + &.btn-regular-dark { + @apply bg-[oklch(0.75_0.14_var(--hue))] dark:bg-[oklch(0.75_0.14_var(--hue))]; + } +} + +@layer utilities { + /* 确保平滑滚动并隐藏原生滚动条 */ + html, + body { + scroll-behavior: smooth; + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE and Edge */ + } + + html::-webkit-scrollbar, + body::-webkit-scrollbar { + display: none; /* Chrome, Safari and Opera */ + } + + /* 页面顶部渐变高光效果 */ + .top-gradient-highlight { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 180px; + background: linear-gradient( + to bottom, + rgba(255, 255, 255, 0.5) 0%, + rgba(255, 255, 255, 0.3) 30%, + rgba(255, 255, 255, 0.15) 60%, + rgba(255, 255, 255, 0.05) 80%, + transparent 100% + ); + pointer-events: none; + z-index: 20; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + } + + /* 暗色主题下的渐变高光效果 */ + :root.dark .top-gradient-highlight { + background: linear-gradient( + to bottom, + rgba(0, 0, 0, 0.5) 0%, + rgba(0, 0, 0, 0.3) 30%, + rgba(0, 0, 0, 0.15) 60%, + rgba(0, 0, 0, 0.05) 80%, + transparent 100% + ); + } +} + +@layer components { + h1, h2, h3, h4, h5, h6, p, a, span, li, ul, ol, blockquote, code, pre, table, th, td, strong { + @apply transition-colors duration-150; + } +} + +.custom-md img, #post-cover img { + @apply cursor-zoom-in +} + +::selection { + background-color: var(--selection-bg) +} + +.dash-line { + position: relative; +} + +.dash-line::before { + content: ""; + position: absolute; + width: 10%; + height: 100%; + left: calc(50% - 1px); + border-left: 2px dashed var(--line-color); + pointer-events: none; + transition: all 0.3s; + translate: 0 -50%; +} + +.collapsed { + height: var(--collapsedHeight); +} + +/* 剧透效果 */ +.custom-md spoiler { + --_spoiler-mask: var(--primary); + @apply hover:bg-transparent px-1 py-0.5 overflow-hidden rounded-md transition-all duration-150; + background-color: var(--_spoiler-mask); + + &:not(:hover) { + color: var(--_spoiler-mask); + * { + color: var(--_spoiler-mask); + } + } +} + +/* 浅色模式:使用更浅的主题色且完全不透明 */ +:root:not(.dark) .custom-md spoiler { + --_spoiler-mask: color-mix(in oklch, var(--primary) 55%, white 45%); +} \ No newline at end of file diff --git a/src/styles/markdown-extend.styl b/src/styles/markdown-extend.styl new file mode 100644 index 0000000..780dcef --- /dev/null +++ b/src/styles/markdown-extend.styl @@ -0,0 +1,343 @@ +.custom-md + + blockquote.admonition + .bdm-title + display: flex + align-items: center + margin-bottom: -.9rem + font-weight: bold + + &:before + content: ' ' + display: inline-block + font-size: inherit + overflow: visible + margin-right: .6rem + height: 1em + width: 1em + vertical-align: -.126em + mask-size: contain + mask-position: center + mask-repeat: no-repeat + translate: 0 -0.0625rem + &.bdm-tip + .bdm-title + color: var(--admonitions-color-tip) + + &:before + background: var(--admonitions-color-tip) + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z'%3E%3C/path%3E%3C/svg%3E") + + &:before + background: var(--admonitions-color-tip) + &.bdm-note + .bdm-title + color: var(--admonitions-color-note) + + &:before + background: var(--admonitions-color-note) + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath fill='var(--admonitions-color-tip)' d='M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'%3E%3C/path%3E%3C/svg%3E") + + &:before + background: var(--admonitions-color-note) + &.bdm-important + .bdm-title + color: var(--admonitions-color-important) + + &:before + background: var(--admonitions-color-important) + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'%3E%3C/path%3E%3C/svg%3E") + + &:before + background: var(--admonitions-color-important) + &.bdm-warning + .bdm-title + color: var(--admonitions-color-warning) + + &:before + background: var(--admonitions-color-warning) + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z'%3E%3C/path%3E%3C/svg%3E") + + &:before + background: var(--admonitions-color-warning) + &.bdm-caution + .bdm-title + color: var(--admonitions-color-caution) + + &:before + background: var(--admonitions-color-caution) + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath d='M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z'%3E%3C/path%3E%3C/svg%3E") + + &:before + background: var(--admonitions-color-caution) + + img + border-radius: 0.75rem + + hr + border-color: var(--line-divider) + border-style: dashed + + iframe + border-radius: 0.75rem + margin-left: auto + margin-right: auto + max-width: 100% + + +a.card-github + display: block + background: var(--license-block-bg) + position: relative + margin: 0.5rem 0 + padding: 1.1rem 1.5rem 1.1rem 1.5rem + color: var(--tw-prose-body) + border-radius: var(--radius-large) + text-decoration-thickness: 0px + text-decoration-line: none + + &:hover + background-color: var(--btn-regular-bg-hover) + + .gc-titlebar + color: var(--btn-content) + + .gc-stars, .gc-forks, .gc-license, .gc-description + color: var(--tw-prose-headings) + + &:before + background-color: var(--tw-prose-headings) + + &:active + scale: .98 + background-color: var(--btn-regular-bg-active); + + .gc-titlebar + display: flex + align-items: center + justify-content: space-between + margin-bottom: 0.5rem + color: var(--tw-prose-headings) + font-size: 1.25rem + font-weight: 500 + + .gc-titlebar-left + display: flex + flex-flow: row nowrap + gap: 0.5rem + + .gc-repo + font-weight: bold + + .gc-owner + font-weight: 300 + position: relative + display: flex + flex-flow: row nowrap + gap: 0.5rem + align-items: center + + .gc-avatar + display: block + overflow: hidden + width: 1.5rem + height: 1.5rem + margin-top: -0.1rem + background-color: var(--primary) + background-size: cover + border-radius: 50% + + .gc-description + margin-bottom: 0.7rem + font-size: 1rem + font-weight: 300 + line-height: 1.5rem + color: var(--tw-prose-body) + + .gc-infobar + display: flex + flex-flow: row nowrap + gap: 1.5rem + color: var(--tw-prose-body) + width: fit-content + + .gc-language + display: none + + .gc-stars, .gc-forks, .gc-license, .github-logo + font-weight: 500 + font-size: 0.875rem + opacity: 0.9; + + &:before + content: ' ' + display: inline-block + height: 1.3em + width: 1.3em + margin-right: .4rem + vertical-align: -.24em + font-size: inherit + background-color: var(--tw-prose-body) + overflow: visible + mask-size: contain + mask-position: center + mask-repeat: no-repeat + transition-property: background-color, background; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) + transition-duration: 0.15s + + .gc-stars + &:before + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' height='16' viewBox='0 0 16 16' version='1.1' width='16'%3E%3Cpath d='M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z'%3E%3C/path%3E%3C/svg%3E") + + .gc-license + &:before + margin-right: .5rem + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' height='16' viewBox='0 0 16 16' version='1.1' width='16'%3E%3Cpath d='M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z'%3E%3C/path%3E%3C/svg%3E") + + .gc-forks + &:before + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-hidden='true' height='16' viewBox='0 0 16 16' version='1.1' width='16'%3E%3Cpath d='M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z'%3E%3C/path%3E%3C/svg%3E") + + .github-logo + font-size: 1.25rem + + &:before + background-color: var(--tw-prose-headings) + margin-right: 0 + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='31' height='32' viewBox='0 0 496 512'%3E%3Cpath fill='%23a1f7cb' d='M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9c1.6 2.3 4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2'/%3E%3C/svg%3E") + +a.card-github.fetch-waiting + pointer-events: none + opacity: 0.7 + transition: opacity 0.15s ease-in-out + + .gc-description, .gc-infobar, .gc-avatar + background-color: var(--tw-prose-body) + color: transparent + opacity: 0.5; + animation: pulsate 2s infinite linear + user-select: none + + &:before + background-color: transparent + + .gc-repo + margin-left: -0.1rem + + .gc-description, .gc-infobar + border-radius: 0.5rem + +a.card-github.fetch-error + pointer-events: all + opacity: 1 + +.card-github, .gc-description, .gc-titlebar, .gc-stars, .gc-forks, .gc-license, .gc-avatar, .github-logo + transition-property: all + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) + transition-duration: 0.15s + + +.mermaid-wrapper + padding: 1.5rem + text-align: center + + +.mermaid + display: flex + justify-content: center + align-items: center + min-height: 100px + font-family: inherit + position: relative; + overflow: hidden; + + svg + max-width: 100% + height: auto + border-radius: 0.5rem + user-select: none; + pointer-events: all; + + +// 响应式设计 +@media (max-width: 768px) + .mermaid-wrapper + padding: 1rem + + .mermaid svg + max-height: 400px + + +.mermaid-error + color: var(--admonitions-color-warning) + background: rgba(239, 68, 68, 0.1) + border: 1px solid var(--admonitions-color-warning) + border-radius: 0.5rem + padding: 1rem + margin: 1rem 0 + text-align: center + font-weight: 500 + + p + margin: 0 0 0.5rem 0 + + button + transition: all 0.2s ease + + &:hover + background: var(--primary-hover) !important + translate: 0 -1px + + +.mermaid-zoom-wrapper + transform-origin: 0 0; + transition: transform 120ms ease-out; + will-change: transform; + cursor: grab; + background: transparent; + +.mermaid-zoom-wrapper:active + cursor: grabbing; + +.mermaid-zoom-controls + position: absolute; + top: 8px; + right: 8px; + display: flex; + gap: 6px; + z-index: 30; + user-select: none; + + +.mermaid-diagram-container + margin: 1rem 0 + border-radius: 0.75rem + overflow: hidden + background: var(--card-bg) + transition: all 0.3s ease + + &:hover + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1) + +.dark .mermaid-diagram-container + background: var(--card-bg) + + svg + filter: brightness(0.9) contrast(1.1) + + +@keyframes pulsate + 0% + opacity: 0.15 + 50% + opacity: 0.25 + 100% + opacity: 0.15 + + +@keyframes spin + 0% + rotate: 0deg + 100% + rotate: 360deg \ No newline at end of file diff --git a/src/styles/markdown.css b/src/styles/markdown.css new file mode 100644 index 0000000..f7d5be7 --- /dev/null +++ b/src/styles/markdown.css @@ -0,0 +1,168 @@ +@reference "tailwindcss"; + +.custom-md { + h1 { + @apply text-3xl; + } + + h1, h2, h3, h4, h5, h6 { + .anchor { + @apply transition! -m-0.5! ml-[0.2ch]! p-0.5! select-none! opacity-0! no-underline!; + + .anchor-icon { + @apply mx-[0.45ch]!; + } + } + + &:hover { + .anchor { + @apply opacity-100!; + } + } + } + + a:not(.no-styling) { + @apply relative bg-none font-medium text-(--primary) + underline decoration-(--link-underline) decoration-1 decoration-dashed underline-offset-4; + box-decoration-break: clone; + -webkit-box-decoration-break: clone; + &:hover, &:active { + @apply decoration-transparent; + background: var(--btn-plain-bg-hover); + border-bottom: 1px dashed var(--link-hover); + text-decoration: none; + } + } + + code { + @apply bg-(--inline-code-bg) text-(--inline-code-color) px-1 py-0.5 rounded-md overflow-hidden; + + font-family: 'JetBrains Mono Variable', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; + &:before { + content:none; + } + &:after { + content:none; + } + + counter-reset: line; + span.line { + &:before { + @apply text-black/25 dark:text-white/25 mr-4 w-4 inline-block; + content: counter(line); + counter-increment: line; + direction: rtl; + } + &:last-child:empty, &:last-child:has(> span:empty:only-child) { + display: none; + } + } + } + + + .collapse-btn { + all: initial; + @apply opacity-0 absolute active:scale-90 h-6 w-6 top-2 right-10 text-xs rounded transition-all ease-in-out z-20 cursor-pointer bg-(--btn-regular-bg) hover:bg-(--btn-regular-bg-hover) text-(--btn-content); + } + .expressive-code:hover .collapse-btn { + opacity: 1; + } + .collapse-btn-icon { + @apply absolute top-1/2 left-1/2 transition -translate-x-1/2 -translate-y-1/2 w-3 h-3 fill-current pointer-events-none; + } + .expressive-code.collapsed .collapse-icon { + @apply -rotate-90; + } + .expressive-code.collapsed pre { + @apply max-h-[5.5rem] overflow-hidden; + } + .expressive-code.collapsed .frame { + @apply relative; + } + .expressive-code.collapsed .frame::before { + content: ""; + @apply absolute bottom-0 left-0 right-0 h-12 bg-linear-to-t from-(--codeblock-bg) to-transparent pointer-events-none z-10; + } + + .copy-btn { + all: initial; + @apply opacity-0 absolute active:scale-90 h-6 w-6 top-2 right-2 text-xs rounded transition-all ease-in-out z-20 cursor-pointer bg-(--btn-regular-bg) hover:bg-(--btn-regular-bg-hover) text-(--btn-content); + } + .expressive-code:hover .copy-btn { + opacity: 1; + } + .copy-btn-icon { + @apply absolute top-1/2 left-1/2 transition -translate-x-1/2 -translate-y-1/2 w-3 h-3 fill-current pointer-events-none; + } + .copy-btn .copy-icon { + @apply opacity-100; + } + .copy-btn.success .copy-icon { + @apply opacity-0; + } + .copy-btn .success-icon { + @apply opacity-0; + } + .copy-btn.success .success-icon { + @apply opacity-100; + } + + .expressive-code { + @apply my-4; + ::selection { + @apply bg-(--codeblock-selection); + } + } + + + ul, ol { + li::marker { + @apply text-(--primary); + } + } + + blockquote { + @apply not-italic border-transparent relative; + font-weight: inherit; + + &:before { + @apply content-[''] absolute -left-1 block transition bg-(--btn-regular-bg) h-full w-1 rounded-full; + } + + /* Remove the double quotes from default styles */ + p:before, p:after { + @apply content-none; + } + + } + + .katex-display { + @apply my-4; + max-width: 100%; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: thin; + scrollbar-color: rgba(0,0,0,0.3) transparent; + + &::-webkit-scrollbar { + height: 6px; + } + &::-webkit-scrollbar-track { + background: transparent; + } + &::-webkit-scrollbar-thumb { + background: rgba(0,0,0,0.3); + border-radius: 3px; + } + &::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.5); + } + } + +} + +/* 修复代码块内列表项标记颜色问题 */ +.custom-md .expressive-code ul li::marker, +.custom-md .expressive-code ol li::marker { + @apply text-inherit; +} \ No newline at end of file diff --git a/src/styles/musicplayer.css b/src/styles/musicplayer.css new file mode 100644 index 0000000..637c76b --- /dev/null +++ b/src/styles/musicplayer.css @@ -0,0 +1,173 @@ +@reference "tailwindcss"; + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} +.animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +@keyframes slide-up { + from { + translate: 0 100%; + opacity: 0; + } + to { + translate: 0 0; + opacity: 1; + } +} +.animate-slide-up { + animation: slide-up 0.3s ease-out; +} + +@keyframes rotate { + from { rotate: 0deg; } + to { rotate: 360deg; } +} + +@keyframes musicWave { + 0%, 100% { scale: 1 0.5; } + 50% { scale: 1 1; } +} + +@keyframes spin-continuous { + from { + rotate: 0deg; + } + to { + rotate: 360deg; + } +} +.cover-container img { + animation: spin-continuous 3s linear infinite; + animation-play-state: paused; +} +.cover-container img.spinning { + animation-play-state: running; +} + +button.bg-\(--primary\) { + box-shadow: 0 0 0 2px var(--primary); + border: none; +} + +.orb-player { + position: relative; + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} +.orb-player::before { + content: ''; + position: absolute; + inset: -2px; + background: linear-gradient(45deg, var(--primary), transparent, var(--primary)); + border-radius: 50%; + z-index: -1; + opacity: 0; + transition: opacity 0.3s ease; +} +.orb-player:hover::before { + opacity: 0.3; + animation: rotate 2s linear infinite; +} +.orb-player .animate-pulse { + animation: musicWave 1.5s ease-in-out infinite; +} + +.music-player { + max-width: 320px; + user-select: none; +} +.expanded-player { + width: 320px; + position: absolute; + bottom: 0; + right: 0; +} +.music-player.expanded .expanded-player { + position: relative; +} +.music-player.expanded .orb-player { + position: absolute; + bottom: 0; + right: 0; +} +.progress-section div:hover, +.bottom-controls > div:hover { + scale: 1 1.2; + transition: transform 0.2s ease; +} +/* Playlist Scrollbar Styles */ +.playlist-content { + scrollbar-width: thin; + scrollbar-color: transparent transparent; + transition: scrollbar-color 0.3s ease; +} +.playlist-content:hover { + scrollbar-color: rgba(155, 155, 155, 0.5) transparent; +} +.playlist-content::-webkit-scrollbar { + width: 4px; +} +.playlist-content::-webkit-scrollbar-track { + background: transparent; +} +.playlist-content::-webkit-scrollbar-thumb { + background-color: transparent; + border-radius: 4px; +} +.playlist-content:hover::-webkit-scrollbar-thumb { + background-color: rgba(155, 155, 155, 0.5); +} + +@media (hover: none) and (pointer: coarse) { + .music-player button, + .playlist-item { + min-height: 44px; + } + .progress-section > div, + .bottom-controls > div:nth-child(2) { + height: 12px; + } +} + +@media (max-width: 768px) { + .music-player { + max-width: 280px; + /*left: 8px !important;*/ + bottom: 8px !important; + right: 8px !important; + } + .music-player.expanded { + width: calc(100vw - 16px); + max-width: 320px; + /*left: 8px !important;*/ + right: 8px !important; + } + .expanded-player { + width: min(calc(100vw - 16px), 320px) !important; + } + .playlist-panel { + width: min(calc(100vw - 16px), 320px) !important; + /*left: 8px !important;*/ + /*right: 8px !important;*/ + max-width: none; + } + .controls { + gap: 8px; + } + .controls button { + width: 36px; + height: 36px; + } + .controls button:nth-child(3) { + width: 44px; + height: 44px; + } +} \ No newline at end of file diff --git a/src/styles/navbar.css b/src/styles/navbar.css new file mode 100644 index 0000000..b421f21 --- /dev/null +++ b/src/styles/navbar.css @@ -0,0 +1,269 @@ +/* + * 导航栏半透明效果样式 + * Navbar Translucent Effects Styles + * 只有当页面启用banner时才应用半透明效果 +*/ + + +/* 导航区域基础布局样式(避免 flex 子项溢出) */ +.navbar-nav-links { + min-width: 0; + flex-shrink: 1; + transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s, gap 0.3s ease; +} + +/* 导航链接样式 */ +.nav-link-container { + position: relative; +} + +/* 小屏幕时只显示图标 */ +@media (max-width: 1279px) { + .nav-link-item { + width: 2.75rem; /* 11 * 0.25rem */ + padding-left: 0; + padding-right: 0; + display: flex; + align-items: center; + justify-content: center; + } + + .nav-link-text { + display: none; + } + + .nav-link-icon { + margin-left: 0; + } +} + +/* 大屏幕时显示图标+文字 */ +@media (min-width: 1280px) { + .nav-link-item { + padding-left: 0.75rem; /* 3 * 0.25rem */ + padding-right: 0.75rem; + } + + .nav-link-text { + display: inline; + } +} + +/* 按钮区域基础布局样式(避免 flex 子项溢出) */ +.navbar-buttons { + min-width: 0; + flex-shrink: 0; +} + +/* 无banner时使用原始card-base样式,不添加额外的透明效果 */ +/* 确保导航栏在没有banner时有基本的背景色和圆角(低优先级,不覆盖card-base) */ +#navbar > div { + background: var(--card-bg); + border-radius: var(--radius-large); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + + +/* 半透明模式 - 在有banner时启用 */ +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="semi"] > div { + backdrop-filter: blur(20px) !important; + background: rgba(255, 255, 255, 0.55) !important; + border: 1px solid rgba(255, 255, 255, 0.55) !important; + border-radius: 0.75rem !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1) !important; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; +} +/* 半透明模式 - 在有banner时启用 - 暗色主题 */ +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="semi"] > div { + background: rgba(0, 0, 0, 0.55) !important; + border: 1px solid rgba(0, 0, 0, 0.55) !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important; +} + +/* 完全透明模式 - 在有banner时启用 */ +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="full"] > div { + backdrop-filter: none !important; + background: transparent !important; + border: none !important; + border-radius: 0 !important; + box-shadow: none !important; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; +} +/* 完全透明模式 - 在有banner时启用 - 暗色主题 */ +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="full"] > div { + background: transparent !important; + border: none !important; + box-shadow: none !important; +} +/* 半完全透明模式 - 在有banner时启用 - 默认状态:页面顶部时完全透明 */ +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="semifull"] > div { + backdrop-filter: none !important; + background: transparent !important; + border: none !important; + border-radius: 0 !important; + box-shadow: none !important; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; +} +/* 半完全透明模式 - 在有banner时启用 - 默认状态:页面顶部时完全透明 - 暗色主题 */ +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="semifull"] > div { + background: transparent !important; + border: none !important; + box-shadow: none !important; +} +/* 半完全透明模式 - 在有banner时启用 - 滚动状态:下滑后变为半透明圆角 */ +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="semifull"].scrolled > div { + backdrop-filter: blur(20px) !important; + background: rgba(255, 255, 255, 0.55) !important; + border: 1px solid rgba(255, 255, 255, 0.55) !important; + border-radius: 0.75rem !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1) !important; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; +} +/* 半完全透明模式 - 在有banner时启用 - 滚动状态:下滑后变为半透明圆角 - 暗色主题 */ +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #navbar[data-transparent-mode="semifull"].scrolled > div { + background: rgba(0, 0, 0, 0.55) !important; + border: 1px solid rgba(0, 0, 0, 0.55) !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important; +} + +/* 二级菜单、主题色、夜间模式菜单、手机端导航在有banner时启用半透明效果 */ +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) .dropdown-content, +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #display-setting, +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #nav-menu-panel, +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #translate-panel, +:is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #search-panel { + backdrop-filter: blur(20px) !important; + background: rgba(255, 255, 255, 0.55) !important; + border: 1px solid rgba(255, 255, 255, 0.55) !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1) !important; +} +/* 二级菜单、主题色、夜间模式菜单、手机端导航在有banner时启用半透明效果 - 暗色主题 */ +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) .dropdown-content, +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #display-setting, +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #nav-menu-panel, +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #translate-panel, +:root.dark :is(#banner-wrapper ~ *, body:has(#banner-wrapper)) #search-panel { + background: rgba(0, 0, 0, 0.55) !important; + border: 1px solid rgba(0, 0, 0, 0.55) !important; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2) !important; +} + +/* 响应式优化 */ + +/* 桌面端&平板端布局 */ +@media (min-width: 768px) { + /* 使用 Grid 布局确保中间区域在有空间时居中 */ + #navbar > div { + display: grid !important; + grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); + justify-content: space-between; + align-items: center; + } + /* 确保左侧 Home 按钮不拉伸并靠左 */ + #navbar > div > a:first-child { + justify-self: start; + } + + #navbar .navbar-nav-links { + position: static; + left: unset; + translate: none; + justify-self: center; + gap: clamp(0.12rem, 1vw, 0.36rem); + } + + #navbar .navbar-buttons { + justify-self: end; + gap: clamp(0.12rem, 1vw, 0.36rem); + } +} + +/* 非大屏桌面端&平板端优化 */ +@media (min-width: 768px) and (max-width: 1279px) { + #navbar .navbar-nav-links { + gap: 0.2rem; + } + + #navbar .navbar-buttons { + gap: 0.2rem; + } + + /* 搜索状态下的避让逻辑以防重叠 */ + #navbar.is-searching .navbar-nav-links { + opacity: 0; + scale: 0.9; + pointer-events: none; + visibility: hidden; + } +} + +/* 手机端导航栏 */ +@media (max-width: 768px) { + #navbar > div { + max-width: none !important; + width: 100% !important; + margin-left: 0 !important; + margin-right: 0 !important; + } +} +/* 手机端导航栏 - 小屏 */ +@media (max-width: 512px) { + #navbar > div { + border-radius: 0.3rem !important; + margin: 0 !important; + padding-left: 0.6rem !important; + padding-right: 0.6rem !important; + max-width: none !important; + width: 100% !important; + } + + #navbar-buttons { + gap: 0.123rem !important; + } + /* Only size the trigger buttons; do not affect nested buttons inside panels */ + #navbar-buttons button:not(.float-panel *) { + width: 2.4rem !important; + height: 2.4rem !important; + padding: 0 !important; + } + + /* home button */ + #navbar > div > a:first-child { + width: 7.2rem !important; + height: 2.4rem !important; + padding: 0 !important; + } +} + +/* 手机端导航栏 - 更小屏 */ +@media (min-width: 333px) and (max-width: 444px) { + #navbar-buttons { + gap: 0.111rem !important; + } + /* Only size the trigger buttons; do not affect nested buttons inside panels */ + #navbar-buttons button:not(.float-panel *) { + width: 2.1rem !important; + height: 2.1rem !important; + padding: 0 !important; + } + + /* home button */ + #navbar > div > a:first-child { + width: 6.3rem !important; + height: 2.1rem !important; + padding: 0 !important; + } +} + +/* 手机端导航栏按钮 -超小屏 */ +@media (max-width: 333px) { + #navbar-buttons { + gap: 0 !important; + justify-content: flex-end !important; + } + + /* Hide home button text (keep icon) */ + #navbar > div > a:first-child > div { + font-size: 0 !important; + } +} \ No newline at end of file diff --git a/src/styles/transition.css b/src/styles/transition.css new file mode 100644 index 0000000..419bc92 --- /dev/null +++ b/src/styles/transition.css @@ -0,0 +1,190 @@ +/* Page transition animations with Swup - Enhanced version inspired by yukina */ + +/* 主要内容区域的过渡动画 - 参考yukina的侧滑效果 */ +.transition-main { + transition: + opacity 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), + translate 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +/* 离开动画 - 内容向右上滑出并淡出 */ +.transition-leaving { + transition: + translate 300ms cubic-bezier(0.55, 0.055, 0.675, 0.19), + opacity 300ms cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +html.is-changing .transition-main { + transition: + opacity 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), + translate 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +html.is-leaving .transition-main { + transition: + opacity 300ms cubic-bezier(0.55, 0.055, 0.675, 0.19), + translate 300ms cubic-bezier(0.55, 0.055, 0.675, 0.19); +} + +/* 进入动画 - 从右下角轻微滑入,模仿yukina效果 */ +html.is-animating .transition-main { + opacity: 0; + translate: 0.5rem 1.5rem; +} + +/* 离开动画 - 向左上角滑出 */ +html.is-animating.is-leaving .transition-leaving { + translate: -0.5rem -1rem; + opacity: 0; +} + +/* Swup fade 动画 - 保持兼容性 */ +html.is-changing .transition-swup-fade { + transition: all 300ms ease-out; +} + +html.is-animating .transition-swup-fade { + opacity: 0; + translate: 0 1.5rem; +} + +/* Loading 状态下禁止滚动 */ +html.is-loading { + overflow: hidden; +} + +/* 淡入动画 */ +@keyframes fade-in-up { + from { + opacity: 0; + translate: 0 1.5rem; + } + to { + opacity: 1; + translate: 0 0; + } +} +@keyframes fade-in-down { + from { + opacity: 0; + translate: 0 -1.5rem; + } + to { + opacity: 1; + translate: 0 0; + } +} +/* 淡出动画 */ +@keyframes fade-out-down { + from { + opacity: 1; + translate: 0 0; + } + to { + opacity: 0; + translate: 0 -1.5rem; + } +} + +/* 隐藏页面加载动画 */ +.onload-animation-up, .onload-animation-down { + opacity: 0; +} +/* 动画结束后或在非加载/非初始动画状态下保持可见 */ +html:not(.is-loading):not(.show-initial-animation) :is(.onload-animation-up, .onload-animation-down) { + opacity: 1; +} +/* 初始加载动画,仅在 .show-initial-animation 存在时触发以避免与 Swup 自身的过渡动画冲突 */ +.show-initial-animation .onload-animation-up { + animation: fade-in-up 600ms ease-out forwards; +} +.show-initial-animation .onload-animation-down { + animation: fade-in-down 600ms ease-out forwards; +} +/* 渐进式动画延迟 - 仅在初始加载时应用 */ +.show-initial-animation :is(.onload-animation-up, .onload-animation-down):nth-child(1) { animation-delay: 0ms; } +.show-initial-animation :is(.onload-animation-up, .onload-animation-down):nth-child(2) { animation-delay: 150ms; } +.show-initial-animation :is(.onload-animation-up, .onload-animation-down):nth-child(3) { animation-delay: 300ms; } +.show-initial-animation :is(.onload-animation-up, .onload-animation-down):nth-child(4) { animation-delay: 450ms; } +.show-initial-animation :is(.onload-animation-up, .onload-animation-down):nth-child(5) { animation-delay: 600ms; } + +/* 特殊元素的动画 */ +.transition-slide-in { + opacity: 0; + translate: 8px 20px; + transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); +} +.transition-slide-in.active { + opacity: 1; + translate: 0 0; +} + +/* 卡片动画 */ +.card-animation { + opacity: 0; + translate: 10px 30px; + scale: 0.98; + transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); +} +.card-animation.visible { + opacity: 1; + translate: 0 0; + scale: 1; +} + +/* 导航动画 */ +.nav-animation { + opacity: 0; + translate: -20px 0; + transition: all 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); +} +.nav-animation.loaded { + opacity: 1; + translate: 0 0; +} + +/* 性能优化 */ +.transition-main, +.transition-leaving, +.onload-animation-up, +.onload-animation-down, +.transition-slide-in, +.card-animation { + backface-visibility: hidden; + -webkit-font-smoothing: antialiased; +} + +/* 响应式调整 */ +@media (max-width: 768px) { + html.is-animating .transition-main { + translate: 0.3rem 1rem; + } + + html.is-animating.is-leaving .transition-leaving { + translate: -0.3rem -0.8rem; + } + + .transition-slide-in { + translate: 5px 15px; + } + + .card-animation { + translate: 6px 20px; + scale: 0.99; + } +} + +/* 减少动画的用户偏好设置 */ +@media (prefers-reduced-motion: reduce) { + .transition-main, + .transition-leaving, + .onload-animation-up, + .onload-animation-down, + .transition-slide-in, + .card-animation, + .nav-animation { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} \ No newline at end of file diff --git a/src/styles/twikoo.css b/src/styles/twikoo.css new file mode 100644 index 0000000..735ddd9 --- /dev/null +++ b/src/styles/twikoo.css @@ -0,0 +1,192 @@ +@reference "tailwindcss"; + +:root { + --tk-text: black; + --code-block-text: #333; /* 调整为深色但在浅色背景下仍然舒适的值 */ +} + +html.dark { + --tk-text: #d1d5db; + --code-block-text: #d1d5db; /* 在深色模式下使用更亮的颜色 */ +} + +.tk-comments { + @apply text-(--tk-text); +} + +.tk-submit { + .tk-avatar { + @apply hidden; + } +} + +/* Text Area */ +.tk-row { + .tk-col { + @apply flex-col-reverse; + .tk-input { + textarea { + @apply rounded-(--radius-large) py-4 px-6 min-h-[150px]! focus:border-(--primary); + } + } + } +} + +/* Meta */ +.tk-meta-input { + @apply relative mt-3; + div { + @apply min-h-10; + .el-input-group__prepend { + @apply bg-inherit! rounded-l-lg; + min-height: inherit; + } + input { + @apply px-4 rounded-r-lg focus:border-(--primary)!; + min-height: inherit; + } + } +} + +/* Button */ +.tk-row.actions { + @apply w-full ml-0! mt-0!; + .__markdown { + @apply hidden!; + } + .tk-preview, + .tk-send, + .tk-cancel { + @apply border-none rounded-lg px-3 py-0 h-8 + bg-(--btn-regular-bg-active)! disabled:bg-(--btn-regular-bg)! + text-(--btn-content)! disabled:text-[#ffffffa1]!; + } +} + +/* Comment title */ +.tk-comments-title { + .__comments svg { + @apply fill-(--primary); + } +} + +.tk-comment { + @apply border border-[rgba(144,147,153,0.31)] p-4 rounded-2xl hover:shadow-md transition-all; + .tk-action-icon svg { + @apply fill-(--primary); + } +} + +.tk-action { + .tk-action-count { + @apply text-(--btn-content); + } +} + +.tk-meta { + .tk-tag { + @apply border-none rounded-lg text-(--btn-content); + } + + .tk-tag-green { + @apply bg-(--btn-regular-bg) dark:bg-(--primary) dark:text-(--deep-text); + } +} + +/* Content & Preview */ +.tk-content, +.tk-preview-container { + /* by @microsic + Make the picture type emoticons display without wrapping + */ + img { + @apply inline align-bottom!; + } + + a { + @apply underline text-(--primary) font-medium; + } + + .tk-ruser { + @apply no-underline; + } + + :not(pre) > code { + @apply bg-(--inline-code-bg) rounded-md text-[--inline-code-color] px-1 py-0.5 font-semibold; + } + + li { + @apply before:content-["•"] before:text-(--primary); + } +} + +/* Replies */ +.tk-replies { + .tk-comment { + @apply bg-(--page-bg); + .tk-content { + > span:first-of-type { + @apply text-xs; + } + } + } +} + +.twikoo .code-block { + pre { + @apply rounded-xl!; + } + + /* Code block fall back */ + pre:not([class]) { + @apply bg-(--codeblock-bg) overflow-auto p-2 text-(--code-block-text); + } + + .copy-btn-icon { + width: inherit !important; + height: inherit !important; + } +} + +.tk-expand-wrap .tk-expand, +.tk-collapse-wrap .tk-expand { + @apply hover:rounded-lg mt-1 hover:bg-(--btn-plain-bg-hover); +} + +/* by @SirTamago +Make the emoji component display correctly when there are too many emoji packs +*/ +.card-base { + overflow: visible; +} + +/* 防止 Twikoo 操作时的意外滚动 */ +.tk-action-icon, +.tk-owo, +.tk-submit, +.tk-cancel, +.tk-preview, +.tk-admin, +.tk-delete, +.tk-edit { + cursor: pointer; + transition: all 0.2s ease; +} + +/* 确保点击区域足够大 */ +.tk-action { + min-height: 24px; + display: flex; + align-items: center; +} + +/* 防止表单提交时的意外跳转 */ +.tk-submit-wrapper { + position: relative; +} + +/* 管理面板样式优化 */ +.tk-admin-panel { + position: relative; + z-index: 100; +} \ No newline at end of file diff --git a/src/styles/variables.styl b/src/styles/variables.styl new file mode 100644 index 0000000..4bb8c4d --- /dev/null +++ b/src/styles/variables.styl @@ -0,0 +1,99 @@ +/* utils */ +white(a) + rgba(255, 255, 255, a) + +black(a) + rgba(0, 0, 0, a) + +rainbow-light = linear-gradient(to right, oklch(0.80 0.10 0), oklch(0.80 0.10 30), oklch(0.80 0.10 60), oklch(0.80 0.10 90), oklch(0.80 0.10 120), oklch(0.80 0.10 150), oklch(0.80 0.10 180), oklch(0.80 0.10 210), oklch(0.80 0.10 240), oklch(0.80 0.10 270), oklch(0.80 0.10 300), oklch(0.80 0.10 330), oklch(0.80 0.10 360)) +rainbow-dark = linear-gradient(to right, oklch(0.70 0.10 0), oklch(0.70 0.10 30), oklch(0.70 0.10 60), oklch(0.70 0.10 90), oklch(0.70 0.10 120), oklch(0.70 0.10 150), oklch(0.70 0.10 180), oklch(0.70 0.10 210), oklch(0.70 0.10 240), oklch(0.70 0.10 270), oklch(0.70 0.10 300), oklch(0.70 0.10 330), oklch(0.70 0.10 360)) + +:root + --radius-large 1rem + +/* An util to define variables that vary with light and dark mode */ +define(vars) + :root + for key, value in vars + {key}: value[0] + :root.dark + for key, value in vars + if length(value) > 1 + {key}: value[1] + +define({ + --primary: oklch(0.70 0.14 var(--hue)) oklch(0.75 0.14 var(--hue)) + --page-bg: oklch(0.95 0.01 var(--hue)) oklch(0.16 0.014 var(--hue)) + --card-bg: white oklch(0.23 0.015 var(--hue)) + --card-bg-transparent: rgba(255, 255, 255, 0.8) rgba(23, 23, 23, 0.8) + + --btn-content: oklch(0.55 0.12 var(--hue)) oklch(0.75 0.1 var(--hue)) + + --btn-regular-bg: oklch(0.95 0.025 var(--hue)) oklch(0.33 0.035 var(--hue)) + --btn-regular-bg-hover: oklch(0.9 0.05 var(--hue)) oklch(0.38 0.04 var(--hue)) + --btn-regular-bg-active: oklch(0.85 0.08 var(--hue)) oklch(0.43 0.045 var(--hue)) + + --btn-plain-bg-hover: oklch(0.95 0.025 var(--hue)) oklch(0.30 0.035 var(--hue)) + --btn-plain-bg-active: oklch(0.98 0.01 var(--hue)) oklch(0.27 0.025 var(--hue)) + + --btn-card-bg-hover: oklch(0.98 0.005 var(--hue)) oklch(0.3 0.03 var(--hue)) + --btn-card-bg-active: oklch(0.9 0.03 var(--hue)) oklch(0.35 0.035 var(--hue)) + + --enter-btn-bg: var(--btn-regular-bg) + --enter-btn-bg-hover: var(--btn-regular-bg-hover) + --enter-btn-bg-active: var(--btn-regular-bg-active) + + --deep-text: oklch(0.25 0.02 var(--hue)) + + --title-active: oklch(0.6 0.1 var(--hue)) + + --line-divider: black(0.08) white(0.08) + + --line-color: black(0.1) white(0.1) + --meta-divider: black(0.2) white(0.2) + --content-meta: black(0.6) white(0.6) + + --inline-code-bg: var(--btn-regular-bg) + --inline-code-color: var(--btn-content) + --selection-bg: oklch(0.90 0.05 var(--hue)) oklch(0.40 0.08 var(--hue)) + --codeblock-selection: oklch(0.90 0.06 var(--hue)) oklch(0.45 0.06 var(--hue)) + --codeblock-bg: oklch(0.96 0.015 var(--hue)) oklch(0.18 0.015 var(--hue)) + --codeblock-topbar-bg: oklch(0.93 0.03 var(--hue)) oklch(0.12 0.015 var(--hue)) + + --license-block-bg: black(0.03) var(--codeblock-bg) + + --link-underline: oklch(0.93 0.04 var(--hue)) oklch(0.40 0.08 var(--hue)) + --link-hover: oklch(0.95 0.025 var(--hue)) oklch(0.40 0.08 var(--hue)) + --link-active: oklch(0.90 0.05 var(--hue)) oklch(0.35 0.07 var(--hue)) + + --float-panel-bg: white oklch(0.19 0.015 var(--hue)) + + --scrollbar-bg-light: black(0.4) + --scrollbar-bg-hover-light: black(0.5) + --scrollbar-bg-active-light: black(0.6) + + --scrollbar-bg-dark: white(0.4) + --scrollbar-bg-hover-dark: white(0.5) + --scrollbar-bg-active-dark: white(0.6) + + --scrollbar-bg: var(--scrollbar-bg-light) var(--scrollbar-bg-dark) + --scrollbar-bg-hover: var(--scrollbar-bg-hover-light) var(--scrollbar-bg-hover-dark) + --scrollbar-bg-active: var(--scrollbar-bg-active-light) var(--scrollbar-bg-active-dark) + + --color-selection-bar: rainbow-light rainbow-dark + + --display-light-icon: 1 0 + --display-dark-icon: 0 1 + + --admonitions-color-tip: oklch(0.7 0.14 180) oklch(0.75 0.14 180) + --admonitions-color-note: oklch(0.7 0.14 250) oklch(0.75 0.14 250) + --admonitions-color-important: oklch(0.7 0.14 310) oklch(0.75 0.14 310) + --admonitions-color-warning: oklch(0.7 0.14 60) oklch(0.75 0.14 60) + --admonitions-color-caution: oklch(0.6 0.2 25) oklch(0.65 0.2 25) + + --toc-badge-bg: oklch(0.9 0.045 var(--hue)) var(--btn-regular-bg) + --toc-btn-hover: oklch(0.92 0.015 var(--hue)) oklch(0.22 0.02 var(--hue)) + --toc-btn-active: oklch(0.90 0.015 var(--hue)) oklch(0.25 0.02 var(--hue)) + --toc-width: calc((100vw - var(--page-width)) / 2 - 1rem) + --toc-item-active: oklch(0.70 0.13 var(--hue)) oklch(0.35 0.07 var(--hue)) +}) \ No newline at end of file diff --git a/src/types/config.ts b/src/types/config.ts new file mode 100644 index 0000000..89d0b55 --- /dev/null +++ b/src/types/config.ts @@ -0,0 +1,535 @@ +import type { + SYSTEM_MODE, + DARK_MODE, + LIGHT_MODE, + WALLPAPER_FULLSCREEN, + WALLPAPER_BANNER, + WALLPAPER_NONE +} from "@constants/constants"; + + +/** + * + */ + +// Favicon 配置 +export type Favicon = { + src: string; + theme?: "light" | "dark"; + sizes?: string; +}; + + +// 加载页配置 +export type LoadingOverlayConfig = { + // 是否启用加载页 + enable: boolean; + // 加载标题配置 + title: { + // 是否启用加载标题 + enable: boolean; + // 加载标题文本 + content: string; + // 动画周期 (s) + interval: number; + }; + // 加载动画配置 + spinner: { + // 是否启用加载动画 + enable: boolean; + // 动画周期 (s) + interval: number; + }; +}; + + +// 站点配置 +export type SiteConfig = { + // 站点 URL (以斜杠结尾) + siteURL: string; + // 站点标题 + title: string; + // 站点副标题 + subtitle: string; + // 站点关键词,用于生成 + keywords?: string[]; + // 语言配置 + lang: "zh" | "en" | "ko" | "ja" | "es" | "th" | "vi" | "tr" | "id" | "fr" | "de" | "ru" | "ar"; + // 翻译配置 + translate?: { + // 启用翻译功能 + enable: boolean; + // 翻译服务类型,如 'client.edge' + service?: string; + // 显示语言选择下拉框 + showSelectTag?: boolean; + // 自动识别用户语言 + autoDiscriminate?: boolean; + // 翻译时忽略的 CSS 类名 + ignoreClasses?: string[]; + // 翻译时忽略的 HTML 标签 + ignoreTags?: string[]; + }; + // 时区配置 + timeZone: -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12; + // 字体配置 + font: { + [key: string]: { + // 字体源 (字体 CSS 链接 | 字体文件路径) + src: string; + // 字体名 (font-family) + family: string; + }; + }; + // 主题色配置 + themeColor: { + // 主题色的默认色相 (0-360) + hue: number; + }; + // 默认主题 + defaultTheme: "system" | "light" | "dark"; + // 壁纸配置 + wallpaper: { + // 模式 + mode: "fullscreen" | "banner" | "none"; + src: // 图片源配置 (fullscreen 和 banner 模式共享) + | string + | string[] + | { + desktop?: string | string[]; + mobile?: string | string[]; + }; + // 壁纸位置,等同于 object-position + position?: "top" | "center" | "bottom"; + // 轮播配置 (fullscreen 和 banner 模式共享) + carousel?: { + // 为多张图片启用轮播,否则随机显示一张图片 + enable: boolean; + // 轮播间隔时间 (s) + interval: number; + // 启用 Ken Burns 效果 + kenBurns?: boolean; + }; + // Banner 模式专属配置 + banner?: { + homeText?: { + // 在主页显示文本 + enable: boolean; + // 主标题 + title?: string; + // 副标题 + subtitle?: string | string[]; // 支持单个字符串或字符串数组 + // 副标题打字机效果 + typewriter?: { + // 启用副标题打字机效果 + enable: boolean; + // 打字速度 (ms) + speed: number; + // 删除速度 (ms) + deleteSpeed: number; + // 完全显示后的暂停时间 (ms) + pauseTime: number; + }; + }; + // 横幅图片来源文本 + credit?: { + // 显示横幅图片来源文本 + enable: boolean; + // 要显示的来源文本 + text: string; + // (可选) 原始艺术品或艺术家页面的 URL 链接 + url?: string; + }; + // 导航栏配置 + navbar?: { + // 导航栏透明模式 + transparentMode?: "semi" | "full" | "semifull"; + }; + // 水波纹效果配置 + waves?: { + // 启用水波纹效果 + enable: boolean; + // 启用性能模式 (简化波浪效果以提升性能) + performanceMode?: boolean; + }; + }; + // Fullscreen 模式专属配置 + fullscreen?: { + // 层级 + zIndex?: number; + // 壁纸透明度,0-1 之间 + opacity?: number; + // 背景模糊程度 (px) + blur?: number; + // 导航栏透明模式 + navbar?: { + transparentMode?: "semi" | "full" | "semifull"; + }; + }; + }; + // 加载页配置 + loadingOverlay?: LoadingOverlayConfig; + // Favicon 配置 + favicon: Favicon[]; + // bangumi 配置 + bangumi?: { + // 用户 ID + userId?: string; + }; + // OpenGraph 配置 + generateOgImages: boolean; +}; + +/** + * + */ + +export type LIGHT_DARK_MODE = + | typeof LIGHT_MODE + | typeof DARK_MODE + | typeof SYSTEM_MODE; + + +export type WALLPAPER_MODE = + | typeof WALLPAPER_FULLSCREEN + | typeof WALLPAPER_BANNER + | typeof WALLPAPER_NONE; + +/** + * + */ + +export enum LinkPreset { + Home = 0, + Archive = 1, + Projects = 2, + Skills = 3, + Timeline = 4, + Diary = 5, + Albums = 6, + Anime = 7, + About = 8, + Friends = 9, +} + + +export type NavbarLink = { + // 链接名称 + name: string; + // 链接 + url: string; + // 是否为外部链接 + external?: boolean; + // 链接图标 + icon?: string; + // 中转页描述 + description?: string; + // 子链接,可以是NavbarLink或LinkPreset + children?: (NavbarLink | LinkPreset)[]; +}; + + +// 导航栏配置 +export type NavbarConfig = { + // 链接配置 + links: (NavbarLink | LinkPreset)[]; // 支持多级菜单 +}; + +/** + * + */ + +export type WidgetComponentType = + | "profile" + | "announcement" + | "categories" + | "tags" + | "statistics" + | "toc" + | "custom"; + + +export type WidgetComponentConfig = { + // 组件类型 + type: WidgetComponentType; + // 启用该组件 + enable: boolean; + // 组件位置 + position: "top" | "sticky"; // 顶部固定区域或粘性区域 + // 自定义内联样式 + style?: string; + // 响应式配置 + responsive?: { + // 在指定设备上隐藏 + hidden?: ("mobile" | "tablet" | "desktop")[]; + // 折叠阈值 + collapseThreshold?: number; + }; + // 自定义属性 + customProps?: Record; +}; + + +// 资料配置 +export type ProfileConfig = { + // 头像配置 + avatar?: string; + // 信息配置 + name: string; + // 简介配置 + bio?: string; + // 链接配置 + links: { + name: string; + url: string; + icon: string; + }[]; +}; + + +// 公告配置 +export type AnnouncementConfig = { + // 公告标题 + title?: string; + // 公告内容 + content: string; + // 公告类型 + type?: "info" | "warning" | "success" | "error"; + // 公告栏图标 + icon?: string; + // 允许用户关闭公告 + closable?: boolean; + // 链接配置 + link?: { + // 启用链接 + enable: boolean; + // 链接文本 + text: string; + // 链接 URL + url: string; + // 是否外部链接 + external?: boolean; + }; +}; + + +// 侧边栏配置 +export type SidebarConfig = { + // 侧边栏组件配置列表 + components: { + left: WidgetComponentConfig[]; + right: WidgetComponentConfig[]; + }; +}; + +/** + * + */ + +export type BlogPostData = { + body: string; + title: string; + published: Date; + description: string; + tags: string[]; + draft?: boolean; + image?: string; + category?: string; + pinned?: boolean; + prevTitle?: string; + prevSlug?: string; + nextTitle?: string; + nextSlug?: string; +}; + + +// 文章配置 +export type PostConfig = { + // 显示“上次编辑”卡片 + showLastModified: boolean; + // 在文章内容中显示封面 + showCoverInContent: boolean; + // 代码高亮配置 + expressiveCode: { + // 主题 + theme: string; + }; + // 许可证配置 + license: { + // 启用许可证 + enable: boolean; + // 许可证名称 + name: string; + // 许可证链接 + url: string; + }; + // 评论配置 + comment: { + // 启用评论功能 + enable: boolean; + // Twikoo 评论系统配置 + twikoo?: { + // 环境 ID + envId: string; + // 地域 + region?: string; + // 语言 + lang?: string; + }; + }; +}; + +/** + * + */ + +// 页脚配置 +export type FooterConfig = { + // 是否启用 Footer HTML 注入功能 + enable: boolean; + // 自定义 HTML 内容,用于添加备案号等信息 + customHtml?: string; +}; + +/** + * + */ + +// 粒子特效配置 +export type ParticleConfig = { + // 启用粒子特效 + enable: boolean; + // 粒子数量 + particleNum: number; + // 粒子越界限制次数,-1为无限循环 + limitTimes: number; + // 粒子尺寸配置 + size: { + // 粒子最小尺寸倍数 + min: number; + // 粒子最大尺寸倍数 + max: number; + }; + // 粒子透明度配置 + opacity: { + // 粒子最小不透明度 + min: number; + // 粒子最大不透明度 + max: number; + }; + // 粒子移动速度配置 + speed: { + // 水平移动速度 + horizontal: { + // 最小值 + min: number; + // 最大值 + max: number; + }; + // 垂直移动速度 + vertical: { + // 最小值 + min: number; + // 最大值 + max: number; + }; + // 旋转速度 + rotation: number; + // 消失速度 + fadeSpeed: number; + }; + // 粒子层级 + zIndex: number; +}; + +/** + * + */ + +export type MusicPlayerTrack = { + // 序号 + id: number | string; + // 标题 + title: string; + // 作者 + artist: string; + // 封面 + cover: string; + // 路径 + url: string; + // 时长 + duration: number; +}; + + +// 音乐播放器配置 +export type MusicPlayerConfig = { + // 启用音乐播放器功能 + enable: boolean; + // 默认模式 + mode: "meting" | "local"; + // meting 模式专属配置 + meting: { + // Meting API 地址 + meting_api: string; + // 音乐平台 + server: "netease" | "tencent" | "kugou" | "baidu" | "kuwo"; + // 类型 + type: "playlist" | "album" | "artist" | "song" | "search"; + // 资源 ID + id: string; + }; + // local 模式专属配置 + local: { + // 播放列表 + playlist: MusicPlayerTrack[]; + }; + // 是否自动播放 + autoplay?: boolean; +}; + +/** + * + */ + +// 看板娘配置 +export type PioConfig = { + // 启用看板娘 + enable: boolean; + // 模型文件路径 + models?: string[]; + // 看板娘位置 + position?: "left" | "right"; + // 看板娘宽度 + width?: number; + // 看板娘高度 + height?: number; + // 展现模式 + mode?: "static" | "fixed" | "draggable"; + // 是否在移动设备上隐藏 + hiddenOnMobile?: boolean; + // 对话框配置 + dialog?: { + // 欢迎词 + welcome?: string | string[]; + // 触摸提示 + touch?: string | string[]; + // 首页提示 + home?: string; + // 换装提示 + skin?: [string, string]; // [切换前, 切换后] + // 关闭提示 + close?: string; + // 关于链接 + link?: string; + // 自定义属性 + custom?: Array<{ + // CSS选择器 + selector: string; + // 类型 + type: "read" | "link"; + // 自定义文本 + text?: string; + }>; + }; +}; \ No newline at end of file diff --git a/src/types/translate.d.ts b/src/types/translate.d.ts new file mode 100644 index 0000000..71abaea --- /dev/null +++ b/src/types/translate.d.ts @@ -0,0 +1,32 @@ +declare global { + interface Window { + translate?: { + service: { + use: (service: string) => void; + }; + language: { + setLocal: (language: string) => void; + }; + setAutoDiscriminateLocalLanguage: () => void; + ignore: { + class: string[]; + tag: string[]; + }; + selectLanguageTag: { + show: boolean; + }; + storage: { + set: () => void; + }; + listener: { + start: () => void; + }; + execute: () => void; + }; + loadTranslateScript?: () => Promise; + translateScriptLoaded?: boolean; + translateInitialized?: boolean; + } +} + +export {}; \ No newline at end of file diff --git a/src/utils/albums.ts b/src/utils/albums.ts new file mode 100644 index 0000000..99981cd --- /dev/null +++ b/src/utils/albums.ts @@ -0,0 +1,45 @@ +// Album data configuration file +// Used to manage data for the album display page +const albumModules = import.meta.glob('../content/albums/*.json', { eager: true }); + +export interface Photo { + src: string; + alt?: string; + title?: string; + description?: string; + tags?: string[]; + date?: string; + width?: number; + height?: number; +} + +export interface AlbumGroup { + id: string; + title: string; + description?: string; + cover: string; + date: string; + location?: string; + tags?: string[]; + layout?: "grid" | "masonry" | "list"; + columns?: number; + photos: Photo[]; + visible?: boolean; +} + +export const albums: AlbumGroup[] = Object.entries(albumModules).map(([path, mod]: [string, any]) => { + const id = path.split('/').pop()?.replace('.json', '') || ''; + const data = mod.default as any; + const album: AlbumGroup = { + id, + ...data, + photos: data.photos || [], + visible: data.visible !== false, // 默认为 true + }; + return album; +}); + +// Sort albums by date in descending order +export const sortedAlbums = [...albums].sort( + (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(), +); \ No newline at end of file diff --git a/src/utils/content.ts b/src/utils/content.ts new file mode 100644 index 0000000..5231ff8 --- /dev/null +++ b/src/utils/content.ts @@ -0,0 +1,121 @@ +import { type CollectionEntry, getCollection } from "astro:content"; + +import { getCategoryUrl } from "@utils/url"; +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +// // Retrieve posts and sort them by publication date +async function getRawSortedPosts() { + const allBlogPosts = await getCollection("posts", ({ data }) => { + return import.meta.env.PROD ? data.draft !== true : true; + }); + + const sorted = allBlogPosts.sort((a, b) => { + // 首先按置顶状态排序,置顶文章在前 + if (a.data.pinned && !b.data.pinned) return -1; + if (!a.data.pinned && b.data.pinned) return 1; + + // 如果置顶状态相同,则按发布日期排序 + const dateA = new Date(a.data.published); + const dateB = new Date(b.data.published); + return dateA > dateB ? -1 : 1; + }); + return sorted; +} + +export async function getSortedPosts() { + const sorted = await getRawSortedPosts(); + + for (let i = 1; i < sorted.length; i++) { + sorted[i].data.nextSlug = sorted[i - 1].id; + sorted[i].data.nextTitle = sorted[i - 1].data.title; + } + for (let i = 0; i < sorted.length - 1; i++) { + sorted[i].data.prevSlug = sorted[i + 1].id; + sorted[i].data.prevTitle = sorted[i + 1].data.title; + } + + return sorted; +} +export type PostForList = { + id: string; + data: CollectionEntry<"posts">["data"]; +}; +export async function getSortedPostsList(): Promise { + const sortedFullPosts = await getRawSortedPosts(); + + // delete post.body + const sortedPostsList = sortedFullPosts.map((post) => ({ + id: post.id, + data: post.data, + })); + + return sortedPostsList; +} +export type Tag = { + name: string; + count: number; +}; + +export async function getTagList(): Promise { + const allBlogPosts = await getCollection<"posts">("posts", ({ data }) => { + return import.meta.env.PROD ? data.draft !== true : true; + }); + + const countMap: { [key: string]: number } = {}; + allBlogPosts.forEach((post: { data: { tags: string[] } }) => { + post.data.tags.forEach((tag: string) => { + if (!countMap[tag]) countMap[tag] = 0; + countMap[tag]++; + }); + }); + + // sort tags + const keys: string[] = Object.keys(countMap).sort((a, b) => { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }); + + return keys.map((key) => ({ name: key, count: countMap[key] })); +} + +export type Category = { + name: string; + count: number; + url: string; +}; + +export async function getCategoryList(): Promise { + const allBlogPosts = await getCollection<"posts">("posts", ({ data }) => { + return import.meta.env.PROD ? data.draft !== true : true; + }); + const count: { [key: string]: number } = {}; + allBlogPosts.forEach((post: { data: { category: string | null } }) => { + if (!post.data.category) { + const ucKey = i18n(I18nKey.uncategorized); + count[ucKey] = count[ucKey] ? count[ucKey] + 1 : 1; + return; + } + + const categoryName = + typeof post.data.category === "string" + ? post.data.category.trim() + : String(post.data.category).trim(); + + count[categoryName] = count[categoryName] ? count[categoryName] + 1 : 1; + }); + + const lst = Object.keys(count).sort((a, b) => { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }); + + const ret: Category[] = []; + for (const c of lst) { + ret.push({ + name: c, + count: count[c], + url: getCategoryUrl(c), + }); + } + return ret; +} \ No newline at end of file diff --git a/src/utils/date.ts b/src/utils/date.ts new file mode 100644 index 0000000..a801a4c --- /dev/null +++ b/src/utils/date.ts @@ -0,0 +1,24 @@ +import { langToLocaleMap } from "@i18n/language"; +import { getDefaultLanguage } from "./language"; + + +export function formatDateToYYYYMMDD(date: Date): string { + return date.toISOString().substring(0, 10); +} + +// 国际化日期格式化函数 +export function formatDateI18n(dateString: string): string { + const date = new Date(dateString); + const lang = getDefaultLanguage(); + + // 根据语言设置不同的日期格式 + const options: Intl.DateTimeFormatOptions = { + year: "numeric", + month: "long", + day: "numeric", + }; + + // 使用统一的语言配置获取 locale + const locale = langToLocaleMap[lang] || "en-US"; + return date.toLocaleDateString(locale, options); +} \ No newline at end of file diff --git a/src/utils/diary.ts b/src/utils/diary.ts new file mode 100644 index 0000000..ad3d223 --- /dev/null +++ b/src/utils/diary.ts @@ -0,0 +1,25 @@ +// Diary data configuration file +// Used to manage data for the diary display page +const diaryModules = import.meta.glob('../content/diary/*.json', { eager: true }); + +export interface Moment { + id: string; + content: string; + date: string; + images?: string[]; +} + +export const moments: Moment[] = Object.entries(diaryModules).map(([path, mod]: [string, any]) => { + const id = path.split('/').pop()?.replace('.json', '') || ''; + const data = mod.default as any; + const moment: Moment = { + id, + ...data, + }; + return moment; +}); + +// Sort moments by date in descending order +export const sortedMoments = [...moments].sort( + (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(), +); \ No newline at end of file diff --git a/src/utils/fancybox.ts b/src/utils/fancybox.ts new file mode 100644 index 0000000..b959372 --- /dev/null +++ b/src/utils/fancybox.ts @@ -0,0 +1,101 @@ +let fancyboxSelectors: string[] = []; +let Fancybox: any; + +// 图片灯箱按需加载 +export async function initFancybox() { + if (typeof document === "undefined") return; + // 相册图片选择器 (只绑定不在 a 标签内的图片,避免与链接绑定冲突) + const albumImagesSelector = ".custom-md img:not(a *), #post-cover img:not(a *), .moment-images img:not(a *), .photo-gallery img:not(a *)"; + // 相册链接选择器 + const albumLinksSelector = ".moment-images a[data-fancybox], .photo-gallery a[data-fancybox]"; + // 单张图片选择器 + const singleFancyboxSelector = "[data-fancybox]:not(.moment-images a):not(.photo-gallery a)"; + // 检查是否有图片需要绑定 + const hasImages = + document.querySelector(albumImagesSelector) || + document.querySelector(albumLinksSelector) || + document.querySelector(singleFancyboxSelector); + if (!hasImages) return; + // 检查是否已初始化 Fancybox + if (!Fancybox) { + const mod = await import("@fancyapps/ui"); + Fancybox = mod.Fancybox; + await import("@fancyapps/ui/dist/fancybox/fancybox.css"); + } + if (fancyboxSelectors.length > 0) { + return; // 已经初始化,直接返回 + } + // 公共配置 + const commonConfig = { + Thumbs: { + autoStart: true, + showOnStart: "yes" + }, + Toolbar: { + display: { + left: ["infobar"], + middle: [ + "zoomIn", + "zoomOut", + "toggle1to1", + "rotateCCW", + "rotateCW", + "flipX", + "flipY", + ], + right: ["slideshow", "thumbs", "close"], + }, + }, + animated: true, + dragToClose: true, + keyboard: { + Escape: "close", + Delete: "close", + Backspace: "close", + PageUp: "next", + PageDown: "prev", + ArrowUp: "next", + ArrowDown: "prev", + ArrowRight: "next", + ArrowLeft: "prev", + }, + fitToView: true, + preload: 3, + infinite: true, + Panzoom: { + maxScale: 3, + minScale: 1 + }, + caption: false, + }; + // 绑定相册/文章图片 + Fancybox.bind(albumImagesSelector, { + ...commonConfig, + groupAll: true, + Carousel: { + transition: "slide", + preload: 2, + }, + }); + fancyboxSelectors.push(albumImagesSelector); + // 绑定相册链接 + Fancybox.bind(albumLinksSelector, { + ...commonConfig, + source: (el: any) => { + return el.getAttribute("data-src") || el.getAttribute("href"); + }, + }); + fancyboxSelectors.push(albumLinksSelector); + // 绑定单独的 fancybox 图片 + Fancybox.bind(singleFancyboxSelector, commonConfig); + fancyboxSelectors.push(singleFancyboxSelector); +} + +// 清理 Fancybox 实例 +export function cleanupFancybox() { + if (!Fancybox) return; // 如果从未加载过,无需清理 + fancyboxSelectors.forEach((selector) => { + Fancybox.unbind(selector); + }); + fancyboxSelectors = []; +} \ No newline at end of file diff --git a/src/utils/friends.ts b/src/utils/friends.ts new file mode 100644 index 0000000..be3e445 --- /dev/null +++ b/src/utils/friends.ts @@ -0,0 +1,18 @@ +// Friends links data configuration file +// Used to manage data for the friends page +const friendModules = import.meta.glob('../content/friends/*.json', { eager: true }); + +export interface FriendLink { + id: string; + title: string; + imgurl: string; + desc: string; + siteurl: string; + tags?: string[]; +} + +export const friendsData: FriendLink[] = Object.entries(friendModules).map(([path, mod]: [string, any]) => { + const id = path.split('/').pop()?.replace('.json', '') || ''; + const data = mod.default; + return { id, ...data } as FriendLink; +}); \ No newline at end of file diff --git a/src/utils/hue.ts b/src/utils/hue.ts new file mode 100644 index 0000000..62a5e60 --- /dev/null +++ b/src/utils/hue.ts @@ -0,0 +1,41 @@ +import { siteConfig } from "@/config"; + + +// Function to set hue +export function setHue(hue: number): void { + if (typeof localStorage !== "undefined") { + localStorage.setItem("hue", String(hue)); + } + if (typeof document !== "undefined") { + const r = document.querySelector(":root") as HTMLElement; + if (!r) { + return; + } + r.style.setProperty("--hue", String(hue)); + } +} + +// Function to get default hue from config-carrier dataset +export function getDefaultHue(): number { + const fallback = siteConfig.themeColor.hue.toString(); + if (typeof document !== "undefined") { + const configCarrier = document.getElementById("config-carrier"); + return Number.parseInt(configCarrier?.dataset.hue || fallback); + } + return Number.parseInt(fallback); +} + +// Function to get hue from local storage or default +export function getHue(): number { + if (typeof localStorage !== "undefined") { + const stored = localStorage.getItem("hue"); + return stored ? Number.parseInt(stored) : getDefaultHue(); + } + return getDefaultHue(); +} + +// Function to initialize hue from local storage or default +export function initHue(): void { + const hue = getHue(); + setHue(hue); +} \ No newline at end of file diff --git a/src/utils/language.ts b/src/utils/language.ts new file mode 100644 index 0000000..359a333 --- /dev/null +++ b/src/utils/language.ts @@ -0,0 +1,210 @@ +import { + type SupportedLanguage, + SUPPORTED_LANGUAGES, + langToTranslateMap, + translateToLangMap, + LANGUAGE_CONFIG, +} from "@i18n/language"; +import { + siteConfig, +} from "@/config"; + + +// 重新导出以保持向后兼容 +export { SUPPORTED_LANGUAGES, type SupportedLanguage, langToTranslateMap, translateToLangMap }; + + +// 语言存储键 +const LANG_STORAGE_KEY = "selected-language"; + +// 存储语言设置 +export function setStoredLanguage(lang: string): void { + if (typeof localStorage !== "undefined") { + localStorage.setItem(LANG_STORAGE_KEY, lang); + } +} + +// 获取存储的语言设置 +export function getStoredLanguage(): string | null { + if (typeof localStorage !== "undefined") { + return localStorage.getItem(LANG_STORAGE_KEY); + } + return null; +} + +// 获取默认语言配置 +export function getDefaultLanguage(): string { + const fallback = siteConfig.lang; + if (typeof document !== "undefined") { + const configCarrier = document.getElementById("config-carrier"); + return configCarrier?.dataset.lang || fallback; + } + return fallback; +} + +// 将配置文件的语言代码转换为翻译服务的语言代码 +export function getTranslateLanguageFromConfig(configLang: string): string { + return langToTranslateMap[configLang] || "chinese_simplified"; +} + +// 获取解析后的站点语言代码 +export function getResolvedSiteLang(): SupportedLanguage { + const configLang = getDefaultLanguage() as any; + if (SUPPORTED_LANGUAGES.includes(configLang)) { + return configLang as SupportedLanguage; + } + // 如果 siteConfig.lang 不合规,则使用浏览器检测到的语言 + return detectBrowserLanguage(); +} + +// 将翻译服务的语言代码转换为配置文件的语言代码 +export function getConfigLanguageFromTranslate(translateLang: string): string { + return translateToLangMap[translateLang] || "zh"; +} + +// 获取语言的显示名称 +export function getLanguageDisplayName(langCode: string): string { + // 先尝试作为配置语言代码查找 + if (langCode in LANGUAGE_CONFIG) { + return LANGUAGE_CONFIG[langCode as SupportedLanguage].displayName; + } + // 尝试作为翻译服务代码查找 + const configLang = translateToLangMap[langCode]; + if (configLang && configLang in LANGUAGE_CONFIG) { + return LANGUAGE_CONFIG[configLang as SupportedLanguage].displayName; + } + // 如果都找不到,返回原始代码 + return langCode; +} + +// 检测浏览器语言并返回支持的语言代码 +export function detectBrowserLanguage(fallbackLang: SupportedLanguage = "en"): SupportedLanguage { + // 服务端渲染时返回备用语言 + if (typeof window === "undefined" || typeof navigator === "undefined") { + return fallbackLang; + } + // 获取浏览器语言列表 + const browserLangs = navigator.languages || [navigator.language]; + // 遍历浏览器语言列表,找到第一个支持的语言 + for (const browserLang of browserLangs) { + // 提取主语言代码(例如:'zh-CN' -> 'zh', 'en-US' -> 'en') + const langCode = browserLang.toLowerCase().split("-")[0]; + // 检查是否在支持的语言列表中 + if (SUPPORTED_LANGUAGES.includes(langCode as SupportedLanguage)) { + return langCode as SupportedLanguage; + } + } + // 如果没有找到支持的语言,返回备用语言 + return fallbackLang; +} + +// 获取当前站点语言(优先使用缓存,其次是配置语言,最后是浏览器检测) +export function getSiteLanguage(configLang?: string): string { + // 优先从缓存读取 + const storedLang = getStoredLanguage(); + if (storedLang) return storedLang; + // 其次使用传入的配置语言或从 carrier 获取的默认语言 + const defaultLang = configLang || getDefaultLanguage(); + if (SUPPORTED_LANGUAGES.includes(defaultLang as SupportedLanguage)) { + return langToTranslateMap[defaultLang]; + } + // 最后自动检测浏览器语言并转换为翻译服务代码 + const browserLang = detectBrowserLanguage(); + return langToTranslateMap[browserLang]; +} + +// 初始化翻译功能 +export function initTranslateService(): void { + if (typeof window === "undefined" || !siteConfig.translate?.enable) return; + // 检查 translate.js 是否已加载 + const translate = (window as any).translate; + if (!translate || (window as any).translateInitialized) return; + // 配置 translate.js + if (siteConfig.translate.service) { + translate.service.use(siteConfig.translate.service); + } + // 设置源语言(始终是网站渲染的语言) + const resolvedLang = getResolvedSiteLang(); + const sourceLang = getTranslateLanguageFromConfig(resolvedLang); + translate.language.setLocal(sourceLang); + // 获取目标语言(缓存 -> 配置 -> 浏览器) + const targetLang = getSiteLanguage(resolvedLang); + // 如果目标语言不同于源语言,则设置目标语言 + if (targetLang && targetLang !== sourceLang) { + translate.to = targetLang; + } + // 自动识别语言 + if (siteConfig.translate.autoDiscriminate) { + translate.setAutoDiscriminateLocalLanguage(); + } + // 设置忽略项 + if (siteConfig.translate.ignoreClasses) { + siteConfig.translate.ignoreClasses.forEach((className: string) => { + translate.ignore.class.push(className); + }); + } + if (siteConfig.translate.ignoreTags) { + siteConfig.translate.ignoreTags.forEach((tagName: string) => { + translate.ignore.tag.push(tagName); + }); + } + // UI 配置 + if (siteConfig.translate.showSelectTag === false) { + translate.selectLanguageTag.show = false; + } + // 接管存储逻辑:使用自定义缓存并同步到 translate.js + translate.storage.set = function (key: string, value: string) { + if (key === "to") { // translate.js 使用 "to" 存储目标语言 + setStoredLanguage(value); + } else { + localStorage.setItem(key, value); + } + }; + translate.storage.get = function (key: string) { + if (key === "to") { + return getStoredLanguage(); + } + return localStorage.getItem(key); + }; + // 启动翻译监听 + translate.listener.start(); + (window as any).translateInitialized = true; + // 如果目标语言存在且不是源语言,执行翻译 + // 强制执行一次 execute 以确保初始化时应用翻译 + if (translate.to && translate.to !== translate.language.getLocal()) { + // 延迟一小段时间执行,确保 DOM 完全就绪 + setTimeout(() => { + translate.execute(); + }, 10); + } else if (translate.to === translate.language.getLocal()) { + // 如果目标语言就是源语言,确保处于未翻译状态 + // 有时插件可能会残留之前的翻译状态 + translate.reset(); + } +} + +// 加载并初始化翻译功能 +export async function loadAndInitTranslate(): Promise { + if (typeof window === "undefined" || !siteConfig.translate?.enable) return; + try { + // 检查是否已经加载 + if (!(window as any).translate) { + // 使用动态导入,Vite 会自动处理代码分割 + await import("@/plugins/translate"); + (window as any).translateScriptLoaded = true; + } + // 初始化服务 + initTranslateService(); + } catch (error) { + console.error('Failed to load or init translate.js:', error); + } +} + +// 切换语言 +export function toggleLanguage(langCode: string): void { + const translate = (window as any).translate; + if (!translate) return; + // 切换语言 + translate.changeLanguage(langCode); + setStoredLanguage(langCode); +} \ No newline at end of file diff --git a/src/utils/markdown.ts b/src/utils/markdown.ts new file mode 100644 index 0000000..eef0d41 --- /dev/null +++ b/src/utils/markdown.ts @@ -0,0 +1,117 @@ +/** + * Markdown 相关交互逻辑 + * 包括代码块复制和折叠功能 + * 使用事件委托,确保在 Swup 无刷新跳转后依然有效 + */ + +export function initMarkdownActions() { + if (typeof document === "undefined") return; + // 移除旧的监听器(如果有),防止重复绑定 + // 注意:由于使用的是匿名函数且通常在页面加载时只运行一次,在 Swup 环境下只要这个脚本在主布局中加载,它就只会运行一次。 + document.addEventListener("click", function (e: MouseEvent) { + const target = e.target as Element | null; + if (!target) return; + + // 1. 处理复制按钮点击 + if (target.classList.contains("copy-btn") || target.closest(".copy-btn")) { + const btn = target.classList.contains("copy-btn") ? target : target.closest(".copy-btn"); + if (!btn) return; + + const codeEle = btn.parentElement?.querySelector("code"); + + // 精确的代码提取逻辑 + let code = ''; + if (codeEle) { + // 获取所有代码行元素 + const lineElements = codeEle.querySelectorAll('span.line'); + // 对于有行结构的代码块,精确处理每一行 + if (lineElements.length > 0) { + const lines: string[] = []; + for (let i = 0; i < lineElements.length; i++) { + const lineElement = lineElements[i]; + const lineText = lineElement.textContent || ''; + lines.push(lineText); + } + code = lines.join('\n'); + } else { + const codeElements = codeEle.querySelectorAll('.code:not(summary *)'); + if (codeElements.length > 0) { + const lines: string[] = []; + for (let i = 0; i < codeElements.length; i++) { + const el = codeElements[i]; + const lineText = el.textContent || ''; + lines.push(lineText); + } + code = lines.join('\n'); + } else { + code = codeEle.textContent || ''; + } + } + } + + // 处理连续空行 + code = code.replace(/\n\n\n+/g, function(match) { + const newlineCount = match.length; + const emptyLineCount = newlineCount - 1; + let resultEmptyLines: number; + if (emptyLineCount % 2 === 0) { + resultEmptyLines = emptyLineCount / 2; + } else { + resultEmptyLines = Math.floor((emptyLineCount + 1) / 2); + } + if (resultEmptyLines < 1) resultEmptyLines = 1; + return '\n'.repeat(resultEmptyLines + 1); + }); + + // 尝试多种复制方法 + const copyToClipboard = async (text: string) => { + try { + await navigator.clipboard.writeText(text); + } catch (clipboardErr) { + console.warn('Clipboard API 失败,尝试备用方案:', clipboardErr); + const textArea = document.createElement('textarea'); + textArea.value = text; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + try { + document.execCommand('copy'); + } catch (execErr) { + console.error('execCommand 也失败了:', execErr); + throw new Error('所有复制方法都失败了'); + } finally { + document.body.removeChild(textArea); + } + } + }; + + // 调用复制函数 + copyToClipboard(code).then(() => { + const timeoutId = btn.getAttribute("data-timeout-id"); + if (timeoutId) { + clearTimeout(parseInt(timeoutId)); + } + btn.classList.add("success"); + const newTimeoutId = setTimeout(() => { + btn.classList.remove("success"); + }, 1000); + btn.setAttribute("data-timeout-id", newTimeoutId.toString()); + }).catch(err => { + console.error('复制失败:', err); + }); + } + + // 2. 处理折叠按钮点击 + if (target.classList.contains("collapse-btn") || target.closest(".collapse-btn")) { + const btn = target.classList.contains("collapse-btn") ? target : target.closest(".collapse-btn"); + const codeBlock = btn?.closest(".expressive-code"); + if (codeBlock) { + codeBlock.classList.toggle("collapsed"); + codeBlock.classList.toggle("expanded"); + } + } + }); +} diff --git a/src/utils/navigation.ts b/src/utils/navigation.ts new file mode 100644 index 0000000..f7af033 --- /dev/null +++ b/src/utils/navigation.ts @@ -0,0 +1,130 @@ +/** + * 导航工具函数 + * 提供统一的页面导航功能,支持 Swup 无刷新跳转 + */ +import { navbarConfig } from "@/config"; +import { LinkPresets } from "@constants/link-presets"; +import { type NavbarLink } from "@/types/config"; +import { pathsEqual } from "./url"; + + +/** + * 根据当前路径查找其所属的父级页面(如 [...menu].astro 生成的中转页) + * @param currentPath 当前页面的路径 + * @returns 如果找到父级页面,则返回该页面的 NavbarLink 对象,否则返回 undefined + */ +export function getParentLink(currentPath: string): NavbarLink | undefined { + // 遍历导航栏中的所有链接 + for (const link of navbarConfig.links) { + // 检查是否有子链接且不是 LinkPreset 枚举 + if (typeof link !== "number" && link.children && link.children.length > 0) { + // 检查子链接中是否包含当前路径 + for (const child of link.children) { + let childLink: NavbarLink; + if (typeof child === "number") { + childLink = LinkPresets[child]; + } else { + childLink = child; + } + // 比较路径是否匹配 + if (pathsEqual(childLink.url, currentPath)) { + return link; + } + } + } + } + return undefined; +} + +/** + * 降级导航函数 + * 当 Swup 不可用时使用普通的页面跳转 + */ +function fallbackNavigation( + url: string, + options?: { + replace?: boolean; + force?: boolean; + }, +): void { + if (typeof window === "undefined") return; + if (options?.replace) { + window.location.replace(url); + } else { + window.location.href = url; + } +} + +/** + * 导航到指定页面 + * @param url 目标页面URL + * @param options 导航选项 + */ +export function navigateToPage( + url: string, + options?: { + replace?: boolean; + force?: boolean; + }, +): void { + // 检查 URL 是否有效 + if (!url || typeof url !== "string") { + console.warn("navigateToPage: Invalid URL provided"); + return; + } + + // 如果是外部链接,直接跳转 + if ( + url.startsWith("http://") || + url.startsWith("https://") || + url.startsWith("//") + ) { + window.open(url, "_blank"); + return; + } + + // 如果是锚点链接,滚动到对应位置 + if (url.startsWith("#")) { + if (typeof document !== "undefined") { + const element = document.getElementById(url.slice(1)); + if (element) { + element.scrollIntoView({ behavior: "smooth" }); + } + } + return; + } + + // 检查 Swup 是否可用 + if (typeof window !== "undefined" && (window as any).swup) { + try { + // 使用 Swup 进行无刷新跳转 + if (options?.replace) { + (window as any).swup.navigate(url, { history: false }); + } else { + (window as any).swup.navigate(url); + } + } catch (error) { + console.error("Swup navigation failed:", error); + // 降级到普通跳转 + fallbackNavigation(url, options); + } + } else { + // Swup 不可用时的降级处理 + fallbackNavigation(url, options); + } +} + +/** + * 获取当前页面路径 + */ +export function getCurrentPath(): string { + return typeof window !== "undefined" ? window.location.pathname : ""; +} + +/** + * 检查是否为首页 + */ +export function isHomePage(): boolean { + const path = getCurrentPath(); + return path === "/" || path === ""; +} \ No newline at end of file diff --git a/src/utils/particle.ts b/src/utils/particle.ts new file mode 100644 index 0000000..37759e6 --- /dev/null +++ b/src/utils/particle.ts @@ -0,0 +1,393 @@ +import type { ParticleConfig } from "@/types/config"; +import { particleConfig } from "@/config"; + + +const BOUNDARY_OFFSET = 100; + +// 粒子对象类 +class Particle { + x: number; + y: number; + s: number; + r: number; + a: number; + fn: { + x: (x: number, y: number) => number; + y: (x: number, y: number) => number; + r: (r: number) => number; + a: (a: number) => number; + }; + idx: number; + img: HTMLImageElement; + limitArray: number[]; + config: ParticleConfig; + // 构造函数 + constructor( + x: number, + y: number, + s: number, + r: number, + a: number, + fn: { + x: (x: number, y: number) => number; + y: (x: number, y: number) => number; + r: (r: number) => number; + a: (a: number) => number; + }, + idx: number, + img: HTMLImageElement, + limitArray: number[], + config: ParticleConfig, + ) { + this.x = x; + this.y = y; + this.s = s; + this.r = r; + this.a = a; + this.fn = fn; + this.idx = idx; + this.img = img; + this.limitArray = limitArray; + this.config = config; + } + // 绘制粒子 + draw(cxt: CanvasRenderingContext2D) { + cxt.save(); + cxt.translate(this.x, this.y); + cxt.rotate(this.r); + cxt.globalAlpha = this.a; + cxt.drawImage(this.img, 0, 0, 40 * this.s, 40 * this.s); + cxt.restore(); + } + // 更新粒子位置和状态 + update() { + this.x = this.fn.x(this.x, this.y); + this.y = this.fn.y(this.y, this.y); + this.r = this.fn.r(this.r); + this.a = this.fn.a(this.a); + // 如果粒子越界或完全透明,重新调整位置 + if ( + this.x > window.innerWidth || + this.x < 0 || + this.y > window.innerHeight + BOUNDARY_OFFSET || + this.y < -BOUNDARY_OFFSET || // 从顶部消失 + this.a <= 0 + ) { + // 如果粒子不做限制 + if (this.limitArray[this.idx] === -1) { + this.resetPosition(); + } + // 否则粒子有限制 + else { + if (this.limitArray[this.idx] > 0) { + this.resetPosition(); + this.limitArray[this.idx]--; + } + } + } + } + // 重置粒子位置 + private resetPosition() { + this.r = getRandom("fnr", this.config); + if (Math.random() > 0.4) { + this.x = getRandom("x", this.config); + this.y = window.innerHeight + Math.random() * BOUNDARY_OFFSET; // 从屏幕底部开始 + this.s = getRandom("s", this.config); + this.r = getRandom("r", this.config); + this.a = getRandom('a', this.config); + } else { + this.x = window.innerWidth; + this.y = getRandom("y", this.config); + this.s = getRandom("s", this.config); + this.r = getRandom("r", this.config); + this.a = getRandom('a', this.config); + } + } +} + +// 粒子列表类 +class ParticleList { + list: Particle[]; + // 构造函数 + constructor() { + this.list = []; + } + // 添加粒子 + push(particle: Particle) { + this.list.push(particle); + } + // 更新所有粒子 + update() { + for (let i = 0, len = this.list.length; i < len; i++) { + this.list[i].update(); + } + } + // 绘制所有粒子 + draw(cxt: CanvasRenderingContext2D) { + for (let i = 0, len = this.list.length; i < len; i++) { + this.list[i].draw(cxt); + } + } + // 获取指定索引的粒子 + get(i: number) { + return this.list[i]; + } + // 获取粒子数量 + size() { + return this.list.length; + } +} + +// 获取随机值的函数 +function getRandom(option: string, config: ParticleConfig): any { + let ret: any; + let random: number; + // 根据选项获取随机值 + switch (option) { + case "x": + ret = Math.random() * window.innerWidth; + break; + case "y": + ret = window.innerHeight + Math.random() * BOUNDARY_OFFSET; // 初始位置在屏幕底部 + break; + case "s": + ret = + config.size.min + Math.random() * (config.size.max - config.size.min); + break; + case "r": + ret = Math.random() * 6; + break; + case "a": + ret = config.opacity.min + Math.random() * (config.opacity.max - config.opacity.min); + break; + case "fnx": + random = config.speed.horizontal.min + Math.random() * (config.speed.horizontal.max - config.speed.horizontal.min); // x方向保持较小的随机运动 + ret = function (x: number, y: number) { + return x + random; + }; + break; + case "fny": + random = -(config.speed.vertical.min + Math.random() * (config.speed.vertical.max - config.speed.vertical.min)); // y方向随机向上运动 + ret = function (x: number, y: number) { + return y + random; + }; + break; + case "fnr": + ret = function (r: number) { + return r + config.speed.rotation * 0.1; + }; + break; + case "fna": + ret = function (alpha: number) { + return alpha - config.speed.fadeSpeed * 0.01; + }; + break; + } + return ret; +} + +// 粒子管理器类 +export class ParticleManager { + private config: ParticleConfig; + private canvas: HTMLCanvasElement | null = null; + private ctx: CanvasRenderingContext2D | null = null; + private particleList: ParticleList | null = null; + private animationId: number | null = null; + private img: HTMLImageElement | null = null; + private isRunning = false; + // 构造函数 + constructor(config: ParticleConfig) { + this.config = config; + } + // 初始化粒子特效 + async init(): Promise { + if (typeof document === "undefined" || !this.config.enable || this.isRunning) { + return; + } + // 创建图片对象 + this.img = new Image(); + this.img.src = "/assets/images/particle.png"; // 使用粒子图片 + // 等待图片加载完成 + await new Promise((resolve, reject) => { + if (this.img) { + this.img.onload = () => resolve(); + this.img.onerror = () => + reject(new Error("Failed to load particle image")); + } + }); + // 创建画布 + this.createCanvas(); + // 创建粒子列表 + this.createParticleList(); + // 启动动画循环 + this.startAnimation(); + // 标记为运行中 + this.isRunning = true; + } + // 创建画布 + private createCanvas(): void { + if (typeof document === "undefined") return; + this.canvas = document.createElement("canvas"); + this.canvas.height = window.innerHeight; + this.canvas.width = window.innerWidth; + this.canvas.setAttribute( + "style", + `position: fixed; left: 0; top: 0; pointer-events: none; z-index: ${this.config.zIndex};`, + ); + this.canvas.setAttribute("id", "canvas_particle"); + document.body.appendChild(this.canvas); + this.ctx = this.canvas.getContext("2d"); + // 监听窗口大小变化 + if (typeof window !== "undefined") { + window.addEventListener("resize", this.handleResize.bind(this)); + } + } + // 创建粒子列表 + private createParticleList(): void { + if (!this.img || !this.ctx) return; + this.particleList = new ParticleList(); + const limitArray = new Array(this.config.particleNum).fill( + this.config.limitTimes, + ); + for (let i = 0; i < this.config.particleNum; i++) { + const randomX = getRandom("x", this.config); + const randomY = getRandom("y", this.config); + const randomS = getRandom("s", this.config); + const randomR = getRandom("r", this.config); + const randomA = getRandom("a", this.config); + const randomFnx = getRandom("fnx", this.config); + const randomFny = getRandom("fny", this.config); + const randomFnR = getRandom("fnr", this.config); + const randomFnA = getRandom("fna", this.config); + const particle = new Particle( + randomX, + randomY, + randomS, + randomR, + randomA, + { + x: randomFnx, + y: randomFny, + r: randomFnR, + a: randomFnA, + }, + i, + this.img, + limitArray, + this.config, + ); + particle.draw(this.ctx); + this.particleList.push(particle); + } + } + // 开始动画 + private startAnimation(): void { + if (!this.ctx || !this.canvas || !this.particleList) return; + const animate = () => { + if (!this.ctx || !this.canvas || !this.particleList) return; + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.particleList.update(); + this.particleList.draw(this.ctx); + this.animationId = requestAnimationFrame(animate); + }; + this.animationId = requestAnimationFrame(animate); + } + // 处理窗口大小变化 + private handleResize(): void { + if (this.canvas) { + this.canvas.width = window.innerWidth; + this.canvas.height = window.innerHeight; + } + } + // 停止粒子特效 + stop(): void { + if (this.animationId && typeof window !== "undefined") { + cancelAnimationFrame(this.animationId); + this.animationId = null; + } + if (this.canvas && typeof document !== "undefined") { + document.body.removeChild(this.canvas); + this.canvas = null; + } + if (typeof window !== "undefined") { + window.removeEventListener("resize", this.handleResize.bind(this)); + } + this.isRunning = false; + } + // 切换粒子特效 + toggle(): void { + if (this.isRunning) { + this.stop(); + } else { + this.init(); + } + } + // 更新配置 + updateConfig(newConfig: ParticleConfig): void { + const wasRunning = this.isRunning; + if (wasRunning) { + this.stop(); + } + this.config = newConfig; + if (wasRunning && newConfig.enable) { + this.init(); + } + } + // 获取运行状态 + getIsRunning(): boolean { + return this.isRunning; + } +} + +// 创建全局粒子管理器实例 +let globalParticleManager: ParticleManager | null = null; + +// 初始化粒子特效 +export function initParticle(config: ParticleConfig): void { + if (globalParticleManager) { + globalParticleManager.updateConfig(config); + } else { + globalParticleManager = new ParticleManager(config); + if (config.enable) { + globalParticleManager.init(); + } + } +} + +// 切换粒子特效 +export function toggleParticle(): void { + if (globalParticleManager) { + globalParticleManager.toggle(); + } +} + +// 停止粒子特效 +export function stopParticle(): void { + if (globalParticleManager) { + globalParticleManager.stop(); + globalParticleManager = null; + } +} + +// 获取粒子特效运行状态 +export function getParticleStatus(): boolean { + return globalParticleManager ? globalParticleManager.getIsRunning() : false; +} + +// 包含配置检查、重复初始化检查以及页面加载状态处理 +export function setupParticleEffects(): void { + if (typeof window === "undefined") return; + // 初始化函数 + const init = () => { + if (!particleConfig || !particleConfig.enable) return; + if ((window as any).particleInitialized) return; + initParticle(particleConfig); + (window as any).particleInitialized = true; + }; + // 处理页面加载状态 + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } +} \ No newline at end of file diff --git a/src/utils/projects.ts b/src/utils/projects.ts new file mode 100644 index 0000000..bda46b8 --- /dev/null +++ b/src/utils/projects.ts @@ -0,0 +1,71 @@ +// Project data configuration file +// Used to manage data for the project display page +const projectModules = import.meta.glob('../content/projects/*.json', { eager: true }); + +export interface Project { + id: string; + title: string; + description: string; + image: string; + category: "library" | "ai" | "software" | "website" | "game"; + techStack: string[]; + status: "completed" | "in-progress" | "planned"; + demoUrl?: string; + sourceUrl?: string; + startDate: string; + endDate?: string; + featured?: boolean; + tags?: string[]; +} + +export const projectsData: Project[] = Object.entries(projectModules).map(([path, mod]: [string, any]) => { + const id = path.split('/').pop()?.replace('.json', '') || ''; + const data = mod.default as any; + const project: Project = { + id, + ...data, + demoUrl: data.demoUrl ?? data.liveDemo, + sourceUrl: data.sourceUrl ?? data.sourceCode, + }; + return project; +}); + +// Get project statistics +export const getProjectStats = () => { + const total = projectsData.length; + const completed = projectsData.filter((p) => p.status === "completed").length; + const inProgress = projectsData.filter( + (p) => p.status === "in-progress", + ).length; + const planned = projectsData.filter((p) => p.status === "planned").length; + return { + total, + byStatus: { + completed, + inProgress, + planned, + }, + }; +}; + +// Get projects by category +export const getProjectsByCategory = (category?: string) => { + if (!category || category === "all") { + return projectsData; + } + return projectsData.filter((p) => p.category === category); +}; + +// Get featured projects +export const getFeaturedProjects = () => { + return projectsData.filter((p) => p.featured); +}; + +// Get all tech stacks +export const getAllTechStack = () => { + const techSet = new Set(); + projectsData.forEach((project) => { + project.techStack.forEach((tech) => techSet.add(tech)); + }); + return Array.from(techSet).sort(); +}; \ No newline at end of file diff --git a/src/utils/skills.ts b/src/utils/skills.ts new file mode 100644 index 0000000..64a73bf --- /dev/null +++ b/src/utils/skills.ts @@ -0,0 +1,76 @@ +// Skill data configuration file +// Used to manage data for the skill display page +const skillModules = import.meta.glob('../content/skills/*.json', { eager: true }); + +export interface Skill { + id: string; + name: string; + description: string; + icon: string; // Iconify icon name + category: "ai" | "backend" | "client" | "frontend" | "database" | "engines" | "tools" | "others"; + level: "beginner" | "intermediate" | "advanced" | "expert"; + experience: { + years: number; + months: number; + }; + projects?: string[]; // Related project IDs + certifications?: string[]; + color?: string; // Skill card theme color +} + +export const skillsData: Skill[] = Object.entries(skillModules).map(([path, mod]: [string, any]) => { + const id = path.split('/').pop()?.replace('.json', '') || ''; + const data = mod.default; + return { id, ...data } as Skill; +}); + +// Get skill statistics +export const getSkillStats = () => { + const total = skillsData.length; + const byLevel = { + beginner: skillsData.filter((s) => s.level === "beginner").length, + intermediate: skillsData.filter((s) => s.level === "intermediate").length, + advanced: skillsData.filter((s) => s.level === "advanced").length, + expert: skillsData.filter((s) => s.level === "expert").length, + }; + const byCategory = { + ai: skillsData.filter((s) => s.category === "ai").length, + backend: skillsData.filter((s) => s.category === "backend").length, + client: skillsData.filter((s) => s.category === "client").length, + frontend: skillsData.filter((s) => s.category === "frontend").length, + database: skillsData.filter((s) => s.category === "database").length, + tools: skillsData.filter((s) => s.category === "tools").length, + engines: skillsData.filter((s) => s.category === "engines").length, + others: skillsData.filter((s) => s.category === "others").length, + }; + return { total, byLevel, byCategory }; +}; + + +// Get skills by category +export const getSkillsByCategory = (category?: string) => { + if (!category || category === "all") { + return skillsData; + } + return skillsData.filter((s) => s.category === category); +}; + + +// Get advanced skills +export const getAdvancedSkills = () => { + return skillsData.filter( + (s) => s.level === "advanced" || s.level === "expert", + ); +}; + + +// Calculate total years of experience +export const getTotalExperience = () => { + const totalMonths = skillsData.reduce((total, skill) => { + return total + skill.experience.years * 12 + skill.experience.months; + }, 0); + return { + years: Math.floor(totalMonths / 12), + months: totalMonths % 12, + }; +}; \ No newline at end of file diff --git a/src/utils/theme.ts b/src/utils/theme.ts new file mode 100644 index 0000000..d4eb4eb --- /dev/null +++ b/src/utils/theme.ts @@ -0,0 +1,108 @@ +import { + SYSTEM_MODE, + DARK_MODE, + LIGHT_MODE, +} from "@constants/constants"; +import type { + LIGHT_DARK_MODE, +} from "@/types/config"; +import { + siteConfig, +} from "@/config"; + + +// Function to apply theme to document +export function applyThemeToDocument(theme: LIGHT_DARK_MODE, force = false) { + if (typeof document === "undefined") return; + // 获取当前主题状态的完整信息 + const currentIsDark = document.documentElement.classList.contains("dark"); + const currentTheme = document.documentElement.getAttribute("data-theme"); + // 计算目标主题状态 + let targetIsDark: boolean; + switch (theme) { + case LIGHT_MODE: + targetIsDark = false; + break; + case DARK_MODE: + targetIsDark = true; + break; + case SYSTEM_MODE: + targetIsDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + break; + default: + targetIsDark = currentIsDark; // fallback to current mode if theme is unknown + break; + } + // 检测是否真的需要主题切换 + const needsThemeChange = currentIsDark !== targetIsDark; + const targetTheme = targetIsDark ? "github-dark" : "github-light"; + const needsCodeThemeUpdate = currentTheme !== targetTheme; + // 如果既不需要主题切换也不需要代码主题更新且不是强制更新,直接返回 + if (!force && !needsThemeChange && !needsCodeThemeUpdate) { + return; + } + // 只在需要主题切换时添加过渡保护 + if (needsThemeChange) { + document.documentElement.classList.add("is-theme-transitioning"); + } + // 使用 requestAnimationFrame 确保在下一帧执行,避免闪屏 + requestAnimationFrame(() => { + // 应用主题变化 + if (needsThemeChange) { + if (targetIsDark) { + document.documentElement.classList.add("dark"); + } else { + document.documentElement.classList.remove("dark"); + } + } + // Set the theme for Expressive Code based on current mode + document.documentElement.setAttribute("data-theme", targetTheme); + // 在下一帧快速移除保护类,使用微任务确保DOM更新完成 + if (needsThemeChange) { + // 使用 requestAnimationFrame 确保在下一帧移除过渡保护类 + requestAnimationFrame(() => { + document.documentElement.classList.remove("is-theme-transitioning"); + }); + } + }); +} + +// Function to set theme +export function setTheme(theme: LIGHT_DARK_MODE): void { + if (typeof localStorage !== "undefined") { + localStorage.setItem("theme", theme); + } + applyThemeToDocument(theme); +} + +// Function to get default theme from config-carrier +export function getDefaultTheme(): LIGHT_DARK_MODE { + const fallback = siteConfig.defaultTheme; + if (typeof document !== "undefined") { + const configCarrier = document.getElementById("config-carrier"); + return (configCarrier?.dataset.theme as LIGHT_DARK_MODE) || fallback; + } + return fallback; +} + +// Function to get stored theme from local storage or default +export function getStoredTheme(): LIGHT_DARK_MODE { + if (typeof localStorage !== "undefined") { + return (localStorage.getItem("theme") as LIGHT_DARK_MODE) || getDefaultTheme(); + } + return getDefaultTheme(); +} + +// Function to initialize theme from local storage or default +export function initTheme(): void { + if (typeof window === "undefined") return; + const storedTheme = getStoredTheme(); + applyThemeToDocument(storedTheme, true); + // 监听系统主题变化 + window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => { + const currentStored = getStoredTheme(); + if (currentStored === SYSTEM_MODE) { + applyThemeToDocument(SYSTEM_MODE); + } + }); +} \ No newline at end of file diff --git a/src/utils/timeline.ts b/src/utils/timeline.ts new file mode 100644 index 0000000..7c48924 --- /dev/null +++ b/src/utils/timeline.ts @@ -0,0 +1,96 @@ +// Timeline data configuration file +// Used to manage data for the timeline page +const timelineModules = import.meta.glob('../content/timeline/*.json', { eager: true }); + +export interface TimelineItem { + id: string; + title: string; + description: string; + type: "education" | "work" | "project" | "achievement"; + startDate: string; + endDate?: string; // If empty, it means current + location?: string; + organization?: string; + position?: string; + skills?: string[]; + achievements?: string[]; + links?: { + name: string; + url: string; + type: "certificate" | "project" | "other"; + }[]; + icon?: string; // Iconify icon name + color?: string; + featured?: boolean; +} + +export const timelineData: TimelineItem[] = Object.entries(timelineModules).map(([path, mod]: [string, any]) => { + const id = path.split('/').pop()?.replace('.json', '') || ''; + const data = mod.default; + return { id, ...data } as TimelineItem; +}); + +// Get timeline statistics +export const getTimelineStats = () => { + const total = timelineData.length; + const byType = { + education: timelineData.filter((item) => item.type === "education").length, + work: timelineData.filter((item) => item.type === "work").length, + project: timelineData.filter((item) => item.type === "project").length, + achievement: timelineData.filter((item) => item.type === "achievement") + .length, + }; + return { total, byType }; +}; + + +// Get timeline items by type +export const getTimelineByType = (type?: string) => { + if (!type || type === "all") { + return timelineData.sort( + (a, b) => + new Date(b.startDate).getTime() - new Date(a.startDate).getTime(), + ); + } + return timelineData + .filter((item) => item.type === type) + .sort( + (a, b) => + new Date(b.startDate).getTime() - new Date(a.startDate).getTime(), + ); +}; + + +// Get featured timeline items +export const getFeaturedTimeline = () => { + return timelineData + .filter((item) => item.featured) + .sort( + (a, b) => + new Date(b.startDate).getTime() - new Date(a.startDate).getTime(), + ); +}; + + +// Get current ongoing items +export const getCurrentItems = () => { + return timelineData.filter((item) => !item.endDate); +}; + + +// Calculate total work experience +export const getTotalWorkExperience = () => { + const workItems = timelineData.filter((item) => item.type === "work"); + let totalMonths = 0; + workItems.forEach((item) => { + const startDate = new Date(item.startDate); + const endDate = item.endDate ? new Date(item.endDate) : new Date(); + const diffTime = Math.abs(endDate.getTime() - startDate.getTime()); + const diffMonths = Math.ceil(diffTime / (1000 * 60 * 60 * 24 * 30)); + totalMonths += diffMonths; + }); + return { + years: Math.floor(totalMonths / 12), + months: totalMonths % 12, + }; +}; \ No newline at end of file diff --git a/src/utils/url.ts b/src/utils/url.ts new file mode 100644 index 0000000..badaa17 --- /dev/null +++ b/src/utils/url.ts @@ -0,0 +1,76 @@ +import type { CollectionEntry } from "astro:content"; + +import { i18n } from "@i18n/translation"; +import I18nKey from "@i18n/i18nKey"; + + +export function pathsEqual(path1: string, path2: string) { + const normalizedPath1 = path1.replace(/^\/|\/$/g, "").toLowerCase(); + const normalizedPath2 = path2.replace(/^\/|\/$/g, "").toLowerCase(); + return normalizedPath1 === normalizedPath2; +} + +function joinUrl(...parts: string[]): string { + const joined = parts.join("/"); + return joined.replace(/\/+/g, "/"); +} + +export function removeFileExtension(id: string): string { + return id.replace(/\.(md|mdx|markdown)$/i, ""); +} + +export function getPostUrlBySlug(slug: string): string { + // 移除文件扩展名(如 .md, .mdx 等) + const slugWithoutExt = removeFileExtension(slug); + return url(`/posts/${slugWithoutExt}/`); +} + +export function getPostUrlByRouteName(routeName: string): string { + // 移除开头的斜杠并确保固定链接在 /posts/ 路径下 + const cleanRouteName = routeName.replace(/^\/+/, ""); + return url(`/posts/${cleanRouteName}/`); +} + +export function getPostUrl(post: CollectionEntry<"posts">): string; +export function getPostUrl(post: { id: string; data: { routeName?: string } }): string; +export function getPostUrl(post: any): string { + // 如果文章有自定义固定链接,优先使用固定链接 + if (post.data.routeName) { + return getPostUrlByRouteName(post.data.routeName); + } + // 否则使用默认的 slug 路径 + return getPostUrlBySlug(post.id); +} + +export function getTagUrl(tag: string): string { + if (!tag) return url("/archive/"); + return url(`/archive/?tag=${encodeURIComponent(tag.trim())}`); +} + +export function getCategoryUrl(category: string | null): string { + if ( + !category || + category.trim() === "" || + category.trim().toLowerCase() === i18n(I18nKey.uncategorized).toLowerCase() + ) + return url("/archive/?uncategorized=true"); + return url(`/archive/?category=${encodeURIComponent(category.trim())}`); +} + +export function getDir(path: string): string { + // 移除文件扩展名 + const pathWithoutExt = removeFileExtension(path); + const lastSlashIndex = pathWithoutExt.lastIndexOf("/"); + if (lastSlashIndex < 0) { + return "/"; + } + return pathWithoutExt.substring(0, lastSlashIndex + 1); +} + +export function getFileDirFromPath(filePath: string): string { + return filePath.replace(/^src\//, "").replace(/\/[^/]+$/, ""); +} + +export function url(path: string) { + return joinUrl("", import.meta.env.BASE_URL, path); +} \ No newline at end of file diff --git a/src/utils/wallpaper.ts b/src/utils/wallpaper.ts new file mode 100644 index 0000000..b8efe9d --- /dev/null +++ b/src/utils/wallpaper.ts @@ -0,0 +1,362 @@ +import { + WALLPAPER_FULLSCREEN, + WALLPAPER_BANNER, + WALLPAPER_NONE, + BANNER_HEIGHT, + MAIN_PANEL_OVERLAPS_BANNER_HEIGHT, +} from "@constants/constants"; +import type { + WALLPAPER_MODE, +} from "@/types/config"; +import { + siteConfig, +} from "@/config"; + + +// Declare global function types for carousel initializers +declare global { + interface Window { + initBannerCarousel?: () => void; + initFullscreenWallpaperCarousel?: () => void; + initSemifullScrollDetection?: () => void; + bannerCarouselState?: { + currentIndex: number; + lastSwitchTime: number; + }; + fullscreenWallpaperState?: { + currentIndex: number; + lastSwitchTime: number; + }; + bannerCarouselTimer?: any; + fullscreenWallpaperTimer?: any; + currentBannerCarousel?: HTMLElement | null; + currentFullscreenWallpaperCarousel?: HTMLElement | null; + } +} + + +// Function to get navbar transparent mode for wallpaper mode +export function getNavbarTransparentModeForWallpaperMode(mode: WALLPAPER_MODE): string { + if (mode === WALLPAPER_FULLSCREEN) { + return siteConfig.wallpaper.fullscreen?.navbar?.transparentMode || "semi"; + } + if (mode === WALLPAPER_BANNER) { + return siteConfig.wallpaper.banner?.navbar?.transparentMode || "semifull"; + } + return "semi"; // 其他情况使用默认的 semi 模式 +} + +// Cache for elements +const getElements = () => { + if (typeof document === 'undefined') return { + navbar: null, + bannerWrapper: null, + banner: null, + fullscreenContainer: null, + mainContent: null, + }; + return { + navbar: document.getElementById('navbar'), + bannerWrapper: document.getElementById('banner-wrapper'), + banner: document.getElementById('banner'), + fullscreenContainer: document.querySelector('[data-fullscreen-wallpaper]') as HTMLElement, + mainContent: document.querySelector('.absolute.w-full.z-30') as HTMLElement, + }; +}; + +// Helper to safely execute after a delay if mode hasn't changed +function runIfMode(mode: WALLPAPER_MODE, callback: () => void, delay = 600) { + setTimeout(() => { + if (typeof document !== 'undefined' && document.documentElement.getAttribute('data-wallpaper-mode') === mode) { + callback(); + } + }, delay); +} + +// Function to adjust main content position based on wallpaper mode +function adjustMainContentPosition(mode: WALLPAPER_MODE | 'banner' | 'none' | 'fullscreen') { + const { mainContent } = getElements(); + if (!mainContent) return; + // Remove existing position classes + mainContent.classList.remove('no-banner-layout'); + // Add new position classes based on mode + switch (mode) { + case WALLPAPER_BANNER: + case 'banner': + // 主内容在banner下方 + mainContent.style.top = `calc(${BANNER_HEIGHT}vh - ${MAIN_PANEL_OVERLAPS_BANNER_HEIGHT}rem)`; + break; + case WALLPAPER_FULLSCREEN: + case 'fullscreen': + case WALLPAPER_NONE: + case 'none': + // 主内容从导航栏下方开始 + mainContent.classList.add('no-banner-layout'); + mainContent.style.top = '5.5rem'; + break; + default: + mainContent.style.top = '5.5rem'; + break; + } +} + +// Function to update navbar transparency based on wallpaper mode +function updateNavbarTransparency(mode: WALLPAPER_MODE) { + const { navbar } = getElements(); + if (!navbar) return; + // 根据当前壁纸模式获取透明模式配置 + const transparentMode = getNavbarTransparentModeForWallpaperMode(mode); + // 更新导航栏的透明模式属性 + navbar.setAttribute('data-transparent-mode', transparentMode); + // 重新初始化半透明模式滚动检测(如果需要) + if (transparentMode === 'semifull' && typeof window.initSemifullScrollDetection === 'function') { + if ('requestIdleCallback' in window) { + requestIdleCallback(() => window.initSemifullScrollDetection!()); + } else { + setTimeout(() => window.initSemifullScrollDetection!(), 0); + } + } +} + +// Helper to initialize banner elements +function initBannerElements(banner: HTMLElement | null) { + if (!banner) return; + banner.classList.remove('opacity-0'); + banner.classList.add('opacity-100'); + + // Handle mobile banner + const mobileBanner = document.querySelector('.block.md\\:hidden[alt="Mobile banner"]'); + if (mobileBanner) { + mobileBanner.classList.remove('opacity-0'); + mobileBanner.classList.add('opacity-100'); + } +} + +// Function to show banner mode wallpaper +function showBannerMode() { + const { bannerWrapper, fullscreenContainer, banner } = getElements(); + // 隐藏全屏壁纸(通过CSS类控制) + if (fullscreenContainer) { + fullscreenContainer.style.opacity = '0'; + runIfMode(WALLPAPER_BANNER, () => { + fullscreenContainer.classList.add('hidden'); + }); + } + // 显示banner + if (!bannerWrapper) { + requestAnimationFrame(showBannerMode); + return; + } + const isAlreadyVisible = typeof document !== 'undefined' && !bannerWrapper.classList.contains('hidden') && !document.documentElement.classList.contains('banner-hiding'); + if (!isAlreadyVisible && typeof document !== 'undefined') { + // 如果正在隐藏中,先移除隐藏类 + document.documentElement.classList.remove('banner-hiding'); + // 添加过渡类到 html + document.documentElement.classList.add('banner-transitioning'); + // 移除 hidden + bannerWrapper.classList.remove('hidden'); + // 触发重绘 + void bannerWrapper.offsetHeight; + // 移除过渡类 + document.documentElement.classList.remove('banner-transitioning'); + // 添加显示动画类 + document.documentElement.classList.add('show-banner-animation'); + setTimeout(() => { + document.documentElement.classList.remove('show-banner-animation'); + }, 1200); + } + // 确保banner可见 + bannerWrapper.classList.remove('opacity-0'); + bannerWrapper.classList.add('opacity-100'); + // Initialize carousel or static banner + if (typeof window.initBannerCarousel === 'function') { + window.initBannerCarousel(); + } else { + setTimeout(() => { + initBannerElements(banner); + }, 100); + } +} + +// Function to show fullscreen mode wallpaper +function showFullscreenMode() { + const { bannerWrapper, fullscreenContainer } = getElements(); + // 显示全屏 + if (!fullscreenContainer) { + requestAnimationFrame(showFullscreenMode); + return; + } + fullscreenContainer.classList.remove('hidden'); + void fullscreenContainer.offsetHeight; + fullscreenContainer.style.opacity = siteConfig.wallpaper.fullscreen?.opacity?.toString() || '0.8'; + // 隐藏banner + if (bannerWrapper) { + if (typeof document !== 'undefined' && document.documentElement.classList.contains('banner-hiding')) { + runIfMode(WALLPAPER_FULLSCREEN, () => { + bannerWrapper.classList.add('hidden'); + }); + } else { + bannerWrapper.classList.add('hidden'); + } + } +} + +// Function to show none mode wallpaper +function showNoneMode() { + const { bannerWrapper, fullscreenContainer } = getElements(); + // 隐藏banner + if (bannerWrapper) { + bannerWrapper.classList.add('hidden'); + } + // 隐藏全屏 + if (fullscreenContainer) { + fullscreenContainer.style.opacity = '0'; + runIfMode(WALLPAPER_NONE, () => { + fullscreenContainer.classList.add('hidden'); + }); + } +} + +// Function to reinitialize components based on wallpaper mode +function reinitializeComponents(mode: WALLPAPER_MODE) { + if (mode === WALLPAPER_BANNER) { + setTimeout(() => { + initBannerElements(getElements().banner); + }, 100); + } +} + +// Function to apply wallpaper mode to document +export function applyWallpaperModeToDocument(mode: WALLPAPER_MODE, force = false) { + if (typeof document === 'undefined') return; + // 获取当前的壁纸模式 + const currentMode = document.documentElement.getAttribute('data-wallpaper-mode') as WALLPAPER_MODE; + // 如果模式没有变化且不是强制更新,直接返回 + if (!force && currentMode === mode) { + return; + } + // 更新数据属性 + document.documentElement.setAttribute('data-wallpaper-mode', mode); + // Handle Banner exit transition + if (currentMode === WALLPAPER_BANNER && mode !== WALLPAPER_BANNER) { + document.documentElement.classList.add('banner-hiding'); + // 主内容区域开始向上滑动 + adjustMainContentPosition(mode); + // 导航栏也立即更新透明度 + updateNavbarTransparency(mode); + // 等待过渡动画完成后再执行实际的模式切换 + setTimeout(() => { + document.documentElement.classList.remove('banner-hiding'); + executeApply(); + }, 600); + return; + } + + // 如果是初始加载或强制更新,我们可能需要立即执行一些逻辑,或者等待 DOM 就绪 + const apply = () => { + executeApply(); + }; + + function executeApply() { + const body = document.body; + if (!body) { + // 如果 body 还没准备好,稍后再试 + requestAnimationFrame(executeApply); + return; + } + // 添加过渡保护类 + document.documentElement.classList.add('is-wallpaper-transitioning'); + // 只有当新模式不需要透明效果时,才移除 wallpaper-transparent + const nextRequiresTransparency = mode === WALLPAPER_BANNER || mode === WALLPAPER_FULLSCREEN; + if (!nextRequiresTransparency) { + // 延迟移除以配合背景过渡动画 + setTimeout(() => { + const isStillTransitioning = document.documentElement.classList.contains('is-wallpaper-transitioning'); + const currentDataMode = document.documentElement.getAttribute('data-wallpaper-mode'); + const isNowTransparentMode = currentDataMode === WALLPAPER_BANNER || currentDataMode === WALLPAPER_FULLSCREEN; + if (!isStillTransitioning || !isNowTransparentMode) { + body.classList.remove('wallpaper-transparent'); + } + }, 300); + } else { + body.classList.add('wallpaper-transparent'); + } + // 移除 enable-banner,由 showBannerMode 重新添加(如果是切换到 Banner 模式) + // 如果是从 Banner 切换走,则在 executeApply 中移除 + if (mode !== WALLPAPER_BANNER) { + body.classList.remove('enable-banner'); + } else { + body.classList.add('enable-banner'); + } + // 根据模式添加相应的CSS类 + switch (mode) { + case WALLPAPER_BANNER: + showBannerMode(); + break; + case WALLPAPER_FULLSCREEN: + showFullscreenMode(); + adjustMainContentTransparency(true); + break; + case WALLPAPER_NONE: + showNoneMode(); + adjustMainContentTransparency(false); + break; + } + // 调整主内容位置 + adjustMainContentPosition(mode); + // 更新导航栏透明模式 + updateNavbarTransparency(mode); + // 重新初始化相关组件 + reinitializeComponents(mode); + // 等待过渡动画完成后移除过渡保护类 + setTimeout(() => { + document.documentElement.classList.remove('is-wallpaper-transitioning'); + }, 600); + } + // 使用 requestAnimationFrame 确保在下一帧执行,避免闪屏 + requestAnimationFrame(apply); +} + +// Function to adjust main content transparency based on wallpaper mode +function adjustMainContentTransparency(enable: boolean) { + const { mainContent } = getElements(); + if (!mainContent) return; + // Add or remove transparent class based on enable flag + if (enable) { + mainContent.classList.add('wallpaper-transparent'); + } else { + mainContent.classList.remove('wallpaper-transparent'); + } +} + +// Function to set wallpaper mode and apply it to document +export function setWallpaperMode(mode: WALLPAPER_MODE): void { + if (typeof localStorage !== 'undefined') { + localStorage.setItem('wallpaperMode', mode); + } + applyWallpaperModeToDocument(mode); +} + +// Function to get default wallpaper mode from config-carrier +export function getDefaultWallpaperMode(): WALLPAPER_MODE { + const fallback = siteConfig.wallpaper.mode; + if (typeof document !== 'undefined') { + const configCarrier = document.getElementById('config-carrier'); + return (configCarrier?.dataset.wallpaperMode as WALLPAPER_MODE) || fallback; + } + return fallback; +} + +// Function to get stored wallpaper mode from local storage +export function getStoredWallpaperMode(): WALLPAPER_MODE { + if (typeof localStorage !== 'undefined') { + return (localStorage.getItem('wallpaperMode') as WALLPAPER_MODE) || getDefaultWallpaperMode(); + } + return getDefaultWallpaperMode(); +} + +// Function to initialize wallpaper mode on page load +export function initWallpaperMode(): void { + const storedMode = getStoredWallpaperMode(); + applyWallpaperModeToDocument(storedMode, true); +} \ No newline at end of file diff --git a/src/utils/widget.ts b/src/utils/widget.ts new file mode 100644 index 0000000..fb53720 --- /dev/null +++ b/src/utils/widget.ts @@ -0,0 +1,432 @@ +import type { + WidgetComponentConfig, + WidgetComponentType, + SidebarConfig, +} from "@/types/config"; +import { sidebarConfig } from "@/config"; + + +/** + * 组件映射表 - 将组件类型映射到实际的组件路径 + */ +export const WIDGET_COMPONENT_MAP = { + profile: "@components/sidebar/profile.astro", + announcement: "@components/sidebar/announcement.astro", + categories: "@components/sidebar/categories.astro", + tags: "@components/sidebar/tags.astro", + toc: "@components/sidebar/toc.astro", + statistics: "@components/sidebar/statistics.astro", + custom: null, // 自定义组件需要在配置中指定路径 +} as const; + +/** + * 组件管理器类 + * 负责管理侧边栏组件的动态加载、排序和渲染 + */ +export class WidgetManager { + private config: SidebarConfig; + + constructor(config: SidebarConfig = sidebarConfig) { + this.config = config; + } + + /** + * 获取配置 + */ + getConfig(): SidebarConfig { + return this.config; + } + + /** + * 获取指定侧边栏上的组件列表 + * @param side 侧边栏位置:'left' | 'right' + */ + getComponentsBySide(side: "left" | "right"): WidgetComponentConfig[] { + return this.config.components[side] || []; + } + + /** + * 根据位置获取组件列表 + * @param position 组件位置:'top' | 'sticky' + */ + getComponentsByPosition(position: "top" | "sticky"): WidgetComponentConfig[] { + const left = this.getComponentsBySideAndPosition("left", position); + const right = this.getComponentsBySideAndPosition("right", position); + // Note: This might return duplicates if left/right logic overlaps, but used for enabled types check + return [...left, ...right]; + } + + /** + * 根据侧边栏和位置获取组件列表 + * @param side 侧边栏位置:'left' | 'right' | 'middle' + * @param position 组件位置:'top' | 'sticky' + */ + getComponentsBySideAndPosition( + side: "left" | "right" | "middle", + position: "top" | "sticky", + ): WidgetComponentConfig[] { + const leftComponents = (this.config.components.left || []).filter(c => c.position === position); + const rightComponents = (this.config.components.right || []).filter(c => c.position === position); + + if (side === "left") { + // Left sidebar includes Right components on Tablet (merged) + return [...leftComponents, ...rightComponents]; + } + + if (side === "right") { + // Right sidebar only shows Right components (Desktop only) + return rightComponents; + } + + if (side === "middle") { + // Middle sidebar includes all components + return [...leftComponents, ...rightComponents]; + } + + return []; + } + + /** + * 获取组件的CSS类名 + * @param component 组件配置 + * @param index 组件在列表中的索引 + * @param side 当前渲染的侧边栏位置 + */ + getComponentClass(component: WidgetComponentConfig, index: number, side: "left" | "right" | "middle"): string { + const classes: string[] = []; + + // 基础响应式隐藏配置 (用户配置的) + if (component.responsive?.hidden) { + component.responsive.hidden.forEach((device) => { + switch (device) { + case "mobile": + classes.push("hidden md:block"); + break; + case "tablet": + classes.push("md:hidden lg:block"); + break; + case "desktop": + classes.push("lg:hidden"); + break; + } + }); + } + + // 自动布局逻辑 + const isFromLeft = (this.config.components.left || []).includes(component); + const isFromRight = (this.config.components.right || []).includes(component); + + if (side === "left") { + if (isFromRight && !isFromLeft) { + // 如果是右侧组件在左侧栏渲染(平板模式),则仅在平板显示 + classes.push("hidden md:block lg:hidden"); + } + // 左侧组件默认显示 + } + + return classes.join(" "); + } + + /** + * 获取组件的内联样式 + * @param component 组件配置 + * @param index 组件在列表中的索引 + */ + getComponentStyle(component: WidgetComponentConfig, index: number): string { + const styles: string[] = []; + + // 添加自定义样式 + if (component.style) { + styles.push(component.style); + } + + return styles.join("; "); + } + + /** + * 检查组件是否应该折叠 + * @param component 组件配置 + * @param itemCount 组件内容项数量 + */ + isCollapsed(component: WidgetComponentConfig, itemCount: number): boolean { + if (!component.responsive?.collapseThreshold) { + return false; + } + return itemCount >= component.responsive.collapseThreshold; + } + + /** + * 获取组件的路径 + * @param componentType 组件类型 + */ + getComponentPath(componentType: WidgetComponentType): string | null { + return WIDGET_COMPONENT_MAP[componentType]; + } + + /** + * 检查指定侧边栏是否具有实际可显示的内容 + * @param side 侧边栏位置:'left' | 'right' + * @param headings 页面标题列表,用于判断特殊组件是否显示 + */ + hasContentOnSide(side: "left" | "right", headings: any[] = []): boolean { + const components = this.getComponentsBySide(side); + if (components.length === 0) return false; + + // 只要有一个组件能显示内容,侧边栏就不是空的 + return components.some((component) => { + // TOC 组件只有在有标题时才显示 + if (component.type === "toc") { + return headings && headings.length > 0; + } + // 其他组件暂认为始终有内容 + return true; + }); + } + + /** + * 更新组件配置 + * @param newConfig 新的配置 + */ + updateConfig(newConfig: Partial): void { + this.config = { ...this.config, ...newConfig }; + } + + /** + * 添加新组件 + * @param component 组件配置 + * @param side 侧边栏位置 + */ + addComponent(component: WidgetComponentConfig, side: "left" | "right"): void { + if (!this.config.components[side]) { + this.config.components[side] = []; + } + this.config.components[side].push(component); + } + + /** + * 移除组件 + * @param componentType 组件类型 + */ + removeComponent(componentType: WidgetComponentType): void { + if (this.config.components.left) { + this.config.components.left = this.config.components.left.filter( + (component) => component.type !== componentType, + ); + } + if (this.config.components.right) { + this.config.components.right = this.config.components.right.filter( + (component) => component.type !== componentType, + ); + } + } + + /** + * 重新排序组件 + * @param side 侧边栏 + * @param oldIndex 旧索引 + * @param newIndex 新索引 + */ + reorderComponent(side: "left" | "right", oldIndex: number, newIndex: number): void { + const list = this.config.components[side]; + if (!list) return; + + if (oldIndex >= 0 && oldIndex < list.length && newIndex >= 0 && newIndex < list.length) { + const [moved] = list.splice(oldIndex, 1); + list.splice(newIndex, 0, moved); + } + } + + /** + * 检查组件是否应该在侧边栏中渲染 + * @param componentType 组件类型 + */ + isSidebarComponent(componentType: WidgetComponentType): boolean { + return true; + } + + /** + * 获取页面中的标题列表 + * @returns 格式化后的标题数组 + */ + getPageHeadings() { + if (typeof document === "undefined") return []; + return Array.from(document.querySelectorAll("h1, h2, h3, h4, h5, h6")) + .filter((h) => h.id) + .map((h) => ({ + depth: parseInt(h.tagName.substring(1)), + slug: h.id, + text: (h.textContent || "").replace(/#+\s*$/, ""), + })); + } + + /** + * 获取网格布局相关的类名 + * @param headings 页面标题列表 + */ + getGridLayout(headings: any[] = []) { + const hasLeftComponents = this.hasContentOnSide("left", headings); + const hasRightComponents = this.hasContentOnSide("right", headings); + const hasAnyComponents = hasLeftComponents || hasRightComponents; + + // Desktop: Left if hasLeft, Right if hasRight + const hasLeftSidebar = hasLeftComponents; + const hasRightSidebar = hasRightComponents; + + // 动态网格布局类名 + const gridCols = ` + grid-cols-1 + ${hasAnyComponents ? "md:grid-cols-[17.5rem_1fr]" : "md:grid-cols-1"} + ${ + hasLeftSidebar && hasRightSidebar + ? "lg:grid-cols-[17.5rem_1fr_17.5rem]" + : hasLeftSidebar + ? "lg:grid-cols-[17.5rem_1fr]" + : hasRightSidebar + ? "lg:grid-cols-[1fr_17.5rem]" + : "lg:grid-cols-1" + } + `.trim().replace(/\s+/g, " "); + + // 左侧侧边栏容器类名 + // Mobile: Hidden + // Tablet: Visible if hasAnyComponents (merged) + // Desktop: Visible if hasLeftSidebar + const leftSidebarClass = ` + mb-0 col-span-1 hidden + ${hasAnyComponents ? "md:block md:max-w-70" : ""} + ${hasLeftSidebar ? "lg:block lg:max-w-70 lg:col-start-1 lg:col-end-2 lg:row-start-1 lg:row-end-2" : "lg:hidden"} + `.trim().replace(/\s+/g, " "); + + // 右侧侧边栏容器类名 + // Mobile: Hidden + // Tablet: Hidden + // Desktop: Visible if hasRightSidebar + const rightSidebarClass = ` + mb-0 col-span-1 hidden + md:hidden + ${ + hasRightSidebar + ? hasLeftSidebar + ? "lg:block lg:max-w-70 lg:col-start-3 lg:col-end-4 lg:row-start-1 lg:row-end-2" + : "lg:block lg:max-w-70 lg:col-start-2 lg:col-end-3 lg:row-start-1 lg:row-end-2" + : "lg:hidden" + } + `.trim().replace(/\s+/g, " "); + + // 移动端 Footer 类名 + // Always 1 col on mobile + // 2 cols on tablet if sidebar is present + const mobileFooterClass = ` + footer col-span-1 onload-animation-up block lg:hidden transition-swup-fade + ${hasAnyComponents ? "md:col-span-2" : "md:col-span-1"} + `.trim().replace(/\s+/g, " "); + + // 移动端侧边栏类名 + const middleSidebarClass = ` + col-span-1 block md:hidden + ${!hasAnyComponents ? "hidden" : ""} + `.trim().replace(/\s+/g, " "); + + // 主内容区域类名 + const mainContentClass = ` + overflow-hidden w-full + col-span-1 row-start-1 row-end-2 + ${hasAnyComponents ? "md:col-start-2 md:col-end-3 md:row-start-1 md:row-end-2" : "md:col-span-1"} + ${ + hasLeftSidebar && hasRightSidebar + ? "lg:col-start-2 lg:col-end-3 lg:row-start-1 lg:row-end-2" + : hasLeftSidebar + ? "lg:col-start-2 lg:col-end-3 lg:row-start-1 lg:row-end-2" + : hasRightSidebar + ? "lg:col-start-1 lg:col-end-2 lg:row-start-1 lg:row-end-2" + : "lg:col-span-1" + } + `.trim().replace(/\s+/g, " "); + + return { + hasLeftSidebar, + hasRightSidebar, + hasAnyComponents, + gridCols, + leftSidebarClass, + rightSidebarClass, + mainContentClass, + mobileFooterClass, + middleSidebarClass, + }; + } +} + +/** + * 默认组件管理器实例 + */ +export const widgetManager = new WidgetManager(); + +/** + * 工具函数:根据组件类型获取组件配置 + * @param componentType 组件类型 + */ +export function getComponentConfig( + componentType: WidgetComponentType, +): WidgetComponentConfig | undefined { + const left = widgetManager.getConfig().components.left || []; + const right = widgetManager.getConfig().components.right || []; + return left.find((c) => c.type === componentType) || + right.find((c) => c.type === componentType); +} + +/** + * 工具函数:检查组件是否启用 + * @param componentType 组件类型 + */ +export function isComponentEnabled( + componentType: WidgetComponentType, +): boolean { + // 默认所有配置中存在的组件都视为启用 + return !!getComponentConfig(componentType); +} + +/** + * 工具函数:获取所有启用的组件类型 + */ +export function getEnabledComponentTypes(): WidgetComponentType[] { + const enabledComponents = widgetManager.getComponentsByPosition("top").concat( + widgetManager.getComponentsByPosition("sticky") + ); + return enabledComponents.map((c) => c.type); +} + +/** + * 通用的点击外部关闭处理函数 + * @param event 鼠标事件 + * @param panelId 面板ID + * @param ignoreIds 忽略的元素ID(按钮等),支持单个ID或ID数组 + * @param action 关闭回调 + */ +export function onClickOutside( + event: MouseEvent, + panelId: string, + ignoreIds: string | string[], + action: () => void +) { + if (typeof document === "undefined") { + return; + } + const panel = document.getElementById(panelId); + + const target = event.target as HTMLElement; + + const ids = Array.isArray(ignoreIds) ? ignoreIds : [ignoreIds]; + + // 如果点击的是忽略元素或其内部元素,则不执行关闭操作 + for (const id of ids) { + if (target.closest(`#${id}`)) { + return; + } + } + + // 如果面板存在且点击发生在面板外部,则执行关闭操作 + if (panel && !panel.contains(target)) { + action(); + } +} \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..251a16c --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,6 @@ +import { vitePreprocess } from "@astrojs/svelte"; + + +export default { + preprocess: [vitePreprocess({ script: true })], +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8ad67e5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "jsxImportSource": "react", + "baseUrl": ".", + "strictNullChecks": true, + "allowJs": false, + "declaration": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "types": ["astro/client"], + "plugins": [ + { + "name": "@astrojs/ts-plugin" + } + ], + "paths": { + "@assets/*": ["src/assets/*"], + "@i18n/*": ["src/i18n/*"], + "@constants/*": ["src/constants/*"], + "@utils/*": ["src/utils/*"], + "@components/*": ["src/components/*"], + "@pages/*": ["src/pages/*"], + "@layouts/*": ["src/layouts/*"], + "@styles/*": ["src/styles/*"], + "@/*": ["src/*"], + }, + "noEmit": true, + "allowImportingTsExtensions": true, + }, + "include": ["src/**/*"] +} \ No newline at end of file diff --git a/twilight.config.yaml b/twilight.config.yaml new file mode 100644 index 0000000..abac748 --- /dev/null +++ b/twilight.config.yaml @@ -0,0 +1,434 @@ +# 站点配置 +site: + # 站点 URL(以斜杠结尾) + siteURL: "https://twilight.spr-aachen.com/" + # 站点标题 + title: "Twilight" + # 站点副标题 + subtitle: "Blog Template" + # 语言配置 + lang: "en" + # 翻译配置 + translate: + # 启用翻译功能 + enable: true + # 翻译服务 + service: "client.edge" + # 显示语言选择下拉框 + showSelectTag: false + # 自动检测用户语言 + autoDiscriminate: true + # 翻译时忽略的 CSS 类名 + ignoreClasses: + - "ignore" + - "banner-title" + - "banner-subtitle" + # 翻译时忽略的 HTML 标签 + ignoreTags: + - "script" + - "style" + - "code" + - "pre" + # 时区配置 + timeZone: 8 + # 字体配置 + font: + # 示例字体配置 - Zen Maru Gothic + "Example - ZenMaruGothic": + # 字体源 (字体 CSS 链接 | 字体文件路径) + src: "https://fonts.googleapis.com/css2?family=Zen+Maru+Gothic&display=swap" + # 字体名 (font-family) + family: "Zen Maru Gothic" + # 主题色配置 + themeColor: + # 主题色的默认色相 (范围从 0 到 360。例如:红色:0,青色:200,蓝绿色:250,粉色:345) + hue: 255 + # 默认主题 ("system" 跟随系统 | "light" 浅色 | "dark" 深色) + defaultTheme: "dark" + # 壁纸配置 + wallpaper: + # 模式 ("banner" 横幅 | "fullscreen" 全屏 | "none" 纯色) + mode: "banner" + # 图片源配置 (fullscreen 和 banner 模式共享) + src: + # 桌面壁纸图片 (相对于 /public 目录; 支持单张图片或图片数组,当数组长度 > 1 时自动启用轮播) + desktop: + - "/assets/images/desktopWallpaper_1.jpg" + - "/assets/images/desktopWallpaper_2.jpg" + - "/assets/images/desktopWallpaper_3.jpg" + # 移动壁纸图片 (相对于 /public 目录; 支持单张图片或图片数组,当数组长度 > 1 时自动启用轮播) + mobile: + - "/assets/images/mobileWallpaper_1.jpg" + - "/assets/images/mobileWallpaper_2.jpg" + # 壁纸位置 ('top' | 'center' | 'bottom') + position: "center" + # 轮播配置 (fullscreen 和 banner 模式共享) + carousel: + # 为多张图片启用轮播,否则随机显示一张图片 + enable: true + # 轮播间隔时间 (秒) + interval: 3.6 + # 启用 Ken Burns 效果 + kenBurns: true + # Banner 模式专属配置 + banner: + # 横幅文本配置 + homeText: + # 在主页显示文本 + enable: true + # 主标题 + title: "Twilight" + # 副标题,支持单个字符串或字符串数组 + subtitle: + - "Illuminate Our Paths" + # 副标题打字机效果 + typewriter: + # 启用副标题打字机效果 + enable: true + # 打字速度 (毫秒) + speed: 111 + # 删除速度 (毫秒) + deleteSpeed: 51 + # 完全显示后的暂停时间 (毫秒) + pauseTime: 3000 + # 横幅图片来源文本 + credit: + # 显示横幅图片来源文本 + enable: false + # 要显示的来源文本 + text: "Describe" + # (可选) 原始艺术品或艺术家页面的 URL 链接 + url: "" + # 导航栏配置 + navbar: + # 导航栏透明模式 ("semi" 半透明加圆角 | "full" 完全透明 | "semifull" 动态透明) + transparentMode: "semifull" + # 水波纹效果配置 + waves: + # 启用水波纹效果 + enable: true + # 启用性能模式 (简化波浪效果以提升性能) + performanceMode: false + # Fullscreen 模式专属配置 + fullscreen: + # 层级 + zIndex: -1 + # 壁纸透明度,0-1之间 + opacity: 0.9 + # 背景模糊程度 (像素值) + blur: 1 + # 导航栏透明模式 + navbar: + transparentMode: "semi" + # 加载页配置 + loadingOverlay: + # 是否启用加载页 + enable: true + # 加载标题配置 + title: + # 是否启用加载标题 + enable: true + # 加载标题文本 + content: "LOADING" + # 动画周期 (s) + interval: 1.5 + # 加载动画配置 + spinner: + # 是否启用加载动画 + enable: true + # 动画周期 (s) + interval: 1.5 + # favicon 配置 + favicon: [] + # bangumi 配置 + bangumi: + # 用户 ID + userId: "your-bangumi-id" + # OpenGraph 配置 + generateOgImages: false + +# Umami统计配置 +umami: + # 是否显示Umami统计 + enabled: false + # UmamiCloudAPI地址 + baseUrl: "https://api.umami.is" + # API密钥 (可用环境变量覆盖) + apiKey: "" + # 要插入的Script (可用环境变量覆盖) + scripts: "" + +# 导航栏配置 +navbar: + # 链接配置 (链接预设位于 src/constants/link-presets.ts 的 LinkPresets) + links: + - # 一级导航链接 - 主页 (预设) + "Home" + - # 一级导航链接 - 归档 (预设) + "Archive" + - # 一级导航链接 - 展览 (自定义) + # 导航名称 + name: "Exhibition" + # 导航链接 + url: "/exhibition/" + # 导航图标 + icon: "material-symbols:person" + # 导航描述 + description: "A collection of my creative works and experiences" + # 子链接 + children: + - # 二级导航链接 - 项目 (预设) + "Projects" + - # 二级导航链接 - 技能 (预设) + "Skills" + - # 二级导航链接 - 历程 (预设) + "Timeline" + - # 二级导航链接 - 日记 (预设) + "Diary" + - # 二级导航链接 - 相册 (预设) + "Albums" + - # 二级导航链接 - 动画 (预设) + "Anime" + - # 一级导航链接 - 好友 (预设) + "Friends" + - # 一级导航链接 - 关于 (预设) + "About" + +# 侧边栏配置 +sidebar: + # 侧边栏组件配置列表 (侧栏组件预设位于 src/types/config.ts 的 WidgetComponentType) + components: + # 左侧侧边栏 + left: + - # 组件 - 资料 (预设) + # 类型 + type: "profile" + # 位置策略 ("top" 顶部固定 | "sticky" 粘性) + position: "top" + - # 组件 - 公告 (预设) + # 类型 + type: "announcement" + # 位置策略 ("top" 顶部固定 | "sticky" 粘性) + position: "top" + - # 组件 - 文章类别 (预设) + # 类型 + type: "categories" + # 位置策略 ("top" 顶部固定 | "sticky" 粘性) + position: "sticky" + # 响应式配置 + responsive: + # 折叠阈值 + collapseThreshold: 5 + - # 组件 - 文章标签 (预设) + # 类型 + type: "tags" + # 位置策略 ("top" 顶部固定 | "sticky" 粘性) + position: "sticky" + # 响应式配置 + responsive: + # 折叠阈值 + collapseThreshold: 20 + # 右侧侧边栏 + right: + - # 组件 - 文章目录 (预设) + # 类型 + type: "toc" + # 位置策略 ("top" 顶部固定 | "sticky" 粘性) + position: "sticky" + # 自定义属性 + customProps: + # 目录深度 (1-6,1 表示只显示 h1 标题,2 表示显示 h1 和 h2 标题,依此类推) + depth: 3 + - # 组件 - 文章统计 (预设) + # 类型 + type: "statistics" + # 位置策略 ("top" 顶部固定 | "sticky" 粘性) + position: "sticky" + +# 资料配置 +profile: + # 头像配置 (相对于 /public 目录) + avatar: "/assets/images/avatar.jpg" + # 信息配置 + name: "Twilight" + # 简介配置 + bio: "Hi" + # 链接配置 + links: + - # 链接示例 + # 名字 + name: "GitHub" + # 图标 + icon: "fa6-brands:github" + # 链接 + url: "https://github.com/Spr-Aachen/Twilight" + +# 公告配置 +announcement: + # 公告标题 + title: "Announcement" + # 公告内容 + content: "Welcome to my blog!" + # 允许用户关闭公告 + closable: true + # 链接配置 + link: + # 启用链接 + enable: true + # 链接文本 + text: "Learn More" + # 链接 URL + url: "/about/" + # 是否外部链接 + external: false + +# 文章配置 +post: + # 显示“上次编辑”卡片 + showLastModified: true + # 在文章内容中显示封面 + showCoverInContent: false + # 代码高亮配置 + expressiveCode: + # 主题 + theme: "github-dark" + # 许可证配置 + license: + # 启用许可证 + enable: true + # 许可证名称 + name: "CC BY-NC-SA 4.0" + # 许可证链接 + url: "https://creativecommons.org/licenses/by-nc-sa/4.0/" + # 评论配置 + comment: + # 启用评论功能 + enable: false + # Twikoo 评论系统配置 + twikoo: + # 环境 ID + envId: "https://twikoo.vercel.app" + # 语言 + lang: "en" + +# 页脚配置 +footer: + # 启用 Footer HTML 注入功能 + enable: false + # 自定义 HTML 内容,用于添加备案号等信息 + customHtml: "" + +# 粒子特效配置 +particle: + # 启用粒子特效 + enable: true + # 粒子数量 + particleNum: 12 + # 粒子越界限制次数,-1为无限循环 + limitTimes: -1 + # 粒子尺寸配置 + size: + # 粒子最小尺寸倍数 + min: 0.3 + # 粒子最大尺寸倍数 + max: 0.9 + # 粒子透明度配置 + opacity: + # 粒子最小不透明度 + min: 0.3 + # 粒子最大不透明度 + max: 0.9 + # 粒子移动速度配置 + speed: + # 水平移动速度 + horizontal: + # 最小值 + min: -0.9 + # 最大值 + max: 0.9 + # 垂直移动速度 + vertical: + # 最小值 + min: 0.15 + # 最大值 + max: 0.3 + # 旋转速度 + rotation: 0.12 + # 消失速度 + fadeSpeed: 0.12 + # 粒子层级 + zIndex: 100 + +# 音乐播放器配置 +musicPlayer: + # 启用音乐播放器功能 + enable: true + # 默认模式 ("meting" API | "local" 本地) + mode: "meting" + # meting 模式专属配置 + meting: + # Meting API 地址 + meting_api: "https://api.i-meto.com/meting/api" + # 音乐平台 + server: "netease" + # 类型 ("playlist" 歌单 | "song" 单曲) + type: "playlist" + # 资源 ID + id: "2161912966" + # local 模式专属配置 + local: + # 播放列表 + playlist: + - # 列表示例 + # 序号 + id: 1 + # 标题 + title: "深海之息" + # 作者 + artist: "Youzee Music" + # 封面 + cover: "https://p1.music.126.net/PhKOqFtljgHDDpKYM2ADUA==/109951169858309716.jpg" + # 路径 + url: "assets/music/深海之息.m4a" + # 时长 + duration: 146 + # 是否自动播放 + autoplay: true + +# 看板娘配置 +pio: + # 启用看板娘 + enable: false + # 模型文件路径 + models: + - "/pio/models/pio/model.json" + # 看板娘位置 + position: "left" + # 看板娘宽度 + width: 280 + # 看板娘高度 + height: 250 + # 展现模式 + mode: "draggable" + # 是否在移动设备上隐藏 + hiddenOnMobile: true + # 对话框配置 + dialog: + # 欢迎词 + welcome: "Welcome!" + # 触摸提示 + touch: + - "What are you doing?" + - "Stop touching me!" + - "Don't bully me like that!" + - "(。í _ ì。)" + # 首页提示 + home: "Click here to go back to homepage!" + # 换装提示 + skin: + - "Want to see my new outfit?" + - "The new outfit looks great~" + # 关闭提示 + close: "See you next time~" + # 关于链接 + link: "https://nav.kungal.org" \ No newline at end of file diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..87dfd7c --- /dev/null +++ b/vercel.json @@ -0,0 +1,66 @@ +{ + "buildCommand": "pnpm build", + "outputDirectory": "dist", + "installCommand": "pnpm install", + "framework": "astro", + "headers": [ + { + "source": "/(.*)", + "headers": [ + { + "key": "X-Content-Type-Options", + "value": "nosniff" + }, + { + "key": "X-Frame-Options", + "value": "DENY" + }, + { + "key": "X-XSS-Protection", + "value": "1; mode=block" + }, + { + "key": "Referrer-Policy", + "value": "strict-origin-when-cross-origin" + } + ] + }, + { + "source": "/_astro/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "public, max-age=31536000, immutable" + } + ] + }, + { + "source": "/assets/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "public, max-age=31536000, immutable" + } + ] + }, + { + "source": "/favicon/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "public, max-age=31536000, immutable" + } + ] + }, + { + "source": "/pio/(.*)", + "headers": [ + { + "key": "Cache-Control", + "value": "public, max-age=31536000, immutable" + } + ] + } + ], + "cleanUrls": true +} \ No newline at end of file