Showing preview only (3,888K chars total). Download the full file or copy to clipboard to get everything.
Repository: asadahimeka/yandere-masonry
Branch: main
Commit: 1ea1ac12f3ba
Files: 117
Total size: 2.9 MB
Directory structure:
gitextract_f7ynjoip/
├── .eslintignore
├── .eslintrc.json
├── .gitattributes
├── .github/
│ └── FUNDING.yml
├── .gitignore
├── .npmrc
├── .vscode/
│ └── settings.json
├── CHANGELOG.md
├── LICENSE
├── README.en.md
├── README.md
├── dist/
│ └── yandere-masonry.user.js
├── docs/
│ ├── README.old.en.md
│ └── README.old.md
├── header.config.js
├── index.html
├── package.json
├── packages/
│ ├── booru/
│ │ ├── LICENSE.md
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ ├── package.json
│ │ ├── readme.md
│ │ └── readme.zh-cn.md
│ ├── release/
│ │ ├── index.d.ts
│ │ ├── index.mjs
│ │ └── package.json
│ ├── true-masonry/
│ │ ├── index.ts
│ │ └── package.json
│ ├── vite-plugin-userscript/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── index.d.ts
│ │ ├── index.js
│ │ ├── index.mjs
│ │ └── package.json
│ ├── vue-masonry-css/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── index.ts
│ │ └── package.json
│ └── vue-virtual-waterfall/
│ ├── VirtualWaterfall.vue
│ ├── index.ts
│ └── package.json
├── pnpm-workspace.yaml
├── scripts/
│ ├── postbuild.mjs
│ └── release.mjs
├── src/
│ ├── App.vue
│ ├── api/
│ │ ├── all-girl.ts
│ │ ├── anihonetwallpaper.ts
│ │ ├── anime-pictures.ts
│ │ ├── autocomplete.ts
│ │ ├── booru.ts
│ │ ├── danbooru.ts
│ │ ├── e-shuushuu.ts
│ │ ├── fav.ts
│ │ ├── gelbooru.ts
│ │ ├── hentaibooru.ts
│ │ ├── index.ts
│ │ ├── kusowanka.ts
│ │ ├── moebooru.ts
│ │ ├── nozomi.ts
│ │ ├── r34-paheal.ts
│ │ ├── realbooru.ts
│ │ ├── rule34.ts
│ │ ├── rule34hentai.ts
│ │ ├── sankaku-complex.ts
│ │ ├── sankaku-idol.ts
│ │ ├── sankaku-idol_unused.ts
│ │ ├── sankaku.ts
│ │ └── zerochan.ts
│ ├── components/
│ │ ├── AppBar.vue
│ │ ├── AppContainer.vue
│ │ ├── DPlayer.vue
│ │ ├── NavDrawer.vue
│ │ ├── PoolList.vue
│ │ ├── PostDetail.vue
│ │ ├── PostExportTags.vue
│ │ ├── PostList.vue
│ │ ├── SettingsDrawer.vue
│ │ ├── Snackbar.vue
│ │ └── WfLayout.vue
│ ├── data/
│ │ ├── all_tags_cn.json
│ │ ├── all_tags_cn.min.json
│ │ ├── all_tags_cn_space.json
│ │ ├── all_tags_cn_space.min.json
│ │ ├── danbooru.csv
│ │ ├── danbooru_tags_cn.json
│ │ ├── gelbooru.csv
│ │ ├── handle-tags.mjs
│ │ ├── moebooru_tags_cn.json
│ │ ├── sankakucomplex_chan.csv
│ │ ├── tags_cn.json
│ │ └── yande.csv
│ ├── env.d.ts
│ ├── locales/
│ │ ├── en.json
│ │ ├── ja.json
│ │ ├── zh-Hans.json
│ │ └── zh-Hant.json
│ ├── main.ts
│ ├── plugins/
│ │ ├── vuetify.ts
│ │ └── webfontloader.ts
│ ├── prepare.ts
│ ├── store/
│ │ ├── actions/
│ │ │ ├── _util.ts
│ │ │ ├── detail.ts
│ │ │ ├── post.ts
│ │ │ └── site.ts
│ │ ├── index.ts
│ │ └── settings.ts
│ ├── styles/
│ │ ├── custom.css
│ │ ├── konachan.css
│ │ ├── prepare.css
│ │ └── yandere.css
│ └── utils/
│ ├── fsa.ts
│ ├── i18n.ts
│ └── index.ts
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintignore
================================================
/dist
node_modules
/packages/**/*.js
/packages/**/*.mjs
/scripts
/**/header.config.js
/**/*.d.ts
================================================
FILE: .eslintrc.json
================================================
{
"root": true,
"env": {
"browser": true,
"es6": true,
"greasemonkey": true
},
"parserOptions": {
"parser": "@typescript-eslint/parser",
"ecmaVersion": "latest",
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"extends": ["eslint:recommended", "@antfu/vue"],
"rules": {
"@typescript-eslint/brace-style": ["error", "1tbs", { "allowSingleLine": true }],
"antfu/if-newline": "off",
"arrow-parens": ["error", "as-needed"],
"brace-style": ["error", "1tbs", { "allowSingleLine": true }],
"curly": ["warn", "multi-line"],
"eqeqeq": "off",
"no-console": "off",
"no-unexpected-multiline": "error",
"no-unused-expressions": "off",
"no-void": "off",
"quotes": ["warn", "single"],
"semi": ["error", "never"],
"space-before-function-paren": ["error", { "anonymous": "always", "named": "never", "asyncArrow": "always" }],
"vue/component-tags-order": ["warn", { "order": [["script", "template"], "style"] }],
"vue/html-self-closing": ["warn", { "html": { "void": "never", "normal": "never", "component": "always" }, "svg": "never", "math": "never" }],
"vue/no-deprecated-v-bind-sync": "off",
"vue/no-v-text-v-html-on-component": "off",
"vue/singleline-html-element-content-newline": "off",
"vue/no-deprecated-destroyed-lifecycle": "off"
}
}
================================================
FILE: .gitattributes
================================================
* text=auto
* vue eol=lf encoding=UTF-8
*.css eol=lf encoding=UTF-8
*.html eol=lf encoding=UTF-8
*.js eol=lf encoding=UTF-8
*.jsx eol=lf encoding=UTF-8
*.md eol=lf encoding=UTF-8
*.scss eol=lf encoding=UTF-8
*.ts eol=lf encoding=UTF-8
*.tsx eol=lf encoding=UTF-8
*.txt eol=lf encoding=UTF-8
*.xml eol=lf encoding=UTF-8
# Images
*.gif binary
*.ico binary
*.jpg binary
*.png binary
*.svg eol=lf encoding=UTF-8
*.webp binary
# Fonts
*.eot binary
*.otf binary
*.ttf binary
*.woff binary
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
# github: YunYouJun # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
# patreon: YunYouJun # Replace with a single Patreon username
ko_fi: sakurayumine
custom: https://sponsors-yumine.netlify.app # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
*.local
# Editor directories and files
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
================================================
FILE: .npmrc
================================================
registry=https://registry.npmjs.org/
shamefully-hoist=true
strict-peer-dependencies=false
auto-install-peers=true
link-workspace-packages=true
================================================
FILE: .vscode/settings.json
================================================
{
"i18n-ally.localesPaths": ["src/locales"],
"i18n-ally.sourceLanguage": "zh-Hans",
"i18n-ally.keystyle": "nested",
// "typescript.tsdk": "node_modules\\typescript\\lib",
"eslint.probe": ["javascript", "javascriptreact", "typescript", "typescriptreact", "vue"],
"eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact", "vue"],
}
================================================
FILE: CHANGELOG.md
================================================
## v0.37.5
- fix: 修复 gelbooru 无法下载图片到子目录
## v0.37.4
- fix: 修复 e-shuushuu.net 无法加载
## v0.37.3
- fix: 修复 gelbooru 无法下载原图
## v0.37.2
- feat: 新增通过 FileSystemAccess API 下载图片的设置
- fix: 修复 Safari 浏览下无法加载
## v0.37.1
- fix: 修复深色模式设置失效
## v0.37.0
- feat: Justified 布局缩略图宽度调整设置
- feat: 图片详情弹窗操作按钮栏与标签栏位置互换设置
- feat: 点击详情图片是否关闭弹窗的设置
- fix: 修复 Zerochan API 挑战
- fix: 尝试修复批量选择后导出的下载TXT文件异常
## v0.36.10
- fix: 修复 rule34.xxx 视频无法加载
## v0.36.9
- fix: 修复 danbooru 添加收藏时的错误提示
## v0.36.8
- fix: 修复 rule34.xxx 无法加载
## v0.36.4
- fix: https://idol.sankakucomplex.com 切换为 https://www.idolcomplex.com
## v0.36.3
- fix: 更新标签翻译
## v0.36.2
- feat: 支持 rule34hentai.net
## v0.36.1
- fix: 标签导出功能支持全站点
## v0.36.0
- feat: danbooru 添加标签导出功能
## v0.35.9
- fix: 修复 Firefox rule34.xxx 无法添加收藏
- feat: 添加一种瀑布流布局,使用 CSS Grid 实现
## v0.35.8
- feat: yande.re/konachan/danbooru 支持在详情弹窗左上角显示 Artist/Character/Copyright 标签
## v0.35.7
- fix: 修复 gelbooru 无法加载
## v0.35.6
- fix: 修复因标签黑名单导致的无法继续加载问题
- fix: 样式修改
## v0.35.5
- fix: 尝试修复 rule34.xxx 评分阈值与 AI 开关不生效的问题
## v0.35.4
- fix: 修复 Firefox 下 rule34.xxx 无法加载
## v0.35.3
- fix: virtual 布局可选择列数
- fix: 替换 nozomi 链接
## v0.35.2
- fix: 修复 sankaku 无法加载
## v0.35.1
- fix: 修复 realbooru.com 详情 GIF 无法加载
## v0.35.0
- feat: 新增 danbooru/gelbooru/rule34.xxx 的搜索标签自动补全
## v0.34.1
- fix: 修复 realbooru.com 无法加载
## v0.34.0
- feat: 显示列表图片的分辨率
- fix: 优化瀑布流虚拟列表组件
- fix: 修复 xbooru 图片链接
## v0.33.6
- fix: 修复 rule34.xxx 图片链接
## v0.33.5
- fix: 修复 rule34.paheals 下载链接
## v0.33.4
- fix: yandere 瀑布流模式下与主页图片顺序一致
- fix: 修复 anime-pictures 大图无法加载
- fix: 修复 rule34.paheals 图片无法下载
## v0.33.3
- fix: rule34.paheal 通过解析 HTML 获取数据
## v0.33.2
- fix: 修复 sankaku idol 翻页问题
## v0.33.1
- fix: 修复 fancybox 无法使用
## v0.33.0
- feat: 支持 e-shuushuu.net
- feat: 支持 zerochan.net
- feat: 支持 sankaku.app(chan.sankakucomplex.com)
- feat: 支持 idol.sankakucomplex.com
- feat: 支持 anime-pictures.net
- feat: 支持 allgirl.booru.org
- feat: 支持 booru.eu
- feat: 支持 kusowanka.com
- feat: 支持 anihonetwallpaper.com
- feat: 支持 nozomi.la
- feat: 新增使用 fancybox 查看大图的设置
- fix: 修复 rule34.paheal 无法加载的问题
## v0.32.3
- feat: 添加 Danbooru/Gelbooru/Rule34 收藏按钮
- feat: 添加显示列表图片卡片左上角复选框的设置,勾选复选框可加入下载列表
## v0.32.2
- fix: 优化 a11y,便于使用 Vimium 插件浏览
- fix: 修复 Justified 布局下没有缩略图大图开关
- fix: 样式修改
## v0.32.1
- fix: 修复 Firefox 下 Gelbooru 无法查看大图的问题
## v0.32.0
- feat: 新增图片铺满屏幕设置
- feat: 新增本地标签黑名单导入导出功能
- feat: 新增自动进入瀑布流模式设置
- fix: 样式修改
## v0.31.0
- feat: 添加虚拟瀑布流布局(实验性)
- feat: 添加父投稿与子项提示(Y 站和 K 站)
## v0.30.0
- feat: 添加 danbooru 标签翻译, 数据来自 [danbooru-diffusion-prompt-builder](https://github.com/wfjsw/danbooru-diffusion-prompt-builder)
- feat: 简单适配从 rule34.xxx 收藏夹界面进入瀑布流模式
- fix: danbooru.donmai.us 使用 720x720 缩略图
## v0.29.1
- feat: 支持保存图片到子文件夹,需要将 Tampermonkey 的“下载模式”修改为“浏览器 API”。
- fix: 图片列表添加快捷操作按钮,鼠标上浮时显示
## v0.29.0
- feat: 国际化支持
## v0.28.1
- fix: yande.re 站点下载文件时使用原文件名
## v0.28.0
- feat: 修改设置界面样式
## v0.27.4
- fix: 修改 Flexbin 布局为适高不等宽
## v0.27.0
- feat: 支持设置图片信息流布局
- Masonry (等宽不等高)
- Grid (等宽等高)
- Flexbin (等高不等宽)
- fix: 下载列表可选择图片清晰度
- fix: 详情弹窗修改为整屏弹出
- fix: 图片详情样品图可使用右键复制
- fix: 视频详情加载上/下一个按钮,样式修改
## v0.26.0
- feat: 支持 atfbooru 与 aibooru
- feat: 支持设置站点 API Key 查询字符串
- feat: 添加 moebooru 语言选择
- revert: 回滚弹窗遮罩样式
## v0.25.2
- feat: 详情弹窗支持使用 A/D/←/→ 加载上一张/下一张图片
- feat: 列表右键菜单添加下载原图选项
- fix: 详情查看大图默认修改为原始大小
- fix: 修改弹窗遮罩样式
## v0.25.1
- feat: 简单支持详情图片旋转操作
## v0.25.0
- chore: 升级 vue 版本到 2.7
- fix: 修复依赖 CDN 加载顺序
## v0.24.8
- feat: 添加缩略图列表布局设置,默认为瀑布流布局,可切换为等高网格布局
## v0.24.7
- fix: 修复因 Gelbooru CSP 导致的 DPlayer 加载失败
## v0.24.6
- fix: 修改所有 CDN 为 UNPKG
## v0.24.5
- feat: 图片预加载数量配置
- fix: 图片详情翻到最后一张时加载下一页
## v0.24.0
- feat: 添加 NSFW 开关,默认打开
- feat: 添加鼠标滚轮事件开关,默认打开
- feat: 添加详情图片预加载开关,默认关闭
## v0.23.0
- feat: 瀑布流模式添加全屏按钮
- feat: 图片详情查看大图添加调整原图适应页面的按钮
## v0.22.4
- feat: 详情弹窗查看原图时可以进入全屏查看
- fix: 详情弹窗鼠标滚轮事件判断
## v0.22.3
- feat: 详情弹窗可以用鼠标滚轮加载上一张/下一张图片
- fix: 详情弹窗稍微扩大
## v0.22.0
- feat: 瀑布流点击详情查看原图时可拖动图片
- fix: 显示侧栏滚动条
## v0.21.0
- feat: ✨添加 Web 预览版本链接
- feat: 添加 Pixiv Ranking 与 Pixiv Viewer 链接
- fix: 瀑布流初始化时只加载两页,避免某些情况下无限加载
## v0.20.4
- fix: 瀑布流模式详情记住标签显示隐藏状态
## v0.20.2
- fix: 修改 macy 响应列数
## v0.20.1
- feat: 添加反馈链接
## v0.20.0
- feat: ✨ moebooru 支持在图集列表与详情页面进入瀑布流模式
- feat: moebooru 添加返回首页按钮
- feat: 瀑布流列表标注视频与 GIF 格式的作品
- fix: 进入瀑布流按钮样式更改
- fix: 修改 a.thumb 样式
- docs: 更新翻译文件
## v0.19.1
- fix: 修复 dplayer 初始化错误
## v0.19.0
- feat: 使用 dplayer 替代原生播放器
- feat: 添加标签显示隐藏按钮
- feat: 支持 lolibooru
- feat: 支持 sakugabooru
- feat: 支持 3dbooru
- fix: 修复某些站点图片加载错误
- chore: 更新依赖
## v0.18.0
- feat: 本地标签黑名单
- feat: 作品详情弹窗加载上一个或下一个作品
- feat: 顶栏页码输入框可使用方向键跳页
## v0.17.3
- feat: moebooru 可以直接加载上一个或者下一个周期的人气作品
## v0.17.2
- fix: moebooru /tag 页面的标签添加翻译
- fix: 侧栏添加更新日志链接
- fix: 替换 `GM_notification` 为 `snackbar`
## v0.17.1
- fix: 修复搜索标签触发行为
- docs:完善更新日志
- docs: 更新 Readme
## v0.2.40
- feat: 瀑布流模式顶栏添加加载收藏夹 (moebooru 站点)、人气作品、随机作品按钮
## v0.2.39
- feat: 瀑布流模式支持标签搜索
## v0.2.38
- feat: 瀑布流模式侧栏添加人气与随机作品列表页面链接
- docs: 更新 Readme
## v0.2.37
- fix: 进入瀑布流模式时尝试移除 moebooru 站点一些监听事件
## v0.2.34
- fix: 移除 mdi CSS CDN 链接
## v0.2.33
- perf: 放弃 CSS Iconfont,使用 `@mdi/js` 加载 svg 图标
- chore: 更新依赖 & 添加依赖 `@antfu/eslint-config-vue`
- chore: eslint 基本配置修改为 `@antfu/vue`
## v0.2.31
- fix: 跳页输入框样式修改
- fix: 只在 moebooru 站点获取用户名
- refactor: 修改文件结构
## v0.2.30
- fix: 修改依赖库 CDN
## v0.2.29
- fix: 瀑布流模式详情只在 moebooru 站点查询作品信息
## v0.2.28
- feat: 瀑布流模式支持在 appbar 跳转页数
- docs: 更新 Readme
## v0.2.27
- fix: moebooru 瀑布流模式详情标签默认颜色
## v0.2.26
- feat: moebooru 支持在人气页面进入瀑布流模式
- feat: moebooru 瀑布流模式详情支持彩色标签
## v0.2.25
- fix: 通过 GitHub Raw 加载翻译文件
- fix: 替换 eleme CDN 为 jsDelivr
- docs: 更新翻译文件
## v0.2.24
- docs: 更新翻译文件
## v0.2.23
- chore: 修改翻译文件位置
## v0.2.22
- feat: 添加 moebooru 标签中文翻译
- fix: 使用 `GM_info` 获取脚本版本
## v0.2.21
- fix: 防止 Konachan Access Denied 时无限跳转
## v0.2.19
- fix: moebooru 站点使用 url 参数设置语言
## v0.2.18
- feat: 访问 moebooru 站点时默认设置语言为中文
## v0.2.17
- feat: 加载下一页时自动修改地址
- feat: 瀑布流模式列数选择小于 6 时列表会加载大图
- feat: 添加退出瀑布流模式按钮
- fix: 样式修改
- fix: 修改 Macy 默认列数为 5
- fix: 修复 safebooru 添加瀑布流模式按钮两次
- fix: 设置各站点 page limit
- chore: 更新依赖 `@himeka/booru`
- chore: 修改 eslint 规则
## v0.2.16
- fix: 样式修改
## v0.2.15
- fix: moebooru 修改获取用户名的方式
## v0.2.14
- fix: 修改脚本版本展示位置
## v0.2.13
- feat: 添加脚本版本展示
## v0.2.12
- feat: 瀑布流模式支持输出下载地址
## v0.2.10
- feat: 瀑布流模式图片详情支持查询收藏状态
- feat: 瀑布流模式侧栏添加个人页面、收藏夹链接
- fix: 静态页不运行脚本("jpg", "jpeg", "png", "gif", "mp4", "webm", "json", "xml")
- docs: 更新 Readme
## v0.2.9
- fix: 修改 @exclude
## v0.2.8
- feat: 瀑布流模式图片详情支持查看原图
## v0.2.7
- feat: 支持瀑布流模式图片显示列数调整
- fix: 样式调整
- chore: 添加 postbuild 与 release 脚本
## v0.2.5
- chore: 更新 `@himeka/booru` 依赖
## v0.2.4
- fix: 样式修改
## v0.2.3
- fix: 收藏失败时提示错误
## v0.2.2
- fix: 修改瀑布流按钮插入时机
## v0.2.1
- feat: moebooru 添加收藏功能
- feat: 右键缩略图时弹出菜单,可以收藏、新标签页打开、加入下载列表
- fix: 下载功能使用 `GM_download`
## v0.2.0
- feat: 添加下载、下载列表
## v0.1.5
- feat: 详情支持视频展示
- docs:修改 Readme
## v0.1.4
- fix: 修改瀑布流按钮插入时机
## v0.1.3
- chore: 添加推送脚本
## v0.1.1
- fix: 修改 run-at 为 document-end
## v0.1.0
- feat: Yande.re 缩略图列表页面使用 Macy 库
- fix: 样式修改
## v0.0.1
- init: 初版提交,Forked 自 yande-re-chinese-patch
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2022 Yumine Sakura
Copyright (c) 2021 coderzhaoziwei
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.
================================================
FILE: README.en.md
================================================
# Yande.re Masonry

[](https://github.com/asadahimeka/yandere-masonry/blob/main/CHANGELOG.md)







English | [Simple Readme](https://github.com/asadahimeka/yandere-masonry/blob/main/docs/README.old.en.md) | [中文](https://github.com/asadahimeka/yandere-masonry/blob/main/README.md)
Yande.re/Konachan Masonry(Waterfall) Layout.
## Table of Contents
- [Project Introduction](#-project-introduction)
- [Features](#-features)
- [Supported Sites](#-supported-sites)
- [Screenshot Display](#-screenshot-display)
- [Installation Guide](#-installation-guide)
- [Usage Guide](#-usage-guide)
- [FAQ](#-faq)
- [Technical Details](#-technical-details)
- [Development Guide](#-development-guide)
- [Changelog](#-changelog)
- [Contributing Guide](#-contributing-guide)
- [Acknowledgements](#-acknowledgements)
- [License](#-license)
- [Sponsorship](#-sponsorship)
- [Statistics](#-statistics)
## 📖 Project Introduction
**Yande.re Masonry** is a userscript designed specifically for anime image browsing websites, aiming to greatly enhance the browsing experience. It brings practical features such as masonry layout, Chinese tag translation, thumbnail enlargement, double-click page navigation, and more to Yande.re, Konachan, and over 20 Booru sites.
This project was originally improved based on [zhzwz/yande-re-chinese-patch](https://github.com/zhzwz/yande-re-chinese-patch) and has now evolved into a fully featured modern userscript.
* 🎨 **Immersive Browsing** - Masonry layout makes browsing smoother and more efficient
* 🌏 **Localization Support** - Complete Chinese tag translation to eliminate language barriers
* ⚡ **Performance Optimization** - Virtual scrolling, lazy loading, and other techniques ensure a smooth experience
* 🔧 **Highly Customizable** - Rich configuration options to meet different user needs
* 🌐 **Multi-site Support** - Install once, supports 20+ sites
---
## ✨ Features
### 🖼️ Masonry Browsing Mode
Core feature that completely changes the browsing experience:
* **Multiple Layout Modes**:
* Masonry (equal width, variable height) - classic waterfall layout
* Grid (equal width, equal height) - neat grid
* Justified (adaptive height, variable width) - compact layout
* Virtual (virtual scrolling) - best choice for large numbers of images
* **Smart Loading**:
* Automatically loads more when scrolling to the bottom
* Supports infinite scrolling
* Virtual scrolling optimizes performance
* **Customizable Column Count**:
* Automatic mode (based on screen width)
* Manual selection from 1–20 columns
* Automatically switches to high-definition preview when fewer than 7 columns
### 🏷️ Chinese Tag Translation
Eliminate browsing barriers caused by English tags:
* **Complete Translation Coverage**:
* Yande.re/Konachan tag translations (source: [yande-re-chinese-patch](https://github.com/zhzwz/yande-re-chinese-patch))
* Danbooru-based site translations (source: [danbooru-diffusion-prompt-builder](https://github.com/wfjsw/danbooru-diffusion-prompt-builder))
* Other site tags (source: [Yellow-Rush/zh_CN-Tags](https://github.com/Yellow-Rush/zh_CN-Tags))
* **Smart Autocomplete**: Real-time suggestions and translations while typing tags
* **Continuous Updates**: PRs are welcome to supplement or correct translations
### 🔍 Search and Filtering
Powerful search features (based on the original site search syntax):
* **Tag Search**: Supports tag autocomplete
* **Advanced Search**: Supports meta tags such as rating and order
* **Blacklist Filtering**: Local tag blacklist to block unwanted content
* **NSFW Control**: One-click toggle to show/hide NSFW content
* **Sorting Methods**:
* By score, favorites, resolution
* By time, popularity
* Random, quality sorting
### ➡️ Quick Browsing
Detail features that improve browsing efficiency:
In non-masonry mode (Y/K sites):
* **Thumbnail Enlargement**: Larger preview images to see details at a glance
* **Double-click Paging**: Double-click left side for previous page, right side for next page
* **Visited Mark**: A horizontal line is shown under images that have been viewed
Masonry mode:
* **Keyboard Navigation**: Image detail supports A/D/←/→ keys for paging
* **Mouse Wheel Navigation**: Image detail supports mouse wheel paging
* **HD Preview**: Thumbnails in the image list can use high-definition image links
* **Image Preloading**: Image detail supports preloading the next sample/original image
* **Auto Enter**: Can be set to automatically enter masonry mode
* **Images Fill Screen**: Supports full-width display mode, balancing immersion and reading whitespace
### 📥 Batch Download
Convenient image management features:
* **Batch Selection**: Quickly select multiple images
* **Download List**: Manage the download queue
* **Export Links**: Export image URLs as TXT, supporting tools like Xunlei/IDM/wget
* **Filename Handling**: Domain prefix + artwork tags
* **Download Source Selection**: Original file (fileUrl) / JPG compressed image (jpegUrl)
### ⭐ Favorites and Interaction (Y/K Sites)
* **One-click Favorite**: Quickly add to personal favorites
* **Pool Browsing**: Browse related artwork collections
* **Popularity Rankings**: View popular, ranked, and recently favorited works
### 🎛️ Interface Customization
* **Dark Mode**: Eye-friendly night browsing experience
* **Fullscreen Mode**: Immersive browsing with no distractions
* **Column Switching**: Adjust display density according to preference
* **Image Resolution Display**: Intuitively view image dimensions
* **Type Indicators**: Icon indicators for GIFs, videos, child images, parent images, etc.
---
## 🌐 Supported Sites
### Full Support (Tag Translation + Double-click Paging + Masonry)
| Site | URL | Features |
| -------------- | ---------------------------------------------------------- | ---------------------------------- |
| Yande.re | [https://yande.re](https://yande.re) | Full support, primary testing site |
| Konachan | [https://konachan.com](https://konachan.com) | Full support |
| Konachan(Safe) | [https://konachan.net](https://konachan.net) | Full support |
| Sakugabooru | [https://www.sakugabooru.com](https://www.sakugabooru.com) | Almost full support |
### Basic Support (Masonry)
| Site | URL | Features |
| ------------- | ---------------------------------------------------------------- | ------------------------------------------ |
| Danbooru | [https://danbooru.donmai.us](https://danbooru.donmai.us) | Basic support |
| Gelbooru | [https://gelbooru.com](https://gelbooru.com) | Basic support (API Key required) |
| Rule34 | [https://rule34.xxx](https://rule34.xxx) | Basic support (API Key required) |
| Safebooru | [https://safebooru.org](https://safebooru.org) | Basic support |
| AIBooru | [https://aibooru.online](https://aibooru.online) | Basic support |
| Xbooru | [https://xbooru.com](https://xbooru.com) | Basic support |
| ATFBooru | [https://booru.allthefallen.moe](https://booru.allthefallen.moe) | Basic support |
| TBIB | [https://tbib.org](https://tbib.org) | Basic support |
| Rule34 Paheal | [https://rule34.paheal.net](https://rule34.paheal.net) | Basic support |
| Lolibooru | [https://lolibooru.moe](https://lolibooru.moe) | Basic support (site currently unavailable) |
| 3dbooru | [http://behoimi.org](http://behoimi.org) | Basic support (site currently unavailable) |
### Limited Support (Masonry, partial feature limitations)
| Site | URL | Notes |
| ----------------- | ------------------------------------------------------------------ | -------------------------------------- |
| Anime Pictures | [https://anime-pictures.net](https://anime-pictures.net) | Partial feature limitations |
| Anihone Wallpaper | [https://anihonetwallpaper.com](https://anihonetwallpaper.com) | Partial feature limitations |
| All Girl | [https://allgirl.booru.org](https://allgirl.booru.org) | Partial feature limitations |
| e-shuushuu | [https://e-shuushuu.net](https://e-shuushuu.net) | Partial feature limitations |
| Zerochan | [https://www.zerochan.net](https://www.zerochan.net) | Partial feature limitations |
| Sankaku App | [https://sankaku.app](https://sankaku.app) | Partial feature limitations (unstable) |
| Sankaku Complex | [https://chan.sankakucomplex.com](https://chan.sankakucomplex.com) | Partial feature limitations (unstable) |
| Idol Complex | [https://www.idolcomplex.com](https://www.idolcomplex.com) | Partial feature limitations (unstable) |
| Realbooru | [https://realbooru.com](https://realbooru.com) | Partial feature limitations |
| Hentai Booru | [https://booru.eu](https://booru.eu) | Partial feature limitations |
| Kusowanka | [https://kusowanka.com](https://kusowanka.com) | Partial feature limitations |
| Nozomi.la | [https://nozomi.la](https://nozomi.la) | Partial feature limitations |
| Rule34 Hentai | [https://rule34hentai.net](https://rule34hentai.net) | Partial feature limitations |
> ⚠️ **Note**:
>
> * The primary supported sites are Yande.re and Konachan; other sites have basic support
> * Some sites may have inconsistencies between page listings and API responses
> * Some sites require setting an API Key to function properly
---
## 📸 Screenshot Display









---
## 🚀 Installation Guide
> ⚠️ **Compatibility**:
> - The primary testing environment is Windows + Chrome/Edge browser
> - Firefox browser is supported to the best of our ability
> - macOS + Safari support is limited
### Method 1: Install via Greasy Fork (Recommended)
1. **Install a userscript manager** (if not already installed):
* Chrome/Edge: [Tampermonkey](https://www.tampermonkey.net/) or [Violentmonkey](https://violentmonkey.github.io/)
* Firefox: [Tampermonkey](https://www.tampermonkey.net/) or [Greasemonkey](https://www.greasespot.net/)
* Safari: [Userscripts](https://apps.apple.com/app/userscripts/id1463298887) or [Stay for Safari](https://apps.apple.com/app/stay-for-safari/id1591620171)
2. **Install the script**:
* Click Greasy Fork: [Click to install](https://greasyfork.org/zh-CN/scripts/444885)
* Or Sleazy Fork: [Click to install](https://sleazyfork.org/scripts/444885)
* Click "Install" on the confirmation page
3. **Verify installation**:
* Visit any supported site (e.g., yande.re)
* A "Enter Masonry" button should appear in the top-right corner of the page
### Method 2: Install Directly from GitHub
1. Download the script file:
* [Click to download](https://github.com/asadahimeka/yandere-masonry/raw/main/dist/yandere-masonry.user.js)
2. Open the userscript manager
3. Click "Create new script" or drag the file to install
### Method 3: Try the Web Version
No installation required, experience it directly in the browser:
* [Online preview version](https://booru.vercel.app/)
### Update Script
The script checks for updates automatically, or update manually:
* Click "Check for updates" in the Tampermonkey dashboard
* Or reinstall the latest version
---
## 📖 Usage Guide
### Quick Start
1. Visit any supported site (e.g., yande.re/post)
2. Click the "Enter Masonry" button in the top-right corner
3. Enjoy the brand-new browsing experience!
### Masonry Mode Operations
#### Top Toolbar
| Icon | Function |
| ---- | --------------------- |
| ⚙️ | Open settings |
| 1️⃣ | Page number switching |
| ⭐ | Browse my favorites |
| 🔥 | Browse popular works |
| 🔀 | Random browsing |
| 🔍 | Tag search |
| ☑️ | Batch selection |
| ⬇️ | Download manager |
| ☀️ | Dark mode toggle |
| ⛶ | Fullscreen mode |
| 🌐 | Language switching |
| ⏏️ | Exit masonry mode |
#### Sidebar
* **Site Switching**: Quickly switch between different sites
* **Blacklist Management**: Add tags you don't want to see
* **API Credentials**: Set credentials for sites that require login
* **NSFW Control**: Show/hide sensitive content
* **Layout Mode**: Masonry/Grid/Justified/Virtual
* **Column Settings**: Auto or 1–20 columns
* **Keyboard & Wheel**: Control image switching in detail view
* **Image Preloading**: Control detail image preloading and quantity
* **Large Thumbnails**: Control whether list thumbnails use large image links
* **Fixed Container Width**: Control whether the image list leaves margins on both sides
* **Auto Enter**: Control whether to automatically enter masonry mode
* **Info Display**: Control whether image resolution is shown in the image list
* **Button Position**: Control the position of the action button bar in image detail view
* **Close Behavior**: Control how closing the detail popup is triggered
* **Viewer Tool**: Fancybox plugin can be used to view image details
#### Image Operations
List:
* **Single click**: Open image details
* **Right click**: Quick menu (favorite, download, open details, etc.)
* **Middle click**: Middle mouse button click the detail link button to open in a new tab
Details:
* Detail link
* Source link
* Artist link
* Tag links
* Tag display
* Tag export
* Favorite artwork
* Zoom image
* Download artwork
#### Shortcuts
| Key | Function |
| --------------------------- | -------------------- |
| <kbd>←</kbd> / <kbd>→</kbd> | Previous/Next image |
| <kbd>A</kbd> / <kbd>D</kbd> | Previous/Next image |
| <kbd>Enter</kbd> | Search tags |
| Mouse wheel | Previous/Next image |
| Middle mouse button | Open link in new tab |
### Tag Search
1. Click the 🔍 search button
2. Enter tags (English only supported)
3. Real-time autocomplete suggestions are shown
4. Press Enter to perform the search
### Batch Download
1. Select the images you want to download
2. Click the ⬇️ download button
3. Choose:
* Direct download: Use the browser download manager
* Export links: Save as a TXT file and download with other tools
4. Configure download source (Y site / K site): original image / JPG compressed image
### Favorites Feature
Supported sites:
* yande.re
* konachan.com
* konachan.net
* danbooru.donmai.us
* gelbooru.com
* rule34.xxx
---
## ❓ FAQ
### Q: Why are some site features incomplete?
A: The project is mainly optimized for Yande.re and Konachan. Other sites receive basic support. Some site API limitations or structural differences cause feature restrictions.
### Q: Why do images in masonry mode differ from the original site list?
A: Masonry mode uses site APIs to fetch data, which may differ from page rendering logic. This is normal.
### Q: What if tag translations are incomplete?
A: PRs are welcome to add translations! See the "Contributing Translations" section for details.
### Q: How do I disable a feature?
A: Most features can be turned off in the settings sidebar, such as thumbnail enlargement and NSFW display.
### Q: Does the script support mobile devices?
A: Partially supported. Mainly optimized for desktop; mobile experience may be imperfect.
### Q: Why can’t some sites be used?
A: Login and API credentials are required. Set credentials in the sidebar to enable usage.
### Q: Why is the download feature slow?
A: Browsers have concurrent download limits. It is recommended to use the "Export links" feature with professional download tools (such as IDM, wget, aria2, etc.).
### Q: How can I report issues or suggestions?
A: Please submit feedback on [GitHub Issues](https://github.com/asadahimeka/yandere-masonry/issues).
---
## 🎯 Technical Details
### Frontend Tech Stack
* **Vue 2.7 + Composition API**:
* Uses Vue 2.7 Composition API features
* `<script setup>` syntax for cleaner code
* Reactive state management with excellent performance
* **TypeScript Strict Mode**:
* Type safety guarantees
* Intelligent hints and autocomplete
* Reduced runtime errors
* **Vite Build Tool**:
* Extremely fast development experience
* HMR (Hot Module Replacement)
* Optimized production builds
### Core Technical Implementation
* **Masonry Layout Algorithm**:
* Adaptive column count calculation
* Minimized gaps
* Supports multiple layout strategies
* **Smart Preloading**:
* Preloads images for the next screen
* Configurable preload count
* **Virtual Scrolling**:
* Renders only visible elements
* Supports smooth scrolling with large image sets
* Low memory usage
### Multi-site Architecture
* **Unified API Abstraction**:
* The `@himeka/booru` library provides most interfaces
* Automatically adapts API differences between sites
* Easy to extend to new sites
* **Dynamic Site Detection**:
* Automatically identifies the current site
* Loads the corresponding adapter
* Intelligently handles special cases
---
## 💻 Development Guide
The project code is **not** AI-generated; only the README file is AI-optimized
### Tech Stack
* **Framework**: Vue 2.7 (Composition API)
* **Language**: TypeScript
* **Build**: Vite 2.9
* **UI Components**: Vuetify 2
* **State Management**: Vue.observable
* **Layout**: vue-masonry-css, @lhlyu/vue-virtual-waterfall
* **Internationalization**: vue-i18n
* **Utility Libraries**: @vueuse/core, date-fns
* **API**: @himeka/booru
### Environment Requirements
* Node.js >= 16
* pnpm >= 9
* Git
### Development Steps
```bash
# 1. Clone the repository
git clone https://github.com/asadahimeka/yandere-masonry.git
cd yandere-masonry
# 2. Install dependencies
pnpm install
# 3. Start the development server
pnpm run dev
# 4. Open in browser
# - Visit http://127.0.0.1:3000/_development.user.js to install the development script
# - Load the development version on supported sites
```
### Available Commands
```bash
pnpm run dev # Start development server
pnpm run build # Build production version
pnpm run release # Release process (version management)
pnpm run lint # Code linting
```
### Project Structure
```
yandere-masonry/
├── src/
│ ├── api/ # API adapters for each site
│ │ ├── danbooru.ts # Danbooru API
│ │ ├── moebooru.ts # Y/K site API
│ │ ├── gelbooru.ts # Gelbooru API
│ │ └── ...
│ ├── components/ # Vue components
│ │ ├── AppBar.vue # Top toolbar
│ │ ├── PostList.vue # Image list
│ │ ├── PostDetail.vue # Image detail
│ │ └── ...
│ ├── store/ # State management
│ │ ├── index.ts # Main store
│ │ └── actions/ # State actions
│ ├── utils/ # Utility functions
│ │ ├── index.ts # General utilities
│ │ └── i18n.ts # Internationalization config
│ ├── data/ # Static data
│ │ └── tags_cn.json # Chinese translations
│ ├── plugins/ # Vue plugins
│ │ ├── vuetify.ts # Vuetify config
│ │ └── webfontloader.ts # Font loader
│ ├── App.vue # Root component
│ ├── main.ts # Entry file
│ └── prepare.ts # Script initialization
├── scripts/ # Build scripts
│ ├── postbuild.mjs # Post-processing
│ └── release.mjs # Release process
├── package.json
├── vite.config.ts # Vite config
├── tsconfig.json # TypeScript config
└── .eslintrc.json # ESLint config
```
### Code Standards
* **Formatting**: 2-space indentation, no semicolons, single quotes
* **Naming**: camelCase variables/functions, PascalCase components, UPPER_SNAKE_CASE constants
* **Typing**: Strict TypeScript, explicit type annotations
* **Components**: Use Composition API + `<script setup>`
* **Imports**: Use `@/` alias for local modules
### Adding New Site Support
1. Create a new adapter file in `src/api/`
2. Implement site-specific API calls
3. Register the site
4. Test functionality
5. Submit a PR
### Contributing Translations
1. Fork the repository
2. Edit the corresponding translation files:
* Y/K sites: `src/data/tags_cn.json`
* Danbooru: [danbooru_tags_json](https://github.com/asadahimeka/danbooru_tags_json)
3. Submit a PR
---
## 📝 Changelog
View the complete version history and update details:
[CHANGELOG.md](https://github.com/asadahimeka/yandere-masonry/blob/main/CHANGELOG.md)
---
## 🤝 Contributing Guide
All forms of contribution are welcome!
### How to Contribute
1. Fork this repository
2. Create a feature branch: `git checkout -b feature/AmazingFeature`
3. Commit changes: `git commit -m 'Add some AmazingFeature'`
4. Push to the branch: `git push origin feature/AmazingFeature`
5. Submit a Pull Request
### Types of Contributions
* 🐛 Bug fixes
* ✨ New features
* 📝 Documentation improvements
* 🎨 Style optimization
* ⚡ Performance optimization
* 🌍 Internationalization translations
* ✅ Test cases
---
## 🙏 Acknowledgements
This project would not be possible without the following open-source projects:
* [zhzwz/yande-re-chinese-patch](https://github.com/zhzwz/yande-re-chinese-patch) - Base project
* [@himeka/booru](https://github.com/asadahimeka/booru) - Unified Booru API library
* [AtoraSuunva/booru](https://github.com/AtoraSuunva/booru) - Foundation of @himeka/booru project
* [vue-masonry-css](https://github.com/paulcollett/vue-masonry-css) - Masonry layout component
* [@lhlyu/vue-virtual-waterfall](https://github.com/lhlyu/vue-virtual-waterfall) - Virtual masonry component
* [vite-plugin-tm-userscript](https://github.com/asadahimeka/vite-plugin-tm-userscript) - Userscript packaging plugin
* [Vuetify](https://vuetifyjs.com/) - UI component library
* [Vite](https://vite.dev/) - Build tool
Special thanks:
* **TSUKYU** for generous support
---
## 📄 License
This project is open-sourced under the [MIT License](https://github.com/asadahimeka/yandere-masonry/blob/main/LICENSE).
Copyright © 2022 Yumine Sakura
---
## 💖 Sponsorship
If this project has helped you, feel free to [buy me a coffee](https://sponsors-yumine.netlify.app):
[](https://ko-fi.com/sakurayumine)
Your support is my motivation to continue updating!
---
## 📊 Statistics



<p><img src="https://count.nanoka.top/@himekayanderemasonrygh" alt="yandere-masonry"></p>
================================================
FILE: README.md
================================================
# Yande.re Masonry

[](https://github.com/asadahimeka/yandere-masonry/blob/main/CHANGELOG.md)







中文 | [简要](https://github.com/asadahimeka/yandere-masonry/blob/main/docs/README.old.md) | [English](https://github.com/asadahimeka/yandere-masonry/blob/main/README.en.md)
Yande.re/Konachan 中文标签 & 缩略图放大 & 双击翻页 & 瀑布流浏览
## 目录
- [项目简介](#-项目简介)
- [功能特性](#-功能特性)
- [支持站点](#-支持站点)
- [截图展示](#-截图展示)
- [安装指南](#-安装指南)
- [使用指南](#-使用指南)
- [常见问题](#-常见问题)
- [技术相关](#-技术相关)
- [开发指南](#-开发指南)
- [更新日志](#-更新日志)
- [贡献指南](#-贡献指南)
- [致谢](#-致谢)
- [许可证](#-许可证)
- [赞助](#-赞助)
- [统计](#-统计)
## 📖 项目简介
**Yande.re Masonry** 是一款专为二次元图片浏览网站打造的用户脚本(Userscript),旨在大幅提升浏览体验。它为 Yande.re、Konachan 及超过 20 个 Booru 站点带来了瀑布流布局、中文标签翻译、缩略图放大、双击翻页等实用功能。
本项目最初基于 [zhzwz/yande-re-chinese-patch](https://github.com/zhzwz/yande-re-chinese-patch) 改进而来,现已发展为功能完善的现代化用户脚本。
- 🎨 **沉浸式浏览** - 瀑布流布局让浏览更加流畅高效
- 🌏 **本地化支持** - 完整的中文标签翻译,消除语言障碍
- ⚡ **性能优化** - 虚拟滚动、懒加载等技术保证流畅体验
- 🔧 **高度可定制** - 丰富的设置选项满足不同用户需求
- 🌐 **多站支持** - 一次安装,支持 20+ 站点
---
## ✨ 功能特性
### 🖼️ 瀑布流浏览模式
核心功能,彻底改变浏览体验:
- **多种布局方式**:
- Masonry(等宽不等高)- 经典瀑布流
- Grid(等宽等高)- 规整网格
- Justified(适高不等宽)- 紧凑布局
- Virtual(虚拟滚动)- 大量图片时的最佳选择
- **智能加载**:
- 滚动到底部自动加载更多
- 支持无限滚动
- 虚拟滚动优化性能
- **列数自定义**:
- 自动模式(根据屏幕宽度)
- 手动选择 1-20 列
- 小于 7 列时自动切换到高清预览
### 🏷️ 标签中文翻译
消除英语标签的浏览障碍:
- **完整翻译覆盖**:
- Yande.re/Konachan 标签翻译(来源:[yande-re-chinese-patch](https://github.com/zhzwz/yande-re-chinese-patch))
- Danbooru 系站点翻译(来源:[danbooru-diffusion-prompt-builder](https://github.com/wfjsw/danbooru-diffusion-prompt-builder))
- 其他站点标签(来源:[Yellow-Rush/zh_CN-Tags](https://github.com/Yellow-Rush/zh_CN-Tags))
- **智能补全**:输入标签时实时提示和翻译
- **持续更新**:欢迎通过 PR 补充或校正翻译
### 🔍 搜索与筛选
强大的搜索功能(基于原站点搜索语法):
- **标签搜索**:支持标签自动补全
- **高级搜索**:支持 rating(评分)、order(排序)等元标签
- **黑名单过滤**:本地标签黑名单,屏蔽不感兴趣的内容
- **NSFW 控制**:一键切换显示/隐藏 NSFW 内容
- **排序方式**:
- 按分数、收藏数、分辨率
- 按时间、热度
- 随机、质量排序
### ➡️ 快捷浏览
提升浏览效率的细节功能:
非瀑布流模式下(Y 站/K 站):
- **缩略图放大**:更大的预览图,一眼看细节
- **双击翻页**:双击左侧上一页,右侧下一页
- **访问标记**:已查看的图片下方显示横线
瀑布流模式:
- **键盘导航**:图片详情支持A/D/←/→键翻页
- **滚轮导航**:图片详情支持鼠标滚轮翻页
- **高清预览**:图片列表缩略图可使用高清图片链接
- **图片预加载**:图片详情支持预加载下一张样品图/原图
- **自动进入**:可设置自动进入瀑布流模式
- **图片铺满屏幕**:支持全宽显示模式,兼顾沉浸感与阅读留白
### 📥 批量下载
便捷的图片管理功能:
- **批量选择**:快速勾选多张图片
- **下载列表**:管理待下载的图片队列
- **导出链接**:导出图片地址为 TXT,支持迅雷/IDM/wget 等工具
- **文件名处理**:域名前缀 + 作品标签
- **下载来源选择**:原始文件(fileUrl)/ JPG 压缩图(jpegUrl)
### ⭐ 收藏与互动(Y 站/K 站)
- **一键收藏**:快速收藏到个人收藏夹
- **图集浏览**(Pool):浏览相关作品合集
- **人气榜单**:查看热门、排名、近期收藏等
### 🎛️ 界面定制
- **深色模式**:护眼的夜间浏览体验
- **全屏模式**:沉浸式浏览,无干扰
- **列数切换**:根据喜好调整显示密度
- **图片分辨率显示**:直观了解图片尺寸
- **类型标识**:GIF、视频、子图、父图等图标标识
---
## 🌐 支持站点
### 完整支持(标签翻译 + 双击翻页 + 瀑布流)
| 站点 | 地址 | 特性 |
|------|------|------|
| Yande.re | https://yande.re | 完整支持,主要测试站点 |
| Konachan | https://konachan.com | 完整支持 |
| Konachan(Safe) | https://konachan.net | 完整支持 |
| Sakugabooru | https://www.sakugabooru.com | 几乎完整支持 |
### 基本支持(瀑布流)
| 站点 | 地址 | 特性 |
|------|------|------|
| Danbooru | https://danbooru.donmai.us | 基本支持 |
| Gelbooru | https://gelbooru.com | 基本支持(需要 API Key) |
| Rule34 | https://rule34.xxx | 基本支持(需要 API Key) |
| Safebooru | https://safebooru.org | 基本支持 |
| AIBooru | https://aibooru.online | 基本支持 |
| Xbooru | https://xbooru.com | 基本支持 |
| ATFBooru | https://booru.allthefallen.moe | 基本支持 |
| TBIB | https://tbib.org | 基本支持 |
| Rule34 Paheal | https://rule34.paheal.net | 基本支持 |
| Lolibooru | https://lolibooru.moe | 基本支持(站点目前无法访问) |
| 3dbooru | http://behoimi.org | 基本支持(站点目前无法访问) |
### 有限支持(瀑布流、部分功能限制)
| 站点 | 地址 | 说明 |
|------|------|------|
| Anime Pictures | https://anime-pictures.net | 部分功能限制 |
| Anihone Wallpaper | https://anihonetwallpaper.com | 部分功能限制 |
| All Girl | https://allgirl.booru.org | 部分功能限制 |
| e-shuushuu | https://e-shuushuu.net | 部分功能限制 |
| Zerochan | https://www.zerochan.net | 部分功能限制 |
| Sankaku App | https://sankaku.app | 部分功能限制(不稳定) |
| Sankaku Complex | https://chan.sankakucomplex.com | 部分功能限制(不稳定) |
| Idol Complex | https://www.idolcomplex.com | 部分功能限制(不稳定) |
| Realbooru | https://realbooru.com | 部分功能限制 |
| Hentai Booru | https://booru.eu | 部分功能限制 |
| Kusowanka | https://kusowanka.com | 部分功能限制 |
| Nozomi.la | https://nozomi.la | 部分功能限制 |
| Rule34 Hentai | https://rule34hentai.net | 部分功能限制 |
> ⚠️ **注意**:
> - 主要支持的站点是 Yande.re 和 Konachan,其他站点为基本支持
> - 部分站点可能存在页面列表与 API 返回不一致的情况
> - 有些站点需要设置 API Key 后才能正常使用
---
## 📸 截图展示











---
## 🚀 安装指南
> ⚠️ **兼容性相关**:
> - 主要测试环境是 Windows + Chrome/Edge 浏览器
> - Firefox 浏览器尽力支持
> - Safari 浏览器支持有限
### 方法一:通过 Greasy Fork 安装(推荐)
1. **安装用户脚本管理器**(如果尚未安装):
- Chrome/Edge: [Tampermonkey](https://www.tampermonkey.net/) 或 [Violentmonkey](https://violentmonkey.github.io/)
- Firefox: [Tampermonkey](https://www.tampermonkey.net/) 或 [Greasemonkey](https://www.greasespot.net/)
- Safari: [Userscripts](https://apps.apple.com/app/userscripts/id1463298887) 或 [Stay for Safari](https://apps.apple.com/app/stay-for-safari/id1591620171)
2. **安装脚本**:
- 点击 Greasy Fork: [点击安装](https://greasyfork.org/zh-CN/scripts/444885)
- 或 Sleazy Fork: [点击安装](https://sleazyfork.org/scripts/444885)
- 在弹出的确认页面点击"安装"
3. **验证安装**:
- 访问任意支持的站点(如 yande.re)
- 页面右上角应出现"进入瀑布流"按钮
### 方法二:从 GitHub 直接安装
1. 下载脚本文件:
- [点击下载](https://github.com/asadahimeka/yandere-masonry/raw/main/dist/yandere-masonry.user.js)
2. 打开用户脚本管理器
3. 点击"新建脚本"或拖入文件安装
### 方法三:Web 版本试用
无需安装,直接在浏览器中体验:
- [在线预览版本](https://booru.vercel.app/)
### 更新脚本
脚本会自动检查更新,或手动更新:
- 在 Tampermonkey 管理面板点击"检查更新"
- 或重新安装最新版本
---
## 📖 使用指南
### 快速开始
1. 访问任意支持的站点(如 yande.re/post)
2. 点击右上角"进入瀑布流"按钮
3. 享受全新的浏览体验!
### 瀑布流模式操作
#### 顶部工具栏
| 图标 | 功能 |
|------|------|
| ⚙️ | 打开设置 |
| 1️⃣ | 页码切换 |
| ⭐ | 浏览我的收藏 |
| 🔥 | 浏览人气作品 |
| 🔀 | 随机浏览 |
| 🔍 | 标签搜索 |
| ☑️ | 批量选择 |
| ⬇️ | 下载管理 |
| ☀️ | 深色模式切换 |
| ⛶ | 全屏模式 |
| 🌐 | 语言切换 |
| ⏏️ | 退出瀑布流 |
#### 侧边栏
- **站点切换**:在不同站点间快速切换
- **黑名单管理**:添加不想看到的标签
- **API 凭证**:设置需要登录站点的凭证
- **NSFW 控制**:显示/隐藏敏感内容
- **布局模式**:Masonry/Grid/Justified/Virtual
- **列数设置**:自动或 1-20 列
- **键盘滚轮**:控制详情图片切换
- **图片预加载**:控制详情图片预加载与数量
- **缩略大图**:控制列表图片缩略图使用大图链接
- **容器定宽**:控制图片列表两侧是否留白
- **自动进入**:控制是否自动进入瀑布流模式
- **信息展示**:控制图片列表是否展示图片分辨率
- **按钮位置**:控制图片详情里操作按钮栏的位置
- **关闭行为**:控制图片详情里关闭弹窗的触发行为
- **查看工具**:可使用 Fancybox 插件来查看图片详情
#### 图片操作
列表:
- **单击**:打开图片详情
- **右键**:快捷菜单(收藏、下载、打开详情等)
- **中键**:鼠标中键点击详情链接按钮在新标签页打开
详情:
- 详情链接
- 来源地址
- 画师链接
- 标签链接
- 标签展示
- 标签导出
- 收藏作品
- 放大图片
- 下载作品
#### 快捷键
| 按键 | 功能 |
|------|------|
| <kbd>←</kbd> / <kbd>→</kbd>| 上一张/下一张图片 |
| <kbd>A</kbd> / <kbd>D</kbd> | 上一张/下一张图片 |
| <kbd>Enter</kbd> | 搜索标签 |
| 鼠标滚轮 | 上一张/下一张图片 |
| 鼠标中键 | 新标签页打开链接 |
### 标签搜索
1. 点击 🔍 搜索按钮
2. 输入标签(仅支持英文)
3. 实时显示补全建议
4. 按回车执行搜索
### 批量下载
1. 勾选想要下载的图片
2. 点击 ⬇️ 下载按钮
3. 选择:
- 直接下载:使用浏览器下载管理器
- 导出链接:保存为 TXT 文件,用其他工具下载
4. 配置选下载源(Y 站/ K 站):原图/JPG 压缩图
### 收藏功能
支持以下站点:
- yande.re
- konachan.com
- konachan.net
- danbooru.donmai.us
- gelbooru.com
- rule34.xxx
---
## ❓ 常见问题
### Q: 为什么有些站点功能不完整?
A: 项目主要针对 Yande.re 和 Konachan 优化,其他站点为基本支持。部分站点 API 限制或结构差异导致功能受限。
### Q: 瀑布流模式下的图片与原站列表不一致?
A: 瀑布流使用站点 API 获取数据,可能与页面渲染逻辑不同。这是正常现象。
### Q: 标签翻译不完整怎么办?
A: 欢迎通过 PR 补充翻译!具体步骤见"贡献翻译"部分。
### Q: 如何禁用某个功能?
A: 在设置侧边栏中可以关闭大部分功能,如缩略图放大、NSFW 显示等。
### Q: 脚本是否支持移动端?
A: 部分支持。主要针对桌面端优化,移动端体验可能不完善。
### Q: 为什么有些站点无法使用?
A: 需要登录账号并设置 API 凭证。在侧边栏中设置凭据后即可。
### Q: 下载功能很慢?
A: 浏览器下载有并发限制。建议使用"导出链接"功能,配合专业下载工具(如 IDM、wget、aria2 等等)。
### Q: 如何反馈问题或建议?
A: 请到 [GitHub Issues](https://github.com/asadahimeka/yandere-masonry/issues) 提交反馈。
---
## 🎯 技术相关
### 前端技术栈
- **Vue 2.7 + Composition API**:
- 使用 Vue 2.7 Composition API 特性
- `<script setup>` 语法,代码更简洁
- 响应式状态管理,性能优秀
- **TypeScript 严格模式**:
- 类型安全保障
- 智能提示和自动补全
- 减少运行时错误
- **Vite 构建工具**:
- 极快的开发体验
- HMR(热模块替换)
- 生产构建优化
### 核心技术实现
- **瀑布流布局算法**:
- 自适应列数计算
- 最小化空隙
- 支持多种布局策略
- **智能预加载**:
- 预加载下一屏图片
- 可配置预加载数量
- **虚拟滚动**:
- 仅渲染可视区域元素
- 支持大量图片流畅滚动
- 内存占用低
### 多站点架构
- **统一 API 抽象**:
- `@himeka/booru` 库提供大部分接口
- 自动适配不同站点的 API 差异
- 易于扩展新站点
- **动态站点检测**:
- 自动识别当前站点
- 加载对应的适配器
- 智能处理特殊情况
---
## 💻 开发指南
本项目代码 **非** AI 生成,仅 Readme 文件由 AI 优化
### 技术栈
- **框架**: Vue 2.7 (Composition API)
- **语言**: TypeScript
- **构建**: Vite 2.9
- **UI 组件**: Vuetify 2
- **状态管理**: Vue.observable
- **布局**: vue-masonry-css, @lhlyu/vue-virtual-waterfall
- **国际化**: vue-i18n
- **工具库**: @vueuse/core, date-fns
- **API**: @himeka/booru
### 环境要求
- Node.js >= 16
- pnpm >= 9
- Git
### 开发步骤
```bash
# 1. 克隆仓库
git clone https://github.com/asadahimeka/yandere-masonry.git
cd yandere-masonry
# 2. 安装依赖
pnpm install
# 3. 启动开发服务器
pnpm run dev
# 4. 在浏览器中打开
# - 访问 http://127.0.0.1:3000/_development.user.js 安装开发脚本
# - 在支持的站点加载开发版本
```
### 可用命令
```bash
pnpm run dev # 启动开发服务器
pnpm run build # 构建生产版本
pnpm run release # 发布流程(版本号管理)
pnpm run lint # 代码检查
```
### 项目结构
```
yandere-masonry/
├── src/
│ ├── api/ # 各站点 API 适配器
│ │ ├── danbooru.ts # Danbooru API
│ │ ├── moebooru.ts # Y/K 站 API
│ │ ├── gelbooru.ts # Gelbooru API
│ │ └── ...
│ ├── components/ # Vue 组件
│ │ ├── AppBar.vue # 顶部工具栏
│ │ ├── PostList.vue # 图片列表
│ │ ├── PostDetail.vue # 图片详情
│ │ └── ...
│ ├── store/ # 状态管理
│ │ ├── index.ts # 主 store
│ │ └── actions/ # 状态操作
│ ├── utils/ # 工具函数
│ │ ├── index.ts # 通用工具
│ │ └── i18n.ts # 国际化配置
│ ├── data/ # 静态数据
│ │ └── tags_cn.json # 中文翻译
│ ├── plugins/ # Vue 插件
│ │ ├── vuetify.ts # Vuetify 配置
│ │ └── webfontloader.ts # 字体加载
│ ├── App.vue # 根组件
│ ├── main.ts # 入口文件
│ └── prepare.ts # 脚本初始化
├── scripts/ # 构建脚本
│ ├── postbuild.mjs # 后处理
│ └── release.mjs # 发布流程
├── package.json
├── vite.config.ts # Vite 配置
├── tsconfig.json # TypeScript 配置
└── .eslintrc.json # ESLint 配置
```
### 代码规范
- **格式化**:2 空格缩进,无分号,单引号
- **命名**:camelCase 变量/函数,PascalCase 组件,UPPER_SNAKE_CASE 常量
- **类型**:严格 TypeScript,明确的类型注解
- **组件**:使用 Composition API + `<script setup>`
- **导入**:使用 `@/` 别名引用本地模块
### 添加新站点支持
1. 在 `src/api/` 创建新的适配器文件
2. 实现站点特定的 API 调用
3. 注册站点
4. 测试功能是否正常
5. 提交 PR
### 贡献翻译
1. Fork 仓库
2. 编辑对应翻译文件:
- Y/K 站:`src/data/tags_cn.json`
- Danbooru:[danbooru_tags_json](https://github.com/asadahimeka/danbooru_tags_json)
3. 提交 PR
---
## 📝 更新日志
查看完整的版本历史和更新内容:
[CHANGELOG.md](https://github.com/asadahimeka/yandere-masonry/blob/main/CHANGELOG.md)
---
## 🤝 贡献指南
欢迎任何形式的贡献!
### 如何贡献
1. Fork 本仓库
2. 创建特性分支:`git checkout -b feature/AmazingFeature`
3. 提交更改:`git commit -m 'Add some AmazingFeature'`
4. 推送到分支:`git push origin feature/AmazingFeature`
5. 提交 Pull Request
### 贡献类型
- 🐛 Bug 修复
- ✨ 新功能
- 📝 文档改进
- 🎨 样式优化
- ⚡ 性能优化
- 🌍 国际化翻译
- ✅ 测试用例
---
## 🙏 致谢
本项目离不开以下开源项目:
- [zhzwz/yande-re-chinese-patch](https://github.com/zhzwz/yande-re-chinese-patch) - 基础项目
- [@himeka/booru](https://github.com/asadahimeka/booru) - 统一的 Booru API 库
- [AtoraSuunva/booru](https://github.com/AtoraSuunva/booru) - @himeka/booru 项目基础
- [vue-masonry-css](https://github.com/paulcollett/vue-masonry-css) - 瀑布流布局组件
- [@lhlyu/vue-virtual-waterfall](https://github.com/lhlyu/vue-virtual-waterfall) - 虚拟瀑布流组件
- [vite-plugin-tm-userscript](https://github.com/asadahimeka/vite-plugin-tm-userscript) - 用户脚本打包插件
- [Vuetify](https://vuetifyjs.com/) - UI 组件库
- [Vite](https://vite.dev/) - 打包工具
特别感谢:
- **TSUKYU** 的慷慨支持
---
## 📄 许可证
本项目采用 [MIT License](https://github.com/asadahimeka/yandere-masonry/blob/main/LICENSE) 开源。
Copyright © 2022 Yumine Sakura
---
## 💖 赞助
如果这个项目对你有帮助,欢迎请我[喝杯咖啡](https://sponsors-yumine.netlify.app):
[](https://ko-fi.com/sakurayumine)
您的支持是我持续更新的动力!
---
## 📊 统计



<p><img src="https://count.nanoka.top/@himekayanderemasonrygh" alt="yandere-masonry"></p>
================================================
FILE: dist/yandere-masonry.user.js
================================================
// ==UserScript==
// @name Yande.re 瀑布流浏览
// @name:en Yande.re Masonry
// @name:zh Yande.re 瀑布流浏览
// @version 0.37.5
// @description Yande.re/Konachan 中文标签 & 缩略图放大 & 双击翻页 & 瀑布流浏览模式(支持 danbooru/gelbooru/rule34/sakugabooru/lolibooru/safebooru/3dbooru/xbooru/atfbooru/aibooru 等)
// @description:en Yande.re/Konachan Masonry(Waterfall) Layout. Also support danbooru/gelbooru/rule34/sakugabooru/lolibooru/safebooru/3dbooru/xbooru/atfbooru/aibooru et cetera.
// @description:zh Yande.re/Konachan 中文标签 & 缩略图放大 & 双击翻页 & 瀑布流浏览模式(支持 danbooru/gelbooru/rule34/sakugabooru/lolibooru/safebooru/3dbooru/xbooru/atfbooru/aibooru 等)
// @author asadahimeka
// @namespace me.asadahimeka.yanderemasonry
// @license MIT
// @match https://yande.re/*
// @match https://konachan.com/*
// @match https://konachan.net/*
// @match https://danbooru.donmai.us/*
// @match https://gelbooru.com/*
// @match https://rule34.xxx/*
// @match https://lolibooru.moe/*
// @match https://www.sakugabooru.com/*
// @match https://safebooru.org/*
// @match https://tbib.org/*
// @match https://xbooru.com/*
// @match http://behoimi.org/*
// @match https://rule34.paheal.net/*
// @match https://realbooru.com/*
// @match https://booru.allthefallen.moe/*
// @match https://aibooru.online/*
// @match https://e-shuushuu.net/*
// @match https://www.zerochan.net/*
// @match https://sankaku.app/*
// @match https://chan.sankakucomplex.com/*
// @match https://www.sankakucomplex.com/*
// @match https://www.idolcomplex.com/*
// @match https://anime-pictures.net/*
// @match https://allgirl.booru.org/*
// @match https://booru.eu/*
// @match https://kusowanka.com/*
// @match https://anihonetwallpaper.com/*
// @match https://nozomi.la/*
// @match https://rule34hentai.net/*
// @homepage https://www.nanoka.top
// @source https://github.com/asadahimeka/yandere-masonry
// @icon https://upload-bbs.mihoyo.com/upload/2022/05/23/260511332/f1f6267537a5aff959ee63ec2c9e4e52_4821140735490026106.jpg
// @supportURL https://github.com/asadahimeka/yandere-masonry/issues
// @run-at document-end
// @grant GM_addStyle
// @grant unsafeWindow
// @grant GM_addElement
// @grant GM_info
// @grant GM_download
// @grant GM_xmlhttpRequest
// ==/UserScript==
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
(() => {
var prepareStyle = "#enter-masonry{position:fixed;z-index:99999;right:16px;top:10px;height:30px;padding:6px 10px;font-size:13px;border:0;border-radius:6px;color:#fff;outline:0;background:linear-gradient(to right,#ff758c 0%,#ff7eb3 100%);opacity:1;transform:scale(1);transition:opacity,transform .2s;cursor:pointer}#enter-masonry:hover{opacity:.8;transform:scale(1.05)}#enter-masonry.enter-button-bottom{top:unset;bottom:15px}#locale-select{position:fixed;z-index:99;right:110px;top:12px;font-size:13px;padding:5px;background:#ee9ca7;background:linear-gradient(to left,#ffdde1,#ee9ca7);border:none;border-radius:6px}#wf-type-select{position:fixed;z-index:99;right:190px;top:12px;font-size:13px;padding:5px;background:#ee9ca7;background:linear-gradient(to left,#ffdde1,#ee9ca7);border:none;border-radius:6px}\n";
var ydStyle = 'a.thumb{padding-bottom:5px;border-bottom:2px solid;border-color:#232322}a.thumb:visited{border-color:#ffaaae}#add-to-favs{zoom:1.7;margin:4px 0}li.tag-type-artist a[href^="/post"]:not(.no-browser-link):before{content:"[\\753b\\5e08] "}li.tag-type-copyright a[href^="/post"]:not(.no-browser-link):before{content:"[\\7248\\6743] "}li.tag-type-character a[href^="/post"]:not(.no-browser-link):before{content:"[\\89d2\\8272] "}li.tag-type-circle a[href^="/post"]:not(.no-browser-link):before{content:"[\\793e\\56e2] "}#post-list{display:flex}#post-list .sidebar,#post-popular .sidebar{float:none;width:auto;max-width:240px}#post-list .content,#post-popular .content{float:none;flex:1;padding-right:10px}#post-list ul#post-list-posts,#post-popular ul#post-list-posts{display:block;width:100%;margin:0 auto}#post-popular ul#post-list-posts{width:96vw}#post-list ul#post-list-posts li,#post-popular ul#post-list-posts li{float:none;display:inline-block;margin:0;transition:.2s ease-in-out}#post-list ul#post-list-posts li[data-macy-complete="1"] img.preview,#post-popular ul#post-list-posts li[data-macy-complete="1"] img.preview{max-width:100%}#post-list ul#post-list-posts .inner,#post-popular ul#post-list-posts .inner{width:100%!important;height:auto!important}#post-list img.preview,#post-popular img.preview{width:100%;height:auto;margin-top:0;border-radius:5px;box-sizing:border-box}#post-list a.directlink,#post-popular a.directlink{margin-top:5px}.mm-masonry{--gap: 24;--col-width: 240}.mm-masonry{--_col-width: var(--col-width, 280);--_col-width-px: calc(var(--_col-width) * 1px);--_gap: calc(var(--gap, 20) * 1px);display:var(--display, grid)!important;grid-template-columns:repeat(auto-fill,minmax(var(--_col-width-px),1fr));grid-auto-rows:1px;column-gap:var(--_gap)}.mm-masonry__item{--img-proportional-height: calc(var(--h) * var(--_col-width) / (var(--w)));grid-row-end:span var(--img-proportional-height, 240);overflow:hidden}.mm-masonry__item:not(:last-child){margin-bottom:var(--_gap)}#post-list ul#post-list-posts .mm-masonry__item .inner,#post-popular ul#post-list-posts .mm-masonry__item .inner{height:100%!important}.mm-masonry__img{width:100%!important;height:100%!important;object-fit:cover}.justified-container{display:flex!important;flex-wrap:wrap}.justified-container:after{content:"";flex-grow:999999999}.justified-item{position:relative}.justified-item img.preview{position:absolute;top:0;left:0;width:100%;vertical-align:bottom;object-fit:cover}\n';
var knStyle = "#lsidebar{display:none}#post-popular ul#post-list-posts{display:flex;justify-content:center;flex-wrap:wrap}#post-list ul#post-list-posts li,#post-popular ul#post-list-posts li{width:auto!important;margin:0 10px 10px 0;vertical-align:top}\n";
var customStyle = '#loading{height:100%;width:100%;position:fixed;z-index:99999;margin-top:0;top:0}#loading p{margin:100px auto;line-height:100px;font-family:Meiryo UI,MicroHei,Microsoft YaHei UI;font-size:18px;color:#9671d7}#loading-center{width:100%;height:100%;position:relative}#loading-center-absolute{position:absolute;left:50%;top:50%;height:150px;width:150px;margin-top:-75px;margin-left:-50px}.loading-object{width:20px;height:20px;background-color:#9671d7;float:left;margin-right:20px;margin-top:65px;border-radius:50%}#loading-object_one{animation:object_one 1.5s infinite}#loading-object_two{animation:object_two 1.5s infinite;animation-delay:.25s}#loading-object_three{animation:object_three 1.5s infinite;animation-delay:.5s}@keyframes object_one{75%{transform:scale(0)}}@keyframes object_two{75%{transform:scale(0)}}@keyframes object_three{75%{transform:scale(0)}}.img_detail_loading{position:absolute;top:0;left:0;z-index:1;display:flex;justify-content:center;align-items:center;width:100%;height:100%;margin:0}.img_detail_loading:after{content:"";position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;backdrop-filter:blur(2px)}.img_detail_loading .v-progress-circular{position:absolute;z-index:10}.img_detail_loading img{object-fit:cover}.img_scale_scroll{display:block;width:100vw;height:100vh;overflow:auto;user-select:none}.img_detail_scale{display:block;margin:0 auto;user-select:none;transition:.2s}.img_detail_cont{position:relative;display:flex;justify-content:center;align-items:center;width:100%;height:100%;background-color:#212121}.theme--light .img_detail_cont{background-color:#fff}.img_scale_normal{display:flex;justify-content:center;align-items:center;height:100%}.img_detail_sample{display:block;max-width:100vw;max-height:100vh;margin:0 auto}.img_detail_btns{position:absolute;top:0;left:0;width:100%;height:100%}.img_detail_tag_list .v-slide-group__content{max-height:72vh;overflow-y:auto}::-webkit-scrollbar{width:0px}.img_detail_tag_list .v-slide-group__content::-webkit-scrollbar,.nav_drawer .v-navigation-drawer__content::-webkit-scrollbar,.img_scale_scroll::-webkit-scrollbar{width:10px!important;height:10px!important}.nav_drawer .v-list-group__items .v-list-item{padding-left:10px!important}.nav_drawer .v-list .v-list-group--active.primary--text{color:inherit!important}.img_scale_scroll::-webkit-scrollbar-track{background:#e6e6e6;border-left:1px solid #dadada}.img_detail_tag_list .v-slide-group__content::-webkit-scrollbar-thumb,.nav_drawer .v-navigation-drawer__content::-webkit-scrollbar-thumb{background:#b0b0b0;border:solid 3px #e9eef6;border-radius:7px}.theme--dark .img_detail_tag_list .v-slide-group__content::-webkit-scrollbar-thumb,.theme--dark .nav_drawer .v-navigation-drawer__content::-webkit-scrollbar-thumb{border:solid 3px #363636}.img_scale_scroll::-webkit-scrollbar-thumb{background:#b0b0b0;border:solid 3px #e6e6e6;border-radius:7px}.nav_drawer .v-navigation-drawer__content::-webkit-scrollbar-thumb:hover,.img_scale_scroll::-webkit-scrollbar-thumb:hover{background:black}.theme--dark .nav_drawer .v-navigation-drawer__content::-webkit-scrollbar-thumb:hover{background:#ddd}.v-date-picker-table>table>thead>tr>th{padding:0}.v-date-picker-table>table>thead>tr>th:nth-child(1):before{content:"\\65e5"}.v-date-picker-table>table>thead>tr>th:nth-child(2):before{content:"\\4e00"}.v-date-picker-table>table>thead>tr>th:nth-child(3):before{content:"\\4e8c"}.v-date-picker-table>table>thead>tr>th:nth-child(4):before{content:"\\4e09"}.v-date-picker-table>table>thead>tr>th:nth-child(5):before{content:"\\56db"}.v-date-picker-table>table>thead>tr>th:nth-child(6):before{content:"\\4e94"}.v-date-picker-table>table>thead>tr>th:nth-child(7):before{content:"\\516d"}.poa_left_center{position:absolute;left:10px;top:50%;transform:translateY(-50%)}.poa_right_center{position:absolute;right:10px;top:50%;transform:translateY(-50%)}.v-list-item__title.title{line-height:1.2!important}.blacklist_combobox [role=combobox]{padding:0!important}.blacklist_combobox .v-chip{margin-bottom:4px!important}.preload_num{width:32px;height:30px;margin:0;padding-left:4px;border:1px solid #bbb;color:inherit;appearance:none!important;-webkit-appearance:none!important;-moz-appearance:textfield}.dplayer-notice-list,.dplayer-bezel-icon{opacity:0!important;visibility:hidden!important}.posts-image-card{margin-bottom:8px}.wf-grid .posts-image-card .v-responsive__sizer{padding-bottom:100%!important}.justified-container{display:flex!important;flex-wrap:wrap;gap:8px}.justified-container:after{content:"";flex-grow:999999999}.justified-container .posts-image-card{--jstf-w: 340;position:relative;flex-grow:calc(var(--w) * var(--jstf-w) / var(--h));width:calc(1px * var(--w) * var(--jstf-w) / var(--h));margin-bottom:0!important;padding-bottom:0!important;background-color:#dcdcdc;content-visibility:auto;contain-intrinsic-size:auto 300px}@media screen and (max-width: 500px){.justified-container .posts-image-card{--jstf-w: 240}}.justified-container .posts-image-card:before{content:"";display:block;padding-bottom:calc(var(--h) / var(--w) * 100%)!important}.justified-container .post-image{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:4px;vertical-align:bottom;object-fit:cover}.theme--light .v-app-bar{background-color:#fff!important}.site_icon{width:20px;height:20px;object-fit:cover}.theme--light .sel_menu_btn{min-height:32px;padding:0 16px;background-color:#ba68c833!important;border-width:0;border-radius:4px;font-weight:600!important;color:#8e24aa!important;text-transform:none;box-shadow:none!important}.theme--light .nav_drawer .sel_menu_btn .v-icon{color:#8e24aa!important}.theme--light .sel_menu_btn .v-btn__content{line-height:1!important}.theme--light .nav_drawer .v-icon,.theme--light .nav_drawer .v-btn--icon,.theme--light .v-app-bar .v-icon,.theme--light .v-app-bar .v-btn--icon{color:#000000de!important}.posts-image-wh{position:absolute;bottom:0;left:0;padding:0 8px;font-size:14px;color:#fff;background:rgba(0,0,0,.4);border-top-right-radius:4px}.posts-image-actions{position:absolute;bottom:0;right:0;width:100%;padding:2px;text-align:center;background:rgba(0,0,0,.4);backdrop-filter:blur(10px);opacity:0;visibility:hidden;transition:.4s}.posts-image-card:hover .posts-image-actions{opacity:1;visibility:visible}.posts-image-checkbox{position:absolute;top:5px;left:5px;width:28px;padding:2px;height:28px;border-radius:2px;background:rgba(0,0,0,.4);backdrop-filter:blur(10px);opacity:0;visibility:hidden;transition:.4s}.posts-image-checkbox:has(input[aria-checked="true"]),.posts-image-card:hover .posts-image-checkbox{opacity:1;visibility:visible}.posts-image-checkbox .v-input--selection-controls__ripple .primary--text,.posts-image-checkbox .v-input--selection-controls__input .v-icon{color:#fff!important}.posts-image-type{position:absolute!important;top:0;right:0;padding:2px 4px;border-bottom-left-radius:4px;background:rgba(0,0,0,.4);backdrop-filter:blur(10px)}.theme--light .posts-image-type{background:rgba(255,255,255,.4)}@media screen and (min-width: 768px){.wf-no-fit-screen{max-width:62.5vw;margin:16px auto}}.virtual-waterfall>[data-index]{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;border-radius:4px}.theme--light .v-app-bar{box-shadow:none!important;background:#f6f8fc!important}.theme--light .v-app-bar,.theme--light .v-app-bar .v-toolbar__content{height:64px!important}.theme--light .v-main{padding-top:64px!important}.theme--light .v-app-bar .v-toolbar__title+input{width:50px!important;background-color:#eaf1fb!important;border-radius:24px!important}.theme--light .nav_drawer .v-icon,.theme--light .nav_drawer .v-btn--icon,.theme--light .v-app-bar .v-icon,.theme--light .v-app-bar .v-btn--icon{color:#5f6368!important}.theme--light .app-bar-tag-input .v-input .v-input__slot:before,.theme--light .app-bar-tag-input .v-input .v-input__slot:after{display:none}.theme--light .app-bar-tag-input .v-input input{padding:5px 44px 5px 10px;background-color:#eaf1fb;min-height:48px;border-radius:24px}.theme--light .app-bar-tag-input:not([style*="none"])+.v-btn{position:relative;left:-50px}.theme--light.v-list,.theme--light.v-navigation-drawer{background:#e9eef6!important}.theme--dark .img_detail_btn_color .v-chip:not(.img_detail_tag),.theme--dark .img_detail_btn_color .v-chip.tag_type_general,.theme--dark .img_detail_btn_color .v-btn{background-color:#ba68c8b3!important;border-color:#ba68c8b3!important}.theme--light .img_detail_btn_color .v-chip:not(.img_detail_tag),.theme--light .img_detail_btn_color .v-chip:not(.img_detail_tag) .v-icon,.theme--light .img_detail_btn_color .v-chip.tag_type_general,.theme--light .img_detail_btn_color .v-btn{background-color:#c2e7ff!important;border-color:#c2e7ff!important;color:#1a73e8!important;box-shadow:none!important;font-weight:500}.img_detail_btn_color .v-chip.img_detail_tag{font-weight:500}.theme--light .v-btn:not(.v-btn--icon,.v-btn--fab,.v-btn--text,.v-date-picker-table__current){padding-bottom:2px;border-radius:10px;color:#001d35;background-color:#c2e7ff}.theme--light .refresh_posts_btn{box-shadow:0 1px 2px #0000,0 1px 3px 1px #0000;background-color:#c2e7ff!important;border-color:#c2e7ff!important;color:#001d35}.theme--light .img_detail_loading .v-progress-circular{color:#1a73e8!important;caret-color:#1a73e8!important}.theme--light .blacklist_combobox .v-input__slot{padding-left:8px!important}.theme--light .v-text-field--outlined{border-radius:20px}.fancybox__caption{display:none;padding:12px 24px!important}.v-toolbar.img_detail_btn_color{backdrop-filter:none!important}.virtual-waterfall .posts-image-card{width:100%;height:100%;margin-bottom:0;background:gainsboro;border-radius:4px!important}.virtual-waterfall .post-image-v{width:100%;height:100%;object-fit:cover;border-radius:4px!important}.virtual-waterfall .posts-image-type{border-top-right-radius:4px}.virtual-waterfall .posts-image-actions{border-bottom-left-radius:4px;border-bottom-right-radius:4px}html:has(#app.theme--dark){background:#121212}@media screen and (max-width: 1200px){.nav_drawer{height:100dvh!important}.nav_drawer .v-navigation-drawer__content{padding-bottom:9vh}}.img_meta_tag_list{position:absolute;top:35px;width:200px}.img_meta_tag_list .img_detail_tag.tag_type_artist{color:#c97000!important;background-color:#ffdcb0!important;border-color:#ffdcb0!important}.img_meta_tag_list .img_detail_tag.tag_type_copyright{color:#ae3fc1!important;background-color:#f9d5ff!important;border-color:#f9d5ff!important}.img_meta_tag_list .img_detail_tag.tag_type_character{color:#0c9312!important;background-color:#c4ffc7!important;border-color:#c4ffc7!important}.true-masonry .posts-image-card{height:fit-content;max-height:unset!important;margin-bottom:0!important}.d-flex-y{display:flex;align-items:center;flex-wrap:wrap}.d-flex-col{display:flex;flex-direction:column}.export-tags-setting{display:flex;align-items:center;flex-wrap:wrap;gap:20px}.export-tags-setting .v-messages{display:none}.export-tags-setting>.v-input{margin-top:0}.export-tags-wght-inp{width:45px;height:24px;margin-left:4px;background-color:#eaf1fb;border-radius:4px;border:1px solid rgb(187,187,187);color:inherit;text-align:center}.d-flex-col .v-chip--active:before,.d-flex-col .v-chip--active:hover:before,.d-flex-col .v-chip:focus:before{display:none}.img-detail-toolbar{position:absolute;top:0;width:100%;z-index:10}.img-detail-toolbar.detail-buttons-bottom{top:unset;bottom:12px}.img-detail-tags{position:absolute;z-index:10;bottom:12px;padding:0 12px}.img-detail-tags.detail-buttons-bottom{top:12px;bottom:unset}.img-detail-toolbar.detail-buttons-bottom .img_meta_tag_list{top:0;transform:translateY(-95%)}.settings_drawer .v-list-item__subtitle{white-space:normal}\n';
const langList = [
{ value: "zh-Hans", label: "\u7B80\u4F53\u4E2D\u6587" },
{ value: "zh-Hant", label: "\u7E41\u9AD4\u4E2D\u6587" },
{ value: "ja", label: "\u65E5\u672C\u8A9E" },
{ value: "en", label: "English" }
];
const langMap = {
"zh": "zh-Hans",
"zh-CN": "zh-Hans",
"zh-TW": "zh-Hant",
"zh-HK": "zh-Hant",
"zh-MO": "zh-Hant",
"zh-SG": "zh-Hans",
"ja": "ja",
"ja-JP": "ja",
"en": "en",
"en-US": "en",
"en-GB": "en"
};
const isMobile = navigator.userAgent.includes("Mobile");
const defaultSettings = {
lang: langMap[navigator.language] || "en",
darkMode: "light",
blacklist: localStorage.getItem("__blacklist")?.split(",").filter(Boolean) || [],
selectedColumn: "0",
showNSFWContents: true,
isListenWheelEvent: true,
isFullImgPreload: false,
imgPreloadNum: 1,
masonryLayout: "masonry",
isListenKeyupEvent: true,
credentialQuery: "",
isThumbSampleUrl: false,
showPostCheckbox: false,
useFancybox: false,
isHoldsFalse: false,
isYandereFetchByHtml: false,
showListPostReso: false,
isFitScreen: true,
isDLSubpath: false,
autoWaterfall: false,
showTagChipGroup: false,
justifiedBaseWidth: isMobile ? 240 : 340,
detailButtonsBottom: isMobile,
closePopupOnImgClick: isMobile,
downloadBy: "tm"
};
const initialSettings = {
...defaultSettings,
...(() => {
try {
return JSON.parse(localStorage.getItem("YM_APP_SETTINGS") || "{}");
} catch (err) {
return {};
}
})()
};
console.log("initialSettings: ", initialSettings);
function doNotRun() {
const mimeTypes = ["jpg", "jpeg", "png", "gif", "mp4", "webm", "json", "xml"];
return mimeTypes.some((e) => location.pathname.endsWith(`.${e}`));
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function isMoebooru() {
return ["yande.re", "konachan", "lolibooru", "sakugabooru"].some((e) => location.host.includes(e));
}
async function prepareApp(callback) {
if (doNotRun())
return;
addSiteStyle();
if (isMoebooru()) {
bindDblclick();
setMoebooruLocale();
translateTags();
addMoeLocaleSelect();
addWfTypeSelect();
initLayout();
} else {
translateDanbooruTags();
}
await sleep(1e3);
setMasonryMode(async () => {
removeOldListeners();
await initMasonry();
callback?.();
});
}
const wfTypeActions = {
masonry: (list) => {
list.classList.add("mm-masonry");
for (const item of list.children) {
const img = item.querySelector("img");
const w = Number(img?.getAttribute("width"));
let h = Number(img?.getAttribute("height"));
h += w * 0.17;
item.setAttribute("style", `width:auto;margin:0 0 12px 0;vertical-align:top;--w:${w};--h:${h}`);
item.classList.add("mm-masonry__item");
img?.classList.add("mm-masonry__img");
}
},
grid: (list) => {
list.classList.add("mm-masonry");
for (const item of list.children) {
const img = item.querySelector("img");
item.setAttribute("style", "width:auto;margin:0 0 12px 0;vertical-align:top;--img-proportional-height:263;");
item.classList.add("mm-masonry__item");
img?.classList.add("mm-masonry__img");
}
},
justified: (list) => {
list.classList.add("justified-container");
for (const item of list.children) {
const img = item.querySelector("img");
const w = Number(img?.getAttribute("width"));
const h = Number(img?.getAttribute("height"));
const width = w * 300 / h;
item.setAttribute("style", `width:${width}px;flex-grow:${width};margin:0 10px 10px 0;vertical-align:top;`);
item.querySelector(".thumb")?.setAttribute("style", `padding-bottom:${h / w * 101}%`);
item.classList.add("justified-item");
}
}
};
async function initLayout() {
if (!location.href.includes("yande.re/post"))
return;
const listEl = document.querySelector("#post-list-posts");
if (!listEl)
return;
const wfType = initialSettings.masonryLayout || "masonry";
wfTypeActions[wfType]?.(listEl);
}
const isAutoWf = (() => {
const params2 = new URLSearchParams(location.search);
if (params2.get("_wf"))
return true;
return initialSettings.autoWaterfall;
})();
function addWfTypeSelect() {
if (!location.href.includes("yande.re/post"))
return;
if (isAutoWf)
return;
const type = initialSettings.masonryLayout || "masonry";
document.body.insertAdjacentHTML("beforeend", `<select id="wf-type-select">${Object.keys(wfTypeActions).map((e) => `<option ${type == e ? "selected" : ""} value="${e}">${e}</option>`).join("")}</select>`);
const sel = document.querySelector("#wf-type-select");
sel?.addEventListener("change", function() {
const { value } = this;
if (!value)
return;
initialSettings.masonryLayout = value;
localStorage.setItem("YM_APP_SETTINGS", JSON.stringify(initialSettings));
setTimeout(() => {
location.reload();
}, 200);
});
}
async function initMasonry() {
replaceDocument();
await loadDeps();
}
function addSiteStyle() {
GM_addStyle(prepareStyle);
if (location.host.includes("yande.re")) {
GM_addStyle(ydStyle);
}
if (location.host.includes("konachan")) {
GM_addStyle(ydStyle + knStyle);
}
}
const locales = ["de", "en", "es", "ja", "ru", "zh_CN", "zh_TW"];
function setMoebooruLocale() {
if (document.title === "Access denied")
return;
if (document.cookie.includes("locale="))
return;
if (isAutoWf)
return;
const url = new URL(location.href);
if (url.searchParams.get("locale"))
return;
const browserLang = navigator.language;
const locale = locales.find((e) => e == browserLang.replace("-", "_") || e == browserLang.split("-")[0]);
if (!locale)
return;
url.searchParams.set("locale", locale);
location.assign(url);
}
function addMoeLocaleSelect() {
if (isAutoWf)
return;
document.body.insertAdjacentHTML("beforeend", `<select id="locale-select"><option value="">- lang -</option>${locales.map((e) => `<option value="${e}">${e}</option>`).join("")}</select>`);
const sel = document.querySelector("#locale-select");
sel?.addEventListener("change", function() {
const { value } = this;
if (!value)
return;
const url = new URL(location.href);
url.searchParams.set("locale", value);
location.assign(url);
});
}
function bindDblclick() {
document.addEventListener("dblclick", (e) => {
const prev = document.querySelector("a.previous_page");
const next = document.querySelector("a.next_page");
const w = document.documentElement.offsetWidth || document.body.offsetWidth;
const clickX = e.clientX;
clickX > w / 2 ? next?.click() : prev?.click();
});
}
function setTagText(seletcor, textEn, display) {
const elements = document.querySelectorAll(seletcor);
for (const item of elements) {
const en2 = textEn?.(item) || item.innerHTML;
const cn = window.__tagsCN?.[en2];
if (cn)
item.innerHTML = display?.(en2, cn) || `${en2} [${cn}]`;
}
}
async function translateTags() {
const locale = document.cookie.match(/locale=(\w+)/)?.[1];
if (locale && locale !== "zh_CN")
return;
const response = await fetch("https://cdn.jsdelivr.net/gh/asadahimeka/yandere-masonry@main/src/data/all_tags_cn.min.json");
window.__tagsCN = await response.json();
const url = new URL(location.href);
if (url.pathname == "/tag")
return setTagText("td[class^=tag-type] a:last-child");
if (!url.pathname.includes("/post"))
return;
const textEn = (el) => el.innerHTML.replace(/\s+/g, "_");
setTagText('#site-title a[href^="/post?tags="]', textEn);
setTagText('#tag-sidebar a[href^="/post?tags="]:not(.no-browser-link)', textEn, (en2, cn) => `[${cn}] ${en2}`);
}
async function translateDanbooruTags() {
if (!navigator.language.includes("zh"))
return;
let tagsCache = sessionStorage.getItem("__YM_TAGS_CN_CACHE") || "";
if (!tagsCache) {
try {
const response = await fetch("https://cdn.jsdelivr.net/gh/asadahimeka/yandere-masonry@main/src/data/all_tags_cn_space.min.json");
tagsCache = await response.text();
sessionStorage.setItem("__YM_TAGS_CN_CACHE", tagsCache);
} catch (error) {
}
}
window.__tagsCN = JSON.parse(tagsCache || "{}");
const textEn = (el) => el.innerText.trim();
const textCn = (en2, cn) => `[${cn}] ${en2}`;
setTagText('.tag-list li a[href*="post"]:not([onclick])', textEn, textCn);
setTagText('#tag-sidebar li a[href*="post"]:not([onclick])', textEn, textCn);
setTagText('#tags-table td.name-column a[href*="post"]', (el) => el.innerText.trim().replace(/_/g, " "), textCn);
}
function removeOldListeners() {
try {
document.documentElement.replaceWith(document.documentElement.cloneNode(true));
document.body.replaceWith(document.body.cloneNode(true));
unsafeWindow.onerror = null;
if (isMoebooru()) {
const d = document;
const w = unsafeWindow;
d.stopObserving();
w.$("login-popup-username").stopObserving();
w.User = {
form_username_focus: () => {
},
form_username_changed: () => {
},
form_username_blur: () => {
}
};
w.ReportError = null;
}
} catch (error) {
console.log("error: ", error);
}
}
function setMasonryMode(fn) {
if (isAutoWf)
return fn();
if (location.href.includes("safebooru")) {
const oldBtn = document.querySelector("#enter-masonry");
oldBtn?.remove();
}
const btnText = navigator.language.includes("zh") ? "\u7011\u5E03\u6D41\u6A21\u5F0F" : "Browsing";
document.body.insertAdjacentHTML("beforeend", `<button id="enter-masonry" class="${initialSettings.detailButtonsBottom ? "enter-button-bottom" : ""}">${btnText}</button>`);
const btn = document.querySelector("#enter-masonry");
btn?.addEventListener("click", () => {
fn();
});
}
const specialSites = ["gelbooru.com"];
function loadScript(src) {
return new Promise((resolve) => {
let script;
if (specialSites.some((e) => location.hostname.includes(e))) {
script = GM_addElement("script", { src });
script.addEventListener("load", () => {
resolve();
}, false);
} else {
script = document.createElement("script");
script.src = src;
script.addEventListener("load", () => {
resolve();
}, false);
document.head.appendChild(script);
}
});
}
async function loadDeps() {
await loadScript("https://cdnjs.cloudflare.com/ajax/libs/vue/2.7.16/vue.min.js");
await loadScript("https://cdnjs.cloudflare.com/ajax/libs/vuetify/2.7.2/vuetify.min.js");
await loadScript("https://cdnjs.cloudflare.com/ajax/libs/vue-i18n/8.28.2/vue-i18n.min.js");
await loadScript("https://cdnjs.cloudflare.com/ajax/libs/fast-xml-parser/4.4.0/fxparser.min.js");
}
function replaceDocument() {
const el = document.querySelector('[name="csrf-token"]');
const token = el?.getAttribute("content");
token && sessionStorage.setItem("csrf-token", token);
document.head.innerHTML = `
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
<title>${location.host.toUpperCase()} Masonry</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/vuetify/2.7.2/vuetify.min.css">
<style>${customStyle}</style>
`;
document.body.innerHTML = `
<div id="app">
<div id="loading">
<div id="loading-center">
<div id="loading-center-absolute">
<div class="loading-object" id="loading-object_one"></div>
<div class="loading-object" id="loading-object_two"></div>
<div class="loading-object" id="loading-object_three"></div>
<p> \u8AAD\u307F\u8FBC\u307F\u4E2D</p>
</div>
</div>
</div>
</div>
`;
}
prepareApp(() => {(function(Vue2, Vuetify2, VueI18n2, fastXmlParser) {
"use strict";
;
function _interopDefaultLegacy(e) {
return e && typeof e === "object" && "default" in e ? e : { "default": e };
}
var Vue__default = /* @__PURE__ */ _interopDefaultLegacy(Vue2);
var Vuetify__default = /* @__PURE__ */ _interopDefaultLegacy(Vuetify2);
var VueI18n__default = /* @__PURE__ */ _interopDefaultLegacy(VueI18n2);
/*! prepare end */
/*!
* vue-masonry-css v1.0.3
* https://github.com/paulcollett/vue-masonry-css
* Released under the MIT License.
*/
const breakpointValue = function(mixed, windowWidth) {
const valueAsNum = parseInt(mixed);
if (valueAsNum > -1) {
return mixed;
} else if (typeof mixed !== "object") {
return 0;
}
let matchedBreakpoint = Infinity;
let matchedValue = mixed.default || 0;
for (const k in mixed) {
const breakpoint = parseInt(k);
const breakpointValRaw = mixed[breakpoint];
const breakpointVal = parseInt(breakpointValRaw);
if (isNaN(breakpoint) || isNaN(breakpointVal)) {
continue;
}
const isNewBreakpoint = windowWidth <= breakpoint && breakpoint < matchedBreakpoint;
if (isNewBreakpoint) {
matchedBreakpoint = breakpoint;
matchedValue = breakpointValRaw;
}
}
return matchedValue;
};
const getWindowWidth$1 = () => window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
const masonry = Vue2.defineComponent({
props: {
tag: {
type: [String],
default: "div"
},
cols: {
type: [Object, Number, String],
default: 2
},
gutter: {
type: [Object, Number, String],
default: 0
},
css: {
type: [Boolean],
default: true
},
columnTag: {
type: [String],
default: "div"
},
columnClass: {
type: [String, Array, Object],
default: () => []
},
columnAttr: {
type: [Object],
default: () => ({})
}
},
data() {
return {
windowWidth: 0,
displayColumns: 2,
displayGutter: 0
};
},
mounted() {
this.$nextTick(() => {
this.reCalculate();
});
if (window) {
window.addEventListener("resize", this.reCalculate);
}
},
updated() {
this.$nextTick(() => {
this.reCalculate();
});
},
beforeDestroy() {
if (window) {
window.removeEventListener("resize", this.reCalculate);
}
},
methods: {
reCalculate() {
const previousWindowWidth = this.windowWidth;
this.windowWidth = getWindowWidth$1() || Infinity;
if (previousWindowWidth === this.windowWidth) {
return;
}
this._reCalculateColumnCount(this.windowWidth);
this._reCalculateGutterSize(this.windowWidth);
},
_reCalculateGutterSize(windowWidth) {
this.displayGutter = breakpointValue(this.gutter, windowWidth);
},
_reCalculateColumnCount(windowWidth) {
let newColumns = breakpointValue(this.cols, windowWidth);
newColumns = Math.max(1, Number(newColumns) || 0);
this.displayColumns = newColumns;
},
_getChildItemsInColumnsArray() {
const columns = [];
let childItems = this.$slots.default || [];
if (childItems.length === 1 && childItems[0].componentOptions && childItems[0].componentOptions.tag == "transition-group") {
childItems = childItems[0].componentOptions.children || [];
}
for (let i = 0, visibleItemI = 0; i < childItems.length; i++, visibleItemI++) {
if (!childItems[i].tag) {
visibleItemI--;
continue;
}
const columnIndex = visibleItemI % this.displayColumns;
if (!columns[columnIndex]) {
columns[columnIndex] = [];
}
columns[columnIndex].push(childItems[i]);
}
return columns;
}
},
render(createElement) {
const columnsContainingChildren = this._getChildItemsInColumnsArray();
const isGutterSizeUnitless = parseInt(this.displayGutter) === this.displayGutter * 1;
const gutterSizeWithUnit = isGutterSizeUnitless ? `${this.displayGutter}px` : this.displayGutter;
const columnStyle = {
boxSizing: "border-box",
backgroundClip: "padding-box",
width: `${100 / this.displayColumns}%`,
border: "0 solid transparent",
borderLeftWidth: gutterSizeWithUnit
};
const columns = columnsContainingChildren.map((children, index) => {
return createElement(this.columnTag, {
key: `${index}-${columnsContainingChildren.length}`,
style: this.css ? columnStyle : void 0,
class: this.columnClass,
attrs: this.columnAttr
}, children);
});
const containerStyle = {
display: ["-webkit-box", "-ms-flexbox", "flex"],
marginLeft: `-${gutterSizeWithUnit}`
};
return createElement(
this.tag,
this.css ? { style: containerStyle } : void 0,
columns
);
}
});
const setBreakpoints = (mixed, windowWidth) => {
const valueAsNum = parseInt(mixed);
const minVal = -1;
const zero = 0;
if (valueAsNum > -minVal) {
return mixed;
} else if (typeof mixed !== "object") {
return zero;
}
let matchedBreakpoint = Infinity;
let initValue = mixed.default || zero;
for (const key in mixed) {
const breakpoint = parseInt(key);
const breakpointValRaw = mixed[breakpoint];
const breakpointVal = parseInt(breakpointValRaw);
if (isNaN(breakpoint) || isNaN(breakpointVal)) {
continue;
}
const isNewBreakpoint = windowWidth <= breakpoint && breakpoint < matchedBreakpoint;
if (isNewBreakpoint) {
matchedBreakpoint = breakpoint;
initValue = breakpointValRaw;
}
}
return initValue;
};
const measurements = [
"paddingLeft",
"paddingRight",
"paddingTop",
"paddingBottom",
"marginLeft",
"marginRight",
"marginTop",
"marginBottom",
"borderLeftWidth",
"borderRightWidth",
"borderTopWidth",
"borderBottomWidth"
];
const measurementsLength = measurements.length;
const getStyle = (elem) => {
const style = getComputedStyle(elem);
if (!style) {
console.error(`Style returned ${style}. Are you running this code in a hidden iframe on Firefox? See https://bit.ly/getsizebug1`);
}
return style;
};
const getStyleSize = (value) => {
const num = parseFloat(value);
const isValid2 = !value.includes("%") && !isNaN(num);
return isValid2 && num;
};
const getWindowWidth = () => window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
const TrueMasonry = Vue2.defineComponent({
props: {
tag: {
type: [String],
default: "div"
},
cols: {
type: [Object, Number, String],
default: 2
},
gap: {
type: [Object, Number, String],
default: 0
},
css: {
type: [Boolean],
default: true
}
},
data() {
return {
windowWidth: getWindowWidth(),
displayColumns: 2,
displayGutter: 0
};
},
mounted() {
this.$nextTick(() => {
this._reCalculate("force");
});
window.addEventListener("resize", this._reCalculate);
},
activated() {
this.$nextTick(() => {
this._reCalculate("force");
});
},
updated() {
this.$nextTick(() => {
this._reCalculate("force");
});
},
beforeDestroy() {
window.removeEventListener("resize", this._reCalculate);
},
methods: {
getChildItemsInColumnsArray() {
const childItems = this.$slots.default || [];
return childItems.filter((cell) => cell.tag);
},
_getSize(elemm) {
const style = getStyle(elemm);
const size = {};
size.height = elemm.offsetHeight;
const isBorderBox = size.isBorderBox = style.boxSizing == "border-box";
for (let i = 0; i < measurementsLength; i++) {
const measurement = measurements[i];
const value = style[measurement];
const num = parseFloat(value);
size[measurement] = !isNaN(num) ? num : 0;
}
const paddingHeight = size.paddingTop + size.paddingBottom;
const marginHeight = size.marginTop + size.marginBottom;
const borderHeight = size.borderTopWidth + size.borderBottomWidth;
const isBorderBoxSizeOuter = isBorderBox;
const styleHeight = getStyleSize(style.height);
const zero = 0;
if (styleHeight !== false) {
size.height = styleHeight + (isBorderBoxSizeOuter ? zero : paddingHeight + borderHeight);
}
size.innerHeight = size.height - (paddingHeight + borderHeight);
size.outerHeight = size.height + marginHeight;
return size;
},
_resizeMasonryItem(item) {
const rowGap = this.displayGutter;
const rowHeight = 0;
const size = Math.round(this._getSize(item.elm).outerHeight);
const rowSpan = Math.ceil((size + rowGap) / (rowHeight + rowGap));
item.elm.style.gridRowEnd = `span ${rowSpan}`;
},
_resizeAllMasonryItems() {
const allItems = this.getChildItemsInColumnsArray();
for (let i = 0; i < allItems.length; i++) {
this._resizeMasonryItem(allItems[i]);
}
},
_reCalculate(force) {
if (force == "force") {
this._buildGrid();
return;
}
const previousWindowWidth = this.windowWidth;
this.windowWidth = getWindowWidth() || Infinity;
if (previousWindowWidth !== this.windowWidth) {
this._buildGrid();
}
},
_buildGrid() {
this._reCalculateColumnCount(this.windowWidth);
this._reCalculateGutterSize(this.windowWidth);
this._resizeAllMasonryItems();
},
_reCalculateColumnCount(windowWidth) {
const zero = 0;
const one = 1;
let newCols = setBreakpoints(this.cols, windowWidth);
newCols = Math.max(one, Number(newCols) || zero);
this.displayColumns = newCols;
},
_reCalculateGutterSize(windowWidth) {
this.displayGutter = setBreakpoints(this.gap, windowWidth);
}
},
render(h) {
const one = 1;
const ten = 10;
const hundred = 100;
const isGutterSizeUnitless = parseInt(this.displayGutter) === this.displayGutter * one;
const gutterSizeWithUnit = isGutterSizeUnitless ? `${this.displayGutter}px` : this.displayGutter;
let columnWidth = (hundred / this.displayColumns * ten - this.displayGutter) / ten;
if (columnWidth > 48)
columnWidth -= 1;
const containerStyle = {
display: "grid",
gridTemplateColumns: `repeat(auto-fill, minmax(${columnWidth}%, 1fr))`,
gridAutoRows: 0,
gridGap: gutterSizeWithUnit
};
return h(
this.tag,
this.css ? { style: containerStyle } : void 0,
this.$slots.default
);
}
});
Vue__default["default"].util.warn;
function tryOnScopeDispose(fn) {
if (Vue2.getCurrentScope()) {
Vue2.onScopeDispose(fn);
return true;
}
return false;
}
function toValue(r) {
return typeof r === "function" ? r() : Vue2.unref(r);
}
const isClient = typeof window !== "undefined" && typeof document !== "undefined";
typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope;
const notNullish = (val) => val != null;
const toString = Object.prototype.toString;
const isObject = (val) => toString.call(val) === "[object Object]";
const noop = () => {
};
function getLifeCycleTarget(target) {
return target || Vue2.getCurrentInstance();
}
function tryOnMounted(fn, sync = true, target) {
const instance = getLifeCycleTarget();
if (instance)
Vue2.onMounted(fn, target);
else if (sync)
fn();
else
Vue2.nextTick(fn);
}
function unrefElement(elRef) {
var _a;
const plain = toValue(elRef);
return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
}
const defaultWindow = isClient ? window : void 0;
isClient ? window.document : void 0;
isClient ? window.navigator : void 0;
isClient ? window.location : void 0;
function useEventListener(...args) {
let target;
let events;
let listeners;
let options;
if (typeof args[0] === "string" || Array.isArray(args[0])) {
[events, listeners, options] = args;
target = defaultWindow;
} else {
[target, events, listeners, options] = args;
}
if (!target)
return noop;
if (!Array.isArray(events))
events = [events];
if (!Array.isArray(listeners))
listeners = [listeners];
const cleanups = [];
const cleanup = () => {
cleanups.forEach((fn) => fn());
cleanups.length = 0;
};
const register = (el, event, listener, options2) => {
el.addEventListener(event, listener, options2);
return () => el.removeEventListener(event, listener, options2);
};
const stopWatch = Vue2.watch(
() => [unrefElement(target), toValue(options)],
([el, options2]) => {
cleanup();
if (!el)
return;
const optionsClone = isObject(options2) ? { ...options2 } : options2;
cleanups.push(
...events.flatMap((event) => {
return listeners.map((listener) => register(el, event, listener, optionsClone));
})
);
},
{ immediate: true, flush: "post" }
);
const stop = () => {
stopWatch();
cleanup();
};
tryOnScopeDispose(stop);
return stop;
}
function useMounted() {
const isMounted = Vue2.ref(false);
const instance = Vue2.getCurrentInstance();
if (instance) {
Vue2.onMounted(() => {
isMounted.value = true;
}, void 0);
}
return isMounted;
}
function useSupported(callback) {
const isMounted = useMounted();
return Vue2.computed(() => {
isMounted.value;
return Boolean(callback());
});
}
function useMutationObserver(target, callback, options = {}) {
const { window: window2 = defaultWindow, ...mutationOptions } = options;
let observer;
const isSupported = useSupported(() => window2 && "MutationObserver" in window2);
const cleanup = () => {
if (observer) {
observer.disconnect();
observer = void 0;
}
};
const targets = Vue2.computed(() => {
const value = toValue(target);
const items = (Array.isArray(value) ? value : [value]).map(unrefElement).filter(notNullish);
return new Set(items);
});
const stopWatch = Vue2.watch(
() => targets.value,
(targets2) => {
cleanup();
if (isSupported.value && targets2.size) {
observer = new MutationObserver(callback);
targets2.forEach((el) => observer.observe(el, mutationOptions));
}
},
{ immediate: true, flush: "post" }
);
const takeRecords = () => {
return observer == null ? void 0 : observer.takeRecords();
};
const stop = () => {
stopWatch();
cleanup();
};
tryOnScopeDispose(stop);
return {
isSupported,
stop,
takeRecords
};
}
function useMediaQuery(query2, options = {}) {
const { window: window2 = defaultWindow } = options;
const isSupported = useSupported(() => window2 && "matchMedia" in window2 && typeof window2.matchMedia === "function");
let mediaQuery;
const matches = Vue2.ref(false);
const handler = (event) => {
matches.value = event.matches;
};
const cleanup = () => {
if (!mediaQuery)
return;
if ("removeEventListener" in mediaQuery)
mediaQuery.removeEventListener("change", handler);
else
mediaQuery.removeListener(handler);
};
const stopWatch = Vue2.watchEffect(() => {
if (!isSupported.value)
return;
cleanup();
mediaQuery = window2.matchMedia(toValue(query2));
if ("addEventListener" in mediaQuery)
mediaQuery.addEventListener("change", handler);
else
mediaQuery.addListener(handler);
matches.value = mediaQuery.matches;
});
tryOnScopeDispose(() => {
stopWatch();
cleanup();
mediaQuery = void 0;
});
return matches;
}
function useResizeObserver(target, callback, options = {}) {
const { window: window2 = defaultWindow, ...observerOptions } = options;
let observer;
const isSupported = useSupported(() => window2 && "ResizeObserver" in window2);
const cleanup = () => {
if (observer) {
observer.disconnect();
observer = void 0;
}
};
const targets = Vue2.computed(() => {
const _targets = toValue(target);
return Array.isArray(_targets) ? _targets.map((el) => unrefElement(el)) : [unrefElement(_targets)];
});
const stopWatch = Vue2.watch(
targets,
(els) => {
cleanup();
if (isSupported.value && window2) {
observer = new ResizeObserver(callback);
for (const _el of els) {
if (_el)
observer.observe(_el, observerOptions);
}
}
},
{ immediate: true, flush: "post" }
);
const stop = () => {
cleanup();
stopWatch();
};
tryOnScopeDispose(stop);
return {
isSupported,
stop
};
}
function useElementBounding(target, options = {}) {
const {
reset = true,
windowResize = true,
windowScroll = true,
immediate = true,
updateTiming = "sync"
} = options;
const height = Vue2.ref(0);
const bottom = Vue2.ref(0);
const left = Vue2.ref(0);
const right = Vue2.ref(0);
const top = Vue2.ref(0);
const width = Vue2.ref(0);
const x = Vue2.ref(0);
const y = Vue2.ref(0);
function recalculate() {
const el = unrefElement(target);
if (!el) {
if (reset) {
height.value = 0;
bottom.value = 0;
left.value = 0;
right.value = 0;
top.value = 0;
width.value = 0;
x.value = 0;
y.value = 0;
}
return;
}
const rect = el.getBoundingClientRect();
height.value = rect.height;
bottom.value = rect.bottom;
left.value = rect.left;
right.value = rect.right;
top.value = rect.top;
width.value = rect.width;
x.value = rect.x;
y.value = rect.y;
}
function update() {
if (updateTiming === "sync")
recalculate();
else if (updateTiming === "next-frame")
requestAnimationFrame(() => recalculate());
}
useResizeObserver(target, update);
Vue2.watch(() => unrefElement(target), (ele) => !ele && update());
useMutationObserver(target, update, {
attributeFilter: ["style", "class"]
});
if (windowScroll)
useEventListener("scroll", update, { capture: true, passive: true });
if (windowResize)
useEventListener("resize", update, { passive: true });
tryOnMounted(() => {
if (immediate)
update();
});
return {
height,
bottom,
left,
right,
top,
width,
x,
y,
update
};
}
function useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {
const { window: window2 = defaultWindow, box = "content-box" } = options;
const isSVG = Vue2.computed(() => {
var _a, _b;
return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes("svg");
});
const width = Vue2.ref(initialSize.width);
const height = Vue2.ref(initialSize.height);
const { stop: stop1 } = useResizeObserver(
target,
([entry]) => {
const boxSize = box === "border-box" ? entry.borderBoxSize : box === "content-box" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;
if (window2 && isSVG.value) {
const $elem = unrefElement(target);
if ($elem) {
const rect = $elem.getBoundingClientRect();
width.value = rect.width;
height.value = rect.height;
}
} else {
if (boxSize) {
const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];
width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);
height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);
} else {
width.value = entry.contentRect.width;
height.value = entry.contentRect.height;
}
}
},
options
);
tryOnMounted(() => {
const ele = unrefElement(target);
if (ele) {
width.value = "offsetWidth" in ele ? ele.offsetWidth : initialSize.width;
height.value = "offsetHeight" in ele ? ele.offsetHeight : initialSize.height;
}
});
const stop2 = Vue2.watch(
() => unrefElement(target),
(ele) => {
width.value = ele ? initialSize.width : 0;
height.value = ele ? initialSize.height : 0;
}
);
function stop() {
stop1();
stop2();
}
return {
width,
height,
stop
};
}
function useWindowSize(options = {}) {
const {
window: window2 = defaultWindow,
initialWidth = Number.POSITIVE_INFINITY,
initialHeight = Number.POSITIVE_INFINITY,
listenOrientation = true,
includeScrollbar = true,
type = "inner"
} = options;
const width = Vue2.ref(initialWidth);
const height = Vue2.ref(initialHeight);
const update = () => {
if (window2) {
if (type === "outer") {
width.value = window2.outerWidth;
height.value = window2.outerHeight;
} else if (includeScrollbar) {
width.value = window2.innerWidth;
height.value = window2.innerHeight;
} else {
width.value = window2.document.documentElement.clientWidth;
height.value = window2.document.documentElement.clientHeight;
}
}
};
update();
tryOnMounted(update);
useEventListener("resize", update, { passive: true });
if (listenOrientation) {
const matches = useMediaQuery("(orientation: portrait)");
Vue2.watch(matches, () => update());
}
return { width, height };
}
var _sfc_main$c = /* @__PURE__ */ Vue2.defineComponent({
__name: "VirtualWaterfall",
props: {
virtual: { type: Boolean, default: true },
rowKey: { default: "id" },
gap: { default: 15 },
preloadScreenCount: { default: () => [0, 0] },
itemMinWidth: { default: 220 },
maxColumnCount: { default: 10 },
minColumnCount: { default: 2 },
items: { default: () => [] },
calcItemHeight: { type: Function, default: () => 250 }
},
setup(__props, { expose }) {
const props = __props;
const content = Vue2.ref();
const { width: contentWidth } = useElementSize(content);
const { top: contentTop } = useElementBounding(content);
Vue2.onMounted(() => {
if (contentWidth.value === 0 && content.value) {
contentWidth.value = Number.parseInt(window.getComputedStyle(content.value).width);
}
});
const columnCount = Vue2.computed(() => {
if (!contentWidth.value) {
return 0;
}
const cWidth = contentWidth.value;
if (cWidth >= props.itemMinWidth * 2) {
const count = Math.floor(cWidth / props.itemMinWidth);
if (props.maxColumnCount && count > props.maxColumnCount) {
return props.maxColumnCount;
}
return count;
}
return props.minColumnCount;
});
const columnsTop = Vue2.ref(new Array(columnCount.value).fill(0));
const itemWidth = Vue2.computed(() => {
if (!contentWidth.value || columnCount.value <= 0) {
return 0;
}
const gap = (columnCount.value - 1) * props.gap;
return Math.ceil((contentWidth.value - gap) / columnCount.value);
});
const itemSpaces = Vue2.shallowRef([]);
const withItemSpaces = (cb) => {
cb(Vue2.readonly(itemSpaces).value);
};
expose({
withItemSpaces
});
const getColumnIndex = () => {
return columnsTop.value.indexOf(Math.min(...columnsTop.value));
};
Vue2.watchEffect(() => {
const length = props.items.length;
if (!columnCount.value || !length) {
itemSpaces.value = [];
return;
}
const spaces = new Array(length);
let start = 0;
const cache = itemSpaces.value.length && length > itemSpaces.value.length;
if (cache) {
start = itemSpaces.value.length;
} else {
columnsTop.value = new Array(columnCount.value).fill(0);
}
for (let i = 0; i < length; i++) {
if (cache && i < start) {
spaces[i] = itemSpaces.value[i];
continue;
}
const columnIndex = getColumnIndex();
const h = props.calcItemHeight(props.items[i], itemWidth.value);
const top = columnsTop.value[columnIndex];
const left = (itemWidth.value + props.gap) * columnIndex;
const space = {
index: i,
item: props.items[i],
column: columnIndex,
top,
left,
bottom: top + h,
height: h
};
columnsTop.value[columnIndex] += h + props.gap;
spaces[i] = space;
}
itemSpaces.value = spaces;
});
const itemRenderList = Vue2.computed(() => {
const length = itemSpaces.value.length;
if (!length) {
return [];
}
if (!props.virtual) {
return itemSpaces.value;
}
const parentTop = content.value.parentElement.offsetTop;
const tp = -contentTop.value + parentTop;
const [topPreloadScreenCount, bottomPreloadScreenCount] = props.preloadScreenCount;
const innerHeight = content.value.parentElement.clientHeight;
const minLimit = tp - topPreloadScreenCount * innerHeight;
const maxLimit = tp + (bottomPreloadScreenCount + 1) * innerHeight;
const items = [];
for (let i = 0; i < length; i++) {
const v = itemSpaces.value[i];
const t = v.top;
const b = v.bottom;
if (t >= minLimit && t <= maxLimit || b >= minLimit && b <= maxLimit || t < minLimit && b > maxLimit) {
items.push(v);
}
}
return items;
});
return { __sfc: true, props, content, contentWidth, contentTop, columnCount, columnsTop, itemWidth, itemSpaces, withItemSpaces, getColumnIndex, itemRenderList };
}
});
function normalizeComponent(scriptExports, render, staticRenderFns, functionalTemplate, injectStyles, scopeId, moduleIdentifier, shadowMode) {
var options = typeof scriptExports === "function" ? scriptExports.options : scriptExports;
if (render) {
options.render = render;
options.staticRenderFns = staticRenderFns;
options._compiled = true;
}
if (functionalTemplate) {
options.functional = true;
}
if (scopeId) {
options._scopeId = "data-v-" + scopeId;
}
var hook;
if (moduleIdentifier) {
hook = function(context) {
context = context || this.$vnode && this.$vnode.ssrContext || this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext;
if (!context && typeof __VUE_SSR_CONTEXT__ !== "undefined") {
context = __VUE_SSR_CONTEXT__;
}
if (injectStyles) {
injectStyles.call(this, context);
}
if (context && context._registeredComponents) {
context._registeredComponents.add(moduleIdentifier);
}
};
options._ssrRegister = hook;
} else if (injectStyles) {
hook = shadowMode ? function() {
injectStyles.call(
this,
(options.functional ? this.parent : this).$root.$options.shadowRoot
);
} : injectStyles;
}
if (hook) {
if (options.functional) {
options._injectStyles = hook;
var originalRender = options.render;
options.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context);
};
} else {
var existing = options.beforeCreate;
options.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
return {
exports: scriptExports,
options
};
}
var _sfc_render$c = function render() {
var _vm = this, _c = _vm._self._c, _setup = _vm._self._setupProxy;
return _c("div", { ref: "content", style: {
position: "relative",
willChange: "height",
height: `${Math.max(..._setup.columnsTop)}px`
} }, _vm._l(_setup.itemRenderList, function(data) {
return _c("div", { key: data.item[_vm.rowKey] || data.index, style: {
position: "absolute",
contentVisibility: "auto",
width: `${_setup.itemWidth}px`,
height: `${data.height}px`,
transform: `translate(${data.left}px, ${data.top}px)`,
containIntrinsicSize: `${_setup.itemWidth}px ${data.height}px`
}, attrs: { "data-index": data.index } }, [_vm._t("default", null, { "item": data.item, "index": data.index })], 2);
}), 0);
};
var _sfc_staticRenderFns$c = [];
var __component__$c = /* @__PURE__ */ normalizeComponent(
_sfc_main$c,
_sfc_render$c,
_sfc_staticRenderFns$c,
false,
null,
null,
null,
null
);
var VirtualWaterfall = __component__$c.exports;
function installVuetify() {
Vue__default["default"].use(Vuetify__default["default"]);
return new Vuetify__default["default"]({
icons: {
iconfont: "mdiSvg"
},
theme: {
dark: false,
themes: {
light: {
primary: "#1a73e8",
accent: "#c2e7ff"
},
dark: {
primary: "#BA68C8",
accent: "#FF80AB"
}
}
}
});
}
function useVuetify() {
const instance = Vue2.getCurrentInstance();
if (!instance) {
throw new Error("Should be used in setup().");
}
return instance.proxy.$vuetify;
}
const UxxldE9xRwmQctrvba5Y8$3 = "\u8BBE\u7F6E";
const Ym0HIEu9Q80qXB31LuC6c$3 = "\u753B\u5E08";
const juT6gwLOg5r1h2vFpFf6P$3 = "\u7248\u6743";
const aonlPAu9kEkkwNvQg0DBk$3 = "\u89D2\u8272";
const ctWGhVvqB2k_1TX2iY0l2$3 = "\u6536\u85CF\u6210\u529F";
const HzMBcS2oNGVIoLiHWprim$3 = "\u6536\u85CF\u5939";
const DXEhXAQbkiCMU_l252jo_$3 = "\u56FE\u96C6 (Pool)";
const ZztrWbSaaaas3v0cHtSmh$3 = "\u641C\u7D22\u6807\u7B7E";
const OKs1ePekQA4Ona839U114$3 = "\u4E0B\u8F7D\u5217\u8868";
const cKn4cfAxzdgh_HD6OFibB$3 = "\u5F00\u59CB\u4E0B\u8F7D";
const aVqN9TBRCbNGsW3Y2D2Nm$3 = "\u5927\u56FE";
const u8mEnSo4mxDRUbj7FeAll$3 = "\u5207\u6362\u6DF1\u8272\u6A21\u5F0F";
const ClZdL9hGweOokP7Mn_Ptq$3 = "\u9000\u51FA\u7011\u5E03\u6D41\u6A21\u5F0F";
const ze1PaiGdX4ufmoOLv_xw6$3 = "\u6309\u5E74";
const l8CbIALt_VWUnzBl_Rmgf$3 = "Booru \u56FE\u7AD9\u7011\u5E03\u6D41\u6D4F\u89C8";
const CacM8tispuPNrSxxpt9GX$3 = "\u5FEB\u6377\u65B9\u5F0F";
const zs8YTCc8d8XFUgRnp7m_w$3 = "\u6211\u7684\u6536\u85CF\u5939";
const e2_EYvweJsVoIZlIWkPRV$3 = "\u7AD9\u70B9\u5217\u8868";
const qWcqQRsE9nN43MaZ2BmN9$3 = "Web \u7248\u672C";
const jerGO2OCuW9TdnEnGYRWd$3 = "\u70B9\u51FB\u67E5\u770B";
const tGi6xYfvStBmR8qduEmKX$3 = "\u67E5\u770B";
const RN4dt81l_fZMWODsskZob$3 = "\u52A0\u8F7D\u4E2D";
const fC8XNfCl04zK7vgeaRZMQ$3 = "\u52A0\u8F7D\u66F4\u591A";
const ad8lEoWap_nT9U69WBKen$3 = "\u9002\u5E94\u5BBD\u5EA6";
const GjMNbm97OgVvpIYlkOisE$3 = "\u9002\u5E94\u9AD8\u5EA6";
const XvOYJ5gHo37M1XztPl18z$3 = "\u5168\u5C4F";
const _bQs7o9oQSo7ao1G0cp3d$3 = "\u65CB\u8F6C";
const pEU9Y9K7DsODkocCDwq_O$3 = "\u5DF2\u6536\u85CF";
const caFFJlrS1wa_F86uKPykd$3 = "\u8BE6\u60C5";
const qSF4OLshg2EEX4CwtBE6r$3 = "\u6765\u6E90";
const wI4KHHIe3zNRziW4lDZrp$3 = "\u4E0B\u8F7D\u6837\u54C1\u56FE";
const k4YzDnBtd_S2UpAQucGxF$3 = "\u4E0B\u8F7D\u9AD8\u6E05\u56FE";
const hVmfDxXoj8vkgVQabEOSr$3 = "\u52A0\u5165\u4E0B\u8F7D\u5217\u8868";
const gM92sLo0Cqfl2rCaXlOhc$3 = "\u9690\u85CF";
const FAqj5ONm50QMfIt9Vq2p1$3 = "\u4E0B\u8F7D\u51FA\u9519";
const Z4pa8GhgE63OGGvCqAld0$3 = "\u4E0B\u9762\u6CA1\u6709\u4E86";
const Dnnio9m9RZA6bkTLytc99$3 = "\u52A0\u5165\u6536\u85CF";
const EsiorRgoeHI8h7IHMLDA4$3 = "\u65B0\u6807\u7B7E\u9875\u6253\u5F00";
const _Efl8k8uYQj9iJmj3kwbd$3 = "\u672C\u5730\u6807\u7B7E\u9ED1\u540D\u5355";
const RstKmO7YVQMpaDoucxUel$3 = "\u5F53\u524D\u7AD9\u70B9 API Credentials";
const Lm_HFVHpv4XCjilV3NLKu$3 = "\u663E\u793A NSFW \u5185\u5BB9";
const A16qoBulYQJLbHe9mqNwm$3 = "\u5305\u542B\u88F8\u9732\u3001\u6027\u63CF\u5199\u5185\u5BB9\u7B49\u8FC7\u6FC0\u5185\u5BB9";
const _nQfaNuwbvPAIFKOY6_7u$3 = "\u76D1\u542C\u6EDA\u8F6E\u4E8B\u4EF6";
const SIUUZ4wqJTOilEdcX3EOi$3 = "\u8BE6\u60C5\u5F39\u7A97\u6EDA\u8F6E\u5207\u6362\u56FE\u7247";
const fVE5taO6GDTPbILat4GCt$3 = "\u76D1\u542C\u952E\u76D8\u4E8B\u4EF6";
const w95XGurDhDfOfw7XH4JFW$3 = "\u8BE6\u60C5\u5F39\u7A97\u4F7F\u7528A/D/\u2190/\u2192\u5207\u6362\u56FE\u7247";
const kFcteLMfnoezhOwuTlLFC$3 = "\u8BE6\u60C5\u56FE\u7247\u9884\u52A0\u8F7D";
const FT1uJs8XG__n5qBvuFsH4$3 = "\u8BE6\u60C5\u5F39\u7A97\u9884\u52A0\u8F7D\u4E0B\u4E00\u5F20\u6837\u54C1\u56FE/\u539F\u56FE";
const G3b7rbyQEj3_rgzVsNJZY$3 = "\u56FE\u7247\u9884\u52A0\u8F7D\u6570\u91CF";
const rXjhc8VuGloy1wZ09noNB$3 = "\u5C0F\u4E8E7\u5217\u65F6\u5217\u8868\u4F1A\u52A0\u8F7D\u5927\u56FE";
const uxIs3XkeVzkrEX985zHk3$3 = "\u81EA\u52A8";
const dU7ou5kVM0s9DMju5e2tS$3 = "\u5217";
const vfUg8xP6WptIhSL0E9b9D$3 = "\u7B49\u5BBD\u7B49\u9AD8";
const PBjdNKuj02doUvOf2zZqP$3 = "\u56FE\u7247\u4FDD\u5B58\u5230\u5B50\u6587\u4EF6\u5939";
const z_oL9s5fS164W4_gITOGZ$3 = "\u5728\u9ED8\u8BA4\u4E0B\u8F7D\u76EE\u5F55\u521B\u5EFA\u4E00\u4E2A\u4EE5\u7AD9\u70B9\u4E3A\u540D\u7684\u6587\u4EF6\u5939\u5B58\u653E\u56FE\u7247\uFF0C\u9700\u8981\u5C06 Tampermonkey \u7684\u201C\u4E0B\u8F7D\u6A21\u5F0F\u201D\u4FEE\u6539\u4E3A\u201C\u6D4F\u89C8\u5668 API\u201D";
const ti3akdSS3iZV9NsGzIo3m$3 = "\u63D0\u793A";
const LN_Rsic4V50DrXbsv9T9L$3 = "\u786E\u5B9A\u8981\u5F00\u542F\u5B50\u6587\u4EF6\u5939\u4E0B\u8F7D\u529F\u80FD\u5417\uFF1F\u8BF7\u786E\u4FDD\u60A8\u5DF2\u5C06 Tampermonkey \u7684\u201C\u4E0B\u8F7D\u6A21\u5F0F\u201D\u4FEE\u6539\u4E3A\u201C\u6D4F\u89C8\u5668 API\u201D\u3002";
const OJ8X55GXx5k3peoSXSujf$3 = "\u6253\u5F00\u65B9\u5F0F\uFF1A\u5C06 Tampermonkey \u8BBE\u7F6E\u4E2D\u7684\u201C\u914D\u7F6E\u6A21\u5F0F\u201D\u7531\u201C\u65B0\u624B\u201D\u6539\u4E3A\u201C\u9AD8\u7EA7\u201D\uFF0C\u7136\u540E\u627E\u5230\u201C\u4E0B\u8F7D BETA\u201D\uFF0C\u5C06\u201C\u4E0B\u8F7D\u6A21\u5F0F\u201D\u4FEE\u6539\u4E3A\u201C\u6D4F\u89C8\u5668 API\u201D\u3002";
const ujBgilCWNgFNV8Q2IDMWS$3 = "\u63D0\u793A\uFF1A\u4E3A\u65B9\u4FBF\u4F7F\u7528\uFF0C\u53EF\u4EE5\u5C06\u6D4F\u89C8\u5668\u8BBE\u7F6E\u4E2D\u201C\u4E0B\u8F7D\u524D\u8BE2\u95EE\u6BCF\u4E2A\u6587\u4EF6\u7684\u4FDD\u5B58\u4F4D\u7F6E\u201D\u9009\u9879\u5173\u95ED\u3002";
const sMkrF8bqCTJZZ1kXTkT_R$3 = "\u67E5\u770B\u7236\u6295\u7A3F";
const u0K7A_hv1RZSJl6TDR61A$3 = "\u67E5\u770B\u5B50\u9879";
const EVPG1YZDtykdz3htyf11u$3 = "\u590D\u5236\u5230\u526A\u8D34\u677F";
const kCYFwKpwznYIKRmB1tCww$3 = "\u4ECE\u526A\u8D34\u677F\u8BFB\u53D6";
const fbIpwMw2yVoSxP66OJ32z$3 = "\u56FE\u7247\u94FA\u6EE1\u5C4F\u5E55";
const tEvQYzSVnggYAcM1uv9Tt$3 = "\u5173\u95ED\u6B64\u529F\u80FD\u7684\u8BDD\u5C4F\u5E55\u4E24\u4FA7\u4F1A\u7559\u767D";
const HSx0XMZFid_lVuwjzrhH0$3 = "\u56FE\u7247\u5217\u8868\u7684\u7F29\u7565\u56FE\u4F7F\u7528\u5927\u56FE\u94FE\u63A5(sample_url)";
const lkCkz1OpNtTCFRfGCEoBp$3 = "\u81EA\u52A8\u8FDB\u5165\u7011\u5E03\u6D41\u6A21\u5F0F";
const e4_fgvntwNlfxgJUc2dXK$3 = "\u8BED\u8A00";
const sxhTRqogDRozo9IaTGI7g$3 = "\u5217\u8868\u56FE\u7247\u663E\u793A\u590D\u9009\u6846";
const gPt6cpWrkvqRqZnwJo1KV$3 = "\u5728\u56FE\u7247\u5361\u7247\u5DE6\u4E0A\u89D2\u663E\u793A\u52A0\u5165\u4E0B\u8F7D\u5217\u8868\u7684\u590D\u9009\u6846";
const dvs63FvVKWm3uHVfqeq00$3 = "\u4F7F\u7528 Fancybox \u67E5\u770B\u8BE6\u60C5";
const Tbq8O5KhwcDHQ_qxNFW09$3 = "\u5B9E\u9A8C\u6027";
const IxTawC_qs_xjxj5g8_aGx$3 = "\u9690\u85CF\u6302\u8D77\u7684\u56FE\u7247";
const YAUNSVT_pTygaY306DZmU$3 = "yande.re \u4E0D\u4F7F\u7528 API \u83B7\u53D6\u56FE\u7247\u5217\u8868";
const HkRzE7fweBSefchs0z0r8$3 = "\u76F4\u63A5\u89E3\u6790 HTML \u83B7\u53D6\u56FE\u7247\u6570\u636E";
const yYtssYrCL8VwFrdvvx8v3$3 = "\u865A\u62DF\u5217\u8868(\u7B49\u5BBD\u4E0D\u7B49\u9AD8)";
const UqbfVZzRyk0iD2NcOii_E$3 = "\u5217\u8868\u56FE\u7247\u663E\u793A\u5206\u8FA8\u7387";
const _4E2zv2NpOG4y8TV5PRL0$3 = "\u5728\u56FE\u7247\u5361\u7247\u5DE6\u4E0B\u89D2\u663E\u793A\u539F\u56FE\u7684\u5206\u8FA8\u7387";
const Cu6n0Apv5xVlo4DnQbVbT$3 = "\u6807\u7B7E\u5BFC\u51FA\u8BBE\u7F6E";
const BB4C5taWpmw06X0Kz_Gtk$3 = "\u8BBE\u7F6E\u6743\u91CD";
const zg2GRF6zmMXCkT9Uz2Bni$3 = "\u5168\u9009";
const xSC1vpAOTLQ3RBipKrNpD$3 = "\u4E0D\u9009";
const cKXET1CCnAXq4H60qr8uc$3 = "\u53CD\u9009";
const QH_xm27zhgs5E1077asf1$3 = "\u5BFC\u51FA";
const Uw9QwD1SaR2VjZEqDYRdb$3 = "\u90E8\u5206\u8BBE\u7F6E\u9700\u8981\u5237\u65B0\u9875\u9762\u540E\u751F\u6548";
const ECpLfRMsS0zpJPTw0qqNs$3 = "\u8BE6\u60C5\u64CD\u4F5C\u680F\u6309\u94AE\u7F6E\u4E8E\u5E95\u90E8";
const vJobIibroyz2wkpmONSnR$3 = "\u56FE\u7247\u8BE6\u60C5\u5F39\u7A97\u7684\u64CD\u4F5C\u6309\u94AE\u680F\u4E0E\u6807\u7B7E\u680F\u4F4D\u7F6E\u4E92\u6362";
const I_MKXUxaNXp3D35GFULn4$3 = "\u6B64\u9009\u9879\u5173\u95ED\u65F6\uFF0C\u70B9\u51FB\u8BE6\u60C5\u56FE\u7247\u4F1A\u5207\u6362\u6309\u94AE\u4E0E\u6807\u7B7E\u7684\u663E\u793A\u9690\u85CF";
const dm7zGAYbP2sbGXO_ekDDl$3 = "Justified \u5E03\u5C40\u5BBD\u5EA6\u7CFB\u6570";
const UOaS5wud2xGLzx9NGJxYQ$3 = "\u9009\u62E9\u76EE\u5F55";
const jx2FWrN3O_8T7U5aSbvXj$3 = "\u9009\u62E9\u56FE\u7247\u7684\u4FDD\u5B58\u4F4D\u7F6E";
var zhHans = {
UxxldE9xRwmQctrvba5Y8: UxxldE9xRwmQctrvba5Y8$3,
"ZtQHZx-pEjmu_o3dQD1fc": "\u793E\u56E2",
Ym0HIEu9Q80qXB31LuC6c: Ym0HIEu9Q80qXB31LuC6c$3,
juT6gwLOg5r1h2vFpFf6P: juT6gwLOg5r1h2vFpFf6P$3,
aonlPAu9kEkkwNvQg0DBk: aonlPAu9kEkkwNvQg0DBk$3,
"MWVfUiW8egLWq7MgV-wzc": "\u6536\u85CF\u5931\u8D25",
ctWGhVvqB2k_1TX2iY0l2: ctWGhVvqB2k_1TX2iY0l2$3,
"nd4UjZy2ILsc-iW9iu7xR": "\u6309\u65E5\u671F",
"elkBQ9moOZ-KMcy5bt_Ts": "\u6700\u8FD1\u4EBA\u6C14",
HzMBcS2oNGVIoLiHWprim: HzMBcS2oNGVIoLiHWprim$3,
DXEhXAQbkiCMU_l252jo_: DXEhXAQbkiCMU_l252jo_$3,
"9juZMc0gPIgvMPKVORpJ1": "\u4EBA\u6C14",
"6acPWiYq2-OdySa2_xqDu": "\u968F\u673A",
ZztrWbSaaaas3v0cHtSmh: ZztrWbSaaaas3v0cHtSmh$3,
OKs1ePekQA4Ona839U114: OKs1ePekQA4Ona839U114$3,
cKn4cfAxzdgh_HD6OFibB: cKn4cfAxzdgh_HD6OFibB$3,
"J2Ckb_-LITfmww4aEksqk": "\u8F93\u51FA\u4E0B\u8F7D\u5730\u5740",
aVqN9TBRCbNGsW3Y2D2Nm: aVqN9TBRCbNGsW3Y2D2Nm$3,
"jDjashxA-oBPo19DXI504": "\u539F\u56FE",
u8mEnSo4mxDRUbj7FeAll: u8mEnSo4mxDRUbj7FeAll$3,
"OrwwNKZ7I70-ecpspE8d_": "\u5207\u6362\u5168\u5C4F",
ClZdL9hGweOokP7Mn_Ptq: ClZdL9hGweOokP7Mn_Ptq$3,
"Mt3-hyoH7f_pW2gnfxyur": "\u6309\u65E5",
"riciqzr6ILBnpPc7KtG-C": "\u6309\u5468",
"PQhFo-g7sgagimkleVoZR": "\u6309\u6708",
ze1PaiGdX4ufmoOLv_xw6: ze1PaiGdX4ufmoOLv_xw6$3,
l8CbIALt_VWUnzBl_Rmgf: l8CbIALt_VWUnzBl_Rmgf$3,
CacM8tispuPNrSxxpt9GX: CacM8tispuPNrSxxpt9GX$3,
zs8YTCc8d8XFUgRnp7m_w: zs8YTCc8d8XFUgRnp7m_w$3,
"7Cgsr4PUMbezDXNfWdvWH": "\u4EBA\u6C14\u4F5C\u54C1",
"StU1-52QJmNFKQ5soJCyG": "\u968F\u673A\u4F5C\u54C1",
e2_EYvweJsVoIZlIWkPRV: e2_EYvweJsVoIZlIWkPRV$3,
"PT74UDfKA45vTVTst_-hD": "\u5173\u4E8E",
"iJ0h220tvMmUhkfIMYI-W": "\u67E5\u770B\u66F4\u65B0\u65E5\u5FD7",
qWcqQRsE9nN43MaZ2BmN9: qWcqQRsE9nN43MaZ2BmN9$3,
jerGO2OCuW9TdnEnGYRWd: jerGO2OCuW9TdnEnGYRWd$3,
"23iEYyiQlLVhFIqGbj527": "\u95EE\u9898\u4E0E\u5EFA\u8BAE",
"4g1TUy2kwQrdOs-w4JobB": "\u70B9\u51FB\u53CD\u9988",
"7Xq5puLNcT0mAvoxElqdf": "\u6B22\u8FCE Star \u2606\u5F61",
"xJJTEE3nZ4HVXGFfiN-LC": "\u5F20",
tGi6xYfvStBmR8qduEmKX: tGi6xYfvStBmR8qduEmKX$3,
"Xtk-NnMgSQZmheJ87nbRV": "\u4E0B\u8F7D",
RN4dt81l_fZMWODsskZob: RN4dt81l_fZMWODsskZob$3,
fC8XNfCl04zK7vgeaRZMQ: fC8XNfCl04zK7vgeaRZMQ$3,
"4hOFoP4M3ZkL3RiN7XOc8": "\u6CA1\u4E86",
"M-wISnLiQgM_DURMwKZGT": "\u9002\u5E94\u9875\u9762",
ad8lEoWap_nT9U69WBKen: ad8lEoWap_nT9U69WBKen$3,
GjMNbm97OgVvpIYlkOisE: GjMNbm97OgVvpIYlkOisE$3,
"KkkM-iz8RCVQoTrTfhS5j": "\u539F\u59CB\u5927\u5C0F",
XvOYJ5gHo37M1XztPl18z: XvOYJ5gHo37M1XztPl18z$3,
_bQs7o9oQSo7ao1G0cp3d: _bQs7o9oQSo7ao1G0cp3d$3,
"lPPsX2CZbXwC-EGN79Rki": "\u7F29\u5C0F",
"t83UAY18UebTg1_-zFGP3": "\u5173\u95ED",
pEU9Y9K7DsODkocCDwq_O: pEU9Y9K7DsODkocCDwq_O$3,
"2ZPEAvLkCbV3mC0iJAw9K": "\u6536\u85CF",
caFFJlrS1wa_F86uKPykd: caFFJlrS1wa_F86uKPykd$3,
qSF4OLshg2EEX4CwtBE6r: qSF4OLshg2EEX4CwtBE6r$3,
"B_ptN5O-9PhmG5ymGGtc6": "\u67E5\u770B\u5927\u56FE",
wI4KHHIe3zNRziW4lDZrp: wI4KHHIe3zNRziW4lDZrp$3,
k4YzDnBtd_S2UpAQucGxF: k4YzDnBtd_S2UpAQucGxF$3,
"VpuyxZtIoDF9-YyOm0tK_": "\u4E0B\u8F7D\u539F\u6587\u4EF6",
hVmfDxXoj8vkgVQabEOSr: hVmfDxXoj8vkgVQabEOSr$3,
gM92sLo0Cqfl2rCaXlOhc: gM92sLo0Cqfl2rCaXlOhc$3,
"l5W-EtJ_ar-SY2lF4H5Zm": "\u663E\u793A",
FAqj5ONm50QMfIt9Vq2p1: FAqj5ONm50QMfIt9Vq2p1$3,
Z4pa8GhgE63OGGvCqAld0: Z4pa8GhgE63OGGvCqAld0$3,
Dnnio9m9RZA6bkTLytc99: Dnnio9m9RZA6bkTLytc99$3,
EsiorRgoeHI8h7IHMLDA4: EsiorRgoeHI8h7IHMLDA4$3,
_Efl8k8uYQj9iJmj3kwbd: _Efl8k8uYQj9iJmj3kwbd$3,
"jMod2JozzAnwHuD-3KuPb": "\u4E0B\u65B9\u8F93\u5165\u6807\u7B7E\uFF0C\u56DE\u8F66\u6DFB\u52A0",
RstKmO7YVQMpaDoucxUel: RstKmO7YVQMpaDoucxUel$3,
"1F-R4qChHIzZaohu5GJzl": "\u5F62\u5982: &api_key=xx&user_id=1",
Lm_HFVHpv4XCjilV3NLKu: Lm_HFVHpv4XCjilV3NLKu$3,
A16qoBulYQJLbHe9mqNwm: A16qoBulYQJLbHe9mqNwm$3,
_nQfaNuwbvPAIFKOY6_7u: _nQfaNuwbvPAIFKOY6_7u$3,
SIUUZ4wqJTOilEdcX3EOi: SIUUZ4wqJTOilEdcX3EOi$3,
fVE5taO6GDTPbILat4GCt: fVE5taO6GDTPbILat4GCt$3,
w95XGurDhDfOfw7XH4JFW: w95XGurDhDfOfw7XH4JFW$3,
kFcteLMfnoezhOwuTlLFC: kFcteLMfnoezhOwuTlLFC$3,
FT1uJs8XG__n5qBvuFsH4: FT1uJs8XG__n5qBvuFsH4$3,
G3b7rbyQEj3_rgzVsNJZY: G3b7rbyQEj3_rgzVsNJZY$3,
"iRt9V9wNQASic3D7-wTZo": "\u5B9E\u9A8C\u6027/\u4E0D\u4FDD\u8BC1\u53EF\u7528",
"kop_-39vkeg-bz2wztJ9O": "\u56FE\u7247\u5217\u8868\u5E03\u5C40",
"tt_YdgKCA_5m-aSTSMPQ_": "\u7011\u5E03\u6D41\u5217\u6570",
rXjhc8VuGloy1wZ09noNB: rXjhc8VuGloy1wZ09noNB$3,
uxIs3XkeVzkrEX985zHk3: uxIs3XkeVzkrEX985zHk3$3,
dU7ou5kVM0s9DMju5e2tS: dU7ou5kVM0s9DMju5e2tS$3,
"6jPGehET9TViankl5-SRu": "\u7B49\u5BBD\u4E0D\u7B49\u9AD8",
vfUg8xP6WptIhSL0E9b9D: vfUg8xP6WptIhSL0E9b9D$3,
"LZbI8am7nD-LiemZzroFF": "\u7B49\u9AD8\u4E0D\u7B49\u5BBD",
PBjdNKuj02doUvOf2zZqP: PBjdNKuj02doUvOf2zZqP$3,
z_oL9s5fS164W4_gITOGZ: z_oL9s5fS164W4_gITOGZ$3,
ti3akdSS3iZV9NsGzIo3m: ti3akdSS3iZV9NsGzIo3m$3,
"9dq_DxgMG88eom9Gq-4nT": "\u53D6\u6D88",
"0VAN4cJ-_mUxvtmg4KEi1": "\u786E\u5B9A",
LN_Rsic4V50DrXbsv9T9L: LN_Rsic4V50DrXbsv9T9L$3,
OJ8X55GXx5k3peoSXSujf: OJ8X55GXx5k3peoSXSujf$3,
ujBgilCWNgFNV8Q2IDMWS: ujBgilCWNgFNV8Q2IDMWS$3,
sMkrF8bqCTJZZ1kXTkT_R: sMkrF8bqCTJZZ1kXTkT_R$3,
u0K7A_hv1RZSJl6TDR61A: u0K7A_hv1RZSJl6TDR61A$3,
EVPG1YZDtykdz3htyf11u: EVPG1YZDtykdz3htyf11u$3,
kCYFwKpwznYIKRmB1tCww: kCYFwKpwznYIKRmB1tCww$3,
fbIpwMw2yVoSxP66OJ32z: fbIpwMw2yVoSxP66OJ32z$3,
tEvQYzSVnggYAcM1uv9Tt: tEvQYzSVnggYAcM1uv9Tt$3,
"99kLMSzDYJCAf1yK9QYzy": "\u5DF2\u590D\u5236",
"si-zDDRFrEwDTCkp53Q44": "\u8BF7\u5141\u8BB8\u526A\u8D34\u677F\u6743\u9650",
"eOxsWLzwqrlhBdVMwz-rH": "\u63A8\u8350\u7F51\u7AD9",
"4yzHPggVky2QKFD2TbBhl": "\u7F29\u7565\u56FE\u4F7F\u7528\u5927\u56FE",
HSx0XMZFid_lVuwjzrhH0: HSx0XMZFid_lVuwjzrhH0$3,
lkCkz1OpNtTCFRfGCEoBp: lkCkz1OpNtTCFRfGCEoBp$3,
"EZd1QQdgUDjT3yya5ZYe-": "\u6253\u5F00\u6E90\u7AD9\u65F6\u76F4\u63A5\u8FDB\u5165\u7011\u5E03\u6D41\u6D4F\u89C8\u6A21\u5F0F",
e4_fgvntwNlfxgJUc2dXK: e4_fgvntwNlfxgJUc2dXK$3,
sxhTRqogDRozo9IaTGI7g: sxhTRqogDRozo9IaTGI7g$3,
gPt6cpWrkvqRqZnwJo1KV: gPt6cpWrkvqRqZnwJo1KV$3,
dvs63FvVKWm3uHVfqeq00: dvs63FvVKWm3uHVfqeq00$3,
"w4uJjpTmSEkm6SIDgEo-0": "\u56FE\u7247\u8BE6\u60C5\u4F7F\u7528\u652F\u6301\u7F29\u653E\u65CB\u8F6C\u7B49\u64CD\u4F5C\u7684 Fancybox \u7EC4\u4EF6\u67E5\u770B",
Tbq8O5KhwcDHQ_qxNFW09: Tbq8O5KhwcDHQ_qxNFW09$3,
"-x4wjDoHtodaXEgm2SXkg": "\u8C03\u7528 API \u65F6\u4F1A\u9ED8\u8BA4\u4F20\u5165 `holds:false` \u6807\u7B7E",
IxTawC_qs_xjxj5g8_aGx: IxTawC_qs_xjxj5g8_aGx$3,
YAUNSVT_pTygaY306DZmU: YAUNSVT_pTygaY306DZmU$3,
HkRzE7fweBSefchs0z0r8: HkRzE7fweBSefchs0z0r8$3,
yYtssYrCL8VwFrdvvx8v3: yYtssYrCL8VwFrdvvx8v3$3,
UqbfVZzRyk0iD2NcOii_E: UqbfVZzRyk0iD2NcOii_E$3,
_4E2zv2NpOG4y8TV5PRL0: _4E2zv2NpOG4y8TV5PRL0$3,
"FMi4atPbKn-B1HiAZ2ZP2": "\u5BFC\u51FA\u6807\u7B7E",
Cu6n0Apv5xVlo4DnQbVbT: Cu6n0Apv5xVlo4DnQbVbT$3,
BB4C5taWpmw06X0Kz_Gtk: BB4C5taWpmw06X0Kz_Gtk$3,
zg2GRF6zmMXCkT9Uz2Bni: zg2GRF6zmMXCkT9Uz2Bni$3,
xSC1vpAOTLQ3RBipKrNpD: xSC1vpAOTLQ3RBipKrNpD$3,
cKXET1CCnAXq4H60qr8uc: cKXET1CCnAXq4H60qr8uc$3,
QH_xm27zhgs5E1077asf1: QH_xm27zhgs5E1077asf1$3,
Uw9QwD1SaR2VjZEqDYRdb: Uw9QwD1SaR2VjZEqDYRdb$3,
ECpLfRMsS0zpJPTw0qqNs: ECpLfRMsS0zpJPTw0qqNs$3,
vJobIibroyz2wkpmONSnR: vJobIibroyz2wkpmONSnR$3,
"HPukB-OKzIuRxMmO4Rx2U": "\u70B9\u51FB\u8BE6\u60C5\u56FE\u7247\u5173\u95ED\u5F39\u7A97",
I_MKXUxaNXp3D35GFULn4: I_MKXUxaNXp3D35GFULn4$3,
dm7zGAYbP2sbGXO_ekDDl: dm7zGAYbP2sbGXO_ekDDl$3,
"kMu1vOFmTJac-ylP0b13Z": "\u4E0B\u8F7D\u6210\u529F",
UOaS5wud2xGLzx9NGJxYQ: UOaS5wud2xGLzx9NGJxYQ$3,
jx2FWrN3O_8T7U5aSbvXj: jx2FWrN3O_8T7U5aSbvXj$3,
"1sUsdpwBzU4gBf7Mrcihq": "\u56FE\u7247\u4FDD\u5B58\u76EE\u5F55",
"rcpw-hgymDP2bsJPPUb_F": "\u9009\u62E9\u56FE\u7247\u7684\u4E0B\u8F7D\u65B9\u5F0F",
"Ah2uP1cGRBQ6jff-SIc-Q": "\u56FE\u7247\u4E0B\u8F7D\u65B9\u5F0F"
};
const UxxldE9xRwmQctrvba5Y8$2 = "\u8A2D\u7F6E";
const A16qoBulYQJLbHe9mqNwm$2 = "\u5305\u542B\u88F8\u9732\u3001\u6027\u611B\u63CF\u5BEB\u5167\u5BB9\u7B49\u904E\u6FC0\u5167\u5BB9";
const CacM8tispuPNrSxxpt9GX$2 = "\u5FEB\u6377\u65B9\u5F0F";
const ClZdL9hGweOokP7Mn_Ptq$2 = "\u9000\u51FA\u7011\u5E03\u6D41\u6A21\u5F0F";
const DXEhXAQbkiCMU_l252jo_$2 = "\u5716\u96C6 (Pool)";
const Dnnio9m9RZA6bkTLytc99$2 = "\u52A0\u5165\u6536\u85CF";
const EsiorRgoeHI8h7IHMLDA4$2 = "\u65B0\u6A19\u7C64\u9801\u6253\u958B";
const FAqj5ONm50QMfIt9Vq2p1$2 = "\u4E0B\u8F09\u51FA\u932F";
const FT1uJs8XG__n5qBvuFsH4$2 = "\u8A73\u60C5\u5F48\u7A97\u9810\u52A0\u8F09\u4E0B\u4E00\u5F35\u6A23\u54C1\u5716/\u539F\u5716";
const G3b7rbyQEj3_rgzVsNJZY$2 = "\u5716\u7247\u9810\u52A0\u8F09\u6578\u91CF";
const GjMNbm97OgVvpIYlkOisE$2 = "\u9069\u61C9\u9AD8\u5EA6";
const HzMBcS2oNGVIoLiHWprim$2 = "\u6536\u85CF\u593E";
const Lm_HFVHpv4XCjilV3NLKu$2 = "\u986F\u793A NSFW \u5167\u5BB9";
const OKs1ePekQA4Ona839U114$2 = "\u4E0B\u8F09\u5217\u8868";
const RN4dt81l_fZMWODsskZob$2 = "\u52A0\u8F09\u4E2D";
const RstKmO7YVQMpaDoucxUel$2 = "\u7576\u524D\u7AD9\u9EDE API Credentials";
const SIUUZ4wqJTOilEdcX3EOi$2 = "\u8A73\u60C5\u5F48\u7A97\u6EFE\u8F2A\u5207\u63DB\u5716\u7247";
const XvOYJ5gHo37M1XztPl18z$2 = "\u5168\u5C4F";
const Ym0HIEu9Q80qXB31LuC6c$2 = "\u756B\u5E2B";
const Z4pa8GhgE63OGGvCqAld0$2 = "\u4E0B\u9762\u6C92\u6709\u4E86";
const ZztrWbSaaaas3v0cHtSmh$2 = "\u641C\u7D22\u6A19\u7C64";
const _Efl8k8uYQj9iJmj3kwbd$2 = "\u672C\u5730\u6A19\u7C64\u9ED1\u540D\u55AE";
const _bQs7o9oQSo7ao1G0cp3d$2 = "\u65CB\u8F49";
const _nQfaNuwbvPAIFKOY6_7u$2 = "\u76E3\u807D\u6EFE\u8F2A\u4E8B\u4EF6";
const aVqN9TBRCbNGsW3Y2D2Nm$2 = "\u5927\u5716";
const ad8lEoWap_nT9U69WBKen$2 = "\u9069\u61C9\u5BEC\u5EA6";
const aonlPAu9kEkkwNvQg0DBk$2 = "\u89D2\u8272";
const cKn4cfAxzdgh_HD6OFibB$2 = "\u958B\u59CB\u4E0B\u8F09";
const caFFJlrS1wa_F86uKPykd$2 = "\u8A73\u60C5";
const ctWGhVvqB2k_1TX2iY0l2$2 = "\u6536\u85CF\u6210\u529F";
const dU7ou5kVM0s9DMju5e2tS$2 = "\u5217";
const e2_EYvweJsVoIZlIWkPRV$2 = "\u7AD9\u9EDE\u5217\u8868";
const fC8XNfCl04zK7vgeaRZMQ$2 = "\u52A0\u8F09\u66F4\u591A";
const fVE5taO6GDTPbILat4GCt$2 = "\u76E3\u807D\u9375\u76E4\u4E8B\u4EF6";
const gM92sLo0Cqfl2rCaXlOhc$2 = "\u96B1\u85CF";
const hVmfDxXoj8vkgVQabEOSr$2 = "\u52A0\u5165\u4E0B\u8F09\u5217\u8868";
const jerGO2OCuW9TdnEnGYRWd$2 = "\u9EDE\u64CA\u67E5\u770B";
const juT6gwLOg5r1h2vFpFf6P$2 = "\u7248\u6B0A";
const k4YzDnBtd_S2UpAQucGxF$2 = "\u4E0B\u8F09\u9AD8\u6E05\u5716";
const kFcteLMfnoezhOwuTlLFC$2 = "\u8A73\u60C5\u5716\u7247\u9810\u52A0\u8F09";
const l8CbIALt_VWUnzBl_Rmgf$2 = "Booru \u5716\u7AD9\u7011\u5E03\u6D41\u700F\u89BD";
const pEU9Y9K7DsODkocCDwq_O$2 = "\u5DF2\u6536\u85CF";
const qSF4OLshg2EEX4CwtBE6r$2 = "\u4F86\u6E90";
const qWcqQRsE9nN43MaZ2BmN9$2 = "Web \u7248\u672C";
const rXjhc8VuGloy1wZ09noNB$2 = "\u5C0F\u65BC7\u5217\u6642\u5217\u8868\u6703\u52A0\u8F09\u5927\u5716";
const tGi6xYfvStBmR8qduEmKX$2 = "\u67E5\u770B";
const u8mEnSo4mxDRUbj7FeAll$2 = "\u5207\u63DB\u6DF1\u8272\u6A21\u5F0F";
const uxIs3XkeVzkrEX985zHk3$2 = "\u81EA\u52D5";
const vfUg8xP6WptIhSL0E9b9D$2 = "\u7B49\u5BEC\u7B49\u9AD8";
const w95XGurDhDfOfw7XH4JFW$2 = "\u8A73\u60C5\u5F48\u7A97\u4F7F\u7528A/D/\u2190/\u2192\u5207\u63DB\u5716\u7247";
const wI4KHHIe3zNRziW4lDZrp$2 = "\u4E0B\u8F09\u6A23\u54C1\u5716";
const ze1PaiGdX4ufmoOLv_xw6$2 = "\u6309\u5E74";
const zs8YTCc8d8XFUgRnp7m_w$2 = "\u6211\u7684\u6536\u85CF\u593E";
const PBjdNKuj02doUvOf2zZqP$2 = "\u5716\u7247\u4FDD\u5B58\u5230\u5B50\u6587\u4EF6\u593E";
const z_oL9s5fS164W4_gITOGZ$2 = "\u5728\u9ED8\u8A8D\u4E0B\u8F09\u76EE\u9304\u5275\u5EFA\u4E00\u500B\u4EE5\u7AD9\u9EDE\u70BA\u540D\u7684\u6587\u4EF6\u593E\u5B58\u653E\u5716\u7247\uFF0C\u9700\u8981\u5C07 Tampermonkey \u7684\u201C\u4E0B\u8F09\u6A21\u5F0F\u201D\u4FEE\u6539\u70BA\u201C\u700F\u89BD\u5668 API\u201D";
const LN_Rsic4V50DrXbsv9T9L$2 = "\u78BA\u5B9A\u8981\u958B\u555F\u5B50\u6587\u4EF6\u593E\u4E0B\u8F09\u529F\u80FD\u55CE\uFF1F\n\u8ACB\u78BA\u4FDD\u60A8\u5DF2\u5C07 Tampermonkey \u7684\u201C\u4E0B\u8F09\u6A21\u5F0F\u201D\u4FEE\u6539\u70BA\u201C\u700F\u89BD\u5668 API\u201D\u3002";
const OJ8X55GXx5k3peoSXSujf$2 = "\u6253\u958B\u65B9\u5F0F\uFF1A\u5C07 Tampermonkey \u8A2D\u7F6E\u4E2D\u7684\u201C\u914D\u7F6E\u6A21\u5F0F\u201D\u7531\u201C\u65B0\u624B\u201D\u6539\u70BA\u201C\u9AD8\u7D1A\u201D\uFF0C\u7136\u5F8C\u627E\u5230\u201C\u4E0B\u8F09 BETA\u201D\uFF0C\u5C07\u201C\u4E0B\u8F09\u6A21\u5F0F\u201D\u4FEE\u6539\u70BA\u201C\u700F\u89BD\u5668 API\u201D\u3002";
const ti3akdSS3iZV9NsGzIo3m$2 = "\u63D0\u793A";
const ujBgilCWNgFNV8Q2IDMWS$2 = "\u63D0\u793A\uFF1A\u70BA\u65B9\u4FBF\u4F7F\u7528\uFF0C\u53EF\u4EE5\u5C07\u700F\u89BD\u5668\u8A2D\u7F6E\u4E2D\u201C\u4E0B\u8F09\u524D\u8A62\u554F\u6BCF\u500B\u6587\u4EF6\u7684\u4FDD\u5B58\u4F4D\u7F6E\u201D\u9078\u9805\u95DC\u9589\u3002";
const sMkrF8bqCTJZZ1kXTkT_R$2 = "\u67E5\u770B\u7236\u6295\u7A3F";
const u0K7A_hv1RZSJl6TDR61A$2 = "\u67E5\u770B\u5B50\u9805";
const EVPG1YZDtykdz3htyf11u$2 = "\u8907\u88FD\u5230\u526A\u8CBC\u7C3F";
const fbIpwMw2yVoSxP66OJ32z$2 = "\u5716\u7247\u92EA\u6EFF\u87A2\u5E55";
const kCYFwKpwznYIKRmB1tCww$2 = "\u5F9E\u526A\u8CBC\u7C3F\u8B80\u53D6";
const tEvQYzSVnggYAcM1uv9Tt$2 = "\u95DC\u9589\u6B64\u529F\u80FD\u7684\u8A71\u87A2\u5E55\u5169\u5074\u6703\u7559\u767D";
const HSx0XMZFid_lVuwjzrhH0$2 = "\u5716\u7247\u6E05\u55AE\u7684\u7E2E\u5716\u4F7F\u7528\u5927\u5716\u9023\u7D50(sample_url)";
const lkCkz1OpNtTCFRfGCEoBp$2 = "\u81EA\u52D5\u9032\u5165\u7011\u5E03\u6D41\u6A21\u5F0F";
const e4_fgvntwNlfxgJUc2dXK$2 = "\u8A9E\u8A00";
const gPt6cpWrkvqRqZnwJo1KV$2 = "\u5728\u5716\u7247\u5361\u7247\u5DE6\u4E0A\u89D2\u986F\u793A\u52A0\u5165\u4E0B\u8F09\u6E05\u55AE\u7684\u8907\u9078\u6846";
const sxhTRqogDRozo9IaTGI7g$2 = "\u6E05\u55AE\u5716\u7247\u986F\u793A\u8907\u9078\u6846";
const dvs63FvVKWm3uHVfqeq00$2 = "\u4F7F\u7528 Fancybox \u67E5\u770B\u8A73\u60C5";
const Tbq8O5KhwcDHQ_qxNFW09$2 = "\u5BE6\u9A57\u6027";
const IxTawC_qs_xjxj5g8_aGx$2 = "\u96B1\u85CF\u639B\u8D77\u7684\u5716\u7247";
const YAUNSVT_pTygaY306DZmU$2 = "yande.re \u4E0D\u4F7F\u7528 API \u53D6\u5F97\u5716\u7247\u5217\u8868";
const HkRzE7fweBSefchs0z0r8$2 = "\u76F4\u63A5\u89E3\u6790 HTML \u53D6\u5F97\u5716\u7247\u6578\u64DA";
const yYtssYrCL8VwFrdvvx8v3$2 = "\u865B\u64EC\u5217\u8868(\u7B49\u5BEC\u4E0D\u7B49\u9AD8)";
const UqbfVZzRyk0iD2NcOii_E$2 = "\u5217\u8868\u5716\u7247\u986F\u793A\u5206\u8FA8\u7387";
const _4E2zv2NpOG4y8TV5PRL0$2 = "\u5728\u5716\u7247\u5361\u5DE6\u4E0B\u89D2\u986F\u793A\u539F\u5716\u7684\u5206\u8FA8\u7387";
const Cu6n0Apv5xVlo4DnQbVbT$2 = "\u6A19\u7C64\u532F\u51FA\u8A2D\u7F6E";
const BB4C5taWpmw06X0Kz_Gtk$2 = "\u8A2D\u7F6E\u6B0A\u91CD";
const zg2GRF6zmMXCkT9Uz2Bni$2 = "\u5168\u9078";
const xSC1vpAOTLQ3RBipKrNpD$2 = "\u53D6\u6D88\u5168\u9078";
const cKXET1CCnAXq4H60qr8uc$2 = "\u53CD\u9078";
const QH_xm27zhgs5E1077asf1$2 = "\u532F\u51FA";
const Uw9QwD1SaR2VjZEqDYRdb$2 = "\u90E8\u5206\u8A2D\u7F6E\u9700\u8981\u5237\u65B0\u9801\u9762\u5F8C\u751F\u6548";
const ECpLfRMsS0zpJPTw0qqNs$2 = "\u8A73\u60C5\u64CD\u4F5C\u6B04\u6309\u9215\u7F6E\u65BC\u5E95\u90E8";
const vJobIibroyz2wkpmONSnR$2 = "\u5716\u7247\u8A73\u60C5\u5F48\u7A97\u7684\u64CD\u4F5C\u6309\u9215\u6B04\u8207\u6A19\u7C64\u6B04\u4F4D\u7F6E\u4E92\u63DB";
const I_MKXUxaNXp3D35GFULn4$2 = "\u6B64\u9078\u9805\u95DC\u9589\u6642\uFF0C\u9EDE\u64CA\u8A73\u60C5\u5716\u7247\u6703\u5207\u63DB\u6309\u9215\u8207\u6A19\u7C64\u7684\u986F\u793A\u96B1\u85CF";
const dm7zGAYbP2sbGXO_ekDDl$2 = "Justified \u4F48\u5C40\u5BEC\u5EA6\u4FC2\u6578";
const UOaS5wud2xGLzx9NGJxYQ$2 = "\u9078\u64C7\u76EE\u9304";
const jx2FWrN3O_8T7U5aSbvXj$2 = "\u9078\u64C7\u5716\u7247\u7684\u4FDD\u5B58\u4F4D\u7F6E";
var zhHant = {
UxxldE9xRwmQctrvba5Y8: UxxldE9xRwmQctrvba5Y8$2,
"1F-R4qChHIzZaohu5GJzl": "\u5F62\u5982: &api_key=xx&user_id=1",
"23iEYyiQlLVhFIqGbj527": "\u554F\u984C\u8207\u5EFA\u8B70",
"2ZPEAvLkCbV3mC0iJAw9K": "\u6536\u85CF",
"4g1TUy2kwQrdOs-w4JobB": "\u9EDE\u64CA\u53CD\u994B",
"4hOFoP4M3ZkL3RiN7XOc8": "\u6C92\u4E86",
"6acPWiYq2-OdySa2_xqDu": "\u96A8\u6A5F",
"6jPGehET9TViankl5-SRu": "\u7B49\u5BEC\u4E0D\u7B49\u9AD8",
"7Cgsr4PUMbezDXNfWdvWH": "\u4EBA\u6C23\u4F5C\u54C1",
"7Xq5puLNcT0mAvoxElqdf": "\u6B61\u8FCE Star \u2606\u5F61",
"9juZMc0gPIgvMPKVORpJ1": "\u4EBA\u6C23",
A16qoBulYQJLbHe9mqNwm: A16qoBulYQJLbHe9mqNwm$2,
"B_ptN5O-9PhmG5ymGGtc6": "\u67E5\u770B\u5927\u5716",
CacM8tispuPNrSxxpt9GX: CacM8tispuPNrSxxpt9GX$2,
ClZdL9hGweOokP7Mn_Ptq: ClZdL9hGweOokP7Mn_Ptq$2,
DXEhXAQbkiCMU_l252jo_: DXEhXAQbkiCMU_l252jo_$2,
Dnnio9m9RZA6bkTLytc99: Dnnio9m9RZA6bkTLytc99$2,
EsiorRgoeHI8h7IHMLDA4: EsiorRgoeHI8h7IHMLDA4$2,
FAqj5ONm50QMfIt9Vq2p1: FAqj5ONm50QMfIt9Vq2p1$2,
FT1uJs8XG__n5qBvuFsH4: FT1uJs8XG__n5qBvuFsH4$2,
G3b7rbyQEj3_rgzVsNJZY: G3b7rbyQEj3_rgzVsNJZY$2,
GjMNbm97OgVvpIYlkOisE: GjMNbm97OgVvpIYlkOisE$2,
HzMBcS2oNGVIoLiHWprim: HzMBcS2oNGVIoLiHWprim$2,
"J2Ckb_-LITfmww4aEksqk": "\u8F38\u51FA\u4E0B\u8F09\u5730\u5740",
"KkkM-iz8RCVQoTrTfhS5j": "\u539F\u59CB\u5927\u5C0F",
"LZbI8am7nD-LiemZzroFF": "\u7B49\u9AD8\u4E0D\u7B49\u5BEC",
Lm_HFVHpv4XCjilV3NLKu: Lm_HFVHpv4XCjilV3NLKu$2,
"M-wISnLiQgM_DURMwKZGT": "\u9069\u61C9\u9801\u9762",
"MWVfUiW8egLWq7MgV-wzc": "\u6536\u85CF\u5931\u6557",
"Mt3-hyoH7f_pW2gnfxyur": "\u6309\u65E5",
OKs1ePekQA4Ona839U114: OKs1ePekQA4Ona839U114$2,
"OrwwNKZ7I70-ecpspE8d_": "\u5207\u63DB\u5168\u5C4F",
"PQhFo-g7sgagimkleVoZR": "\u6309\u6708",
"PT74UDfKA45vTVTst_-hD": "\u95DC\u65BC",
RN4dt81l_fZMWODsskZob: RN4dt81l_fZMWODsskZob$2,
RstKmO7YVQMpaDoucxUel: RstKmO7YVQMpaDoucxUel$2,
SIUUZ4wqJTOilEdcX3EOi: SIUUZ4wqJTOilEdcX3EOi$2,
"StU1-52QJmNFKQ5soJCyG": "\u96A8\u6A5F\u4F5C\u54C1",
"VpuyxZtIoDF9-YyOm0tK_": "\u4E0B\u8F09\u539F\u6587\u4EF6",
"Xtk-NnMgSQZmheJ87nbRV": "\u4E0B\u8F09",
XvOYJ5gHo37M1XztPl18z: XvOYJ5gHo37M1XztPl18z$2,
Ym0HIEu9Q80qXB31LuC6c: Ym0HIEu9Q80qXB31LuC6c$2,
Z4pa8GhgE63OGGvCqAld0: Z4pa8GhgE63OGGvCqAld0$2,
"ZtQHZx-pEjmu_o3dQD1fc": "\u793E\u5718",
ZztrWbSaaaas3v0cHtSmh: ZztrWbSaaaas3v0cHtSmh$2,
_Efl8k8uYQj9iJmj3kwbd: _Efl8k8uYQj9iJmj3kwbd$2,
_bQs7o9oQSo7ao1G0cp3d: _bQs7o9oQSo7ao1G0cp3d$2,
_nQfaNuwbvPAIFKOY6_7u: _nQfaNuwbvPAIFKOY6_7u$2,
aVqN9TBRCbNGsW3Y2D2Nm: aVqN9TBRCbNGsW3Y2D2Nm$2,
ad8lEoWap_nT9U69WBKen: ad8lEoWap_nT9U69WBKen$2,
aonlPAu9kEkkwNvQg0DBk: aonlPAu9kEkkwNvQg0DBk$2,
cKn4cfAxzdgh_HD6OFibB: cKn4cfAxzdgh_HD6OFibB$2,
caFFJlrS1wa_F86uKPykd: caFFJlrS1wa_F86uKPykd$2,
ctWGhVvqB2k_1TX2iY0l2: ctWGhVvqB2k_1TX2iY0l2$2,
dU7ou5kVM0s9DMju5e2tS: dU7ou5kVM0s9DMju5e2tS$2,
e2_EYvweJsVoIZlIWkPRV: e2_EYvweJsVoIZlIWkPRV$2,
"elkBQ9moOZ-KMcy5bt_Ts": "\u6700\u8FD1\u4EBA\u6C23",
fC8XNfCl04zK7vgeaRZMQ: fC8XNfCl04zK7vgeaRZMQ$2,
fVE5taO6GDTPbILat4GCt: fVE5taO6GDTPbILat4GCt$2,
gM92sLo0Cqfl2rCaXlOhc: gM92sLo0Cqfl2rCaXlOhc$2,
hVmfDxXoj8vkgVQabEOSr: hVmfDxXoj8vkgVQabEOSr$2,
"iJ0h220tvMmUhkfIMYI-W": "\u67E5\u770B\u66F4\u65B0\u65E5\u8A8C",
"iRt9V9wNQASic3D7-wTZo": "\u5BE6\u9A57\u6027/\u4E0D\u4FDD\u8B49\u53EF\u7528",
"jDjashxA-oBPo19DXI504": "\u539F\u5716",
"jMod2JozzAnwHuD-3KuPb": "\u4E0B\u65B9\u8F38\u5165\u6A19\u7C64\uFF0C\u56DE\u8ECA\u6DFB\u52A0",
jerGO2OCuW9TdnEnGYRWd: jerGO2OCuW9TdnEnGYRWd$2,
juT6gwLOg5r1h2vFpFf6P: juT6gwLOg5r1h2vFpFf6P$2,
k4YzDnBtd_S2UpAQucGxF: k4YzDnBtd_S2UpAQucGxF$2,
kFcteLMfnoezhOwuTlLFC: kFcteLMfnoezhOwuTlLFC$2,
"kop_-39vkeg-bz2wztJ9O": "\u5716\u7247\u5217\u8868\u4F48\u5C40",
"l5W-EtJ_ar-SY2lF4H5Zm": "\u986F\u793A",
l8CbIALt_VWUnzBl_Rmgf: l8CbIALt_VWUnzBl_Rmgf$2,
"lPPsX2CZbXwC-EGN79Rki": "\u7E2E\u5C0F",
"nd4UjZy2ILsc-iW9iu7xR": "\u6309\u65E5\u671F",
pEU9Y9K7DsODkocCDwq_O: pEU9Y9K7DsODkocCDwq_O$2,
qSF4OLshg2EEX4CwtBE6r: qSF4OLshg2EEX4CwtBE6r$2,
qWcqQRsE9nN43MaZ2BmN9: qWcqQRsE9nN43MaZ2BmN9$2,
rXjhc8VuGloy1wZ09noNB: rXjhc8VuGloy1wZ09noNB$2,
"riciqzr6ILBnpPc7KtG-C": "\u6309\u9031",
"t83UAY18UebTg1_-zFGP3": "\u95DC\u9589",
tGi6xYfvStBmR8qduEmKX: tGi6xYfvStBmR8qduEmKX$2,
"tt_YdgKCA_5m-aSTSMPQ_": "\u7011\u5E03\u6D41\u5217\u6578",
u8mEnSo4mxDRUbj7FeAll: u8mEnSo4mxDRUbj7FeAll$2,
uxIs3XkeVzkrEX985zHk3: uxIs3XkeVzkrEX985zHk3$2,
vfUg8xP6WptIhSL0E9b9D: vfUg8xP6WptIhSL0E9b9D$2,
w95XGurDhDfOfw7XH4JFW: w95XGurDhDfOfw7XH4JFW$2,
wI4KHHIe3zNRziW4lDZrp: wI4KHHIe3zNRziW4lDZrp$2,
"xJJTEE3nZ4HVXGFfiN-LC": "\u5F35",
ze1PaiGdX4ufmoOLv_xw6: ze1PaiGdX4ufmoOLv_xw6$2,
zs8YTCc8d8XFUgRnp7m_w: zs8YTCc8d8XFUgRnp7m_w$2,
PBjdNKuj02doUvOf2zZqP: PBjdNKuj02doUvOf2zZqP$2,
z_oL9s5fS164W4_gITOGZ: z_oL9s5fS164W4_gITOGZ$2,
"0VAN4cJ-_mUxvtmg4KEi1": "\u78BA\u5B9A",
"9dq_DxgMG88eom9Gq-4nT": "\u53D6\u6D88",
LN_Rsic4V50DrXbsv9T9L: LN_Rsic4V50DrXbsv9T9L$2,
OJ8X55GXx5k3peoSXSujf: OJ8X55GXx5k3peoSXSujf$2,
ti3akdSS3iZV9NsGzIo3m: ti3akdSS3iZV9NsGzIo3m$2,
ujBgilCWNgFNV8Q2IDMWS: ujBgilCWNgFNV8Q2IDMWS$2,
sMkrF8bqCTJZZ1kXTkT_R: sMkrF8bqCTJZZ1kXTkT_R$2,
u0K7A_hv1RZSJl6TDR61A: u0K7A_hv1RZSJl6TDR61A$2,
"99kLMSzDYJCAf1yK9QYzy": "\u5DF2\u8907\u88FD",
EVPG1YZDtykdz3htyf11u: EVPG1YZDtykdz3htyf11u$2,
fbIpwMw2yVoSxP66OJ32z: fbIpwMw2yVoSxP66OJ32z$2,
kCYFwKpwznYIKRmB1tCww: kCYFwKpwznYIKRmB1tCww$2,
"si-zDDRFrEwDTCkp53Q44": "\u8ACB\u5141\u8A31\u526A\u8CBC\u7C3F\u6B0A\u9650",
tEvQYzSVnggYAcM1uv9Tt: tEvQYzSVnggYAcM1uv9Tt$2,
"eOxsWLzwqrlhBdVMwz-rH": "\u63A8\u85A6\u7DB2\u7AD9",
"4yzHPggVky2QKFD2TbBhl": "\u7E2E\u5716\u4F7F\u7528\u5927\u5716",
HSx0XMZFid_lVuwjzrhH0: HSx0XMZFid_lVuwjzrhH0$2,
"EZd1QQdgUDjT3yya5ZYe-": "\u958B\u555F\u4F86\u6E90\u7AD9\u6642\u76F4\u63A5\u9032\u5165\u7011\u5E03\u6D41\u700F\u89BD\u6A21\u5F0F",
lkCkz1OpNtTCFRfGCEoBp: lkCkz1OpNtTCFRfGCEoBp$2,
e4_fgvntwNlfxgJUc2dXK: e4_fgvntwNlfxgJUc2dXK$2,
gPt6cpWrkvqRqZnwJo1KV: gPt6cpWrkvqRqZnwJo1KV$2,
sxhTRqogDRozo9IaTGI7g: sxhTRqogDRozo9IaTGI7g$2,
dvs63FvVKWm3uHVfqeq00: dvs63FvVKWm3uHVfqeq00$2,
"w4uJjpTmSEkm6SIDgEo-0": "\u5716\u7247\u8A73\u60C5\u4F7F\u7528\u652F\u63F4\u7E2E\u653E\u65CB\u8F49\u7B49\u64CD\u4F5C\u7684 Fancybox \u7D44\u4EF6\u67E5\u770B",
Tbq8O5KhwcDHQ_qxNFW09: Tbq8O5KhwcDHQ_qxNFW09$2,
IxTawC_qs_xjxj5g8_aGx: IxTawC_qs_xjxj5g8_aGx$2,
"-x4wjDoHtodaXEgm2SXkg": "\u547C\u53EB API \u6642\u6703\u9810\u8A2D\u50B3\u5165 `holds:false` \u6A19\u7C64",
YAUNSVT_pTygaY306DZmU: YAUNSVT_pTygaY306DZmU$2,
HkRzE7fweBSefchs0z0r8: HkRzE7fweBSefchs0z0r8$2,
yYtssYrCL8VwFrdvvx8v3: yYtssYrCL8VwFrdvvx8v3$2,
UqbfVZzRyk0iD2NcOii_E: UqbfVZzRyk0iD2NcOii_E$2,
_4E2zv2NpOG4y8TV5PRL0: _4E2zv2NpOG4y8TV5PRL0$2,
"FMi4atPbKn-B1HiAZ2ZP2": "\u532F\u51FA\u6A19\u7C64",
Cu6n0Apv5xVlo4DnQbVbT: Cu6n0Apv5xVlo4DnQbVbT$2,
BB4C5taWpmw06X0Kz_Gtk: BB4C5taWpmw06X0Kz_Gtk$2,
zg2GRF6zmMXCkT9Uz2Bni: zg2GRF6zmMXCkT9Uz2Bni$2,
xSC1vpAOTLQ3RBipKrNpD: xSC1vpAOTLQ3RBipKrNpD$2,
cKXET1CCnAXq4H60qr8uc: cKXET1CCnAXq4H60qr8uc$2,
QH_xm27zhgs5E1077asf1: QH_xm27zhgs5E1077asf1$2,
Uw9QwD1SaR2VjZEqDYRdb: Uw9QwD1SaR2VjZEqDYRdb$2,
ECpLfRMsS0zpJPTw0qqNs: ECpLfRMsS0zpJPTw0qqNs$2,
vJobIibroyz2wkpmONSnR: vJobIibroyz2wkpmONSnR$2,
"HPukB-OKzIuRxMmO4Rx2U": "\u9EDE\u64CA\u8A73\u60C5\u5716\u7247\u95DC\u9589\u5F48\u7A97",
I_MKXUxaNXp3D35GFULn4: I_MKXUxaNXp3D35GFULn4$2,
dm7zGAYbP2sbGXO_ekDDl: dm7zGAYbP2sbGXO_ekDDl$2,
"kMu1vOFmTJac-ylP0b13Z": "\u4E0B\u8F09\u6210\u529F",
UOaS5wud2xGLzx9NGJxYQ: UOaS5wud2xGLzx9NGJxYQ$2,
jx2FWrN3O_8T7U5aSbvXj: jx2FWrN3O_8T7U5aSbvXj$2,
"1sUsdpwBzU4gBf7Mrcihq": "\u5716\u7247\u4FDD\u5B58\u76EE\u9304",
"rcpw-hgymDP2bsJPPUb_F": "\u9078\u64C7\u5716\u7247\u7684\u4E0B\u8F09\u65B9\u5F0F",
"Ah2uP1cGRBQ6jff-SIc-Q": "\u5716\u7247\u4E0B\u8F09\u65B9\u5F0F"
};
const UxxldE9xRwmQctrvba5Y8$1 = "Settings";
const A16qoBulYQJLbHe9mqNwm$1 = "Contains excessive content such as nudity and sexual descriptions";
const CacM8tispuPNrSxxpt9GX$1 = "Shortcuts";
const ClZdL9hGweOokP7Mn_Ptq$1 = "Exit Waterfall Mode";
const DXEhXAQbkiCMU_l252jo_$1 = "Pools";
const Dnnio9m9RZA6bkTLytc99$1 = "Add to favorites";
const EsiorRgoeHI8h7IHMLDA4$1 = "Open in new tab";
const FAqj5ONm50QMfIt9Vq2p1$1 = "Download error";
const FT1uJs8XG__n5qBvuFsH4$1 = "The details pop-up window preloads the next sample image/original image";
const G3b7rbyQEj3_rgzVsNJZY$1 = "Number of images preloaded";
const GjMNbm97OgVvpIYlkOisE$1 = "Adapt to height";
const HzMBcS2oNGVIoLiHWprim$1 = "Favorites";
const Lm_HFVHpv4XCjilV3NLKu$1 = "Show NSFW content";
const OKs1ePekQA4Ona839U114$1 = "Download list";
const RN4dt81l_fZMWODsskZob$1 = "Loading";
const RstKmO7YVQMpaDoucxUel$1 = "Current Site API Credentials";
const SIUUZ4wqJTOilEdcX3EOi$1 = "Details pop-up scroll wheel to switch images";
const XvOYJ5gHo37M1XztPl18z$1 = "Fullscreen";
const Ym0HIEu9Q80qXB31LuC6c$1 = "Illustrator";
const Z4pa8GhgE63OGGvCqAld0$1 = "No more";
const ZztrWbSaaaas3v0cHtSmh$1 = "Search tags";
const _Efl8k8uYQj9iJmj3kwbd$1 = "Local Tag Blacklist";
const _bQs7o9oQSo7ao1G0cp3d$1 = "Rotate";
const _nQfaNuwbvPAIFKOY6_7u$1 = "Listen for wheel events";
const aVqN9TBRCbNGsW3Y2D2Nm$1 = "Large image";
const ad8lEoWap_nT9U69WBKen$1 = "Adapt to width";
const aonlPAu9kEkkwNvQg0DBk$1 = "Character";
const cKn4cfAxzdgh_HD6OFibB$1 = "Start download";
const caFFJlrS1wa_F86uKPykd$1 = "Details";
const ctWGhVvqB2k_1TX2iY0l2$1 = "Add to favorites success";
const dU7ou5kVM0s9DMju5e2tS$1 = "Column(s)";
const e2_EYvweJsVoIZlIWkPRV$1 = "Site list";
const fC8XNfCl04zK7vgeaRZMQ$1 = "Load more";
const fVE5taO6GDTPbILat4GCt$1 = "Listen for keyboard events";
const gM92sLo0Cqfl2rCaXlOhc$1 = "Hide";
const hVmfDxXoj8vkgVQabEOSr$1 = "Add to download list";
const jerGO2OCuW9TdnEnGYRWd$1 = "Click to view";
const juT6gwLOg5r1h2vFpFf6P$1 = "Copyright";
const k4YzDnBtd_S2UpAQucGxF$1 = "Download jpeg image";
const kFcteLMfnoezhOwuTlLFC$1 = "Detailed image preloading";
const l8CbIALt_VWUnzBl_Rmgf$1 = "Booru sites waterfall browsing";
const pEU9Y9K7DsODkocCDwq_O$1 = "Bookmarked";
const qSF4OLshg2EEX4CwtBE6r$1 = "Source";
const qWcqQRsE9nN43MaZ2BmN9$1 = "Web version";
const rXjhc8VuGloy1wZ09noNB$1 = "When the list is less than 7 columns, the list will load a large image";
const tGi6xYfvStBmR8qduEmKX$1 = "View";
const u8mEnSo4mxDRUbj7FeAll$1 = "Toggle dark mode";
const uxIs3XkeVzkrEX985zHk3$1 = "Auto";
const vfUg8xP6WptIhSL0E9b9D$1 = "Equal width and height";
const w95XGurDhDfOfw7XH4JFW$1 = "Use A/D/\u2190/\u2192 to switch images in the detail pop-up window";
const wI4KHHIe3zNRziW4lDZrp$1 = "Download sample image";
const ze1PaiGdX4ufmoOLv_xw6$1 = "By year";
const zs8YTCc8d8XFUgRnp7m_w$1 = "My favorites";
const PBjdNKuj02doUvOf2zZqP$1 = "Save images to subfolders";
const z_oL9s5fS164W4_gITOGZ$1 = `Create a folder named after the site in the default download directory to store pictures, you need to change Tampermonkey's "Download Mode" to "Browser API"`;
const LN_Rsic4V50DrXbsv9T9L$1 = `Are you sure you want to enable subfolder downloads?
Make sure you have modified Tampermonkey's "Download Mode" to "Browser API".`;
const OJ8X55GXx5k3peoSXSujf$1 = 'How to open it: Change the "Configuration Mode" in the Tampermonkey settings from "Novice" to "Advanced", then find "Download BETA", and change the "Download Mode" to "Browser API".';
const ti3akdSS3iZV9NsGzIo3m$1 = "Tips";
const ujBgilCWNgFNV8Q2IDMWS$1 = 'Tip: For convenience, you can turn off the "Ask where to save each file before downloading" option in the browser settings.';
const sMkrF8bqCTJZZ1kXTkT_R$1 = "Parent";
const u0K7A_hv1RZSJl6TDR61A$1 = "Child";
const EVPG1YZDtykdz3htyf11u$1 = "Copy to clipboard";
const fbIpwMw2yVoSxP66OJ32z$1 = "Images fill the screen";
const kCYFwKpwznYIKRmB1tCww$1 = "Read from clipboard";
const tEvQYzSVnggYAcM1uv9Tt$1 = "When this feature is turned off, both sides of the screen will be blank.";
const HSx0XMZFid_lVuwjzrhH0$1 = "Use the large image link(sample_url) to load the list image thumbnail.";
const lkCkz1OpNtTCFRfGCEoBp$1 = "Automatically enter waterfall mode";
const e4_fgvntwNlfxgJUc2dXK$1 = "Language";
const gPt6cpWrkvqRqZnwJo1KV$1 = "Display a checkbox to add to the download list in the upper left corner of the image card";
const sxhTRqogDRozo9IaTGI7g$1 = "Show checkbox in list image card";
const dvs63FvVKWm3uHVfqeq00$1 = "Use Fancybox to view details";
const Tbq8O5KhwcDHQ_qxNFW09$1 = "Experimental";
const IxTawC_qs_xjxj5g8_aGx$1 = "Hide held posts";
const YAUNSVT_pTygaY306DZmU$1 = "yande.re does not use API to get image list";
const HkRzE7fweBSefchs0z0r8$1 = "Directly parsing HTML to obtain image data";
const yYtssYrCL8VwFrdvvx8v3$1 = "Virtual list (equal width and unequal height)";
const UqbfVZzRyk0iD2NcOii_E$1 = "Show resolution in list image card.";
const _4E2zv2NpOG4y8TV5PRL0$1 = "Display the resolution of the original image in the lower left corner of the image card";
const Cu6n0Apv5xVlo4DnQbVbT$1 = "Tags Export Settings";
const BB4C5taWpmw06X0Kz_Gtk$1 = "Setting weights";
const zg2GRF6zmMXCkT9Uz2Bni$1 = "All";
const xSC1vpAOTLQ3RBipKrNpD$1 = "None";
const cKXET1CCnAXq4H60qr8uc$1 = "Invert";
const QH_xm27zhgs5E1077asf1$1 = "Export";
const Uw9QwD1SaR2VjZEqDYRdb$1 = "Some settings need to refresh the page to take effect.";
const ECpLfRMsS0zpJPTw0qqNs$1 = "Place the action bar button at the bottom of the details popup window";
const vJobIibroyz2wkpmONSnR$1 = "Swap the positions of the action button bar and the label bar of the image details pop-up window";
const I_MKXUxaNXp3D35GFULn4$1 = "When this option is turned off, clicking the detail image will toggle the display and hiding of buttons and tags.";
const dm7zGAYbP2sbGXO_ekDDl$1 = "Justified layout width factor";
const UOaS5wud2xGLzx9NGJxYQ$1 = "Select directory";
const jx2FWrN3O_8T7U5aSbvXj$1 = "Choose where to save the image";
var en = {
UxxldE9xRwmQctrvba5Y8: UxxldE9xRwmQctrvba5Y8$1,
"1F-R4qChHIzZaohu5GJzl": "e.g: &api_key=xx&user_id=1",
"23iEYyiQlLVhFIqGbj527": "Questions and Suggestions",
"2ZPEAvLkCbV3mC0iJAw9K": "Add to favorites",
"4g1TUy2kwQrdOs-w4JobB": "Click to feedback",
"4hOFoP4M3ZkL3RiN7XOc8": "No more",
"6acPWiYq2-OdySa2_xqDu": "Random",
"6jPGehET9TViankl5-SRu": "Equal width and different height",
"7Cgsr4PUMbezDXNfWdvWH": "Popular",
"7Xq5puLNcT0mAvoxElqdf": "Welcome Star \u2606\u5F61",
"9juZMc0gPIgvMPKVORpJ1": "Popular",
A16qoBulYQJLbHe9mqNwm: A16qoBulYQJLbHe9mqNwm$1,
"B_ptN5O-9PhmG5ymGGtc6": "View larger image",
CacM8tispuPNrSxxpt9GX: CacM8tispuPNrSxxpt9GX$1,
ClZdL9hGweOokP7Mn_Ptq: ClZdL9hGweOokP7Mn_Ptq$1,
DXEhXAQbkiCMU_l252jo_: DXEhXAQbkiCMU_l252jo_$1,
Dnnio9m9RZA6bkTLytc99: Dnnio9m9RZA6bkTLytc99$1,
EsiorRgoeHI8h7IHMLDA4: EsiorRgoeHI8h7IHMLDA4$1,
FAqj5ONm50QMfIt9Vq2p1: FAqj5ONm50QMfIt9Vq2p1$1,
FT1uJs8XG__n5qBvuFsH4: FT1uJs8XG__n5qBvuFsH4$1,
G3b7rbyQEj3_rgzVsNJZY: G3b7rbyQEj3_rgzVsNJZY$1,
GjMNbm97OgVvpIYlkOisE: GjMNbm97OgVvpIYlkOisE$1,
HzMBcS2oNGVIoLiHWprim: HzMBcS2oNGVIoLiHWprim$1,
"J2Ckb_-LITfmww4aEksqk": "Output download links",
"KkkM-iz8RCVQoTrTfhS5j": "Original size",
"LZbI8am7nD-LiemZzroFF": "Equal height and unequal width",
Lm_HFVHpv4XCjilV3NLKu: Lm_HFVHpv4XCjilV3NLKu$1,
"M-wISnLiQgM_DURMwKZGT": "Fit page",
"MWVfUiW8egLWq7MgV-wzc": "Add to favorites failed",
"Mt3-hyoH7f_pW2gnfxyur": "By day",
OKs1ePekQA4Ona839U114: OKs1ePekQA4Ona839U114$1,
"OrwwNKZ7I70-ecpspE8d_": "Toggle fullscreen",
"PQhFo-g7sgagimkleVoZR": "By month",
"PT74UDfKA45vTVTst_-hD": "About",
RN4dt81l_fZMWODsskZob: RN4dt81l_fZMWODsskZob$1,
RstKmO7YVQMpaDoucxUel: RstKmO7YVQMpaDoucxUel$1,
SIUUZ4wqJTOilEdcX3EOi: SIUUZ4wqJTOilEdcX3EOi$1,
"StU1-52QJmNFKQ5soJCyG": "Random",
"VpuyxZtIoDF9-YyOm0tK_": "Download the original file",
"Xtk-NnMgSQZmheJ87nbRV": "Download",
XvOYJ5gHo37M1XztPl18z: XvOYJ5gHo37M1XztPl18z$1,
Ym0HIEu9Q80qXB31LuC6c: Ym0HIEu9Q80qXB31LuC6c$1,
Z4pa8GhgE63OGGvCqAld0: Z4pa8GhgE63OGGvCqAld0$1,
"ZtQHZx-pEjmu_o3dQD1fc": "Circle",
ZztrWbSaaaas3v0cHtSmh: ZztrWbSaaaas3v0cHtSmh$1,
_Efl8k8uYQj9iJmj3kwbd: _Efl8k8uYQj9iJmj3kwbd$1,
_bQs7o9oQSo7ao1G0cp3d: _bQs7o9oQSo7ao1G0cp3d$1,
_nQfaNuwbvPAIFKOY6_7u: _nQfaNuwbvPAIFKOY6_7u$1,
aVqN9TBRCbNGsW3Y2D2Nm: aVqN9TBRCbNGsW3Y2D2Nm$1,
ad8lEoWap_nT9U69WBKen: ad8lEoWap_nT9U69WBKen$1,
aonlPAu9kEkkwNvQg0DBk: aonlPAu9kEkkwNvQg0DBk$1,
cKn4cfAxzdgh_HD6OFibB: cKn4cfAxzdgh_HD6OFibB$1,
caFFJlrS1wa_F86uKPykd: caFFJlrS1wa_F86uKPykd$1,
ctWGhVvqB2k_1TX2iY0l2: ctWGhVvqB2k_1TX2iY0l2$1,
dU7ou5kVM0s9DMju5e2tS: dU7ou5kVM0s9DMju5e2tS$1,
e2_EYvweJsVoIZlIWkPRV: e2_EYvweJsVoIZlIWkPRV$1,
"elkBQ9moOZ-KMcy5bt_Ts": "Recent Popular",
fC8XNfCl04zK7vgeaRZMQ: fC8XNfCl04zK7vgeaRZMQ$1,
fVE5taO6GDTPbILat4GCt: fVE5taO6GDTPbILat4GCt$1,
gM92sLo0Cqfl2rCaXlOhc: gM92sLo0Cqfl2rCaXlOhc$1,
hVmfDxXoj8vkgVQabEOSr: hVmfDxXoj8vkgVQabEOSr$1,
"iJ0h220tvMmUhkfIMYI-W": "Check out the changelog",
"iRt9V9wNQASic3D7-wTZo": "Experimental/not guaranteed",
"jDjashxA-oBPo19DXI504": "Original image",
"jMod2JozzAnwHuD-3KuPb": "Input the tags below and press Enter to add",
jerGO2OCuW9TdnEnGYRWd: jerGO2OCuW9TdnEnGYRWd$1,
juT6gwLOg5r1h2vFpFf6P: juT6gwLOg5r1h2vFpFf6P$1,
k4YzDnBtd_S2UpAQucGxF: k4YzDnBtd_S2UpAQucGxF$1,
kFcteLMfnoezhOwuTlLFC: kFcteLMfnoezhOwuTlLFC$1,
"kop_-39vkeg-bz2wztJ9O": "Image List Layout",
"l5W-EtJ_ar-SY2lF4H5Zm": "Show",
l8CbIALt_VWUnzBl_Rmgf: l8CbIALt_VWUnzBl_Rmgf$1,
"lPPsX2CZbXwC-EGN79Rki": "Zoom out",
"nd4UjZy2ILsc-iW9iu7xR": "By date",
pEU9Y9K7DsODkocCDwq_O: pEU9Y9K7DsODkocCDwq_O$1,
qSF4OLshg2EEX4CwtBE6r: qSF4OLshg2EEX4CwtBE6r$1,
qWcqQRsE9nN43MaZ2BmN9: qWcqQRsE9nN43MaZ2BmN9$1,
rXjhc8VuGloy1wZ09noNB: rXjhc8VuGloy1wZ09noNB$1,
"riciqzr6ILBnpPc7KtG-C": "By week",
"t83UAY18UebTg1_-zFGP3": "Close",
tGi6xYfvStBmR8qduEmKX: tGi6xYfvStBmR8qduEmKX$1,
"tt_YdgKCA_5m-aSTSMPQ_": "Number of waterfall columns",
u8mEnSo4mxDRUbj7FeAll: u8mEnSo4mxDRUbj7FeAll$1,
uxIs3XkeVzkrEX985zHk3: uxIs3XkeVzkrEX985zHk3$1,
vfUg8xP6WptIhSL0E9b9D: vfUg8xP6WptIhSL0E9b9D$1,
w95XGurDhDfOfw7XH4JFW: w95XGurDhDfOfw7XH4JFW$1,
wI4KHHIe3zNRziW4lDZrp: wI4KHHIe3zNRziW4lDZrp$1,
"xJJTEE3nZ4HVXGFfiN-LC": "pcs",
ze1PaiGdX4ufmoOLv_xw6: ze1PaiGdX4ufmoOLv_xw6$1,
zs8YTCc8d8XFUgRnp7m_w: zs8YTCc8d8XFUgRnp7m_w$1,
PBjdNKuj02doUvOf2zZqP: PBjdNKuj02doUvOf2zZqP$1,
z_oL9s5fS164W4_gITOGZ: z_oL9s5fS164W4_gITOGZ$1,
"0VAN4cJ-_mUxvtmg4KEi1": "OK",
"9dq_DxgMG88eom9Gq-4nT": "Cancel",
LN_Rsic4V50DrXbsv9T9L: LN_Rsic4V50DrXbsv9T9L$1,
OJ8X55GXx5k3peoSXSujf: OJ8X55GXx5k3peoSXSujf$1,
ti3akdSS3iZV9NsGzIo3m: ti3akdSS3iZV9NsGzIo3m$1,
ujBgilCWNgFNV8Q2IDMWS: ujBgilCWNgFNV8Q2IDMWS$1,
sMkrF8bqCTJZZ1kXTkT_R: sMkrF8bqCTJZZ1kXTkT_R$1,
u0K7A_hv1RZSJl6TDR61A: u0K7A_hv1RZSJl6TDR61A$1,
"99kLMSzDYJCAf1yK9QYzy": "Copied",
EVPG1YZDtykdz3htyf11u: EVPG1YZDtykdz3htyf11u$1,
fbIpwMw2yVoSxP66OJ32z: fbIpwMw2yVoSxP66OJ32z$1,
kCYFwKpwznYIKRmB1tCww: kCYFwKpwznYIKRmB1tCww$1,
"si-zDDRFrEwDTCkp53Q44": "Please allow clipboard permission",
tEvQYzSVnggYAcM1uv9Tt: tEvQYzSVnggYAcM1uv9Tt$1,
"eOxsWLzwqrlhBdVMwz-rH": "Recommended Websites",
"4yzHPggVky2QKFD2TbBhl": "Use large image link for thumbnail",
HSx0XMZFid_lVuwjzrhH0: HSx0XMZFid_lVuwjzrhH0$1,
"EZd1QQdgUDjT3yya5ZYe-": "Directly enter waterfall browsing mode when opening the source site",
lkCkz1OpNtTCFRfGCEoBp: lkCkz1OpNtTCFRfGCEoBp$1,
e4_fgvntwNlfxgJUc2dXK: e4_fgvntwNlfxgJUc2dXK$1,
gPt6cpWrkvqRqZnwJo1KV: gPt6cpWrkvqRqZnwJo1KV$1,
sxhTRqogDRozo9IaTGI7g: sxhTRqogDRozo9IaTGI7g$1,
dvs63FvVKWm3uHVfqeq00: dvs63FvVKWm3uHVfqeq00$1,
"w4uJjpTmSEkm6SIDgEo-0": "Using Fancybox that supports zooming/rotation/so on to view details.",
Tbq8O5KhwcDHQ_qxNFW09: Tbq8O5KhwcDHQ_qxNFW09$1,
IxTawC_qs_xjxj5g8_aGx: IxTawC_qs_xjxj5g8_aGx$1,
"-x4wjDoHtodaXEgm2SXkg": "When calling the API, the `holds:false` tag will be passed in by default.",
YAUNSVT_pTygaY306DZmU: YAUNSVT_pTygaY306DZmU$1,
HkRzE7fweBSefchs0z0r8: HkRzE7fweBSefchs0z0r8$1,
yYtssYrCL8VwFrdvvx8v3: yYtssYrCL8VwFrdvvx8v3$1,
UqbfVZzRyk0iD2NcOii_E: UqbfVZzRyk0iD2NcOii_E$1,
_4E2zv2NpOG4y8TV5PRL0: _4E2zv2NpOG4y8TV5PRL0$1,
"FMi4atPbKn-B1HiAZ2ZP2": "Export Tags",
Cu6n0Apv5xVlo4DnQbVbT: Cu6n0Apv5xVlo4DnQbVbT$1,
BB4C5taWpmw06X0Kz_Gtk: BB4C5taWpmw06X0Kz_Gtk$1,
zg2GRF6zmMXCkT9Uz2Bni: zg2GRF6zmMXCkT9Uz2Bni$1,
xSC1vpAOTLQ3RBipKrNpD: xSC1vpAOTLQ3RBipKrNpD$1,
cKXET1CCnAXq4H60qr8uc: cKXET1CCnAXq4H60qr8uc$1,
QH_xm27zhgs5E1077asf1: QH_xm27zhgs5E1077asf1$1,
Uw9QwD1SaR2VjZEqDYRdb: Uw9QwD1SaR2VjZEqDYRdb$1,
ECpLfRMsS0zpJPTw0qqNs: ECpLfRMsS0zpJPTw0qqNs$1,
vJobIibroyz2wkpmONSnR: vJobIibroyz2wkpmONSnR$1,
"HPukB-OKzIuRxMmO4Rx2U": "Close the pop-up window when you click on the detailed image",
I_MKXUxaNXp3D35GFULn4: I_MKXUxaNXp3D35GFULn4$1,
dm7zGAYbP2sbGXO_ekDDl: dm7zGAYbP2sbGXO_ekDDl$1,
"kMu1vOFmTJac-ylP0b13Z": "Download successful",
UOaS5wud2xGLzx9NGJxYQ: UOaS5wud2xGLzx9NGJxYQ$1,
jx2FWrN3O_8T7U5aSbvXj: jx2FWrN3O_8T7U5aSbvXj$1,
"1sUsdpwBzU4gBf7Mrcihq": "Image saving directory",
"rcpw-hgymDP2bsJPPUb_F": "Choose how to download images",
"Ah2uP1cGRBQ6jff-SIc-Q": "Image download method"
};
const UxxldE9xRwmQctrvba5Y8 = "\u8A2D\u5B9A";
const A16qoBulYQJLbHe9mqNwm = "\u30CC\u30FC\u30C9\u3084\u6027\u7684\u63CF\u5199\u306A\u3069\u306E\u904E\u5EA6\u306A\u5185\u5BB9\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u3082\u306E";
const CacM8tispuPNrSxxpt9GX = "\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8";
const ClZdL9hGweOokP7Mn_Ptq = "\u30A6\u30A9\u30FC\u30BF\u30FC\u30D5\u30A9\u30FC\u30EB\u30E2\u30FC\u30C9\u3092\u7D42\u4E86\u3059\u308B";
const DXEhXAQbkiCMU_l252jo_ = "\u30D7\u30FC\u30EB";
const Dnnio9m9RZA6bkTLytc99 = "\u304A\u6C17\u306B\u5165\u308A\u306B\u8FFD\u52A0";
const EsiorRgoeHI8h7IHMLDA4 = "\u65B0\u3057\u3044\u30BF\u30D6\u3067\u958B\u304F";
const FAqj5ONm50QMfIt9Vq2p1 = "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30A8\u30E9\u30FC";
const FT1uJs8XG__n5qBvuFsH4 = "\u8A73\u7D30\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7 \u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u306F\u3001\u6B21\u306E\u30B5\u30F3\u30D7\u30EB\u753B\u50CF/\u30AA\u30EA\u30B8\u30CA\u30EB\u753B\u50CF\u304C\u30D7\u30EA\u30ED\u30FC\u30C9\u3055\u308C\u307E\u3059\u3002";
const G3b7rbyQEj3_rgzVsNJZY = "\u30D7\u30EA\u30ED\u30FC\u30C9\u3055\u308C\u305F\u753B\u50CF\u306E\u6570";
const GjMNbm97OgVvpIYlkOisE = "\u9AD8\u3055\u306B\u9069\u5FDC\u3059\u308B";
const HzMBcS2oNGVIoLiHWprim = "\u304A\u6C17\u306B\u5165\u308A";
const Lm_HFVHpv4XCjilV3NLKu = "NSFW\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u8868\u793A";
const OKs1ePekQA4Ona839U114 = "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30EA\u30B9\u30C8";
const RN4dt81l_fZMWODsskZob = "\u8AAD\u307F\u8FBC\u307F\u4E2D";
const RstKmO7YVQMpaDoucxUel = "\u73FE\u5728\u306E\u30B5\u30A4\u30C8 API \u8A8D\u8A3C\u60C5\u5831";
const SIUUZ4wqJTOilEdcX3EOi = "\u753B\u50CF\u3092\u5207\u308A\u66FF\u3048\u308B\u305F\u3081\u306E\u8A73\u7D30\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7 \u30B9\u30AF\u30ED\u30FC\u30EB \u30DB\u30A4\u30FC\u30EB";
const XvOYJ5gHo37M1XztPl18z = "\u5168\u753B\u9762\u8868\u793A";
const Ym0HIEu9Q80qXB31LuC6c = "\u30A4\u30E9\u30B9\u30C8\u30EC\u30FC\u30BF\u30FC";
const Z4pa8GhgE63OGGvCqAld0 = "\u3082\u3046\u3044\u3084";
const ZztrWbSaaaas3v0cHtSmh = "\u30BF\u30B0\u3092\u691C\u7D22";
const _Efl8k8uYQj9iJmj3kwbd = "\u30ED\u30FC\u30AB\u30EB\u30BF\u30B0\u30D6\u30E9\u30C3\u30AF\u30EA\u30B9\u30C8";
const _bQs7o9oQSo7ao1G0cp3d = "\u56DE\u8EE2";
const _nQfaNuwbvPAIFKOY6_7u = "\u30DB\u30A4\u30FC\u30EB \u30A4\u30D9\u30F3\u30C8\u3092\u30EA\u30C3\u30B9\u30F3\u3059\u308B";
const aVqN9TBRCbNGsW3Y2D2Nm = "\u5927\u304D\u306A\u753B\u50CF";
const ad8lEoWap_nT9U69WBKen = "\u5E45\u306B\u5408\u308F\u305B\u308B";
const aonlPAu9kEkkwNvQg0DBk = "\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC";
const cKn4cfAxzdgh_HD6OFibB = "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u958B\u59CB";
const caFFJlrS1wa_F86uKPykd = "\u8A73\u7D30";
const ctWGhVvqB2k_1TX2iY0l2 = "\u304A\u6C17\u306B\u5165\u308A\u306B\u8FFD\u52A0\u6210\u529F";
const dU7ou5kVM0s9DMju5e2tS = "\u6841";
const e2_EYvweJsVoIZlIWkPRV = "\u30B5\u30A4\u30C8\u30EA\u30B9\u30C8";
const fC8XNfCl04zK7vgeaRZMQ = "\u3082\u3063\u3068\u8AAD\u307F\u8FBC\u3080";
const fVE5taO6GDTPbILat4GCt = "\u30AD\u30FC\u30DC\u30FC\u30C9\u30A4\u30D9\u30F3\u30C8\u3092\u30EA\u30C3\u30B9\u30F3\u3059\u308B";
const gM92sLo0Cqfl2rCaXlOhc = "\u96A0\u308C\u308B";
const hVmfDxXoj8vkgVQabEOSr = "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30EA\u30B9\u30C8\u306B\u8FFD\u52A0";
const jerGO2OCuW9TdnEnGYRWd = "\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u8868\u793A";
const juT6gwLOg5r1h2vFpFf6P = "\u8457\u4F5C\u6A29";
const k4YzDnBtd_S2UpAQucGxF = "JPEG\u753B\u50CF\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9";
const kFcteLMfnoezhOwuTlLFC = "\u8A73\u7D30\u306A\u753B\u50CF\u306E\u30D7\u30EA\u30ED\u30FC\u30C9";
const l8CbIALt_VWUnzBl_Rmgf = "Booru \u30B5\u30A4\u30C8\u306E\u30A6\u30A9\u30FC\u30BF\u30FC\u30D5\u30A9\u30FC\u30EB \u30D6\u30E9\u30A6\u30B8\u30F3\u30B0";
const pEU9Y9K7DsODkocCDwq_O = "\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u6E08\u307F";
const qSF4OLshg2EEX4CwtBE6r = "\u30BD\u30FC\u30B9";
const qWcqQRsE9nN43MaZ2BmN9 = "Web\u30D0\u30FC\u30B8\u30E7\u30F3";
const rXjhc8VuGloy1wZ09noNB = "\u30EA\u30B9\u30C8\u304C 7 \u5217\u672A\u6E80\u306E\u5834\u5408\u3001\u30EA\u30B9\u30C8\u306B\u306F\u5927\u304D\u306A\u753B\u50CF\u304C\u30ED\u30FC\u30C9\u3055\u308C\u307E\u3059\u3002";
const tGi6xYfvStBmR8qduEmKX = "\u898B\u308B";
const u8mEnSo4mxDRUbj7FeAll = "\u30C0\u30FC\u30AF\u30E2\u30FC\u30C9\u3092\u5207\u308A\u66FF\u3048\u308B";
const uxIs3XkeVzkrEX985zHk3 = "\u81EA\u52D5";
const vfUg8xP6WptIhSL0E9b9D = "\u5E45\u3068\u9AD8\u3055\u304C\u7B49\u3057\u3044";
const w95XGurDhDfOfw7XH4JFW = "A/D/\u2190/\u2192\u3067\u8A73\u7D30\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u30A6\u30A3\u30F3\u30C9\u30A6\u306E\u753B\u50CF\u3092\u5207\u308A\u66FF\u3048\u307E\u3059";
const wI4KHHIe3zNRziW4lDZrp = "\u30B5\u30F3\u30D7\u30EB\u753B\u50CF\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9";
const ze1PaiGdX4ufmoOLv_xw6 = "\u5E74\u5225";
const zs8YTCc8d8XFUgRnp7m_w = "\u79C1\u306E\u304A\u6C17\u306B\u5165\u308A";
const PBjdNKuj02doUvOf2zZqP = "\u753B\u50CF\u3092\u30B5\u30D6\u30D5\u30A9\u30EB\u30C0\u30FC\u306B\u4FDD\u5B58\u3059\u308B";
const z_oL9s5fS164W4_gITOGZ = "\u5199\u771F\u3092\u4FDD\u5B58\u3059\u308B\u306B\u306F\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u30B5\u30A4\u30C8\u306B\u3061\u306A\u3093\u3060\u540D\u524D\u306E\u30D5\u30A9\u30EB\u30C0\u30FC\u3092\u4F5C\u6210\u3057\u307E\u3059\u3002Tampermonkey \u306E\u300C\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 \u30E2\u30FC\u30C9\u300D\u3092\u300C\u30D6\u30E9\u30A6\u30B6 API\u300D\u306B\u5909\u66F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002";
const LN_Rsic4V50DrXbsv9T9L = "\u30B5\u30D6\u30D5\u30A9\u30EB\u30C0\u30FC\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u6709\u52B9\u306B\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B? \nTampermonkey \u306E\u300C\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 \u30E2\u30FC\u30C9\u300D\u3092\u300C\u30D6\u30E9\u30A6\u30B6 API\u300D\u306B\u5909\u66F4\u3057\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002";
const OJ8X55GXx5k3peoSXSujf = "\u958B\u304F\u65B9\u6CD5: Tampermonkey \u8A2D\u5B9A\u306E\u300C\u69CB\u6210\u30E2\u30FC\u30C9\u300D\u3092\u300C\u521D\u5FC3\u8005\u300D\u304B\u3089\u300C\u4E0A\u7D1A\u300D\u306B\u5909\u66F4\u3057\u3001\u300C\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 \u30D9\u30FC\u30BF\u300D\u3092\u898B\u3064\u3051\u3066\u3001\u300C\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 \u30E2\u30FC\u30C9\u300D\u3092\u300C\u30D6\u30E9\u30A6\u30B6 API\u300D\u306B\u5909\u66F4\u3057\u307E\u3059\u3002";
const ti3akdSS3iZV9NsGzIo3m = "\u30D2\u30F3\u30C8";
const ujBgilCWNgFNV8Q2IDMWS = "\u30D2\u30F3\u30C8: \u4FBF\u5B9C\u4E0A\u3001\u30D6\u30E9\u30A6\u30B6\u306E\u8A2D\u5B9A\u3067 [\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u524D\u306B\u5404\u30D5\u30A1\u30A4\u30EB\u306E\u4FDD\u5B58\u5834\u6240\u3092\u78BA\u8A8D\u3059\u308B] \u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u30AA\u30D5\u306B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002";
const sMkrF8bqCTJZZ1kXTkT_R = "Parent";
const u0K7A_hv1RZSJl6TDR61A = "Child";
const EVPG1YZDtykdz3htyf11u = "\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC";
const fbIpwMw2yVoSxP66OJ32z = "\u753B\u50CF\u304C\u753B\u9762\u3044\u3063\u3071\u3044\u306B\u8868\u793A\u3055\u308C\u308B";
const kCYFwKpwznYIKRmB1tCww = "\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u304B\u3089\u8AAD\u307F\u53D6\u308B";
const tEvQYzSVnggYAcM1uv9Tt = "\u3053\u306E\u6A5F\u80FD\u3092\u30AA\u30D5\u306B\u3059\u308B\u3068\u3001\u753B\u9762\u306E\u4E21\u5074\u304C\u7A7A\u767D\u306B\u306A\u308A\u307E\u3059\u3002";
const HSx0XMZFid_lVuwjzrhH0 = "\u753B\u50CF\u4E00\u89A7\u306E\u30B5\u30E0\u30CD\u30A4\u30EB\u306F\u5927\u304D\u306A\u753B\u50CF\u30EA\u30F3\u30AF(sample_url)\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059";
const lkCkz1OpNtTCFRfGCEoBp = "\u81EA\u52D5\u7684\u306B\u30A6\u30A9\u30FC\u30BF\u30FC\u30D5\u30A9\u30FC\u30EB\u30D5\u30ED\u30FC\u30E2\u30FC\u30C9\u306B\u5165\u308A\u307E\u3059";
const e4_fgvntwNlfxgJUc2dXK = "\u8A00\u8A9E";
const gPt6cpWrkvqRqZnwJo1KV = "\u753B\u50CF\u30AB\u30FC\u30C9\u306E\u5DE6\u4E0A\u9685\u306B\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 \u30EA\u30B9\u30C8\u306B\u8FFD\u52A0\u3059\u308B\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u3092\u8868\u793A\u3057\u307E\u3059\u3002";
const sxhTRqogDRozo9IaTGI7g = "\u6295\u7A3F\u30EA\u30B9\u30C8\u306B\u753B\u50CF\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u3092\u8868\u793A\u3059\u308B";
const dvs63FvVKWm3uHVfqeq00 = "Fancybox \u3092\u4F7F\u7528\u3057\u3066\u8A73\u7D30\u3092\u8868\u793A\u3059\u308B";
const Tbq8O5KhwcDHQ_qxNFW09 = "\u5B9F\u9A13\u7684";
const IxTawC_qs_xjxj5g8_aGx = "\u4FDD\u7559\u4E2D\u306E\u753B\u50CF\u3092\u975E\u8868\u793A\u306B\u3059\u308B";
const YAUNSVT_pTygaY306DZmU = "yande.re \u306F\u753B\u50CF\u30EA\u30B9\u30C8\u306E\u53D6\u5F97\u306B API \u3092\u4F7F\u7528\u3057\u307E\u305B\u3093";
const HkRzE7fweBSefchs0z0r8 = "HTML \u3092\u76F4\u63A5\u89E3\u6790\u3057\u3066\u753B\u50CF\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u3059\u308B";
const yYtssYrCL8VwFrdvvx8v3 = "\u4EEE\u60F3\u30EA\u30B9\u30C8 (\u5E45\u306F\u7B49\u3057\u304F\u3001\u9AD8\u3055\u306F\u7B49\u3057\u304F\u306A\u3044)";
const UqbfVZzRyk0iD2NcOii_E = "\u30C7\u30A3\u30B9\u30D7\u30EC\u30A4\u30EA\u30B9\u30C8\u753B\u50CF\u306E\u89E3\u50CF\u5EA6";
const _4E2zv2NpOG4y8TV5PRL0 = "\u753B\u50CF\u30AB\u30FC\u30C9\u306E\u5DE6\u4E0B\u9685\u306B\u5143\u306E\u753B\u50CF\u306E\u89E3\u50CF\u5EA6\u3092\u8868\u793A\u3057\u307E\u3059\u3002";
const Cu6n0Apv5xVlo4DnQbVbT = "\u30BF\u30B0\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u8A2D\u5B9A";
const BB4C5taWpmw06X0Kz_Gtk = "\u30A6\u30A7\u30A4\u30C8\u306E\u8A2D\u5B9A";
const zg2GRF6zmMXCkT9Uz2Bni = "\u5168\u9078\u629E";
const xSC1vpAOTLQ3RBipKrNpD = "\u9078\u629E\u3057\u306A\u3044";
const cKXET1CCnAXq4H60qr8uc = "\u9006\u9078\u629E";
const QH_xm27zhgs5E1077asf1 = "\u8F38\u51FA";
const Uw9QwD1SaR2VjZEqDYRdb = "\u4E00\u90E8\u306E\u8A2D\u5B9A\u3092\u6709\u52B9\u306B\u3059\u308B\u306B\u306F\u3001\u30DA\u30FC\u30B8\u3092\u66F4\u65B0\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002";
const ECpLfRMsS0zpJPTw0qqNs = "\u8A73\u7D30\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u30A6\u30A3\u30F3\u30C9\u30A6\u306E\u4E0B\u90E8\u306B\u30A2\u30AF\u30B7\u30E7\u30F3\u30D0\u30FC\u30DC\u30BF\u30F3\u3092\u914D\u7F6E\u3057\u307E\u3059\u3002";
const vJobIibroyz2wkpmONSnR = "\u753B\u50CF\u8A73\u7D30\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u30A6\u30A3\u30F3\u30C9\u30A6\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u30DC\u30BF\u30F3\u30D0\u30FC\u3068\u30E9\u30D9\u30EB\u30D0\u30FC\u306E\u4F4D\u7F6E\u3092\u5165\u308C\u66FF\u3048\u307E\u3059\u3002";
const I_MKXUxaNXp3D35GFULn4 = "\u30AA\u30D5\u306B\u3059\u308B\u3068\u3001\u8A73\u7D30\u753B\u50CF\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u30DC\u30BF\u30F3\u3084\u30BF\u30B0\u306E\u8868\u793A\u30FB\u975E\u8868\u793A\u304C\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002";
const dm7zGAYbP2sbGXO_ekDDl = "\u4E21\u7AEF\u63C3\u3048\u30EC\u30A4\u30A2\u30A6\u30C8\u5E45\u4FC2\u6570";
const UOaS5wud2xGLzx9NGJxYQ = "\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u9078\u629E";
const jx2FWrN3O_8T7U5aSbvXj = "\u753B\u50CF\u3092\u4FDD\u5B58\u3059\u308B\u5834\u6240\u3092\u9078\u629E\u3057\u307E\u3059";
var ja = {
UxxldE9xRwmQctrvba5Y8,
"1F-R4qChHIzZaohu5GJzl": "\u4F8B\uFF1A&api_key=xx&user_id=1",
"23iEYyiQlLVhFIqGbj527": "\u8CEA\u554F\u3068\u63D0\u6848",
"2ZPEAvLkCbV3mC0iJAw9K": "\u304A\u6C17\u306B\u5165\u308A\u306B\u8FFD\u52A0",
"4g1TUy2kwQrdOs-w4JobB": "\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u3092\u9001\u4FE1",
"4hOFoP4M3ZkL3RiN7XOc8": "\u3082\u3046\u3044\u3084",
"6acPWiYq2-OdySa2_xqDu": "\u30E9\u30F3\u30C0\u30E0",
"6jPGehET9TViankl5-SRu": "\u5E45\u306F\u540C\u3058\u3067\u9AD8\u3055\u306F\u7570\u306A\u308A\u307E\u3059",
"7Cgsr4PUMbezDXNfWdvWH": "\u4EBA\u6C17\u4F5C\u54C1",
"7Xq5puLNcT0mAvoxElqdf": "\u30A6\u30A7\u30EB\u30AB\u30E0\u30B9\u30BF\u30FC\u2606\u5F61",
"9juZMc0gPIgvMPKVORpJ1": "\u4EBA\u6C17",
A16qoBulYQJLbHe9mqNwm,
"B_ptN5O-9PhmG5ymGGtc6": "\u62E1\u5927\u753B\u50CF\u3092\u898B\u308B",
CacM8tispuPNrSxxpt9GX,
ClZdL9hGweOokP7Mn_Ptq,
DXEhXAQbkiCMU_l252jo_,
Dnnio9m9RZA6bkTLytc99,
EsiorRgoeHI8h7IHMLDA4,
FAqj5ONm50QMfIt9Vq2p1,
FT1uJs8XG__n5qBvuFsH4,
G3b7rbyQEj3_rgzVsNJZY,
GjMNbm97OgVvpIYlkOisE,
HzMBcS2oNGVIoLiHWprim,
"J2Ckb_-LITfmww4aEksqk": "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30EA\u30F3\u30AF\u3092\u51FA\u529B\u3059\u308B",
"KkkM-iz8RCVQoTrTfhS5j": "\u30AA\u30EA\u30B8\u30CA\u30EB\u30B5\u30A4\u30BA",
"LZbI8am7nD-LiemZzroFF": "\u9AD8\u3055\u304C\u540C\u3058\u3067\u5E45\u304C\u4E0D\u7B49",
Lm_HFVHpv4XCjilV3NLKu,
"M-wISnLiQgM_DURMwKZGT": "\u30DA\u30FC\u30B8\u306B\u5408\u308F\u305B\u308B",
"MWVfUiW8egLWq7MgV-wzc": "\u304A\u6C17\u306B\u5165\u308A\u306B\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F",
"Mt3-hyoH7f_pW2gnfxyur": "\u65E5\u5225",
OKs1ePekQA4Ona839U114,
"OrwwNKZ7I70-ecpspE8d_": "\u30D5\u30EB\u30B9\u30AF\u30EA\u30FC\u30F3\u5207\u308A\u66FF\u3048",
"PQhFo-g7sgagimkleVoZR": "\u6708\u5225",
"PT74UDfKA45vTVTst_-hD": "\u3053\u306E\u30B9\u30AF\u30EA\u30D7\u30C8\u306B\u3064\u3044\u3066",
RN4dt81l_fZMWODsskZob,
RstKmO7YVQMpaDoucxUel,
SIUUZ4wqJTOilEdcX3EOi,
"StU1-52QJmNFKQ5soJCyG": "\u30E9\u30F3\u30C0\u30E0\u4F5C\u54C1",
"VpuyxZtIoDF9-YyOm0tK_": "\u5143\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3059\u308B",
"Xtk-NnMgSQZmheJ87nbRV": "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",
XvOYJ5gHo37M1XztPl18z,
Ym0HIEu9Q80qXB31LuC6c,
Z4pa8GhgE63OGGvCqAld0,
"ZtQHZx-pEjmu_o3dQD1fc": "\u30B5\u30FC\u30AF\u30EB",
ZztrWbSaaaas3v0cHtSmh,
_Efl8k8uYQj9iJmj3kwbd,
_bQs7o9oQSo7ao1G0cp3d,
_nQfaNuwbvPAIFKOY6_7u,
aVqN9TBRCbNGsW3Y2D2Nm,
ad8lEoWap_nT9U69WBKen,
aonlPAu9kEkkwNvQg0DBk,
cKn4cfAxzdgh_HD6OFibB,
caFFJlrS1wa_F86uKPykd,
ctWGhVvqB2k_1TX2iY0l2,
dU7ou5kVM0s9DMju5e2tS,
e2_EYvweJsVoIZlIWkPRV,
"elkBQ9moOZ-KMcy5bt_Ts": "\u6700\u8FD1\u306E\u4EBA\u6C17",
fC8XNfCl04zK7vgeaRZMQ,
fVE5taO6GDTPbILat4GCt,
gM92sLo0Cqfl2rCaXlOhc,
hVmfDxXoj8vkgVQabEOSr,
"iJ0h220tvMmUhkfIMYI-W": "\u5909\u66F4\u5C65\u6B74",
"iRt9V9wNQASic3D7-wTZo": "\u5B9F\u9A13\u7684/\u4FDD\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
"jDjashxA-oBPo19DXI504": "\u5143\u306E\u753B\u50CF",
"jMod2JozzAnwHuD-3KuPb": "\u4EE5\u4E0B\u306E\u30BF\u30B0\u3092\u5165\u529B\u3057\u3001Enter \u30AD\u30FC\u3092\u62BC\u3057\u3066\u8FFD\u52A0\u3057\u307E\u3059",
jerGO2OCuW9TdnEnGYRWd,
juT6gwLOg5r1h2vFpFf6P,
k4YzDnBtd_S2UpAQucGxF,
kFcteLMfnoezhOwuTlLFC,
"kop_-39vkeg-bz2wztJ9O": "\u753B\u50CF\u30EA\u30B9\u30C8\u306E\u30EC\u30A4\u30A2\u30A6\u30C8",
"l5W-EtJ_ar-SY2lF4H5Zm": "\u898B\u305B\u308B",
l8CbIALt_VWUnzBl_Rmgf,
"lPPsX2CZbXwC-EGN79Rki": "\u30BA\u30FC\u30E0\u30A2\u30A6\u30C8\u3059\u308B",
"nd4UjZy2ILsc-iW9iu7xR": "\u65E5\u4ED8\u9806",
pEU9Y9K7DsODkocCDwq_O,
qSF4OLshg2EEX4CwtBE6r,
qWcqQRsE9nN43MaZ2BmN9,
rXjhc8VuGloy1wZ09noNB,
"riciqzr6ILBnpPc7KtG-C": "\u9031\u5225",
"t83UAY18UebTg1_-zFGP3": "\u9589\u3058\u308B",
tGi6xYfvStBmR8qduEmKX,
"tt_YdgKCA_5m-aSTSMPQ_": "\u30A6\u30A9\u30FC\u30BF\u30FC\u30D5\u30A9\u30FC\u30EB\u306E\u5217\u306E\u6570",
u8mEnSo4mxDRUbj7FeAll,
uxIs3XkeVzkrEX985zHk3,
vfUg8xP6WptIhSL0E9b9D,
w95XGurDhDfOfw7XH4JFW,
wI4KHHIe3zNRziW4lDZrp,
"xJJTEE3nZ4HVXGFfiN-LC": "\u679A",
ze1PaiGdX4ufmoOLv_xw6,
zs8YTCc8d8XFUgRnp7m_w,
PBjdNKuj02doUvOf2zZqP,
z_oL9s5fS164W4_gITOGZ,
"0VAN4cJ-_mUxvtmg4KEi1": "OK",
"9dq_DxgMG88eom9Gq-4nT": "\u30AD\u30E3\u30F3\u30BB\u30EB",
LN_Rsic4V50DrXbsv9T9L,
OJ8X55GXx5k3peoSXSujf,
ti3akdSS3iZV9NsGzIo3m,
ujBgilCWNgFNV8Q2IDMWS,
sMkrF8bqCTJZZ1kXTkT_R,
u0K7A_hv1RZSJl6TDR61A,
"99kLMSzDYJCAf1yK9QYzy": "\u30B3\u30D4\u30FC\u3055\u308C\u307E\u3057\u305F",
EVPG1YZDtykdz3htyf11u,
fbIpwMw2yVoSxP66OJ32z,
kCYFwKpwznYIKRmB1tCww,
"si-zDDRFrEwDTCkp53Q44": "\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306E\u8A31\u53EF\u3092\u8A31\u53EF\u3057\u3066\u304F\u3060\u3055\u3044",
tEvQYzSVnggYAcM1uv9Tt,
"eOxsWLzwqrlhBdVMwz-rH": "\u304A\u3059\u3059\u3081\u30B5\u30A4\u30C8",
"4yzHPggVky2QKFD2TbBhl": "\u30B5\u30E0\u30CD\u30A4\u30EB\u306B\u306F\u5927\u304D\u306A\u753B\u50CF\u3092\u4F7F\u7528\u3059\u308B",
HSx0XMZFid_lVuwjzrhH0,
"EZd1QQdgUDjT3yya5ZYe-": "\u30BD\u30FC\u30B9\u30B5\u30A4\u30C8\u3092\u958B\u3044\u305F\u3068\u304D\u306B\u76F4\u63A5\u30A6\u30A9\u30FC\u30BF\u30FC\u30D5\u30A9\u30FC\u30EB\u30D6\u30E9\u30A6\u30B8\u30F3\u30B0\u30E2\u30FC\u30C9\u306B\u5165\u308B",
lkCkz1OpNtTCFRfGCEoBp,
e4_fgvntwNlfxgJUc2dXK,
gPt6cpWrkvqRqZnwJo1KV,
sxhTRqogDRozo9IaTGI7g,
dvs63FvVKWm3uHVfqeq00,
"w4uJjpTmSEkm6SIDgEo-0": "\u753B\u50CF\u306E\u8A73\u7D30\u306F\u3001\u30BA\u30FC\u30E0\u3084\u56DE\u8EE2\u306A\u3069\u306E\u64CD\u4F5C\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B Fancybox \u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3092\u4F7F\u7528\u3057\u3066\u8868\u793A\u3067\u304D\u307E\u3059\u3002",
Tbq8O5KhwcDHQ_qxNFW09,
IxTawC_qs_xjxj5g8_aGx,
"-x4wjDoHtodaXEgm2SXkg": "API \u3092\u547C\u3073\u51FA\u3059\u3068\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u3067 `holds:false` \u30BF\u30B0\u304C\u6E21\u3055\u308C\u307E\u3059\u3002",
YAUNSVT_pTygaY306DZmU,
HkRzE7fweBSefchs0z0r8,
yYtssYrCL8VwFrdvvx8v3,
UqbfVZzRyk0iD2NcOii_E,
_4E2zv2NpOG4y8TV5PRL0,
"FMi4atPbKn-B1HiAZ2ZP2": "\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u30BF\u30B0",
Cu6n0Apv5xVlo4DnQbVbT,
BB4C5taWpmw06X0Kz_Gtk,
zg2GRF6zmMXCkT9Uz2Bni,
xSC1vpAOTLQ3RBipKrNpD,
cKXET1CCnAXq4H60qr8uc,
QH_xm27zhgs5E1077asf1,
Uw9QwD1SaR2VjZEqDYRdb,
ECpLfRMsS0zpJPTw0qqNs,
vJobIibroyz2wkpmONSnR,
"HPukB-OKzIuRxMmO4Rx2U": "\u8A73\u7D30\u753B\u50CF\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u9589\u3058\u307E\u3059",
I_MKXUxaNXp3D35GFULn4,
dm7zGAYbP2sbGXO_ekDDl,
"kMu1vOFmTJac-ylP0b13Z": "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u6210\u529F",
UOaS5wud2xGLzx9NGJxYQ,
jx2FWrN3O_8T7U5aSbvXj,
"1sUsdpwBzU4gBf7Mrcihq": "\u753B\u50CF\u4FDD\u5B58\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA",
"rcpw-hgymDP2bsJPPUb_F": "\u753B\u50CF\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u65B9\u6CD5\u3092\u9078\u629E\u3059\u308B",
"Ah2uP1cGRBQ6jff-SIc-Q": "\u753B\u50CF\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u65B9\u6CD5"
};
Vue__default["default"].use(VueI18n__default["default"]);
const i18n = new VueI18n__default["default"]({
locale: initialSettings.lang || "en",
fallbackLocale: "en",
messages: {
"zh-Hans": zhHans,
"zh-Hant": zhHant,
en,
ja
}
});
const settings = Vue__default["default"].observable(initialSettings);
const ykFlag = ["konachan", "yande.re"].some((e) => location.href.includes(e));
const poolFlag = location.pathname == "/pool";
const store = Vue__default["default"].observable({
requestLoading: false,
requestStop: false,
showImageSelected: false,
imageSelectedIndex: 0,
showDrawer: false,
showSettings: false,
showFab: false,
currentPage: 1,
imageList: [],
selectedImageList: [],
isYKSite: ykFlag,
showPostList: !poolFlag,
showPoolList: ykFlag && poolFlag,
isFullscreen: false
});
function toggleDrawer() {
store.showDrawer = !store.showDrawer;
}
function addToSelectedList(item) {
if (store.selectedImageList.some((e) => e.id === item.id))
return;
Object.assign(item, { fileNameWithTags: `${location.hostname} ${item.id} ${item.tags.join(" ")}` });
store.selectedImageList.push(item);
}
function removeFromSelectedList(id) {
store.selectedImageList = store.selectedImageList.filter((e) => {
if (e.loading)
return true;
return e.id !== id;
});
}
var _sfc_main$b = /* @__PURE__ */ Vue2.defineComponent({
__name: "WfLayout",
setup(__props) {
const wfType = Vue2.computed(() => settings.masonryLayout || "masonry");
const isMasonry = Vue2.computed(() => ["masonry", "grid"].includes(wfType.value));
const wfClass = Vue2.computed(() => ({
"wf-grid": wfType.value == "grid",
"wf-no-fit-screen": !settings.isFitScreen
}));
const columnCount = Vue2.computed(() => {
return settings.selectedColumn === "0" ? settings.isFitScreen ? {
300: 1,
600: 2,
900: 3,
1200: 4,
1600: 6,
1920: 7,
2400: 8,
2700: 9,
3e3: 10,
default: 6
} : {
300: 1,
1050: 2,
1500: 3,
1920: 4,
default: 4
} : +settings.selectedColumn;
});
const columnCount2 = Vue2.computed(() => {
if (typeof columnCount.value == "number")
return { default: columnCount.value };
return columnCount.value;
});
return { __sfc: true, wfType, isMasonry, wfClass, columnCount, columnCount2 };
}
});
var _sfc_render$b = function render() {
var _vm = this, _c = _vm._self._c, _setup = _vm._self._setupProxy;
return _c("div", { staticClass: "wf-layout", class: _setup.wfClass }, [_setup.wfType === "masonry2" ? _c("true-masonry", { staticClass: "true-masonry", attrs: { "gap": { default: 8 }, "cols": _setup.columnCount2 } }, [_vm._t("default")], 2) : _setup.isMasonry ? _c("masonry", { attrs: { "cols": _setup.columnCount, "gutter": "8px" } }, [_vm._t("default")], 2) : _c("div", { staticClass: "justified-container" }, [_vm._t("default")], 2)], 1);
};
var _sfc_staticRenderFns$b = [];
var __component__$b = /* @__PURE__ */ normalizeComponent(
_sfc_main$b,
_sfc_render$b,
_sfc_staticRenderFns$b,
false,
null,
null,
null,
null
);
var WfLayout = __component__$b.exports;
var mdiAccount = "M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z";
var mdiBrightness6 = "M12,18V6A6,6 0 0,1 18,12A6,6 0 0,1 12,18M20,15.31L23.31,12L20,8.69V4H15.31L12,0.69L8.69,4H4V8.69L0.69,12L4,15.31V20H8.69L12,23.31L15.31,20H20V15.31Z";
var mdiCalendar = "M19,19H5V8H19M16,1V3H8V1H6V3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3H18V1M17,12H12V17H17V12Z";
var mdiCalendarBlank = "M19,19H5V8H19M16,1V3H8V1H6V3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3H18V1";
var mdiCalendarEdit = "M19,3H18V1H16V3H8V1H6V3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H10V19H5V8H19V9H21V5A2,2 0 0,0 19,3M21.7,13.35L20.7,14.35L18.65,12.35L19.65,11.35C19.85,11.14 20.19,11.13 20.42,11.35L21.7,12.63C21.89,12.83 21.89,13.15 21.7,13.35M12,18.94L18.07,12.88L20.12,14.88L14.06,21H12V18.94Z";
var mdiCalendarMonth = "M9,10V12H7V10H9M13,10V12H11V10H13M17,10V12H15V10H17M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5C3.89,21 3,20.1 3,19V5A2,2 0 0,1 5,3H6V1H8V3H16V1H18V3H19M19,19V8H5V19H19M9,14V16H7V14H9M13,14V16H11V14H13M17,14V16H15V14H17Z";
var mdiCalendarSearch = "M15.5,12C18,12 20,14 20,16.5C20,17.38 19.75,18.21 19.31,18.9L22.39,22L21,23.39L17.88,20.32C17.19,20.75 16.37,21 15.5,21C13,21 11,19 11,16.5C11,14 13,12 15.5,12M15.5,14A2.5,2.5 0 0,0 13,16.5A2.5,2.5 0 0,0 15.5,19A2.5,2.5 0 0,0 18,16.5A2.5,2.5 0 0,0 15.5,14M19,8H5V19H9.5C9.81,19.75 10.26,20.42 10.81,21H5C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V13.03C20.5,12.22 19.8,11.54 19,11V8Z";
var mdiCalendarText = "M14,14H7V16H14M19,19H5V8H19M19,3H18V1H16V3H8V1H6V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M17,10H7V12H17V10Z";
var mdiCalendarToday = "M7,10H12V15H7M19,19H5V8H19M19,3H18V1H16V3H8V1H6V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3Z";
var mdiCalendarWeek = "M6 1H8V3H16V1H18V3H19C20.11 3 21 3.9 21 5V19C21 20.11 20.11 21 19 21H5C3.89 21 3 20.1 3 19V5C3 3.89 3.89 3 5 3H6V1M5 8V19H19V8H5M7 10H17V12H7V10Z";
var mdiCheckCircle = "M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M10 17L5 12L6.41 10.59L10 14.17L17.59 6.58L19 8L10 17Z";
var mdiCheckUnderlineCircle = "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M17,18H7V16H17V18M10.3,14L7,10.7L8.4,9.3L10.3,11.2L15.6,5.9L17,7.3L10.3,14Z";
var mdiCheckboxBlankOutline = "M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3M19,5V19H5V5H19Z";
var mdiCheckboxIntermediate = "M19,3H5A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3M19,19H5V5H19V19M17,17H7V7H17V17Z";
var mdiCheckboxMarked = "M10,17L5,12L6.41,10.58L10,14.17L17.59,6.58L19,8M19,3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3Z";
var mdiChevronDown = "M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z";
var mdiChevronLeft = "M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z";
var mdiChevronRight = "M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z";
var mdiClose = "M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z";
var mdiCloseCircle = "M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z";
var mdiCog = "M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z";
var mdiContentCopy = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z";
var mdiContentPaste = "M19,20H5V4H7V7H17V4H19M12,2A1,1 0 0,1 13,3A1,1 0 0,1 12,4A1,1 0 0,1 11,3A1,1 0 0,1 12,2M19,2H14.82C14.4,0.84 13.3,0 12,0C10.7,0 9.6,0.84 9.18,2H5A2,2 0 0,0 3,4V20A2,2 0 0,0 5,22H19A2,2 0 0,0 21,20V4A2,2 0 0,0 19,2Z";
var mdiDelete = "M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z";
var mdiDownload = "M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z";
var mdiFileClockOutline = "M4 2A2 2 0 0 0 2 4V20A2 2 0 0 0 4 22H12.41A7 7 0 0 0 16 23A7 7 0 0 0 23 16A7 7 0 0 0 18 9.3V8L12 2H4M4 4H11V9H16A7 7 0 0 0 9 16A7 7 0 0 0 10.26 20H4V4M16 11A5 5 0 0 1 21 16A5 5 0 0 1 16 21A5 5 0 0 1 11 16A5 5 0 0 1 16 11M15 12V17L18.61 19.16L19.36 17.94L16.5 16.25V12H15Z";
var mdiFileGifBox = "M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3M10 10.5H7.5V13.5H8.5V12H10V13.7C10 14.4 9.5 15 8.7 15H7.3C6.5 15 6 14.3 6 13.7V10.4C6 9.7 6.5 9 7.3 9H8.6C9.5 9 10 9.7 10 10.3V10.5M13 15H11.5V9H13V15M17.5 10.5H16V11.5H17.5V13H16V15H14.5V9H17.5V10.5Z";
var mdiFileTree = "M3,3H9V7H3V3M15,10H21V14H15V10M15,17H21V21H15V17M13,13H7V18H13V20H7L5,20V9H7V11H13V13Z";
var mdiFire = "M17.66 11.2C17.43 10.9 17.15 10.64 16.89 10.38C16.22 9.78 15.46 9.35 14.82 8.72C13.33 7.26 13 4.85 13.95 3C13 3.23 12.17 3.75 11.46 4.32C8.87 6.4 7.85 10.07 9.07 13.22C9.11 13.32 9.15 13.42 9.15 13.55C9.15 13.77 9 13.97 8.8 14.05C8.57 14.15 8.33 14.09 8.14 13.93C8.08 13.88 8.04 13.83 8 13.76C6.87 12.33 6.69 10.28 7.45 8.64C5.78 10 4.87 12.3 5 14.47C5.06 14.97 5.12 15.47 5.29 15.97C5.43 16.57 5.7 17.17 6 17.7C7.08 19.43 8.95 20.67 10.96 20.92C13.1 21.19 15.39 20.8 17.03 19.32C18.86 17.66 19.5 15 18.56 12.72L18.43 12.46C18.22 12 17.66 11.2 17.66 11.2M14.5 17.5C14.22 17.74 13.76 18 13.4 18.1C12.28 18.5 11.16 17.94 10.5 17.28C11.69 17 12.4 16.12 12.61 15.23C12.78 14.43 12.46 13.77 12.33 13C12.21 12.26 12.23 11.63 12.5 10.94C12.69 11.32 12.89 11.7 13.13 12C13.9 13 15.11 13.44 15.37 14.8C15.41 14.94 15.43 15.08 15.43 15.23C15.46 16.05 15.1 16.95 14.5 17.5H14.5Z";
var mdiFitToScreenOutline = "M17 4H20C21.1 4 22 4.9 22 6V8H20V6H17V4M4 8V6H7V4H4C2.9 4 2 4.9 2 6V8H4M20 16V18H17V20H20C21.1 20 22 19.1 22 18V16H20M7 18H4V16H2V18C2 19.1 2.9 20 4 20H7V18M16 10V14H8V10H16M18 8H6V16H18V8Z";
var mdiFolderNetwork = "M3,15V5A2,2 0 0,1 5,3H11L13,5H19A2,2 0 0,1 21,7V15A2,2 0 0,1 19,17H13V19H14A1,1 0 0,1 15,20H22V22H15A1,1 0 0,1 14,23H10A1,1 0 0,1 9,22H2V20H9A1,1 0 0,1 10,19H11V17H5A2,2 0 0,1 3,15Z";
var mdiFullscreen = "M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z";
var mdiFullscreenExit = "M14,14H19V16H16V19H14V14M5,14H10V19H8V16H5V14M8,5H10V10H5V8H8V5M19,8V10H14V5H16V8H19Z";
var mdiGithub = "M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z";
var mdiHeart = "M12,21.35L10.55,20.03C5.4,15.36 2,12.27 2,8.5C2,5.41 4.42,3 7.5,3C9.24,3 10.91,3.81 12,5.08C13.09,3.81 14.76,3 16.5,3C19.58,3 22,5.41 22,8.5C22,12.27 18.6,15.36 13.45,20.03L12,21.35Z";
var mdiHeartPlusOutline = "M12.67 20.74L12 21.35L10.55 20.03C5.4 15.36 2 12.27 2 8.5C2 5.41 4.42 3 7.5 3C9.24 3 10.91 3.81 12 5.08C13.09 3.81 14.76 3 16.5 3C19.58 3 22 5.41 22 8.5C22 9.93 21.5 11.26 20.62 12.61C20 12.31 19.31 12.11 18.59 12.04C19.5 10.8 20 9.65 20 8.5C20 6.5 18.5 5 16.5 5C14.96 5 13.46 6 12.93 7.36H11.07C10.54 6 9.04 5 7.5 5C5.5 5 4 6.5 4 8.5C4 11.39 7.14 14.24 11.89 18.55L12 18.65L12.04 18.61C12.12 19.37 12.34 20.09 12.67 20.74M17 14V17H14V19H17V22H19V19H22V17H19V14H17Z";
var mdiHome = "M10,20V14H14V20H19V12H22L12,3L2,12H5V20H10Z";
var mdiImageMultiple = "M22,16V4A2,2 0 0,0 20,2H8A2,2 0 0,0 6,4V16A2,2 0 0,0 8,18H20A2,2 0 0,0 22,16M11,12L13.03,14.71L16,11L20,16H8M2,6V20A2,2 0 0,0 4,22H18V20H4V6";
var mdiInformationOutline = "M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z";
var mdiLaunch = "M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z";
var mdiLinkVariant = "M10.59,13.41C11,13.8 11,14.44 10.59,14.83C10.2,15.22 9.56,15.22 9.17,14.83C7.22,12.88 7.22,9.71 9.17,7.76V7.76L12.71,4.22C14.66,2.27 17.83,2.27 19.78,4.22C21.73,6.17 21.73,9.34 19.78,11.29L18.29,12.78C18.3,11.96 18.17,11.14 17.89,10.36L18.36,9.88C19.54,8.71 19.54,6.81 18.36,5.64C17.19,4.46 15.29,4.46 14.12,5.64L10.59,9.17C9.41,10.34 9.41,12.24 10.59,13.41M13.41,9.17C13.8,8.78 14.44,8.78 14.83,9.17C16.78,11.12 16.78,14.29 14.83,16.24V16.24L11.29,19.78C9.34,21.73 6.17,21.73 4.22,19.78C2.27,17.83 2.27,14.66 4.22,12.71L5.71,11.22C5.7,12.04 5.83,12.86 6.11,13.65L5.64,14.12C4.46,15.29 4.46,17.19 5.64,18.36C6.81,19.54 8.71,19.54 9.88,18.36L13.41,14.83C14.59,13.66 14.59,11.76 13.41,10.59C13,10.2 13,9.56 13.41,9.17Z";
var mdiLocationExit = "M22 12L18 8V11H10V13H18V16M20 18A10 10 0 1 1 20 6H17.27A8 8 0 1 0 17.27 18Z";
var mdiLoupe = "M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22H20A2,2 0 0,0 22,20V12A10,10 0 0,0 12,2M13,7H11V11H7V13H11V17H13V13H17V11H13V7Z";
var mdiMagnify = "M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z";
var mdiMagnifyMinusOutline = "M15.5,14H14.71L14.43,13.73C15.41,12.59 16,11.11 16,9.5A6.5,6.5 0 0,0 9.5,3A6.5,6.5 0 0,0 3,9.5A6.5,6.5 0 0,0 9.5,16C11.11,16 12.59,15.41 13.73,14.43L14,14.71V15.5L19,20.5L20.5,19L15.5,14M9.5,14C7,14 5,12 5,9.5C5,7 7,5 9.5,5C12,5 14,7 14,9.5C14,12 12,14 9.5,14M7,9H12V10H7V9Z";
var mdiMagnifyPlusOutline = "M15.5,14L20.5,19L19,20.5L14,15.5V14.71L13.73,14.43C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.43,13.73L14.71,14H15.5M9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14M12,10H10V12H9V10H7V9H9V7H10V9H12V10Z";
var mdiMessageAlertOutline = "M13,10H11V6H13V10M13,12H11V14H13V12M22,4V16A2,2 0 0,1 20,18H6L2,22V4A2,2 0 0,1 4,2H20A2,2 0 0,1 22,4M20,4H4V17.2L5.2,16H20V4Z";
var mdiPlaylistPlus = "M3 16H10V14H3M18 14V10H16V14H12V16H16V20H18V16H22V14M14 6H3V8H14M14 10H3V12H14V10Z";
var mdiRefresh = "M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z";
var mdiRotateRight = "M16.89,15.5L18.31,16.89C19.21,15.73 19.76,14.39 19.93,13H17.91C17.77,13.87 17.43,14.72 16.89,15.5M13,17.9V19.92C14.39,19.75 15.74,19.21 16.9,18.31L15.46,16.87C14.71,17.41 13.87,17.76 13,17.9M19.93,11C19.76,9.61 19.21,8.27 18.31,7.11L16.89,8.53C17.43,9.28 17.77,10.13 17.91,11M15.55,5.55L11,1V4.07C7.06,4.56 4,7.92 4,12C4,16.08 7.05,19.44 11,19.93V17.91C8.16,17.43 6,14.97 6,12C6,9.03 8.16,6.57 11,6.09V10L15.55,5.55Z";
var mdiShuffle = "M14.83,13.41L13.42,14.82L16.55,17.95L14.5,20H20V14.5L17.96,16.54L14.83,13.41M14.5,4L16.54,6.04L4,18.59L5.41,20L17.96,7.46L20,9.5V4M10.59,9.17L5.41,4L4,5.41L9.17,10.58L10.59,9.17Z";
var mdiStar = "M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z";
var mdiTableSplitCell = "M19 14H21V20H3V14H5V18H19V14M3 4V10H5V6H19V10H21V4H3M11 11V13H8V15L5 12L8 9V11H11M16 11V9L19 12L16 15V13H13V11H16Z";
var mdiTagMultiple = "M5.5,9A1.5,1.5 0 0,0 7,7.5A1.5,1.5 0 0,0 5.5,6A1.5,1.5 0 0,0 4,7.5A1.5,1.5 0 0,0 5.5,9M17.41,11.58C17.77,11.94 18,12.44 18,13C18,13.55 17.78,14.05 17.41,14.41L12.41,19.41C12.05,19.77 11.55,20 11,20C10.45,20 9.95,19.78 9.58,19.41L2.59,12.42C2.22,12.05 2,11.55 2,11V6C2,4.89 2.89,4 4,4H9C9.55,4 10.05,4.22 10.41,4.58L17.41,11.58M13.54,5.71L14.54,4.71L21.41,11.58C21.78,11.94 22,12.45 22,13C22,13.55 21.78,14.05 21.42,14.41L16.04,19.79L15.04,18.79L20.75,13L13.54,5.71Z";
var mdiTranslate = "M12.87,15.07L10.33,12.56L10.36,12.53C12.1,10.59 13.34,8.36 14.07,6H17V4H10V2H8V4H1V6H12.17C11.5,7.92 10.44,9.75 9,11.35C8.07,10.32 7.3,9.19 6.69,8H4.69C5.42,9.63 6.42,11.17 7.67,12.56L2.58,17.58L4,19L9,14L12.11,17.11L12.87,15.07M18.5,10H16.5L12,22H14L15.12,19H19.87L21,22H23L18.5,10M15.88,17L17.5,12.67L19.12,17H15.88Z";
var mdiVideo = "M17,10.5V7A1,1 0 0,0 16,6H4A1,1 0 0,0 3,7V17A1,1 0 0,0 4,18H16A1,1 0 0,0 17,17V13.5L21,17.5V6.5L17,10.5Z";
var mdiWeb = "M16.36,14C16.44,13.34 16.5,12.68 16.5,12C16.5,11.32 16.44,10.66 16.36,10H19.74C19.9,10.64 20,11.31 20,12C20,12.69 19.9,13.36 19.74,14M14.59,19.56C15.19,18.45 15.65,17.25 15.97,16H18.92C17.96,17.65 16.43,18.93 14.59,19.56M14.34,14H9.66C9.56,13.34 9.5,12.68 9.5,12C9.5,11.32 9.56,10.65 9.66,10H14.34C14.43,10.65 14.5,11.32 14.5,12C14.5,12.68 14.43,13.34 14.34,14M12,19.96C11.17,18.76 10.5,17.43 10.09,16H13.91C13.5,17.43 12.83,18.76 12,19.96M8,8H5.08C6.03,6.34 7.57,5.06 9.4,4.44C8.8,5.55 8.35,6.75 8,8M5.08,16H8C8.35,17.25 8.8,18.45 9.4,19.56C7.57,18.93 6.03,17.65 5.08,16M4.26,14C4.1,13.36 4,12.69 4,12C4,11.31 4.1,10.64 4.26,10H7.64C7.56,10.66 7.5,11.32 7.5,12C7.5,12.68 7.56,13.34 7.64,14M12,4.03C12.83,5.23 13.5,6.57 13.91,8H10.09C10.5,6.57 11.17,5.23 12,4.03M18.92,8H15.97C15.65,6.75 15.19,5.55 14.59,4.44C16.43,5.07 17.96,6.34 18.92,8M12,2C6.47,2 2,6.5 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z";
function toDate(argument) {
const argStr = Object.prototype.toString.call(argument);
if (argument instanceof Date || typeof argument === "object" && argStr === "[object Date]") {
return new argument.constructor(+argument);
} else if (typeof argument === "number" || argStr === "[object Number]" || typeof argument === "string" || argStr === "[object String]") {
return new Date(argument);
} else {
return new Date(NaN);
}
}
function constructFrom(date, value) {
if (date instanceof Date) {
return new date.constructor(value);
} else {
return new Date(value);
}
}
function addDays(date, amount) {
const _date = toDate(date);
if (isNaN(amount))
return constructFrom(date, NaN);
if (!amount) {
return _date;
}
_date.setDate(_date.getDate() + amount);
return _date;
}
function addMonths(date, amount) {
const _date = toDate(date);
if (isNaN(amount))
return constructFrom(date, NaN);
if (!amount) {
return _date;
}
const dayOfMonth = _date.getDate();
const endOfDesiredMonth = constructFrom(date, _date.getTime());
endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);
const daysInMonth = endOfDesiredMonth.getDate();
if (dayOfMonth >= daysInMonth) {
return endOfDesiredMonth;
} else {
_date.setFullYear(
endOfDesiredMonth.getFullYear(),
endOfDesiredMonth.getMonth(),
dayOfMonth
);
return _date;
}
}
function add(date, duration) {
const {
years = 0,
months = 0,
weeks = 0,
days = 0,
hours = 0,
minutes = 0,
seconds = 0
} = duration;
const _date = toDate(date);
const dateWithMonths = months || years ? addMonths(_date, months + years * 12) : _date;
const dateWithDays = days || weeks ? addDays(dateWithMonths, days + weeks * 7) : dateWithMonths;
const minutesToAdd = minutes + hours * 60;
const secondsToAdd = seconds + minutesToAdd * 60;
const msToAdd = secondsToAdd * 1e3;
const finalDate = constructFrom(date, dateWithDays.getTime() + msToAdd);
return finalDate;
}
const millisecondsInWeek = 6048e5;
const millisecondsInMinute = 6e4;
const millisecondsInHour = 36e5;
const millisecondsInSecond = 1e3;
const minutesInMonth = 43200;
const minutesInDay = 1440;
let defaultOptions$1 = {};
function getDefaultOptions$1() {
return defaultOptions$1;
}
function startOfWeek(date, options) {
const defaultOptions2 = getDefaultOptions$1();
const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0;
const _date = toDate(date);
const day = _date.getDay();
const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
_date.setDate(_date.getDate() - diff);
_date.setHours(0, 0, 0, 0);
return _date;
}
function startOfISOWeek(date) {
return startOfWeek(date, { weekStartsOn: 1 });
}
function getISOWeekYear(date) {
const _date = toDate(date);
const year = _date.getFullYear();
const fourthOfJanuaryOfNextYear = constructFrom(date, 0);
fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
const fourthOfJanuaryOfThisYear = constructFrom(date, 0);
fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
if (_date.getTime() >= startOfNextYear.getTime()) {
return year + 1;
} else if (_date.getTime() >= startOfThisYear.getTime()) {
return year;
} else {
return year - 1;
}
}
function getTimezoneOffsetInMilliseconds(date) {
const _date = toDate(date);
const utcDate = new Date(
Date.UTC(
_date.getFullYear(),
_date.getMonth(),
_date.getDate(),
gitextract_f7ynjoip/ ├── .eslintignore ├── .eslintrc.json ├── .gitattributes ├── .github/ │ └── FUNDING.yml ├── .gitignore ├── .npmrc ├── .vscode/ │ └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.en.md ├── README.md ├── dist/ │ └── yandere-masonry.user.js ├── docs/ │ ├── README.old.en.md │ └── README.old.md ├── header.config.js ├── index.html ├── package.json ├── packages/ │ ├── booru/ │ │ ├── LICENSE.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ ├── package.json │ │ ├── readme.md │ │ └── readme.zh-cn.md │ ├── release/ │ │ ├── index.d.ts │ │ ├── index.mjs │ │ └── package.json │ ├── true-masonry/ │ │ ├── index.ts │ │ └── package.json │ ├── vite-plugin-userscript/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── index.d.ts │ │ ├── index.js │ │ ├── index.mjs │ │ └── package.json │ ├── vue-masonry-css/ │ │ ├── LICENSE │ │ ├── README.md │ │ ├── index.ts │ │ └── package.json │ └── vue-virtual-waterfall/ │ ├── VirtualWaterfall.vue │ ├── index.ts │ └── package.json ├── pnpm-workspace.yaml ├── scripts/ │ ├── postbuild.mjs │ └── release.mjs ├── src/ │ ├── App.vue │ ├── api/ │ │ ├── all-girl.ts │ │ ├── anihonetwallpaper.ts │ │ ├── anime-pictures.ts │ │ ├── autocomplete.ts │ │ ├── booru.ts │ │ ├── danbooru.ts │ │ ├── e-shuushuu.ts │ │ ├── fav.ts │ │ ├── gelbooru.ts │ │ ├── hentaibooru.ts │ │ ├── index.ts │ │ ├── kusowanka.ts │ │ ├── moebooru.ts │ │ ├── nozomi.ts │ │ ├── r34-paheal.ts │ │ ├── realbooru.ts │ │ ├── rule34.ts │ │ ├── rule34hentai.ts │ │ ├── sankaku-complex.ts │ │ ├── sankaku-idol.ts │ │ ├── sankaku-idol_unused.ts │ │ ├── sankaku.ts │ │ └── zerochan.ts │ ├── components/ │ │ ├── AppBar.vue │ │ ├── AppContainer.vue │ │ ├── DPlayer.vue │ │ ├── NavDrawer.vue │ │ ├── PoolList.vue │ │ ├── PostDetail.vue │ │ ├── PostExportTags.vue │ │ ├── PostList.vue │ │ ├── SettingsDrawer.vue │ │ ├── Snackbar.vue │ │ └── WfLayout.vue │ ├── data/ │ │ ├── all_tags_cn.json │ │ ├── all_tags_cn.min.json │ │ ├── all_tags_cn_space.json │ │ ├── all_tags_cn_space.min.json │ │ ├── danbooru.csv │ │ ├── danbooru_tags_cn.json │ │ ├── gelbooru.csv │ │ ├── handle-tags.mjs │ │ ├── moebooru_tags_cn.json │ │ ├── sankakucomplex_chan.csv │ │ ├── tags_cn.json │ │ └── yande.csv │ ├── env.d.ts │ ├── locales/ │ │ ├── en.json │ │ ├── ja.json │ │ ├── zh-Hans.json │ │ └── zh-Hant.json │ ├── main.ts │ ├── plugins/ │ │ ├── vuetify.ts │ │ └── webfontloader.ts │ ├── prepare.ts │ ├── store/ │ │ ├── actions/ │ │ │ ├── _util.ts │ │ │ ├── detail.ts │ │ │ ├── post.ts │ │ │ └── site.ts │ │ ├── index.ts │ │ └── settings.ts │ ├── styles/ │ │ ├── custom.css │ │ ├── konachan.css │ │ ├── prepare.css │ │ └── yandere.css │ └── utils/ │ ├── fsa.ts │ ├── i18n.ts │ └── index.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts
SYMBOL INDEX (831 symbols across 44 files)
FILE: dist/yandere-masonry.user.js
function doNotRun (line 123) | function doNotRun() {
function sleep (line 127) | function sleep(ms) {
function isMoebooru (line 130) | function isMoebooru() {
function prepareApp (line 133) | async function prepareApp(callback) {
function initLayout (line 189) | async function initLayout() {
function addWfTypeSelect (line 204) | function addWfTypeSelect() {
function initMasonry (line 223) | async function initMasonry() {
function addSiteStyle (line 227) | function addSiteStyle() {
function setMoebooruLocale (line 237) | function setMoebooruLocale() {
function addMoeLocaleSelect (line 254) | function addMoeLocaleSelect() {
function bindDblclick (line 268) | function bindDblclick() {
function setTagText (line 277) | function setTagText(seletcor, textEn, display) {
function translateTags (line 286) | async function translateTags() {
function translateDanbooruTags (line 301) | async function translateDanbooruTags() {
function removeOldListeners (line 320) | function removeOldListeners() {
function setMasonryMode (line 344) | function setMasonryMode(fn) {
function loadScript (line 359) | function loadScript(src) {
function loadDeps (line 377) | async function loadDeps() {
function replaceDocument (line 383) | function replaceDocument() {
function _interopDefaultLegacy (line 414) | function _interopDefaultLegacy(e) {
method data (line 482) | data() {
method mounted (line 489) | mounted() {
method updated (line 497) | updated() {
method beforeDestroy (line 502) | beforeDestroy() {
method reCalculate (line 508) | reCalculate() {
method _reCalculateGutterSize (line 517) | _reCalculateGutterSize(windowWidth) {
method _reCalculateColumnCount (line 520) | _reCalculateColumnCount(windowWidth) {
method _getChildItemsInColumnsArray (line 525) | _getChildItemsInColumnsArray() {
method render (line 545) | render(createElement) {
method data (line 648) | data() {
method mounted (line 655) | mounted() {
method activated (line 661) | activated() {
method updated (line 666) | updated() {
method beforeDestroy (line 671) | beforeDestroy() {
method getChildItemsInColumnsArray (line 675) | getChildItemsInColumnsArray() {
method _getSize (line 679) | _getSize(elemm) {
method _resizeMasonryItem (line 703) | _resizeMasonryItem(item) {
method _resizeAllMasonryItems (line 710) | _resizeAllMasonryItems() {
method _reCalculate (line 716) | _reCalculate(force) {
method _buildGrid (line 727) | _buildGrid() {
method _reCalculateColumnCount (line 732) | _reCalculateColumnCount(windowWidth) {
method _reCalculateGutterSize (line 739) | _reCalculateGutterSize(windowWidth) {
method render (line 743) | render(h) {
function tryOnScopeDispose (line 766) | function tryOnScopeDispose(fn) {
function toValue (line 773) | function toValue(r) {
function getLifeCycleTarget (line 783) | function getLifeCycleTarget(target) {
function tryOnMounted (line 786) | function tryOnMounted(fn, sync = true, target) {
function unrefElement (line 795) | function unrefElement(elRef) {
function useEventListener (line 804) | function useEventListener(...args) {
function useMounted (line 852) | function useMounted() {
function useSupported (line 862) | function useSupported(callback) {
function useMutationObserver (line 869) | function useMutationObserver(target, callback, options = {}) {
function useMediaQuery (line 909) | function useMediaQuery(query2, options = {}) {
function useResizeObserver (line 943) | function useResizeObserver(target, callback, options = {}) {
function useElementBounding (line 981) | function useElementBounding(target, options = {}) {
function useElementSize (line 1053) | function useElementSize(target, initialSize = { width: 0, height: 0 }, o...
function useWindowSize (line 1109) | function useWindowSize(options = {}) {
method setup (line 1156) | setup(__props, { expose }) {
function normalizeComponent (line 1263) | function normalizeComponent(scriptExports, render, staticRenderFns, func...
function installVuetify (line 1346) | function installVuetify() {
function useVuetify (line 1367) | function useVuetify() {
function toggleDrawer (line 2349) | function toggleDrawer() {
function addToSelectedList (line 2352) | function addToSelectedList(item) {
function removeFromSelectedList (line 2358) | function removeFromSelectedList(id) {
method setup (line 2367) | setup(__props) {
function toDate (line 2475) | function toDate(argument) {
function constructFrom (line 2485) | function constructFrom(date, value) {
function addDays (line 2492) | function addDays(date, amount) {
function addMonths (line 2502) | function addMonths(date, amount) {
function add (line 2524) | function add(date, duration) {
function getDefaultOptions$1 (line 2550) | function getDefaultOptions$1() {
function startOfWeek (line 2553) | function startOfWeek(date, options) {
function startOfISOWeek (line 2563) | function startOfISOWeek(date) {
function getISOWeekYear (line 2566) | function getISOWeekYear(date) {
function getTimezoneOffsetInMilliseconds (line 2585) | function getTimezoneOffsetInMilliseconds(date) {
function startOfISOWeekYear (line 2601) | function startOfISOWeekYear(date) {
function compareAsc (line 2608) | function compareAsc(dateLeft, dateRight) {
function constructNow (line 2620) | function constructNow(date) {
function isDate (line 2623) | function isDate(value) {
function isValid (line 2626) | function isValid(date) {
function differenceInCalendarMonths (line 2633) | function differenceInCalendarMonths(dateLeft, dateRight) {
function getRoundingMethod (line 2640) | function getRoundingMethod(method) {
function differenceInMilliseconds (line 2647) | function differenceInMilliseconds(dateLeft, dateRight) {
function endOfDay (line 2650) | function endOfDay(date) {
function endOfMonth (line 2655) | function endOfMonth(date) {
function isLastDayOfMonth (line 2662) | function isLastDayOfMonth(date) {
function differenceInMonths (line 2666) | function differenceInMonths(dateLeft, dateRight) {
function differenceInSeconds (line 2689) | function differenceInSeconds(dateLeft, dateRight, options) {
function buildFormatLongFn (line 2775) | function buildFormatLongFn(args) {
function buildLocalizeFn (line 2823) | function buildLocalizeFn(args) {
function buildMatchFn (line 3000) | function buildMatchFn(args) {
function findKey (line 3018) | function findKey(object, predicate) {
function findIndex (line 3026) | function findIndex(array, predicate) {
function buildMatchPatternFn (line 3034) | function buildMatchPatternFn(args) {
function getISOWeek (line 3178) | function getISOWeek(date) {
function getWeekYear (line 3183) | function getWeekYear(date, options) {
function startOfWeekYear (line 3204) | function startOfWeekYear(date, options) {
function getWeek (line 3214) | function getWeek(date, options) {
function isProtectedDayOfYearToken (line 3277) | function isProtectedDayOfYearToken(token) {
function isProtectedWeekYearToken (line 3280) | function isProtectedWeekYearToken(token) {
function warnOrThrowProtectedError (line 3283) | function warnOrThrowProtectedError(token, format, input) {
function message (line 3289) | function message(token, format, input) {
function formatDistance (line 3293) | function formatDistance(date, baseDate, options) {
function formatDistanceToNow (line 3372) | function formatDistanceToNow(date, options) {
function getDefaultOptions (line 3375) | function getDefaultOptions() {
function getISODay (line 3378) | function getISODay(date) {
function transpose (line 3386) | function transpose(fromDate, constructor) {
class Setter (line 3402) | class Setter {
method constructor (line 3403) | constructor() {
method validate (line 3406) | validate(_utcDate, _options) {
class ValueSetter (line 3410) | class ValueSetter extends Setter {
method constructor (line 3411) | constructor(value, validateValue, setValue, priority, subPriority) {
method validate (line 3421) | validate(date, options) {
method set (line 3424) | set(date, flags, options) {
class DateToSystemTimezoneSetter (line 3428) | class DateToSystemTimezoneSetter extends Setter {
method constructor (line 3429) | constructor() {
method set (line 3434) | set(date, flags) {
class Parser (line 3440) | class Parser {
method run (line 3441) | run(dateString, token, match2, options) {
method validate (line 3457) | validate(_utcDate, _value, _options) {
class EraParser (line 3461) | class EraParser extends Parser {
method constructor (line 3462) | constructor() {
method parse (line 3467) | parse(dateString, token, match2) {
method set (line 3480) | set(date, flags, value) {
function mapValue (line 3515) | function mapValue(parseFnResult, mapFn) {
function parseNumericPattern (line 3524) | function parseNumericPattern(pattern, dateString) {
function parseTimezonePattern (line 3534) | function parseTimezonePattern(pattern, dateString) {
function parseAnyDigitsSigned (line 3554) | function parseAnyDigitsSigned(dateString) {
function parseNDigits (line 3557) | function parseNDigits(n, dateString) {
function parseNDigitsSigned (line 3571) | function parseNDigitsSigned(n, dateString) {
function dayPeriodEnumToHours (line 3585) | function dayPeriodEnumToHours(dayPeriod) {
function normalizeTwoDigitYear (line 3602) | function normalizeTwoDigitYear(twoDigitYear, currentYear) {
function isLeapYearIndex (line 3616) | function isLeapYearIndex(year) {
class YearParser (line 3619) | class YearParser extends Parser {
method constructor (line 3620) | constructor() {
method parse (line 3625) | parse(dateString, token, match2) {
method validate (line 3644) | validate(_date, value) {
method set (line 3647) | set(date, flags, value) {
class LocalWeekYearParser (line 3664) | class LocalWeekYearParser extends Parser {
method constructor (line 3665) | constructor() {
method parse (line 3684) | parse(dateString, token, match2) {
method validate (line 3703) | validate(_date, value) {
method set (line 3706) | set(date, flags, value, options) {
class ISOWeekYearParser (line 3727) | class ISOWeekYearParser extends Parser {
method constructor (line 3728) | constructor() {
method parse (line 3749) | parse(dateString, token) {
method set (line 3755) | set(date, _flags, value) {
class ExtendedYearParser (line 3762) | class ExtendedYearParser extends Parser {
method constructor (line 3763) | constructor() {
method parse (line 3768) | parse(dateString, token) {
method set (line 3774) | set(date, _flags, value) {
class QuarterParser (line 3780) | class QuarterParser extends Parser {
method constructor (line 3781) | constructor() {
method parse (line 3801) | parse(dateString, token, match2) {
method validate (line 3835) | validate(_date, value) {
method set (line 3838) | set(date, _flags, value) {
class StandAloneQuarterParser (line 3844) | class StandAloneQuarterParser extends Parser {
method constructor (line 3845) | constructor() {
method parse (line 3865) | parse(dateString, token, match2) {
method validate (line 3899) | validate(_date, value) {
method set (line 3902) | set(date, _flags, value) {
class MonthParser (line 3908) | class MonthParser extends Parser {
method constructor (line 3909) | constructor() {
method parse (line 3928) | parse(dateString, token, match2) {
method validate (line 3963) | validate(_date, value) {
method set (line 3966) | set(date, _flags, value) {
class StandAloneMonthParser (line 3972) | class StandAloneMonthParser extends Parser {
method constructor (line 3973) | constructor() {
method parse (line 3992) | parse(dateString, token, match2) {
method validate (line 4027) | validate(_date, value) {
method set (line 4030) | set(date, _flags, value) {
function setWeek (line 4036) | function setWeek(date, week, options) {
class LocalWeekParser (line 4042) | class LocalWeekParser extends Parser {
method constructor (line 4043) | constructor() {
method parse (line 4062) | parse(dateString, token, match2) {
method validate (line 4072) | validate(_date, value) {
method set (line 4075) | set(date, _flags, value, options) {
function setISOWeek (line 4079) | function setISOWeek(date, week) {
class ISOWeekParser (line 4085) | class ISOWeekParser extends Parser {
method constructor (line 4086) | constructor() {
method parse (line 4106) | parse(dateString, token, match2) {
method validate (line 4116) | validate(_date, value) {
method set (line 4119) | set(date, _flags, value) {
class DateParser (line 4138) | class DateParser extends Parser {
method constructor (line 4139) | constructor() {
method parse (line 4158) | parse(dateString, token, match2) {
method validate (line 4168) | validate(date, value) {
method set (line 4178) | set(date, _flags, value) {
class DayOfYearParser (line 4184) | class DayOfYearParser extends Parser {
method constructor (line 4185) | constructor() {
method parse (line 4207) | parse(dateString, token, match2) {
method validate (line 4218) | validate(date, value) {
method set (line 4227) | set(date, _flags, value) {
function setDay (line 4233) | function setDay(date, day, options) {
class DayParser (line 4244) | class DayParser extends Parser {
method constructor (line 4245) | constructor() {
method parse (line 4250) | parse(dateString, token, match2) {
method validate (line 4274) | validate(_date, value) {
method set (line 4277) | set(date, _flags, value, options) {
class LocalDayParser (line 4283) | class LocalDayParser extends Parser {
method constructor (line 4284) | constructor() {
method parse (line 4305) | parse(dateString, token, match2, options) {
method validate (line 4341) | validate(_date, value) {
method set (line 4344) | set(date, _flags, value, options) {
class StandAloneLocalDayParser (line 4350) | class StandAloneLocalDayParser extends Parser {
method constructor (line 4351) | constructor() {
method parse (line 4372) | parse(dateString, token, match2, options) {
method validate (line 4408) | validate(_date, value) {
method set (line 4411) | set(date, _flags, value, options) {
function setISODay (line 4417) | function setISODay(date, day) {
class ISODayParser (line 4423) | class ISODayParser extends Parser {
method constructor (line 4424) | constructor() {
method parse (line 4445) | parse(dateString, token, match2) {
method validate (line 4511) | validate(_date, value) {
method set (line 4514) | set(date, _flags, value) {
class AMPMParser (line 4520) | class AMPMParser extends Parser {
method constructor (line 4521) | constructor() {
method parse (line 4526) | parse(dateString, token, match2) {
method set (line 4557) | set(date, _flags, value) {
class AMPMMidnightParser (line 4562) | class AMPMMidnightParser extends Parser {
method constructor (line 4563) | constructor() {
method parse (line 4568) | parse(dateString, token, match2) {
method set (line 4599) | set(date, _flags, value) {
class DayPeriodParser (line 4604) | class DayPeriodParser extends Parser {
method constructor (line 4605) | constructor() {
method parse (line 4610) | parse(dateString, token, match2) {
method set (line 4641) | set(date, _flags, value) {
class Hour1to12Parser (line 4646) | class Hour1to12Parser extends Parser {
method constructor (line 4647) | constructor() {
method parse (line 4652) | parse(dateString, token, match2) {
method validate (line 4662) | validate(_date, value) {
method set (line 4665) | set(date, _flags, value) {
class Hour0to23Parser (line 4677) | class Hour0to23Parser extends Parser {
method constructor (line 4678) | constructor() {
method parse (line 4683) | parse(dateString, token, match2) {
method validate (line 4693) | validate(_date, value) {
method set (line 4696) | set(date, _flags, value) {
class Hour0To11Parser (line 4701) | class Hour0To11Parser extends Parser {
method constructor (line 4702) | constructor() {
method parse (line 4707) | parse(dateString, token, match2) {
method validate (line 4717) | validate(_date, value) {
method set (line 4720) | set(date, _flags, value) {
class Hour1To24Parser (line 4730) | class Hour1To24Parser extends Parser {
method constructor (line 4731) | constructor() {
method parse (line 4736) | parse(dateString, token, match2) {
method validate (line 4746) | validate(_date, value) {
method set (line 4749) | set(date, _flags, value) {
class MinuteParser (line 4755) | class MinuteParser extends Parser {
method constructor (line 4756) | constructor() {
method parse (line 4761) | parse(dateString, token, match2) {
method validate (line 4771) | validate(_date, value) {
method set (line 4774) | set(date, _flags, value) {
class SecondParser (line 4779) | class SecondParser extends Parser {
method constructor (line 4780) | constructor() {
method parse (line 4785) | parse(dateString, token, match2) {
method validate (line 4795) | validate(_date, value) {
method set (line 4798) | set(date, _flags, value) {
class FractionOfSecondParser (line 4803) | class FractionOfSecondParser extends Parser {
method constructor (line 4804) | constructor() {
method parse (line 4809) | parse(dateString, token) {
method set (line 4813) | set(date, _flags, value) {
class ISOTimezoneWithZParser (line 4818) | class ISOTimezoneWithZParser extends Parser {
method constructor (line 4819) | constructor() {
method parse (line 4824) | parse(dateString, token) {
method set (line 4848) | set(date, flags, value) {
class ISOTimezoneParser (line 4857) | class ISOTimezoneParser extends Parser {
method constructor (line 4858) | constructor() {
method parse (line 4863) | parse(dateString, token) {
method set (line 4887) | set(date, flags, value) {
class TimestampSecondsParser (line 4896) | class TimestampSecondsParser extends Parser {
method constructor (line 4897) | constructor() {
method parse (line 4902) | parse(dateString) {
method set (line 4905) | set(date, _flags, value) {
class TimestampMillisecondsParser (line 4909) | class TimestampMillisecondsParser extends Parser {
method constructor (line 4910) | constructor() {
method parse (line 4915) | parse(dateString) {
method set (line 4918) | set(date, _flags, value) {
function parse (line 4961) | function parse(dateStr, formatStr, referenceDate, options) {
function cleanEscapedString (line 5068) | function cleanEscapedString(input) {
function subDays (line 5071) | function subDays(date, amount) {
function subMonths (line 5074) | function subMonths(date, amount) {
function sub (line 5077) | function sub(date, duration) {
function saveFile (line 5097) | async function saveFile(urlOrBlob, fileName, subdir) {
function getMainDirHandle (line 5117) | async function getMainDirHandle() {
function setMainDirHandle (line 5121) | async function setMainDirHandle() {
function verifyPermission (line 5126) | async function verifyPermission(handle) {
function writeURLToFile (line 5135) | async function writeURLToFile(fileHandle, url) {
function writeBlobToFile (line 5142) | async function writeBlobToFile(fileHandle, blob) {
function getSubDirFileHandle (line 5147) | async function getSubDirFileHandle(dirHandle, subDirName, fileName) {
function openIDB (line 5152) | function openIDB() {
function saveDirHandleToIDB (line 5165) | async function saveDirHandleToIDB(handle) {
function loadDirHandleFromIDB (line 5175) | async function loadDirHandleFromIDB() {
function isURL (line 5186) | function isURL(s) {
function downloadByGM (line 5189) | function downloadByGM(url, name, options) {
function downloadByXHR (line 5206) | function downloadByXHR(url, filename, options, returnBlob = false) {
function downloadByFsa (line 5246) | async function downloadByFsa(url, filename, subdir) {
function downloadByLink (line 5254) | function downloadByLink(source, fileName) {
function downloadFile (line 5265) | async function downloadFile(url, name, options) {
function downloadText (line 5292) | function downloadText(text, filename = "file.txt") {
function showMsg (line 5301) | function showMsg({ msg = "", type = "success" }) {
function notReachBottom (line 5304) | function notReachBottom() {
function throttleScroll (line 5308) | function throttleScroll(downFn, upFn) {
function debounce (line 5324) | function debounce(func, delay, immediate = false) {
function formatDate (line 5336) | function formatDate(date) {
function addDate (line 5342) | function addDate(num, duration, date) {
function subDate (line 5346) | function subDate(num, duration, date) {
function dragElement (line 5350) | function dragElement(sel, childSel) {
function getImageSize (line 5397) | function getImageSize(url) {
function fancyboxShow (line 5413) | async function fancyboxShow(images, index = 0) {
function getCookie (line 5495) | function getCookie(cname) {
function formatRelativeTime (line 5509) | function formatRelativeTime(dateInput) {
function uniqBy (line 5534) | function uniqBy(array, iteratee) {
function isAllGirlPage (line 5546) | function isAllGirlPage() {
function fetchAllGirlPosts (line 5549) | async function fetchAllGirlPosts(page, tags) {
function getAllGirlDetail (line 5580) | async function getAllGirlDetail(id) {
function isAnihonetwallpaperPage (line 5592) | function isAnihonetwallpaperPage() {
function fetchAnihonetwallpaperPosts (line 5595) | async function fetchAnihonetwallpaperPosts(page, tags) {
function isAnimePicturesPage (line 5627) | function isAnimePicturesPage() {
function fetchAnimePicturesPosts (line 5630) | async function fetchAnimePicturesPosts(page, tags) {
function getAnimePicturesDetail (line 5665) | async function getAnimePicturesDetail(id) {
function getAugmentedNamespace (line 5682) | function getAugmentedNamespace(n) {
function unfetch_module (line 5697) | function unfetch_module(e, n) {
method constructor (line 6026) | constructor(message2) {
function expandTags (line 6036) | function expandTags(tags) {
function searchURI (line 6042) | function searchURI(site, tags = [], limit = 100, page = 1, credentials) {
function resolveSite (line 6062) | function resolveSite(domain2) {
function jsonfy (line 6078) | function jsonfy(xml) {
function tryParseJSON (line 6103) | function tryParseJSON(data) {
function shuffle (line 6109) | function shuffle(array) {
function compareArrays (line 6122) | function compareArrays(arr1, arr2) {
function parseImageUrl (line 6127) | function parseImageUrl(url, data, booru, type = "file") {
function getTags (line 6158) | function getTags(data) {
function fromTagString (line 6174) | function fromTagString(tags) {
function formatFileSize (line 6177) | function formatFileSize(size) {
function getFileExt (line 6188) | function getFileExt(url) {
function dealDanbooruPreviewUrl (line 6191) | function dealDanbooruPreviewUrl(url, booru) {
method constructor (line 6201) | constructor(data, booru) {
method isRatingS (line 6296) | get isRatingS() {
method isRatingQ (line 6299) | get isRatingQ() {
method isRatingE (line 6302) | get isRatingE() {
method aspectRatio (line 6305) | get aspectRatio() {
method jpegUrl (line 6308) | get jpegUrl() {
method jpegWidth (line 6311) | get jpegWidth() {
method jpegHeight (line 6314) | get jpegHeight() {
method fileExt (line 6317) | get fileExt() {
method sampleSize (line 6320) | get sampleSize() {
method jpegSize (line 6323) | get jpegSize() {
method fileSize (line 6326) | get fileSize() {
method sampleSizeText (line 6329) | get sampleSizeText() {
method sampleDownloadText (line 6332) | get sampleDownloadText() {
method sampleDownloadName (line 6335) | get sampleDownloadName() {
method jpegSizeText (line 6338) | get jpegSizeText() {
method jpegDownloadText (line 6341) | get jpegDownloadText() {
method jpegDownloadName (line 6344) | get jpegDownloadName() {
method fileSizeText (line 6347) | get fileSizeText() {
method fileDownloadText (line 6350) | get fileDownloadText() {
method fileDownloadName (line 6353) | get fileDownloadName() {
method createdTime (line 6356) | get createdTime() {
method sourceUrl (line 6362) | get sourceUrl() {
method postView (line 6372) | get postView() {
method constructor (line 6377) | constructor(posts, tags, options, booru) {
method first (line 6393) | get first() {
method last (line 6396) | get last() {
method nextPage (line 6399) | nextPage() {
method tagged (line 6404) | tagged(tags, { invert = false } = {}) {
method blacklist (line 6417) | blacklist(tags) {
method constructor (line 6422) | constructor(site, credentials) {
method normalizeTags (line 6434) | normalizeTags(tags) {
method search (line 6441) | async search(tags, {
method postView (line 6474) | postView(id) {
method doSearchRequest (line 6480) | async doSearchRequest(tags, {
method getSearchUrl (line 6526) | getSearchUrl({
method parseSearchResult (line 6534) | parseSearchResult(result, {
method constructor (line 6583) | constructor(site, credentials) {
method search (line 6586) | search(tags, { limit = 1, random = false, page = 0 } = {}) {
method constructor (line 6599) | constructor(site, credentials) {
method constructor (line 6604) | constructor(data) {
function booruFrom (line 6634) | function booruFrom(booruSite, credentials) {
function booruForSite (line 6637) | function booruForSite(site, credentials = null) {
function search (line 6644) | function search(site, tags = [], { limit = 1, random = false, page = 1, ...
function isSankakuComplexPage (line 6664) | function isSankakuComplexPage() {
function fetchSankakuComplexPosts (line 6676) | async function fetchSankakuComplexPosts(page, tags) {
function getSankakuComplexDetail (line 6717) | async function getSankakuComplexDetail(id) {
function isSankakuIdolPage (line 6729) | function isSankakuIdolPage() {
function fetchSankakuIdolPosts (line 6733) | async function fetchSankakuIdolPosts(page, tags) {
function getSankakuIdolDetail (line 6773) | async function getSankakuIdolDetail(id) {
function isSankakuPage (line 6789) | function isSankakuPage() {
function fetchSankakuPosts (line 6793) | async function fetchSankakuPosts(page, tags) {
function getSankakuDetail (line 6833) | async function getSankakuDetail(id) {
function getSiteTitle (line 6931) | function getSiteTitle(domain2 = location.host) {
function searchBooru (line 6950) | async function searchBooru(page, tags) {
function isEshuushuuPage (line 6992) | function isEshuushuuPage() {
function extract (line 6995) | function extract(allData) {
function fetchEshuushuuPosts (line 7040) | async function fetchEshuushuuPosts(page, tags) {
function getTagDetail (line 7082) | function getTagDetail(image) {
function isGelbooruFavPage (line 7110) | function isGelbooruFavPage() {
function isGelbooruPage (line 7113) | function isGelbooruPage() {
function fetchGelbooruPosts (line 7116) | async function fetchGelbooruPosts(page) {
function fetchGelbooruFavorites (line 7150) | async function fetchGelbooruFavorites(page) {
function addFavoriteGelbooru (line 7184) | async function addFavoriteGelbooru(id) {
function isHentaiBooruPage (line 7207) | function isHentaiBooruPage() {
function fetchHentaiBooruPosts (line 7210) | async function fetchHentaiBooruPosts(page, tags) {
function getHentaiBooruDetail (line 7254) | async function getHentaiBooruDetail(id) {
function isKusowankaPage (line 7266) | function isKusowankaPage() {
function fetchKusowankaPosts (line 7269) | async function fetchKusowankaPosts(page, tags) {
function getKusowankaDetail (line 7296) | async function getKusowankaDetail(id) {
function getYandereUserId (line 7315) | function getYandereUserId() {
function getKonachanUsername (line 7319) | function getKonachanUsername() {
function getUsername (line 7324) | async function getUsername() {
function getPostDetail (line 7360) | async function getPostDetail(id) {
function addPostToFavorites$1 (line 7391) | async function addPostToFavorites$1(id) {
function isPopularPage (line 7413) | function isPopularPage() {
function isPoolShowPage (line 7416) | function isPoolShowPage() {
function fetchPostsByPath (line 7419) | async function fetchPostsByPath(postsKey, page) {
function splitTags (line 7430) | function splitTags(tagsData, limit, searchTerm) {
function getTagsString (line 7438) | function getTagsString(key) {
function searchTagsByName (line 7441) | function searchTagsByName(searchTerm) {
function getRecentTags (line 7446) | function getRecentTags() {
function fetchPools (line 7449) | async function fetchPools(page, query2) {
function isYandereHtml (line 7472) | function isYandereHtml() {
function fetchPostsByHtml (line 7475) | async function fetchPostsByHtml(page, tags) {
function isNozomiPage (line 7514) | function isNozomiPage() {
function fetchNozomiPosts (line 7518) | function fetchNozomiPosts(page) {
function path_from_postid (line 7579) | function path_from_postid(postid) {
function fetch_nozomi (line 7584) | function fetch_nozomi(page) {
function get_jsons (line 7613) | function get_jsons() {
function get_json (line 7631) | function get_json(postid) {
function results_to_page (line 7649) | function results_to_page(datas) {
function isRule34Page (line 7671) | function isRule34Page() {
function isRule34FavPage (line 7674) | function isRule34FavPage() {
function isRule34Firefox (line 7677) | function isRule34Firefox() {
function fetchRule34Posts (line 7680) | async function fetchRule34Posts(page, tags) {
function fetchRule34Favorites (line 7721) | async function fetchRule34Favorites(page) {
function addFavoriteRule34 (line 7754) | async function addFavoriteRule34(id) {
function isR34PahealPage (line 7781) | function isR34PahealPage() {
function isR34PahealHome (line 7784) | function isR34PahealHome() {
function fetchR34PahealPosts (line 7787) | async function fetchR34PahealPosts(page, tags) {
function isRealbooruPage (line 7836) | function isRealbooruPage() {
function fetchRealbooruPosts (line 7839) | async function fetchRealbooruPosts(page, tags) {
function isRule34HentaiPage (line 7879) | function isRule34HentaiPage() {
function fetchRule34HentaiPosts (line 7882) | async function fetchRule34HentaiPosts(page, tags) {
function isZerochanPage (line 7926) | function isZerochanPage() {
function openApiWindow (line 7930) | function openApiWindow() {
function fetchZerochanPosts (line 7946) | async function fetchZerochanPosts(page, tags) {
function getZerochanFileUrl (line 7972) | async function getZerochanFileUrl(id) {
function getFirstPageNo (line 8015) | function getFirstPageNo(params2) {
function pushPageState (line 8022) | function pushPageState(pageNo, latePageQuery = false) {
function handleBlacklist (line 8036) | function handleBlacklist(results) {
function fetchDanbooruAutocomplete (line 8128) | async function fetchDanbooruAutocomplete(term) {
function fetchGelbooruAutocomplete (line 8136) | async function fetchGelbooruAutocomplete(term) {
function fetchRule34Autocomplete (line 8144) | async function fetchRule34Autocomplete(term) {
function fetchEshuushuuAutocomplete (line 8152) | async function fetchEshuushuuAutocomplete(term) {
method setup (line 8175) | setup(__props) {
method setup (line 8580) | setup(__props) {
method setup (line 8679) | setup(__props) {
method data (line 8891) | data() {
method mounted (line 8896) | async mounted() {
method beforeDestroy (line 8903) | beforeDestroy() {
method initPlayer (line 8908) | initPlayer() {
method render (line 8922) | render(h) {
method setup (line 8949) | setup(__props) {
function isDanbooruPage (line 9103) | function isDanbooruPage() {
function getDanbooruTagDetail (line 9108) | function getDanbooruTagDetail(image) {
function addFavoriteDanbooru (line 9144) | async function addFavoriteDanbooru(id) {
function handlePostDetail (line 9174) | async function handlePostDetail(img) {
function setPostDetail (line 9183) | async function setPostDetail(imageSelected, postDetail) {
method setup (line 9218) | setup(__props) {
method setup (line 9703) | setup(__props) {
method setup (line 9938) | setup(__props) {
method setup (line 10031) | setup(__props) {
method setup (line 10067) | setup(__props) {
method setup (line 10089) | setup(__props) {
function initApp (line 10116) | function initApp() {
FILE: packages/booru/index.d.ts
type SearchParameters (line 9) | interface SearchParameters {
type InternalSearchParameters (line 30) | interface InternalSearchParameters extends SearchParameters {
class Post (line 59) | class Post {
class SearchResults (line 188) | class SearchResults extends Array<Post> {
type SiteApi (line 245) | interface SiteApi {
type SiteInfo (line 262) | interface SiteInfo {
class Site (line 295) | class Site {
type BooruCredentials (line 329) | interface BooruCredentials {
type SearchUrlParams (line 333) | interface SearchUrlParams {
class Booru (line 357) | class Booru {
class Derpibooru (line 428) | class Derpibooru extends Booru {
class XmlBooru (line 450) | class XmlBooru extends Booru {
type SMap (line 464) | interface SMap<V> {
class BooruError (line 476) | class BooruError extends Error {
FILE: packages/booru/index.js
method constructor (line 336) | constructor(message) {
function expandTags (line 346) | function expandTags(tags) {
function searchURI (line 352) | function searchURI(site, tags = [], limit = 100, page = 1, credentials) {
function resolveSite (line 378) | function resolveSite(domain) {
function jsonfy (line 394) | function jsonfy(xml) {
function tryParseJSON (line 419) | function tryParseJSON(data) {
function shuffle (line 425) | function shuffle(array) {
function compareArrays (line 438) | function compareArrays(arr1, arr2) {
function parseImageUrl (line 445) | function parseImageUrl(url, data, booru, type = "file") {
function getTags (line 476) | function getTags(data) {
function fromTagString (line 492) | function fromTagString(tags) {
function formatFileSize (line 495) | function formatFileSize(size) {
function getFileExt (line 506) | function getFileExt(url) {
function dealDanbooruPreviewUrl (line 509) | function dealDanbooruPreviewUrl(url, booru) {
method constructor (line 537) | constructor(data, booru) {
method isRatingS (line 614) | get isRatingS() {
method isRatingQ (line 617) | get isRatingQ() {
method isRatingE (line 620) | get isRatingE() {
method aspectRatio (line 623) | get aspectRatio() {
method jpegUrl (line 626) | get jpegUrl() {
method jpegWidth (line 629) | get jpegWidth() {
method jpegHeight (line 632) | get jpegHeight() {
method fileExt (line 635) | get fileExt() {
method sampleSize (line 638) | get sampleSize() {
method jpegSize (line 641) | get jpegSize() {
method fileSize (line 644) | get fileSize() {
method sampleSizeText (line 647) | get sampleSizeText() {
method sampleDownloadText (line 650) | get sampleDownloadText() {
method sampleDownloadName (line 653) | get sampleDownloadName() {
method jpegSizeText (line 656) | get jpegSizeText() {
method jpegDownloadText (line 659) | get jpegDownloadText() {
method jpegDownloadName (line 662) | get jpegDownloadName() {
method fileSizeText (line 665) | get fileSizeText() {
method fileDownloadText (line 668) | get fileDownloadText() {
method fileDownloadName (line 671) | get fileDownloadName() {
method createdTime (line 674) | get createdTime() {
method sourceUrl (line 680) | get sourceUrl() {
method postView (line 690) | get postView() {
method constructor (line 702) | constructor(posts, tags, options, booru) {
method first (line 713) | get first() {
method last (line 716) | get last() {
method nextPage (line 719) | nextPage() {
method tagged (line 724) | tagged(tags, { invert = false } = {}) {
method blacklist (line 737) | blacklist(tags) {
method constructor (line 747) | constructor(site, credentials) {
method normalizeTags (line 756) | normalizeTags(tags) {
method search (line 763) | async search(tags, {
method postView (line 796) | postView(id) {
method doSearchRequest (line 802) | async doSearchRequest(tags, {
method getSearchUrl (line 848) | getSearchUrl({
method parseSearchResult (line 856) | parseSearchResult(result, {
method constructor (line 907) | constructor(site, credentials) {
method search (line 910) | search(tags, { limit = 1, random = false, page = 0 } = {}) {
method constructor (line 925) | constructor(site, credentials) {
method constructor (line 943) | constructor(data) {
function booruFrom (line 964) | function booruFrom(booruSite, credentials) {
function booruForSite (line 967) | function booruForSite(site, credentials = null) {
function search (line 975) | function search(site, tags = [], { limit = 1, random = false, page = 1, ...
FILE: packages/booru/index.mjs
method constructor (line 299) | constructor(message) {
function expandTags (line 309) | function expandTags(tags) {
function searchURI (line 315) | function searchURI(site, tags = [], limit = 100, page = 1, credentials) {
function resolveSite (line 341) | function resolveSite(domain) {
function jsonfy (line 357) | function jsonfy(xml) {
function tryParseJSON (line 382) | function tryParseJSON(data) {
function shuffle (line 388) | function shuffle(array) {
function compareArrays (line 401) | function compareArrays(arr1, arr2) {
function parseImageUrl (line 408) | function parseImageUrl(url, data, booru, type = "file") {
function getTags (line 439) | function getTags(data) {
function fromTagString (line 455) | function fromTagString(tags) {
function formatFileSize (line 458) | function formatFileSize(size) {
function getFileExt (line 469) | function getFileExt(url) {
function dealDanbooruPreviewUrl (line 472) | function dealDanbooruPreviewUrl(url, booru) {
method constructor (line 500) | constructor(data, booru) {
method isRatingS (line 577) | get isRatingS() {
method isRatingQ (line 580) | get isRatingQ() {
method isRatingE (line 583) | get isRatingE() {
method aspectRatio (line 586) | get aspectRatio() {
method jpegUrl (line 589) | get jpegUrl() {
method jpegWidth (line 592) | get jpegWidth() {
method jpegHeight (line 595) | get jpegHeight() {
method fileExt (line 598) | get fileExt() {
method sampleSize (line 601) | get sampleSize() {
method jpegSize (line 604) | get jpegSize() {
method fileSize (line 607) | get fileSize() {
method sampleSizeText (line 610) | get sampleSizeText() {
method sampleDownloadText (line 613) | get sampleDownloadText() {
method sampleDownloadName (line 616) | get sampleDownloadName() {
method jpegSizeText (line 619) | get jpegSizeText() {
method jpegDownloadText (line 622) | get jpegDownloadText() {
method jpegDownloadName (line 625) | get jpegDownloadName() {
method fileSizeText (line 628) | get fileSizeText() {
method fileDownloadText (line 631) | get fileDownloadText() {
method fileDownloadName (line 634) | get fileDownloadName() {
method createdTime (line 637) | get createdTime() {
method sourceUrl (line 643) | get sourceUrl() {
method postView (line 653) | get postView() {
method constructor (line 665) | constructor(posts, tags, options, booru) {
method first (line 676) | get first() {
method last (line 679) | get last() {
method nextPage (line 682) | nextPage() {
method tagged (line 687) | tagged(tags, { invert = false } = {}) {
method blacklist (line 700) | blacklist(tags) {
method constructor (line 710) | constructor(site, credentials) {
method normalizeTags (line 719) | normalizeTags(tags) {
method search (line 726) | async search(tags, {
method postView (line 759) | postView(id) {
method doSearchRequest (line 765) | async doSearchRequest(tags, {
method getSearchUrl (line 811) | getSearchUrl({
method parseSearchResult (line 819) | parseSearchResult(result, {
method constructor (line 870) | constructor(site, credentials) {
method search (line 873) | search(tags, { limit = 1, random = false, page = 0 } = {}) {
method constructor (line 888) | constructor(site, credentials) {
method constructor (line 906) | constructor(data) {
function booruFrom (line 927) | function booruFrom(booruSite, credentials) {
function booruForSite (line 930) | function booruForSite(site, credentials = null) {
function search (line 938) | function search(site, tags = [], { limit = 1, random = false, page = 1, ...
FILE: packages/release/index.mjs
function release (line 17) | async function release({ gitAdd = true, gitTag = true, gitPush = true, t...
function updateVersions (line 110) | function updateVersions(version) {
FILE: packages/true-masonry/index.ts
method data (line 97) | data() {
method mounted (line 104) | mounted() {
method activated (line 112) | activated() {
method updated (line 117) | updated() {
method beforeDestroy (line 122) | beforeDestroy() {
method getChildItemsInColumnsArray (line 126) | getChildItemsInColumnsArray() {
method _getSize (line 134) | _getSize(elemm: any) {
method _resizeMasonryItem (line 166) | _resizeMasonryItem(item: any) {
method _resizeAllMasonryItems (line 175) | _resizeAllMasonryItems() {
method _reCalculate (line 181) | _reCalculate(force: any) {
method _buildGrid (line 192) | _buildGrid() {
method _reCalculateColumnCount (line 197) | _reCalculateColumnCount(windowWidth: number) {
method _reCalculateGutterSize (line 204) | _reCalculateGutterSize(windowWidth: number) {
method render (line 208) | render(h) {
type GlobalComponents (line 233) | interface GlobalComponents {
FILE: packages/vite-plugin-userscript/index.d.ts
type Merge (line 3) | type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;
type Grant (line 6) | type Grant = typeof grants[number];
type RunAt (line 8) | type RunAt = 'document-start' | 'document-body' | 'document-end' | 'docu...
type AntiFeature (line 9) | type AntiFeature = 'ads' | 'tracking' | 'miner' | 'membership' | 'paymen...
type TmHeaderKey (line 10) | type TmHeaderKey = typeof tmHeaderKeys[number];
type BareTmHeaderConfig (line 11) | type BareTmHeaderConfig = Partial<Record<TmHeaderKey, string | string[]>>;
type TmHeaderConfig (line 12) | type TmHeaderConfig = Merge<BareTmHeaderConfig, {
type TMPluginOptions (line 21) | interface TMPluginOptions {
FILE: packages/vite-plugin-userscript/index.js
function generateClientCode (line 122) | function generateClientCode({ address, port }, entry) {
function readJSON (line 161) | function readJSON(filePath) {
function readPackageJSON (line 165) | function readPackageJSON() {
function buildName (line 169) | function buildName(name) {
function buildGlobalName (line 172) | function buildGlobalName(input) {
function buildDefaultCDN (line 192) | function buildDefaultCDN(packageName) {
function buildRequireCDN (line 200) | function buildRequireCDN(input) {
function defaultEntry (line 216) | function defaultEntry() {
function getDefinedConfig (line 221) | function getDefinedConfig() {
function parseGrant (line 241) | function parseGrant(autoGrant) {
function addUsedGrants (line 263) | function addUsedGrants(tmConfig, isDevelopment = false) {
function addExtraTmGrant (line 273) | function addExtraTmGrant(tmConfig) {
function generateTmHeader (line 284) | function generateTmHeader(mode, input, hasCss, headers) {
function generateDevelopmentCode (line 358) | function generateDevelopmentCode(address, input, entry, headers) {
function getAddress (line 369) | function getAddress(address) {
function tampermonkeyPlugin (line 379) | function tampermonkeyPlugin(options = {}) {
function defineTmHeader (line 465) | function defineTmHeader(options) {
FILE: packages/vite-plugin-userscript/index.mjs
function generateClientCode (line 103) | function generateClientCode({ address, port }, entry) {
function readJSON (line 142) | function readJSON(filePath) {
function readPackageJSON (line 146) | function readPackageJSON() {
function buildName (line 150) | function buildName(name) {
function buildGlobalName (line 153) | function buildGlobalName(input) {
function buildDefaultCDN (line 173) | function buildDefaultCDN(packageName) {
function buildRequireCDN (line 181) | function buildRequireCDN(input) {
function defaultEntry (line 197) | function defaultEntry() {
function getDefinedConfig (line 202) | function getDefinedConfig() {
function parseGrant (line 222) | function parseGrant(autoGrant) {
function addUsedGrants (line 244) | function addUsedGrants(tmConfig, isDevelopment = false) {
function addExtraTmGrant (line 254) | function addExtraTmGrant(tmConfig) {
function generateTmHeader (line 265) | function generateTmHeader(mode, input, hasCss, headers) {
function generateDevelopmentCode (line 339) | function generateDevelopmentCode(address, input, entry, headers) {
function getAddress (line 350) | function getAddress(address) {
function tampermonkeyPlugin (line 360) | function tampermonkeyPlugin(options = {}) {
function defineTmHeader (line 446) | function defineTmHeader(options) {
FILE: packages/vue-masonry-css/index.ts
method data (line 77) | data() {
method mounted (line 85) | mounted() {
method updated (line 96) | updated() {
method beforeDestroy (line 102) | beforeDestroy() {
method reCalculate (line 111) | reCalculate() {
method _reCalculateGutterSize (line 128) | _reCalculateGutterSize(windowWidth: number) {
method _reCalculateColumnCount (line 132) | _reCalculateColumnCount(windowWidth: number) {
method _getChildItemsInColumnsArray (line 141) | _getChildItemsInColumnsArray() {
method render (line 175) | render(createElement) {
type GlobalComponents (line 215) | interface GlobalComponents {
FILE: packages/vue-virtual-waterfall/index.ts
type GlobalComponents (line 7) | interface GlobalComponents {
FILE: scripts/postbuild.mjs
function main (line 3) | async function main() {
FILE: src/api/all-girl.ts
function isAllGirlPage (line 3) | function isAllGirlPage() {
function fetchAllGirlPosts (line 7) | async function fetchAllGirlPosts(page: number, tags: string | null) {
function getAllGirlDetail (line 41) | async function getAllGirlDetail(id: string) {
FILE: src/api/anihonetwallpaper.ts
function isAnihonetwallpaperPage (line 1) | function isAnihonetwallpaperPage() {
function fetchAnihonetwallpaperPosts (line 5) | async function fetchAnihonetwallpaperPosts(page: number, tags: string | ...
FILE: src/api/anime-pictures.ts
function isAnimePicturesPage (line 1) | function isAnimePicturesPage() {
function fetchAnimePicturesPosts (line 5) | async function fetchAnimePicturesPosts(page: number, tags: string | null) {
function getAnimePicturesDetail (line 41) | async function getAnimePicturesDetail(id: string) {
FILE: src/api/autocomplete.ts
function fetchDanbooruAutocomplete (line 3) | async function fetchDanbooruAutocomplete(term: string) {
function fetchGelbooruAutocomplete (line 12) | async function fetchGelbooruAutocomplete(term: string) {
function fetchRule34Autocomplete (line 21) | async function fetchRule34Autocomplete(term: string) {
function fetchEshuushuuAutocomplete (line 30) | async function fetchEshuushuuAutocomplete(term: string) {
FILE: src/api/booru.ts
function getSiteTitle (line 81) | function getSiteTitle(domain: string = location.host) {
constant BOORU_PAGE_LIMIT (line 100) | const BOORU_PAGE_LIMIT = defaultLimitMap[location.host] || 40
function searchBooru (line 104) | async function searchBooru(page: number, tags: string | null) {
FILE: src/api/danbooru.ts
function isDanbooruPage (line 5) | function isDanbooruPage() {
function getDanbooruTagDetail (line 11) | function getDanbooruTagDetail(image: Post) {
function addFavoriteDanbooru (line 49) | async function addFavoriteDanbooru(id: string) {
FILE: src/api/e-shuushuu.ts
function isEshuushuuPage (line 3) | function isEshuushuuPage() {
function extract (line 7) | function extract(allData: any[]) {
function fetchEshuushuuPosts (line 57) | async function fetchEshuushuuPosts(page: number, tags: string | null) {
function getTagDetail (line 103) | function getTagDetail(image: Record<string, any>) {
FILE: src/api/gelbooru.ts
function isGelbooruFavPage (line 5) | function isGelbooruFavPage() {
function isGelbooruPage (line 9) | function isGelbooruPage() {
function fetchGelbooruPosts (line 13) | async function fetchGelbooruPosts(page: number) {
function fetchGelbooruFavorites (line 56) | async function fetchGelbooruFavorites(page: number) {
function addFavoriteGelbooru (line 99) | async function addFavoriteGelbooru(id: string) {
FILE: src/api/hentaibooru.ts
function isHentaiBooruPage (line 1) | function isHentaiBooruPage() {
function fetchHentaiBooruPosts (line 5) | async function fetchHentaiBooruPosts(page: number, tags: string | null) {
function getHentaiBooruDetail (line 50) | async function getHentaiBooruDetail(id: string) {
FILE: src/api/kusowanka.ts
function isKusowankaPage (line 3) | function isKusowankaPage() {
function fetchKusowankaPosts (line 7) | async function fetchKusowankaPosts(page: number, tags: string | null) {
function getKusowankaDetail (line 37) | async function getKusowankaDetail(id: string) {
FILE: src/api/moebooru.ts
function getYandereUserId (line 6) | function getYandereUserId() {
function getKonachanUsername (line 11) | function getKonachanUsername() {
function getUsername (line 17) | async function getUsername() {
function checkPostIsVoted (line 41) | async function checkPostIsVoted(id: string) {
type PostDetail (line 56) | interface PostDetail {
function getPostDetail (line 76) | async function getPostDetail(id: string): Promise<PostDetail | false> {
function addPostToFavorites (line 107) | async function addPostToFavorites(id: string) {
function isPopularPage (line 130) | function isPopularPage() {
function isPoolShowPage (line 134) | function isPoolShowPage() {
function fetchPostsByPath (line 138) | async function fetchPostsByPath(postsKey?: string, page?: number): Promi...
function splitTags (line 150) | function splitTags(tagsData: string, limit: number, searchTerm?: string) {
function getTagsString (line 157) | function getTagsString(key: string): string {
function searchTagsByName (line 161) | function searchTagsByName(searchTerm?: string) {
function getRecentTags (line 166) | function getRecentTags() {
type Pool (line 170) | interface Pool {
function fetchPools (line 181) | async function fetchPools(page: number, query?: string): Promise<Pool[]> {
function isYandereHtml (line 204) | function isYandereHtml() {
function fetchPostsByHtml (line 208) | async function fetchPostsByHtml(page: number, tags: string | null) {
FILE: src/api/nozomi.ts
function isNozomiPage (line 1) | function isNozomiPage() {
function fetchNozomiPosts (line 6) | function fetchNozomiPosts(page: number) {
function path_from_postid (line 75) | function path_from_postid(postid: string) {
function fetch_nozomi (line 80) | function fetch_nozomi(page: any) {
function get_jsons (line 125) | function get_jsons() {
function get_json (line 144) | function get_json(postid: string | number) {
function results_to_page (line 164) | function results_to_page(datas: any[]) {
FILE: src/api/r34-paheal.ts
function isR34PahealPage (line 3) | function isR34PahealPage() {
function isR34PahealHome (line 7) | function isR34PahealHome() {
function fetchR34PahealPosts (line 11) | async function fetchR34PahealPosts(page: number, tags: string | null) {
FILE: src/api/realbooru.ts
function isRealbooruPage (line 3) | function isRealbooruPage() {
function fetchRealbooruPosts (line 7) | async function fetchRealbooruPosts(page: number, tags: string | null) {
FILE: src/api/rule34.ts
function isRule34Page (line 5) | function isRule34Page() {
function isRule34FavPage (line 9) | function isRule34FavPage() {
function isRule34Firefox (line 13) | function isRule34Firefox() {
function fetchRule34Posts (line 17) | async function fetchRule34Posts(page: number, tags: string | null) {
function fetchRule34Favorites (line 61) | async function fetchRule34Favorites(page: number) {
function addFavoriteRule34 (line 97) | async function addFavoriteRule34(id: string) {
FILE: src/api/rule34hentai.ts
function isRule34HentaiPage (line 1) | function isRule34HentaiPage() {
function fetchRule34HentaiPosts (line 5) | async function fetchRule34HentaiPosts(page: number, tags: string | null) {
FILE: src/api/sankaku-complex.ts
function isSankakuComplexPage (line 1) | function isSankakuComplexPage() {
function fetchSankakuComplexPosts (line 18) | async function fetchSankakuComplexPosts(page: number, tags: string | nul...
function getSankakuComplexDetail (line 60) | async function getSankakuComplexDetail(id: string) {
FILE: src/api/sankaku-idol.ts
function isSankakuIdolPage (line 1) | function isSankakuIdolPage() {
function fetchSankakuIdolPosts (line 6) | async function fetchSankakuIdolPosts(page: number, tags: string | null) {
function getSankakuIdolDetail (line 46) | async function getSankakuIdolDetail(id: string) {
FILE: src/api/sankaku-idol_unused.ts
function isSankakuIdolPage (line 1) | function isSankakuIdolPage() {
function fetchSankakuIdolPosts (line 18) | async function fetchSankakuIdolPosts(page: number, tags: string | null) {
function getSankakuIdolDetail (line 59) | async function getSankakuIdolDetail(id: string) {
FILE: src/api/sankaku.ts
function isSankakuPage (line 6) | function isSankakuPage() {
function fetchSankakuPosts (line 11) | async function fetchSankakuPosts(page: number, tags: string | null) {
function getSankakuDetail (line 51) | async function getSankakuDetail(id: string) {
FILE: src/api/zerochan.ts
function isZerochanPage (line 1) | function isZerochanPage() {
function openApiWindow (line 6) | function openApiWindow() {
function fetchZerochanPosts (line 23) | async function fetchZerochanPosts(page: number, tags: string | null) {
function getZerochanFileUrl (line 50) | async function getZerochanFileUrl(id: string) {
FILE: src/data/handle-tags.mjs
function main (line 3) | async function main() {
FILE: src/env.d.ts
type Window (line 33) | interface Window {
type FileSystemHandle (line 43) | interface FileSystemHandle {
FILE: src/main.ts
function initApp (line 13) | function initApp() {
FILE: src/plugins/vuetify.ts
function installVuetify (line 11) | function installVuetify() {
function useVuetify (line 36) | function useVuetify() {
FILE: src/prepare.ts
function doNotRun (line 9) | function doNotRun() {
function sleep (line 14) | function sleep(ms: number) {
function isMoebooru (line 18) | function isMoebooru() {
function prepareApp (line 22) | async function prepareApp(callback?: () => void) {
function initLayout (line 79) | async function initLayout() {
function addWfTypeSelect (line 93) | function addWfTypeSelect() {
function initMasonry (line 110) | async function initMasonry() {
function addSiteStyle (line 115) | function addSiteStyle() {
function setMoebooruLocale (line 127) | function setMoebooruLocale() {
function addMoeLocaleSelect (line 140) | function addMoeLocaleSelect() {
function bindDblclick (line 153) | function bindDblclick() {
function setTagText (line 163) | function setTagText(seletcor: string, textEn?: (el: HTMLElement) => stri...
function translateTags (line 172) | async function translateTags() {
function translateDanbooruTags (line 185) | async function translateDanbooruTags() {
function removeOldListeners (line 203) | function removeOldListeners() {
function setMasonryMode (line 225) | function setMasonryMode(fn: () => void) {
function loadScript (line 238) | function loadScript(src: string) {
function loadDeps (line 253) | async function loadDeps() {
function replaceDocument (line 260) | function replaceDocument() {
FILE: src/store/actions/_util.ts
function getFirstPageNo (line 7) | function getFirstPageNo(params: URLSearchParams) {
function pushPageState (line 15) | function pushPageState(pageNo: number, latePageQuery = false) {
function handleBlacklist (line 29) | function handleBlacklist(results: SearchResults & { __isR34Fav?: boolean...
FILE: src/store/actions/detail.ts
function handlePostDetail (line 12) | async function handlePostDetail(img: Ref<Post>) {
function setPostDetail (line 21) | async function setPostDetail(imageSelected: Ref<Post>, postDetail: Ref<P...
FILE: src/store/actions/site.ts
type FetchPostsAction (line 21) | interface FetchPostsAction {
type FetchDetailAction (line 52) | interface FetchDetailAction {
FILE: src/store/index.ts
type SeletedPost (line 7) | interface SeletedPost extends Post {
function toggleDrawer (line 33) | function toggleDrawer() {
function addToSelectedList (line 37) | function addToSelectedList(item: Post) {
function removeFromSelectedList (line 43) | function removeFromSelectedList(id: string) {
FILE: src/utils/fsa.ts
function saveFile (line 8) | async function saveFile(urlOrBlob: string | Blob, fileName: string, subd...
function getMainDirHandle (line 33) | async function getMainDirHandle() {
function setMainDirHandle (line 41) | async function setMainDirHandle() {
function verifyPermission (line 50) | async function verifyPermission(handle: FileSystemHandle) {
function writeURLToFile (line 68) | async function writeURLToFile(fileHandle: FileSystemFileHandle, url: str...
function writeBlobToFile (line 82) | async function writeBlobToFile(fileHandle: FileSystemFileHandle, blob: B...
function getSubDirFileHandle (line 94) | async function getSubDirFileHandle(dirHandle: FileSystemDirectoryHandle,...
function openIDB (line 100) | function openIDB() {
function saveDirHandleToIDB (line 116) | async function saveDirHandleToIDB(handle: FileSystemDirectoryHandle) {
function loadDirHandleFromIDB (line 130) | async function loadDirHandleFromIDB() {
FILE: src/utils/index.ts
function isURL (line 11) | function isURL(s: string) {
function downloadByGM (line 15) | function downloadByGM(url: string, name: string, options?: Partial<Tampe...
function downloadByXHR (line 33) | function downloadByXHR(url: string, filename: string, options?: Record<s...
function downloadByFsa (line 74) | async function downloadByFsa(url: string, filename: string, subdir?: str...
function downloadByLink (line 83) | function downloadByLink(source: string, fileName: string) {
function downloadFile (line 95) | async function downloadFile(url: string, name: string, options?: Partial...
function downloadText (line 121) | function downloadText(text: string, filename = 'file.txt') {
type MsgType (line 131) | type MsgType = 'success' | 'error'
type MessageOptions (line 132) | interface MessageOptions {
function showMsg (line 136) | function showMsg({ msg = '', type = 'success' }: MessageOptions) {
function notReachBottom (line 140) | function notReachBottom() {
type ScrollFn (line 145) | type ScrollFn = (scroll: number, ev: Event) => void
function throttleScroll (line 146) | function throttleScroll(downFn: ScrollFn, upFn?: ScrollFn) {
function debounce (line 162) | function debounce(func: Function, delay: number, immediate = false) {
function formatDate (line 200) | function formatDate(date: Date) {
function addDate (line 207) | function addDate(num: number, duration: string, date?: Date) {
function subDate (line 212) | function subDate(num: number, duration: string, date?: Date) {
function dragElement (line 217) | function dragElement(sel: string, childSel: string) {
function getLastPathsegment (line 265) | function getLastPathsegment(url: string | null) {
function getImageSize (line 269) | function getImageSize(url: string) {
function fancyboxShow (line 282) | async function fancyboxShow(images: Post[], index = 0) {
function getCookie (line 377) | function getCookie(cname: string) {
function formatRelativeTime (line 392) | function formatRelativeTime(dateInput?: Date | null): string {
function uniqBy (line 421) | function uniqBy<T>(array: T[], iteratee: ((item: T) => any) | keyof T): ...
Condensed preview — 117 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,194K chars).
[
{
"path": ".eslintignore",
"chars": 97,
"preview": "/dist\nnode_modules\n/packages/**/*.js\n/packages/**/*.mjs\n/scripts\n/**/header.config.js\n/**/*.d.ts\n"
},
{
"path": ".eslintrc.json",
"chars": 1367,
"preview": "{\n \"root\": true,\n \"env\": {\n \"browser\": true,\n \"es6\": true,\n \"greasemonkey\": true\n },\n \"parserOptions\": {\n "
},
{
"path": ".gitattributes",
"chars": 486,
"preview": "* text=auto\n\n* vue eol=lf encoding=UTF-8\n*.css eol=lf encoding=UTF-8\n*.html eol=lf encoding=UTF-8\n*.js eol=lf encoding=U"
},
{
"path": ".github/FUNDING.yml",
"chars": 342,
"preview": "# These are supported funding model platforms\n\n# github: YunYouJun # Replace with up to 4 GitHub Sponsors-enabled userna"
},
{
"path": ".gitignore",
"chars": 204,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\n*.local\n"
},
{
"path": ".npmrc",
"chars": 143,
"preview": "registry=https://registry.npmjs.org/\nshamefully-hoist=true\nstrict-peer-dependencies=false\nauto-install-peers=true\nlink-w"
},
{
"path": ".vscode/settings.json",
"chars": 370,
"preview": "{\n \"i18n-ally.localesPaths\": [\"src/locales\"],\n \"i18n-ally.sourceLanguage\": \"zh-Hans\",\n \"i18n-ally.keystyle\": \"nested\""
},
{
"path": "CHANGELOG.md",
"chars": 7136,
"preview": "## v0.37.5\n\n- fix: 修复 gelbooru 无法下载图片到子目录\n\n## v0.37.4\n\n- fix: 修复 e-shuushuu.net 无法加载\n\n## v0.37.3\n\n- fix: 修复 gelbooru 无法下"
},
{
"path": "LICENSE",
"chars": 1104,
"preview": "MIT License\n\nCopyright (c) 2022 Yumine Sakura\nCopyright (c) 2021 coderzhaoziwei\n\nPermission is hereby granted, free of c"
},
{
"path": "README.en.md",
"chars": 25186,
"preview": "# Yande.re Masonry\n\n\n[\n[\n\n\nconst { sites } = require('@himeka/booru')\n\nconst blackLis"
},
{
"path": "index.html",
"chars": 328,
"preview": "<!DOCTYPE html>\n<html lang=\"zh\">\n\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width,"
},
{
"path": "package.json",
"chars": 1281,
"preview": "{\n \"name\": \"yandere-masonry\",\n \"version\": \"0.37.5\",\n \"private\": true,\n \"description\": \"Yande.re/Konachan Waterfall L"
},
{
"path": "packages/booru/LICENSE.md",
"chars": 1119,
"preview": "# The MIT License (MIT)\n\nCopyright © `2022` `Yumine Sakura`\n\nCopyright © `2022` `Atora Suunva`\n\nPermission is hereby gra"
},
{
"path": "packages/booru/index.d.ts",
"chars": 15943,
"preview": "/**\n * @packageDocumentation\n * @module Structures\n */\n\n/**\n * Just an interface for {@link Booru}'s search params :)\n *"
},
{
"path": "packages/booru/index.js",
"chars": 25611,
"preview": "\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOw"
},
{
"path": "packages/booru/index.mjs",
"chars": 24266,
"preview": "// src/sites.json\nvar sites_default = {\n \"yande.re\": {\n domain: \"yande.re\",\n aliases: [\n \"yd\",\n \"yand\","
},
{
"path": "packages/booru/package.json",
"chars": 987,
"preview": "{\n \"name\": \"@himeka/booru\",\n \"version\": \"2.7.7\",\n \"description\": \"Search (and do other things) on a bunch of differen"
},
{
"path": "packages/booru/readme.md",
"chars": 5117,
"preview": "# booru\n\n   2022 Sakura Yumine\nCopyright (c) 2022 Thinker-ljn\n\nPermission is hereby granted, free of char"
},
{
"path": "packages/vite-plugin-userscript/README.md",
"chars": 6248,
"preview": "# vite-plugin-tm-userscript\n\n\n![]"
},
{
"path": "packages/vite-plugin-userscript/index.d.ts",
"chars": 2123,
"preview": "import { Plugin } from 'vite';\n\ndeclare type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;\n\ndeclare const grants"
},
{
"path": "packages/vite-plugin-userscript/index.js",
"chars": 14624,
"preview": "var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __get"
},
{
"path": "packages/vite-plugin-userscript/index.mjs",
"chars": 13420,
"preview": "var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPr"
},
{
"path": "packages/vite-plugin-userscript/package.json",
"chars": 492,
"preview": "{\n \"name\": \"@himeka/vite-userscript\",\n \"version\": \"1.2.1\",\n \"description\": \"A vite plugin to build userscripts mainly"
},
{
"path": "packages/vue-masonry-css/LICENSE",
"chars": 1069,
"preview": "MIT License\n\nCopyright (c) 2017 Paul Collett\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
},
{
"path": "packages/vue-masonry-css/README.md",
"chars": 3429,
"preview": "A new masonry component powered by CSS to be fast loading and free of jQuery or other dependencies. Build specifically f"
},
{
"path": "packages/vue-masonry-css/index.ts",
"chars": 5715,
"preview": "/*!\n * vue-masonry-css v1.0.3\n * https://github.com/paulcollett/vue-masonry-css\n * Released under the MIT License.\n */\n\n"
},
{
"path": "packages/vue-masonry-css/package.json",
"chars": 273,
"preview": "{\n \"name\": \"@himeka/masonry-css\",\n \"version\": \"1.0.3\",\n \"description\": \"Vue Masonry component powered by CSS, dependa"
},
{
"path": "packages/vue-virtual-waterfall/VirtualWaterfall.vue",
"chars": 5615,
"preview": "<template>\n <div\n ref=\"content\"\n :style=\"{\n position: 'relative',\n willChange: 'height',\n height: "
},
{
"path": "packages/vue-virtual-waterfall/index.ts",
"chars": 255,
"preview": "import VirtualWaterfall from './VirtualWaterfall.vue'\nexport { VirtualWaterfall }\nexport default VirtualWaterfall\n\n// 全局"
},
{
"path": "packages/vue-virtual-waterfall/package.json",
"chars": 105,
"preview": "{\n \"name\": \"@himeka/virtual-waterfall\",\n \"version\": \"1.0.8\",\n \"private\": true,\n \"main\": \"index.ts\"\n}\n"
},
{
"path": "pnpm-workspace.yaml",
"chars": 35,
"preview": "packages:\n - \"packages/*\"\n - \".\"\n"
},
{
"path": "scripts/postbuild.mjs",
"chars": 801,
"preview": "import fs from 'node:fs/promises'\n\nasync function main() {\n const distFilePath = './dist/yandere-masonry.user.js'\n con"
},
{
"path": "scripts/release.mjs",
"chars": 124,
"preview": "import { release } from '@himeka/release'\n\nrelease({ gitAdd: true, gitTag: true }).catch((err) => {\n console.error(err)"
},
{
"path": "src/App.vue",
"chars": 876,
"preview": "<template>\n <v-app>\n <AppBar />\n <NavDrawer />\n <v-main app>\n <AppContainer />\n <SettingsDrawer />\n "
},
{
"path": "src/api/all-girl.ts",
"chars": 1725,
"preview": "import { getImageSize } from '@/utils'\n\nexport function isAllGirlPage() {\n return location.hostname == 'allgirl.booru.o"
},
{
"path": "src/api/anihonetwallpaper.ts",
"chars": 1514,
"preview": "export function isAnihonetwallpaperPage() {\n return location.hostname == 'anihonetwallpaper.com'\n}\n\nexport async functi"
},
{
"path": "src/api/anime-pictures.ts",
"chars": 2245,
"preview": "export function isAnimePicturesPage() {\n return location.hostname == 'anime-pictures.net'\n}\n\nexport async function fetc"
},
{
"path": "src/api/autocomplete.ts",
"chars": 1919,
"preview": "import { searchTagsByName } from './moebooru'\n\nasync function fetchDanbooruAutocomplete(term: string) {\n const response"
},
{
"path": "src/api/booru.ts",
"chars": 4745,
"preview": "import { search, sites } from '@himeka/booru'\nimport { isSankakuSite } from './sankaku'\nimport { animepictures, realboor"
},
{
"path": "src/api/danbooru.ts",
"chars": 2288,
"preview": "import type { Post } from '@himeka/booru'\nimport { showMsg } from '@/utils'\nimport i18n from '@/utils/i18n'\n\nexport func"
},
{
"path": "src/api/e-shuushuu.ts",
"chars": 3868,
"preview": "import i18n from '@/utils/i18n'\n\nexport function isEshuushuuPage() {\n return location.hostname == 'e-shuushuu.net'\n}\n\nf"
},
{
"path": "src/api/fav.ts",
"chars": 679,
"preview": "import { addPostToFavorites as addFavoriteMoebooru } from './moebooru'\nimport { addFavoriteDanbooru } from './danbooru'\n"
},
{
"path": "src/api/gelbooru.ts",
"chars": 4739,
"preview": "import { settings } from '@/store'\nimport { getImageSize, showMsg } from '@/utils'\nimport i18n from '@/utils/i18n'\n\nexpo"
},
{
"path": "src/api/hentaibooru.ts",
"chars": 2147,
"preview": "export function isHentaiBooruPage() {\n return location.hostname == 'booru.eu'\n}\n\nexport async function fetchHentaiBooru"
},
{
"path": "src/api/index.ts",
"chars": 652,
"preview": "export { allgirl } from './all-girl'\nexport { anihonetwallpaper } from './anihonetwallpaper'\nexport { animepictures } fr"
},
{
"path": "src/api/kusowanka.ts",
"chars": 2026,
"preview": "import { getImageSize } from '@/utils'\n\nexport function isKusowankaPage() {\n return location.hostname == 'kusowanka.com"
},
{
"path": "src/api/moebooru.ts",
"chars": 9561,
"preview": "import { Post, SearchResults, forSite } from '@himeka/booru'\nimport { formatDate, showMsg } from '../utils'\nimport i18n "
},
{
"path": "src/api/nozomi.ts",
"chars": 5567,
"preview": "export function isNozomiPage() {\n return location.hostname == 'nozomi.la' && location.pathname == '/'\n}\n\nlet resPosts: "
},
{
"path": "src/api/r34-paheal.ts",
"chars": 2286,
"preview": "import { parse } from 'date-fns'\n\nexport function isR34PahealPage() {\n return location.hostname == 'rule34.paheal.net' "
},
{
"path": "src/api/realbooru.ts",
"chars": 1921,
"preview": "import { getImageSize } from '@/utils'\n\nexport function isRealbooruPage() {\n return location.hostname == 'realbooru.com"
},
{
"path": "src/api/rule34.ts",
"chars": 4635,
"preview": "import { settings } from '@/store'\nimport { getImageSize, showMsg } from '@/utils'\nimport i18n from '@/utils/i18n'\n\nexpo"
},
{
"path": "src/api/rule34hentai.ts",
"chars": 1767,
"preview": "export function isRule34HentaiPage() {\n return location.hostname == 'rule34hentai.net'\n}\n\nexport async function fetchRu"
},
{
"path": "src/api/sankaku-complex.ts",
"chars": 2761,
"preview": "export function isSankakuComplexPage() {\n return location.hostname == 'chan.sankakucomplex.com'\n}\n\nconst state: {\n bas"
},
{
"path": "src/api/sankaku-idol.ts",
"chars": 2092,
"preview": "export function isSankakuIdolPage() {\n return location.hostname == 'www.idolcomplex.com'\n}\n\nconst pageState: { next: st"
},
{
"path": "src/api/sankaku-idol_unused.ts",
"chars": 2707,
"preview": "export function isSankakuIdolPage() {\n return location.hostname == 'idol.sankakucomplex.com'\n}\n\nconst state: {\n base: "
},
{
"path": "src/api/sankaku.ts",
"chars": 2756,
"preview": "import { fetchSankakuComplexPosts, getSankakuComplexDetail, isSankakuComplexPage } from './sankaku-complex'\nimport { fet"
},
{
"path": "src/api/zerochan.ts",
"chars": 1671,
"preview": "export function isZerochanPage() {\n return location.hostname == 'www.zerochan.net'\n}\n\nlet isChallengePass = false\nfunct"
},
{
"path": "src/components/AppBar.vue",
"chars": 22137,
"preview": "<template>\n <v-app-bar app dense flat :elevation=\"2\">\n <v-app-bar-nav-icon @click=\"toggleDrawer()\" />\n <div v-if="
},
{
"path": "src/components/AppContainer.vue",
"chars": 367,
"preview": "<template>\n <v-container class=\"_vcont pa-4\" fluid>\n <PostList v-if=\"store.showPostList\" />\n <PoolList v-if=\"stor"
},
{
"path": "src/components/DPlayer.vue",
"chars": 946,
"preview": "<script>\nimport { loadScript } from '@/prepare'\n\nexport default {\n props: {\n options: {\n type: Object,\n },\n "
},
{
"path": "src/components/NavDrawer.vue",
"chars": 12126,
"preview": "<template>\n <v-navigation-drawer v-model=\"store.showDrawer\" class=\"nav_drawer\" app temporary>\n <v-list-item>\n <"
},
{
"path": "src/components/PoolList.vue",
"chars": 4977,
"preview": "<template>\n <div>\n <masonry :cols=\"columnCount\" gutter=\"8px\">\n <v-card v-for=\"item in pools\" :key=\"item.id\" cla"
},
{
"path": "src/components/PostDetail.vue",
"chars": 25338,
"preview": "<template>\n <v-dialog v-model=\"store.showImageSelected\" fullscreen>\n <div v-if=\"store.showImageSelected\" class=\"img_"
},
{
"path": "src/components/PostExportTags.vue",
"chars": 6584,
"preview": "<template>\n <v-dialog :value=\"showDialog\" max-width=\"800px\" @input=\"handleVisible\">\n <v-card>\n <v-card-title>\n "
},
{
"path": "src/components/PostList.vue",
"chars": 13387,
"preview": "<template>\n <div v-if=\"showImageList\" :style=\"settings.masonryLayout === 'virtual' ? 'height:93vh' : ''\">\n <virtual-"
},
{
"path": "src/components/SettingsDrawer.vue",
"chars": 20897,
"preview": "<template>\n <v-navigation-drawer\n v-model=\"store.showSettings\"\n class=\"nav_drawer settings_drawer\"\n :width=\"40"
},
{
"path": "src/components/Snackbar.vue",
"chars": 859,
"preview": "<template>\n <v-snackbar\n v-model=\"showSnackbar\"\n top\n :color=\"snackbarTypeMap[snackbarType]?.[0]\"\n :timeout"
},
{
"path": "src/components/WfLayout.vue",
"chars": 1420,
"preview": "<template>\n <div class=\"wf-layout\" :class=\"wfClass\">\n <true-masonry\n v-if=\"wfType === 'masonry2'\"\n class=\""
},
{
"path": "src/data/all_tags_cn.json",
"chars": 296410,
"preview": "{\n \"39\": \"ミクの日\",\n \"69\": \"69(体位)\",\n \"\\\"don't_say_\\\"\\\"lazy\\\"\\\"\\\"\": \"\\\"《don't_say_\\\"\\\"lazy\\\"\\\"》\\\"\",\n \"(-3-)\": \"嘟嘴\",\n \""
},
{
"path": "src/data/all_tags_cn.min.json",
"chars": 253182,
"preview": "{\"39\":\"ミクの日\",\"69\":\"69(体位)\",\"\\\"don't_say_\\\"\\\"lazy\\\"\\\"\\\"\":\"\\\"《don't_say_\\\"\\\"lazy\\\"\\\"》\\\"\",\"(-3-)\":\"嘟嘴\",\"+ +\":\"十字星星眼\",\".3.\":"
},
{
"path": "src/data/all_tags_cn_space.json",
"chars": 319145,
"preview": "{\n \"39\": \"ミクの日\",\n \"69\": \"69(体位)\",\n \"\\\"don't say \\\"\\\"lazy\\\"\\\"\\\"\": \"\\\"《don't_say_\\\"\\\"lazy\\\"\\\"》\\\"\",\n \"+ +\": \"加号型眼\",\n \""
},
{
"path": "src/data/all_tags_cn_space.min.json",
"chars": 271997,
"preview": "{\"39\":\"ミクの日\",\"69\":\"69(体位)\",\"\\\"don't say \\\"\\\"lazy\\\"\\\"\\\"\":\"\\\"《don't_say_\\\"\\\"lazy\\\"\\\"》\\\"\",\"+ +\":\"加号型眼\",\"1970s (style)\":\"20世"
},
{
"path": "src/data/danbooru.csv",
"chars": 206861,
"preview": "69,69(体位)\n1boy,1个男孩\n1girl,1个女孩\nabout_to_be_raped,将要被强暴\nabsurdres,超高分辨率\nadjusting_thighhigh,调整过膝袜\nahoge,呆毛\nalbum,专辑\nall_f"
},
{
"path": "src/data/danbooru_tags_cn.json",
"chars": 109041,
"preview": "{\"arm support\":\"用手支撑住\",\"armpits\":\"举手露腋\",\"armpit\":\"举手露腋\",\"arms behind back\":\"手放在身后\",\"hands behind back\":\"手放在身后\",\"arms beh"
},
{
"path": "src/data/gelbooru.csv",
"chars": 206317,
"preview": "69,69(体位)\n1boy,1个男孩\n1girl,1个女孩\nabout_to_be_raped,将要被强暴\nabsurdres,超高分辨率\nadjusting_thighhigh,调整过膝袜\nahoge,呆毛\nalbum,专辑\nall_f"
},
{
"path": "src/data/handle-tags.mjs",
"chars": 1531,
"preview": "import fs from 'node:fs/promises'\n\nasync function main() {\n const danCsv = await fs.readFile('./danbooru.csv', 'utf8')\n"
},
{
"path": "src/data/moebooru_tags_cn.json",
"chars": 7976,
"preview": "{\n \"anal\": \"肛门\",\n \"anal_beads\": \"肛珠\",\n \"angel\": \"天使\",\n \"animal_ears\": \"兽耳\",\n \"anus\": \"肛门露出\",\n \"areola\": \"乳晕\",\n \"a"
},
{
"path": "src/data/sankakucomplex_chan.csv",
"chars": 206826,
"preview": "69,69(体位)\n1boy,1个男孩\n1girl,1个女孩\nabout_to_be_raped,将要被强暴\nabsurdres,超高分辨率\nadjusting_thighhigh,调整过膝袜\nahoge,呆毛\nalbum,专辑\nall_f"
},
{
"path": "src/data/tags_cn.json",
"chars": 8003,
"preview": "{\n \"anal\": \"肛门\",\n \"anal_beads\": \"肛珠\",\n \"angel\": \"天使\",\n \"animal_ears\": \"兽耳\",\n \"anus\": \"肛门露出\",\n \"areola\": \"乳晕\",\n \"a"
},
{
"path": "src/data/yande.csv",
"chars": 206315,
"preview": "69,69(体位)\n1boy,1个男孩\n1girl,1个女孩\nabout_to_be_raped,将要被强暴\nabsurdres,超高分辨率\nadjusting_thighhigh,调整过膝袜\nahoge,呆毛\nalbum,专辑\nall_f"
},
{
"path": "src/env.d.ts",
"chars": 1532,
"preview": "/// <reference types=\"vite/client\" />\n\ndeclare module '*.vue' {\n import type { DefineComponent } from 'vue'\n // eslint"
},
{
"path": "src/locales/en.json",
"chars": 8201,
"preview": "{\n \"UxxldE9xRwmQctrvba5Y8\": \"Settings\",\n \"1F-R4qChHIzZaohu5GJzl\": \"e.g: &api_key=xx&user_id=1\",\n \"23iEYyiQlLVhFIqGbj5"
},
{
"path": "src/locales/ja.json",
"chars": 6489,
"preview": "{\n \"UxxldE9xRwmQctrvba5Y8\": \"設定\",\n \"1F-R4qChHIzZaohu5GJzl\": \"例:&api_key=xx&user_id=1\",\n \"23iEYyiQlLVhFIqGbj527\": \"質問と"
},
{
"path": "src/locales/zh-Hans.json",
"chars": 5604,
"preview": "{\n \"UxxldE9xRwmQctrvba5Y8\": \"设置\",\n \"ZtQHZx-pEjmu_o3dQD1fc\": \"社团\",\n \"Ym0HIEu9Q80qXB31LuC6c\": \"画师\",\n \"juT6gwLOg5r1h2vF"
},
{
"path": "src/locales/zh-Hant.json",
"chars": 5607,
"preview": "{\n \"UxxldE9xRwmQctrvba5Y8\": \"設置\",\n \"1F-R4qChHIzZaohu5GJzl\": \"形如: &api_key=xx&user_id=1\",\n \"23iEYyiQlLVhFIqGbj527\": \"問"
},
{
"path": "src/main.ts",
"chars": 761,
"preview": "// eslint-disable-next-line import/order\nimport { prepareApp } from './prepare'\n\nimport Vue from 'vue'\nimport VueMasonry"
},
{
"path": "src/plugins/vuetify.ts",
"chars": 885,
"preview": "// Styles\n// import '@mdi/font/css/materialdesignicons.css'\n// import 'vuetify/dist/vuetify.min.css'\n\nimport Vue, { getC"
},
{
"path": "src/plugins/webfontloader.ts",
"chars": 337,
"preview": "/**\n * plugins/webfontloader.js\n *\n * webfontloader documentation: https://github.com/typekit/webfontloader\n */\n\n/* expo"
},
{
"path": "src/prepare.ts",
"chars": 10954,
"preview": "import prepareStyle from '@/styles/prepare.css?inline'\nimport ydStyle from '@/styles/yandere.css?inline'\nimport knStyle "
},
{
"path": "src/store/actions/_util.ts",
"chars": 1671,
"preview": "import type { SearchResults } from '@himeka/booru'\nimport { settings } from '@/store'\nimport { allgirl, nozomila, rule34"
},
{
"path": "src/store/actions/detail.ts",
"chars": 1582,
"preview": "import type { Ref } from 'vue'\nimport type { Post } from '@himeka/booru'\nimport { fetchDetailActions } from './site'\nimp"
},
{
"path": "src/store/actions/post.ts",
"chars": 2364,
"preview": "import { fetchPostsActions } from './site'\nimport { getFirstPageNo, handleBlacklist, pushPageState } from './_util'\nimpo"
},
{
"path": "src/store/actions/site.ts",
"chars": 1161,
"preview": "import type { Post } from '@himeka/booru'\nimport {\n allgirl,\n anihonetwallpaper,\n animepictures,\n booruAction,\n esh"
},
{
"path": "src/store/index.ts",
"chars": 1306,
"preview": "import Vue from 'vue'\nimport type { Post } from '@himeka/booru'\nimport { initialSettings } from './settings'\n\nexport con"
},
{
"path": "src/store/settings.ts",
"chars": 1633,
"preview": "export const langList = [\n { value: 'zh-Hans', label: '简体中文' },\n { value: 'zh-Hant', label: '繁體中文' },\n { value: 'ja',"
},
{
"path": "src/styles/custom.css",
"chars": 13971,
"preview": "#loading {\n /* background-color: #222; */\n height: 100%;\n width: 100%;\n position: fixed;\n z-index: 99999;\n margin-"
},
{
"path": "src/styles/konachan.css",
"chars": 281,
"preview": "#lsidebar {\n display: none;\n}\n\n#post-popular ul#post-list-posts {\n display: flex;\n justify-content: center;\n flex-wr"
},
{
"path": "src/styles/prepare.css",
"chars": 975,
"preview": "#enter-masonry {\n position: fixed;\n z-index: 99999;\n right: 16px;\n top: 10px;\n height: 30px;\n padding: 6px 10px;\n "
},
{
"path": "src/styles/yandere.css",
"chars": 2828,
"preview": "a.thumb {\n padding-bottom: 5px;\n border-bottom: 2px solid;\n border-color: #232322;\n}\n\na.thumb:visited {\n border-colo"
},
{
"path": "src/utils/fsa.ts",
"chars": 4298,
"preview": "export const isFsaSupported = 'showDirectoryPicker' in self\n\nlet mainDirHandle: FileSystemDirectoryHandle | null\n\n/**\n *"
},
{
"path": "src/utils/i18n.ts",
"chars": 478,
"preview": "import Vue from 'vue'\nimport VueI18n from 'vue-i18n'\n\nimport zhHans from '@/locales/zh-Hans.json'\nimport zhHant from '@/"
},
{
"path": "src/utils/index.ts",
"chars": 15546,
"preview": "import Vue from 'vue'\nimport { add, formatDistanceToNow, isValid, sub } from 'date-fns'\nimport type { Post } from '@hime"
},
{
"path": "tsconfig.json",
"chars": 1908,
"preview": "{\n \"compilerOptions\": {\n \"allowJs\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"resolveJsonMo"
},
{
"path": "tsconfig.node.json",
"chars": 236,
"preview": "{\n \"compilerOptions\": {\n \"composite\": true,\n \"module\": \"esnext\",\n \"moduleResolution\": \"node\",\n \"esModuleInt"
},
{
"path": "vite.config.ts",
"chars": 778,
"preview": "import { URL, fileURLToPath } from 'node:url'\nimport { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue2'\n"
}
]
About this extraction
This page contains the full source code of the asadahimeka/yandere-masonry GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 117 files (2.9 MB), approximately 765.6k tokens, and a symbol index with 831 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.