commit 8b93d6f42fe68cb3c3cbd4ec0d94f39705cb1276 Author: juluo <142558307+JuLuogo@users.noreply.github.com> Date: Wed Oct 8 14:48:45 2025 +0800 Initial commit diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..a51af8a --- /dev/null +++ b/.env.sample @@ -0,0 +1,5 @@ +VITE_ADSENSE_PUB_ID = +VITE_GOOGLE_ANALYTICS_ID = +VITE_GOOGLE_SEARCH_CONSOLE_VERIFICATION = +VITE_PXIMG_BASEURL_I = /-/ +VITE_PXIMG_BASEURL_S = /~/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab3bd2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,111 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +.vercel + +dev-test +*.dev.* +.vercel +.vs diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..9a0c951 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +registry = https://registry.npmmirror.com diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..df2b2e9 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,12 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: false, + singleQuote: true, + arrowParens: 'always', + quoteProps: 'as-needed', + plugins: [require.resolve('@prettier/plugin-pug')], + pugAttributeSeparator: 'as-needed', + pugSortAttributes: 'asc', + vueIndentScriptAndStyle: false, +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4e71344 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "i18n-ally.localesPaths": [ + "src/locales" + ] +} \ No newline at end of file diff --git a/.vscode/vue.code-snippets b/.vscode/vue.code-snippets new file mode 100644 index 0000000..abd1049 --- /dev/null +++ b/.vscode/vue.code-snippets @@ -0,0 +1,19 @@ +{ + "Init vue components": { + "scope": "vue", + "prefix": "vue", + "body": [ + "", + "", + "", + "", + "" + ], + "description": "Init vue components" + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d828bc1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,445 @@ +## [2.2.1](https://github.com/GratisNow/PixivNow/compare/2.2.0...2.2.1) (2021-07-11) + + + + +# [2.2.0](https://github.com/GratisNow/PixivNow/compare/2.1.1...2.2.0) (2021-07-11) + + +### chore + +* bump version (bump version: 2.2.0)([92a203d](https://github.com/GratisNow/PixivNow/commit/92a203d6affe0c0605c5b947551b3075b9c6bd82)) + + +### fix + +* ranking(api/view)([c86d783](https://github.com/GratisNow/PixivNow/commit/c86d783e2581a172d54309ea5bf96d6ca83cb227)) +* typo([32ff15b](https://github.com/GratisNow/PixivNow/commit/32ff15b911f9b39eef2b26bd3b1954c000560502)) +* typo (#7)([155b04c](https://github.com/GratisNow/PixivNow/commit/155b04c642eb222bba8a1e8f4ef2d2eec93ed2ce)), closes [#7](https://bugs.jquery.com/ticket/7) + + +### update + +* update ranking([d5bbc2d](https://github.com/GratisNow/PixivNow/commit/d5bbc2dd8c55d33f6f9d6c597705ef81ac26a489)) +* view.about([12a72a3](https://github.com/GratisNow/PixivNow/commit/12a72a33f875fc320911eafd36c0b8ae8825f3c8)) + + + + +## [2.1.1](https://github.com/GratisNow/PixivNow/compare/2.0.8...2.1.1) (2021-07-08) + + +### chore + +* bump version (bump 2.1.0)([c4708f5](https://github.com/GratisNow/PixivNow/commit/c4708f589b53d3cd4fcd8d7871636e663e705f19)) +* bump version (bump version: 2.1.1)([5da008c](https://github.com/GratisNow/PixivNow/commit/5da008c03af479c9305abb2b9d5b5d1cfc6f77f6)) + + +### update + +* +ranking, +userLogin (#3)([27fdc6f](https://github.com/GratisNow/PixivNow/commit/27fdc6fa84a3a66e147a63ced2c90ced95f47dae)), closes [#3](https://bugs.jquery.com/ticket/3) +* +view.login, +restrict tag (#4)([affde4b](https://github.com/GratisNow/PixivNow/commit/affde4b76bcf6d83d10b2e7eb90943bfe662900e)), closes [#4](https://bugs.jquery.com/ticket/4) + + + + +## [2.0.8](https://github.com/GratisNow/PixivNow/compare/2.0.7...2.0.8) (2021-06-25) + + +### chore + +* bump version (bump version: 2.0.8)([a8c4cb8](https://github.com/GratisNow/PixivNow/commit/a8c4cb8f1a18b0ed02fd8fb7587da3b33cc67804)) +* rename org([1863ac1](https://github.com/GratisNow/PixivNow/commit/1863ac10e32a2128997786e3cf779919348fbedb)) + + + + +## [2.0.7](https://github.com/GratisNow/PixivNow/compare/2.0.6...2.0.7) (2021-06-22) + + +### chore + +* minor fix (bump version: 2.0.7)([b06cd96](https://github.com/GratisNow/PixivNow/commit/b06cd96ecffb198178687f8922b0453f00d03eb5)) + + + + +## [2.0.6](https://github.com/GratisNow/PixivNow/compare/2.0.4...2.0.6) (2021-06-22) + + +### chore + +* + redirects, + declare *.vue, - workflow (bump version: 2.0.6)([9f6dd20](https://github.com/GratisNow/PixivNow/commit/9f6dd20a59ea9e78a0ea7754a1fc7065af286e2c)) +* disable workflow([a42ec86](https://github.com/GratisNow/PixivNow/commit/a42ec86026b64c929886d1b826b45856469e1bd1)) +* enable workflow([45a5ef0](https://github.com/GratisNow/PixivNow/commit/45a5ef03a95afbff0015c731a16d66e3dda98cbe)) +* minor fix([0a1f31d](https://github.com/GratisNow/PixivNow/commit/0a1f31d6a5e55f89f458a828ff731a3fbd5b0809)) +* minor fix([34f2b6f](https://github.com/GratisNow/PixivNow/commit/34f2b6fec2690c1b89229de80e7903469001392b)) +* test auto deploy([7961719](https://github.com/GratisNow/PixivNow/commit/79617195c137076e3636209d0a0c5c30746586f5)) +* update github links (#2)([bf60468](https://github.com/GratisNow/PixivNow/commit/bf60468dfb085d17fcd42ed988ae244a6a6c2d2a)), closes [#2](https://bugs.jquery.com/ticket/2) + + + + +## [2.0.4](https://github.com/GratisNow/PixivNow/compare/2.0.3...2.0.4) (2021-06-21) + + +### chore + +* minor fix (bump version: 2.0.4)([5c1074d](https://github.com/GratisNow/PixivNow/commit/5c1074d9caea2b05ba4fac6b172234d1269e995f)) + + + + +## [2.0.3](https://github.com/GratisNow/PixivNow/compare/2.0.2...2.0.3) (2021-06-15) + + +### chore + +* bump version (bump version: 2.0.3)([1ed5303](https://github.com/GratisNow/PixivNow/commit/1ed53031383bf9b6c28e1cbeecd4ab9ea6c7ee99)) + + + + +## [2.0.2](https://github.com/GratisNow/PixivNow/compare/2.0.1...2.0.2) (2021-06-15) + + +### chore + +* bump version (bump version: 2.0.2)([4a63cb0](https://github.com/GratisNow/PixivNow/commit/4a63cb03ae4607cf6de1d17e833db263356005d4)) + + +### feat + +* + fontawesome, + image progress([7357714](https://github.com/GratisNow/PixivNow/commit/735771468c56f077d3f327d6207c7e760842e247)) +* + icons([25e591c](https://github.com/GratisNow/PixivNow/commit/25e591c603f424a2aa2d7df750cf45315a92d995)) + + + + +## [2.0.1](https://github.com/GratisNow/PixivNow/compare/2.0.0...2.0.1) (2021-06-13) + + +### feat + +* + NProgress (bump version: 2.0.1)([04df6fd](https://github.com/GratisNow/PixivNow/commit/04df6fde97e13ba46e081bbd02417185b45c6899)) + + + + +# [2.0.0](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.17...2.0.0) (2021-06-13) + + +### update + +* release 2.0 (bump version: 2.0.0)([7e92fb7](https://github.com/GratisNow/PixivNow/commit/7e92fb7794ede97e7fe5968c7892358d7af8019d)) + + + + +# [2.0.0-alpha.17](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.16...2.0.0-alpha.17) (2021-06-13) + + +### update + +* header (bump version: 2.0.0-alpha.17)([69a0d59](https://github.com/GratisNow/PixivNow/commit/69a0d590c0efbb4e59452439f1222c2515485be7)) + + + + +# [2.0.0-alpha.16](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.15...2.0.0-alpha.16) (2021-06-13) + + +### hotfix + +* user.background is undefined (bump version: 2.0.0-alpha.16)([382baa5](https://github.com/GratisNow/PixivNow/commit/382baa505724d447d3e8f089840a940846d40517)) + + + + +# [2.0.0-alpha.15](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.14...2.0.0-alpha.15) (2021-06-13) + + +### update + +* users (bump version: 2.0.0-alpha.15)([13dbdbe](https://github.com/GratisNow/PixivNow/commit/13dbdbe8aec840d61ae79c6db4528efc8dc6dfb7)) + + + + +# [2.0.0-alpha.14](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.13...2.0.0-alpha.14) (2021-06-13) + + +### chore + +* bump version (bump version: 2.0.0-alpha.14)([608f79c](https://github.com/GratisNow/PixivNow/commit/608f79c82cc0341152a3a06587b812c676a3ba7c)) + + + + +# [2.0.0-alpha.13](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.12...2.0.0-alpha.13) (2021-06-13) + + +### hotfix + +* styles, api (bump version: 2.0.0-alpha.13)([03257fc](https://github.com/GratisNow/PixivNow/commit/03257fc4b0cc4f52b982992156a955edbfd0123e)) + + + + +# [2.0.0-alpha.12](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.11...2.0.0-alpha.12) (2021-06-13) + + +### hotfix + +* link style, imgProxy (bump version: 2.0.0-alpha.12)([5f286c2](https://github.com/GratisNow/PixivNow/commit/5f286c29ca10f623f6cd9372636a5eb7c6bd315c)) + + + + +# [2.0.0-alpha.11](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.10...2.0.0-alpha.11) (2021-06-13) + + +### chore + +* minor fix (bump version: 2.0.0-alpha.11)([572a373](https://github.com/GratisNow/PixivNow/commit/572a37392c3c19d71a676d3bef0f16d40a4365d1)) + + + + +# [2.0.0-alpha.10](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.9...2.0.0-alpha.10) (2021-06-13) + + +### fix + +* artwork.index styles (bump version: 2.0.0-alpha.10)([62b6c05](https://github.com/GratisNow/PixivNow/commit/62b6c05fae34a014678827ac14cc1c9a2c380aa9)) + + + + +# [2.0.0-alpha.9](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.8...2.0.0-alpha.9) (2021-06-13) + + +### chore + +* bump version (bump version: 2.0.0-alpha.9)([3b1f57e](https://github.com/GratisNow/PixivNow/commit/3b1f57ead4c783d4dc32d6cf14b7444ffb2b14aa)) + + + + +# [2.0.0-alpha.8](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.7...2.0.0-alpha.8) (2021-06-13) + + +### update + +* update styles, + seaech pagenator (bump version: 2.0.0-alpha.8)([4773dfa](https://github.com/GratisNow/PixivNow/commit/4773dfac136831daab28201ed68e06bc7a00a755)) + + + + +# [2.0.0-alpha.7](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.6...2.0.0-alpha.7) (2021-06-12) + + +### chore + +* update package.json([09f09b9](https://github.com/GratisNow/PixivNow/commit/09f09b9853e9d6dd67b41936bd765fc68a864355)) + + +### feat + +* + search, update gallery, using sass & pug (bump version: 2.0.0-alpha.7)([1386064](https://github.com/GratisNow/PixivNow/commit/13860647a417dcc00990cdd4d04d5038c8d549f5)) + + + + +# [2.0.0-alpha.6](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.5...2.0.0-alpha.6) (2021-06-10) + + +### chore + +* split modules (bump version: 2.0.0-alpha.6)([d8e6ae6](https://github.com/GratisNow/PixivNow/commit/d8e6ae61be49e0571cf70f9a025a693798463e2f)) + + + + +# [2.0.0-alpha.5](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.4...2.0.0-alpha.5) (2021-06-10) + + +### chore + +* update styles (bump version: 2.0.0-alpha.5)([9db7b11](https://github.com/GratisNow/PixivNow/commit/9db7b118592d1235e246db0e4acec6eaad729664)) + + + + +# [2.0.0-alpha.4](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.3...2.0.0-alpha.4) (2021-06-10) + + +### chore + +* bump version (bump version: 2.0.0-alpha.4)([4a87c2e](https://github.com/GratisNow/PixivNow/commit/4a87c2e65834cf5c59b99cffc8460185ab3a2a27)) + + + + +# [2.0.0-alpha.3](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.2...2.0.0-alpha.3) (2021-06-09) + + +### chore + +* minor fix (bump version: 2.0.0-alpha.3)([3e5aa50](https://github.com/GratisNow/PixivNow/commit/3e5aa501e7daaca3851427d7d8a150bc484908cf)) + + + + +# [2.0.0-alpha.2](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.1...2.0.0-alpha.2) (2021-06-09) + + +### chore + +* minor fix (bump version: 2.0.0-alpha.2)([96bd745](https://github.com/GratisNow/PixivNow/commit/96bd745f37f5cc1a1b42cac4830199f2ca91728f)) + + + + +# [2.0.0-alpha.1](https://github.com/GratisNow/PixivNow/compare/2.0.0-alpha.0...2.0.0-alpha.1) (2021-06-09) + + +### chore + +* bump version (bump version: 2.0.0-alpha.1)([5dff17a](https://github.com/GratisNow/PixivNow/commit/5dff17ad9fc49587139c9b7e19904735462f87a1)) + + + + +# [2.0.0-alpha.0](https://github.com/GratisNow/PixivNow/compare/1.1.4...2.0.0-alpha.0) (2021-06-09) + + + + +## [1.1.4](https://github.com/GratisNow/PixivNow/compare/1.1.3...1.1.4) (2021-06-09) + + +### chore + +* bump version (bump version: 1.1.4)([7337437](https://github.com/GratisNow/PixivNow/commit/73374374d5552e212eb0125048ce8ce047f75b7e)) +* update README([0782b81](https://github.com/GratisNow/PixivNow/commit/0782b81a02d5ceea1abd330832708864691caba4)) + + +### fix + +* Access-Control-Allow-Origin([12b3163](https://github.com/GratisNow/PixivNow/commit/12b3163abb0eba54274eccc63bb15b92007286a4)) + + + + +## [1.1.3](https://github.com/GratisNow/PixivNow/compare/1.1.2...1.1.3) (2021-06-06) + + +### chore + +* bump version (bump version: 1.1.3)([87d9878](https://github.com/GratisNow/PixivNow/commit/87d98783a96e4452e0266e3fd7f125800b7a9efc)) + + + + +## [1.1.2](https://github.com/GratisNow/PixivNow/compare/1.1.1...1.1.2) (2021-06-06) + + +### chore + +* bump version (bump version: 1.1.2)([43b543f](https://github.com/GratisNow/PixivNow/commit/43b543f1f2d9ee2cda0524cec721204f2c6085c5)) + + + + +## [1.1.1](https://github.com/GratisNow/PixivNow/compare/1.1.0...1.1.1) (2021-06-06) + + +### chore + +* bump version (bump version: 1.1.1)([3cdf2a4](https://github.com/GratisNow/PixivNow/commit/3cdf2a4bd4f59c719dafded838005012b992d979)) + + + + +# [1.1.0](https://github.com/GratisNow/PixivNow/compare/1.0.6...1.1.0) (2021-06-06) + + +### chore + +* rewrite (bump version: 1.1.0)([8d10a09](https://github.com/GratisNow/PixivNow/commit/8d10a09190acc7fb51a873b2822badbd35a09fb8)) + + + + +## [1.0.6](https://github.com/GratisNow/PixivNow/compare/1.0.5...1.0.6) (2021-06-06) + + +### chore + +* minor fix (bump version: 1.0.6)([52953fe](https://github.com/GratisNow/PixivNow/commit/52953fe96e1e321390a10eaed87ec20f44c40bf6)) + + + + +## [1.0.5](https://github.com/GratisNow/PixivNow/compare/1.0.4...1.0.5) (2021-06-06) + + +### chore + +* bump version (bump version: 1.0.5)([c214151](https://github.com/GratisNow/PixivNow/commit/c214151cd369ee0549baea6f60d067873e253305)) +* minor fix([477b64b](https://github.com/GratisNow/PixivNow/commit/477b64bcf2a0f93d148b3e1d898ae34eba7e0b0d)) + + + + +## [1.0.4](https://github.com/GratisNow/PixivNow/compare/1.0.3...1.0.4) (2021-06-05) + + +### chore + +* update README (bump version: 1.0.4)([3257778](https://github.com/GratisNow/PixivNow/commit/3257778cf82cb0c8e6f66d5b207ef41a952b9b97)) + + + + +## [1.0.3](https://github.com/GratisNow/PixivNow/compare/1.0.2...1.0.3) (2021-06-05) + + +### update + +* + ajax, + user (bump version: 1.0.3)([e04d2b5](https://github.com/GratisNow/PixivNow/commit/e04d2b5294f7ba1c7ab138aea80adbf72c34fdb3)) + + + + +## [1.0.2](https://github.com/GratisNow/PixivNow/compare/1.0.1...1.0.2) (2021-06-05) + + +### update + +* + byUID, + byTagName (bump version: 1.0.2)([5c20b42](https://github.com/GratisNow/PixivNow/commit/5c20b4270b89d2b4c7ce896b5fec260536c8d88a)) + + + + +## [1.0.1](https://github.com/GratisNow/PixivNow/compare/b81baf2bf5d89b0f7f6d0cc0119761a00a5f0c0b...1.0.1) (2021-06-05) + + +### chore + +* bump version (bump version: 1.0.1)([fcc7704](https://github.com/GratisNow/PixivNow/commit/fcc7704f11c555b6ceeb27edb30bb0155c5d017f)) +* commit([b81baf2](https://github.com/GratisNow/PixivNow/commit/b81baf2bf5d89b0f7f6d0cc0119761a00a5f0c0b)) +* imgProxy([be1d495](https://github.com/GratisNow/PixivNow/commit/be1d495b7b6f4c63c66f942d9ab5e5794e58f534)) +* minor fix([2bfc8ca](https://github.com/GratisNow/PixivNow/commit/2bfc8ca5133d46c8ff9cafffb8081c79eb93056d)) +* minor fix([9179bbf](https://github.com/GratisNow/PixivNow/commit/9179bbf7ff7032b2d87479198bd900eacb1bb682)) +* minor fix([68e3b4a](https://github.com/GratisNow/PixivNow/commit/68e3b4ace98f67c4ef640e84787f7dad6b447fcc)) +* minor fix([6bd5ef9](https://github.com/GratisNow/PixivNow/commit/6bd5ef9025144b3fe4aae4542276d621582553f5)) +* minor fix([04ba185](https://github.com/GratisNow/PixivNow/commit/04ba185c0151e8b49e6aac826ec1d8315cdddad0)) +* minor fix([a0e5bed](https://github.com/GratisNow/PixivNow/commit/a0e5bed8aba97fe98045063c942efbafb649c827)) +* minor fix([3b100cc](https://github.com/GratisNow/PixivNow/commit/3b100cc8d54cad0c20de2929af17baad396088b4)) +* test proxy([7144d94](https://github.com/GratisNow/PixivNow/commit/7144d941260cb993db7437fc96b8868670d61cc8)) + + + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..97f9555 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +pixiv.js.org diff --git a/DEV_NOTES/followUser.http b/DEV_NOTES/followUser.http new file mode 100644 index 0000000..c2732a7 --- /dev/null +++ b/DEV_NOTES/followUser.http @@ -0,0 +1,11 @@ +POST https://www.pixiv.net/bookmark_add.php +content-type: application/x-www-form-urlencoded + +{ + "mode": "add", + "type": "user", + "user_id": "15552366", + "tag": "", + "restrict": "0", + "format": "json" +} \ No newline at end of file diff --git a/DEV_NOTES/notification.http b/DEV_NOTES/notification.http new file mode 100644 index 0000000..f2c11af --- /dev/null +++ b/DEV_NOTES/notification.http @@ -0,0 +1,43 @@ +GET https://www.pixiv.net/ajax/notification + +[HTTP/1.1 200 OK] +application/json +{ + "error": false, + "message": "", + "body": { + "items": [ + { + "id": 698556583, + "type": "bookmarked", + "unread": true, + "notifiedAt": "2021-07-17T12:22:25+09:00", + "linkUrl": "/bookmark_detail.php?illust_id=86468782", + "iconUrl": "https://i.pximg.net/c/128x128/img-master/img/2020/12/23/05/25/48/86468782_p0_square1200.jpg", + "targetBlank": false, + "isProfileIcon": false, + "content": "2以上的用户把你的作品加入收藏了: \"[草图] 原创角色 Kunika\"" + } + ], + "remaining_unread_count": 0, + "imageResponseCount": 0, + "quotationCount": 0, + "isNotAuthorized": false, + "filter": { + "reactions": [ + "bookmarked", + "nice", + "commented", + "tagged", + "content_response", + "favorited", + "group_content_reference", + "group_like", + "group_comment", + "received_stacc_message", + "series_watchlist_watched" + ] + } + } +} + diff --git a/DEV_NOTES/searchSuggestion.http b/DEV_NOTES/searchSuggestion.http new file mode 100644 index 0000000..1e3093b --- /dev/null +++ b/DEV_NOTES/searchSuggestion.http @@ -0,0 +1,9874 @@ +GET https://www.pixiv.net/ajax/search/suggestion?mode=all + +[HTTP/1.1 200 OK] +application/json +{ + "error": false, + "body": { + "popularTags": { + "illust": [ + { + "tag": "fanart", + "ids": [ + 87387148, + 89843345, + 87162139 + ] + }, + { + "tag": "Fate/GrandOrder", + "ids": [ + 57808612, + 59665299, + 82432085 + ] + }, + { + "tag": "FGO", + "ids": [ + 57808612, + 61169484, + 68126965 + ] + }, + { + "tag": "GenshinImpact", + "ids": [ + 80567870, + 86425919, + 86464433 + ] + }, + { + "tag": "girl", + "ids": [ + 75748320, + 83199735, + 87162139 + ] + }, + { + "tag": "illustration", + "ids": [ + 63150612, + 67329067, + 68670776 + ] + }, + { + "tag": "MiraculousLadybug", + "ids": [ + 57746661, + 76208126, + 53366642 + ] + }, + { + "tag": "moon", + "ids": [ + 76220766, + 74955694, + 74723171 + ] + }, + { + "tag": "MOTHER", + "ids": [ + 41686664, + 56436164, + 11765689 + ] + }, + { + "tag": "NEWGAME!", + "ids": [ + 58122126, + 64433132, + 57681432 + ] + }, + { + "tag": "NieR", + "ids": [ + 61784598, + 61599251, + 62039907 + ] + }, + { + "tag": "NIJISANJI_EN", + "ids": [ + 90390199 + ] + }, + { + "tag": "original", + "ids": [ + 69463109, + 33414104, + 69139520 + ] + }, + { + "tag": "PetraArt", + "ids": [ + 91411248 + ] + }, + { + "tag": "petragurin", + "ids": [ + 91411248 + ] + }, + { + "tag": "pregnant", + "ids": [ + 89338355, + 83468525, + 83295372 + ] + }, + { + "tag": "roselia", + "ids": [ + 70833260 + ] + }, + { + "tag": "scifi", + "ids": [ + 78311723, + 53034161, + 77079433 + ] + }, + { + "tag": "SK∞", + "ids": [ + 87944694, + 87615344, + 87840158 + ] + }, + { + "tag": "sona", + "ids": [ + 72655663 + ] + }, + { + "tag": "sword", + "ids": [ + 85617306, + 78679716, + 41086111 + ] + }, + { + "tag": "tits", + "ids": [ + 83432825, + 70823889, + 73213860 + ] + }, + { + "tag": "Touhou_Project", + "ids": [ + 56551573, + 84222181, + 90521833 + ] + }, + { + "tag": "Traditionalart", + "ids": [ + 73483984 + ] + }, + { + "tag": "transformers", + "ids": [ + 26064013, + 50067770, + 45571240 + ] + }, + { + "tag": "transfur", + "ids": [ + 57936213, + 81973222, + 53601510 + ] + }, + { + "tag": "VTuber", + "ids": [ + 73518990, + 83603397, + 83442129 + ] + }, + { + "tag": "ww2", + "ids": [ + 73593539 + ] + }, + { + "tag": "あつ森", + "ids": [ + 82266993, + 81593683, + 82753312 + ] + }, + { + "tag": "おっぱい", + "ids": [ + 67407348, + 68126965, + 60865838 + ] + }, + { + "tag": "ころん", + "ids": [ + 71431430, + 67271336, + 77385145 + ] + }, + { + "tag": "しゅがーはぁと", + "ids": [ + 87045706 + ] + }, + { + "tag": "にじさんじ", + "ids": [ + 85779247, + 79024638, + 84419825 + ] + }, + { + "tag": "アナログ", + "ids": [ + 70582093, + 77491275, + 13754871 + ] + }, + { + "tag": "イラスト", + "ids": [ + 80431317, + 57877623, + 74650454 + ] + }, + { + "tag": "ウマ娘", + "ids": [ + 89657320, + 90263277, + 89694199 + ] + }, + { + "tag": "ウマ娘プリティーダービー", + "ids": [ + 89197783, + 89682656, + 88742579 + ] + }, + { + "tag": "オリキャラ", + "ids": [ + 62800098, + 61444625, + 65894188 + ] + }, + { + "tag": "バーチャルYouTuber", + "ids": [ + 73518990, + 84116049, + 85423310 + ] + }, + { + "tag": "ホロライブ", + "ids": [ + 73518990, + 70352399, + 82618568 + ] + }, + { + "tag": "ポケモン", + "ids": [ + 41805526, + 17104931, + 14231474 + ] + }, + { + "tag": "刀剣乱舞", + "ids": [ + 57800451, + 50379267, + 48559220 + ] + }, + { + "tag": "創作", + "ids": [ + 67260707, + 74481708, + 74478908 + ] + }, + { + "tag": "原神", + "ids": [ + 84602943, + 85085701, + 85633671 + ] + }, + { + "tag": "女の子", + "ids": [ + 63120410, + 54618347, + 62406788 + ] + }, + { + "tag": "少女", + "ids": [ + 63304069, + 69297688, + 59612057 + ] + }, + { + "tag": "東方Project", + "ids": [ + 57534432, + 17184292, + 62512328 + ] + }, + { + "tag": "水着", + "ids": [ + 67507815, + 82432085, + 65913057 + ] + }, + { + "tag": "男の子", + "ids": [ + 39316587, + 79372430, + 73838405 + ] + }, + { + "tag": "神宮寺寂雷", + "ids": [ + 72032423, + 72987019, + 70480279 + ] + }, + { + "tag": "背景素材", + "ids": [ + 76419627, + 39379535, + 60800103 + ] + }, + { + "tag": "鬼白", + "ids": [ + 43436652, + 51846917, + 48286222 + ] + }, + { + "tag": "던파", + "ids": [ + 77844238, + 81890250, + 67979905 + ] + } + ], + "novel": [ + { + "tag": "夢術廻戦", + "ids": [ + "85625860" + ] + }, + { + "tag": "東京【腐】リベンジャーズ", + "ids": [ + "90985115" + ] + }, + { + "tag": "腐術廻戦", + "ids": [ + "85850572" + ] + }, + { + "tag": "夢小説", + "ids": [ + "85951712" + ] + }, + { + "tag": "五悠", + "ids": [ + "85547905" + ] + }, + { + "tag": "ウマ娘プリティーダービー", + "ids": [ + "89197783" + ] + }, + { + "tag": "ウマ娘", + "ids": [ + "89657320" + ] + }, + { + "tag": "佐野万次郎", + "ids": [ + "89844674" + ] + }, + { + "tag": "クロスオーバー", + "ids": [ + "63457814" + ] + }, + { + "tag": "夏油傑", + "ids": [ + "86655276" + ] + }, + { + "tag": "五条悟", + "ids": [ + "85842343" + ] + }, + { + "tag": "女体化", + "ids": [ + "81798260" + ] + }, + { + "tag": "腐向け", + "ids": [ + "71152750" + ] + }, + { + "tag": "マイキー", + "ids": [ + "90602994" + ] + }, + { + "tag": "twst夢", + "ids": [ + "82082820" + ] + }, + { + "tag": "本好きの下剋上", + "ids": [ + "78709507" + ] + }, + { + "tag": "東京卍リベンジャーズ", + "ids": [ + "89322687" + ] + }, + { + "tag": "オリ主", + "ids": [ + "66204889" + ] + }, + { + "tag": "女主人公", + "ids": [ + "80630584" + ] + }, + { + "tag": "続きを全裸待機", + "ids": [ + "83242494" + ] + }, + { + "tag": "女監督生", + "ids": [ + "81850096" + ] + }, + { + "tag": "現パロ", + "ids": [ + "72727118" + ] + }, + { + "tag": "やはり俺の青春ラブコメはまちがっている。", + "ids": [ + "49831005" + ] + }, + { + "tag": "魔道祖師", + "ids": [ + "79167696" + ] + }, + { + "tag": "比企谷八幡", + "ids": [ + "80873983" + ] + }, + { + "tag": "場地圭介", + "ids": [ + "90828399" + ] + }, + { + "tag": "東京リベンジャーズ", + "ids": [ + "89602868" + ] + }, + { + "tag": "虎杖悠仁", + "ids": [ + "87630784" + ] + }, + { + "tag": "待ってました!", + "ids": [ + "36022374" + ] + }, + { + "tag": "呪術廻戦", + "ids": [ + "78510327" + ] + }, + { + "tag": "五伏", + "ids": [ + "79379089" + ] + }, + { + "tag": "二次創作", + "ids": [ + "79363893" + ] + }, + { + "tag": "ヤンデレ", + "ids": [ + "77673634" + ] + }, + { + "tag": "クトゥルフ神話TRPG", + "ids": [ + "58393816" + ] + }, + { + "tag": "CoCシナリオ", + "ids": [ + "60520282" + ] + }, + { + "tag": "ハリポタ", + "ids": [ + "16658773" + ] + }, + { + "tag": "オリキャラ", + "ids": [ + "62800098" + ] + }, + { + "tag": "キャラ崩壊", + "ids": [ + "31220217" + ] + }, + { + "tag": "松野千冬", + "ids": [ + "85184256" + ] + }, + { + "tag": "煉獄杏寿郎", + "ids": [ + "79429809" + ] + } + ] + }, + "recommendTags": { + "illust": [ + { + "tag": "Klee", + "ids": [ + "85596117" + ] + }, + { + "tag": "loli", + "ids": [ + "83519895" + ] + }, + { + "tag": "七七(原神)", + "ids": [ + "85653642" + ] + }, + { + "tag": "けもみみ", + "ids": [ + "91339695" + ] + }, + { + "tag": "GenshinImpact", + "ids": [ + "86419304" + ] + }, + { + "tag": "qiqi", + "ids": [ + "86907465" + ] + }, + { + "tag": "クレー(原神)", + "ids": [ + "85349943" + ] + }, + { + "tag": "百合", + "ids": [ + "89519018" + ] + }, + { + "tag": "空(原神)", + "ids": [ + "91187479" + ] + }, + { + "tag": "女の子", + "ids": [ + "86465064" + ] + }, + { + "tag": "可愛い", + "ids": [ + "90885211" + ] + }, + { + "tag": "迪奥娜", + "ids": [ + "90690399" + ] + }, + { + "tag": "七七", + "ids": [ + "90370584" + ] + }, + { + "tag": "ロリ", + "ids": [ + "86086558" + ] + }, + { + "tag": "ケモミミ", + "ids": [ + "89694803" + ] + }, + { + "tag": "R-18", + "ids": [ + "71553807" + ] + }, + { + "tag": "猫耳", + "ids": [ + "89900124" + ] + }, + { + "tag": "ディオナ(原神)", + "ids": [ + "90630791" + ] + }, + { + "tag": "原神", + "ids": [ + "84818149" + ] + }, + { + "tag": "萝莉", + "ids": [ + "89708888" + ] + }, + { + "tag": "女孩子", + "ids": [ + "85540784" + ] + }, + { + "tag": "ジョジョ立ち", + "ids": [ + "84378134" + ] + }, + { + "tag": "甘雨(原神)", + "ids": [ + "91024154" + ] + }, + { + "tag": "パイモン(原神)", + "ids": [ + "85261529" + ] + } + ] + }, + "recommendByTags": { + "illust": [ + { + "tag": "七七(原神)", + "ids": [ + "91303962", + "85010295", + "85047720", + "85109931", + "87173315", + "85377856", + "85294099", + "85026747" + ], + "details": { + "85010295": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85026747": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85047720": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85109931": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85294099": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85377856": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "87173315": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91303962": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + } + } + }, + { + "tag": "甘雨(原神)", + "ids": [ + "91314025", + "91196524", + "91326691", + "90533611", + "91314136", + "91054709", + "91289344", + "90493204" + ], + "details": { + "90493204": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "90533611": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91054709": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91196524": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91289344": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91314025": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91314136": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91326691": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + } + } + }, + { + "tag": "原神", + "ids": [ + "91290724", + "91384160", + "84553956", + "91403730", + "87236094", + "91428641", + "85667426", + "91336876" + ], + "details": { + "84553956": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "85667426": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "87236094": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91290724": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91336876": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91384160": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91403730": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + }, + "91428641": { + "methods": [ + "by_tag" + ], + "score": 0, + "seedIllustIds": [ ] + } + } + } + ] + }, + "myFavoriteTags": [ ], + "tagTranslation": { + "Fate/GrandOrder": { + "en": "Fate/Grand Order", + "ko": "", + "zh": "命运-冠位指定", + "zh_tw": "Fate/Grand Order", + "romaji": "" + }, + "FGO": { + "en": "Fate/Grand Order", + "ko": "페그오", + "zh": "", + "zh_tw": "", + "romaji": "" + }, + "girl": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "女孩", + "romaji": "" + }, + "illustration": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "插畫", + "romaji": "" + }, + "NieR": { + "en": "", + "ko": "", + "zh": "尼尔", + "zh_tw": "", + "romaji": "" + }, + "original": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "原創", + "romaji": "" + }, + "SK∞": { + "en": "", + "ko": "SK∞ 에스케이 에이트", + "zh": "", + "zh_tw": "", + "romaji": "esuke-eito" + }, + "VTuber": { + "en": "virtual YouTuber", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "" + }, + "あつ森": { + "en": "Animal Crossing: New Horizons", + "ko": "모동숲", + "zh": "动森", + "zh_tw": "動森", + "romaji": "atsumori" + }, + "おっぱい": { + "en": "breasts", + "ko": "가슴", + "zh": "欧派", + "zh_tw": "歐派", + "romaji": "oppai" + }, + "ころん": { + "en": "Colon", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "koronn" + }, + "しゅがーはぁと": { + "romaji": "shuga-haxato" + }, + "にじさんじ": { + "en": "Nijisanji", + "ko": "", + "zh": "彩虹社", + "zh_tw": "", + "romaji": "nijisannji" + }, + "アナログ": { + "en": "traditional", + "ko": "아날로그", + "zh": "手绘", + "zh_tw": "手繪", + "romaji": "anarogu" + }, + "イラスト": { + "en": "illustration", + "ko": "일러스트", + "zh": "插画", + "zh_tw": "插畫", + "romaji": "irasuto" + }, + "ウマ娘": { + "en": "horse girl", + "ko": "", + "zh": "马娘", + "zh_tw": "馬娘", + "romaji": "umamusume" + }, + "ウマ娘プリティーダービー": { + "en": "Uma Musume Pretty Derby", + "ko": "", + "zh": "赛马娘Pretty Derby", + "zh_tw": "賽馬娘Pretty Derby", + "romaji": "umamusumepurithi-da-bi-" + }, + "オリキャラ": { + "en": "original character", + "ko": "오리캐", + "zh": "原创角色", + "zh_tw": "原創角色", + "romaji": "orikyara" + }, + "バーチャルYouTuber": { + "en": "Virtual Youtuber", + "ko": "버추얼 유튜버", + "zh": "虚拟YouTuber", + "zh_tw": "虛擬YouTuber", + "romaji": "ba-charuyu-chu-ba-" + }, + "ホロライブ": { + "en": "Hololive", + "ko": "", + "zh": "Hololive", + "zh_tw": "", + "romaji": "hororaibu" + }, + "ポケモン": { + "en": "Pokémon", + "ko": "포켓몬", + "zh": "精灵宝可梦", + "zh_tw": "精靈寶可夢", + "romaji": "pokemonn" + }, + "刀剣乱舞": { + "en": "Touken Ranbu", + "ko": "도검난무", + "zh": "刀剑乱舞", + "zh_tw": "刀劍亂舞", + "romaji": "toukennrannbu" + }, + "創作": { + "en": "creation", + "ko": "창작", + "zh": "原创", + "zh_tw": "原創", + "romaji": "sousaku" + }, + "原神": { + "en": "Genshin Impact", + "ko": "원신", + "zh": "", + "zh_tw": "", + "romaji": "gennshinn" + }, + "女の子": { + "en": "girl", + "ko": "여자애", + "zh": "女孩子", + "zh_tw": "女孩子", + "romaji": "onnnanoko" + }, + "少女": { + "en": "young girl", + "ko": "소녀", + "zh": "", + "zh_tw": "", + "romaji": "shoujo" + }, + "東方Project": { + "romaji": "touhoupurojekuto" + }, + "水着": { + "en": "swimsuit", + "ko": "수영복", + "zh": "泳装", + "zh_tw": "泳裝", + "romaji": "mizugi" + }, + "男の子": { + "en": "boy", + "ko": "남자애", + "zh": "男孩子", + "zh_tw": "男孩子", + "romaji": "otokonoko" + }, + "神宮寺寂雷": { + "en": "Jakurai Jinguji", + "ko": "", + "zh": "神宫寺寂雷", + "zh_tw": "", + "romaji": "jinnguujijakurai" + }, + "背景素材": { + "en": "background material", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "haikeisozai" + }, + "鬼白": { + "en": "Hozuki x Hakutaku", + "ko": "귀백", + "zh": "鬼灯×白泽", + "zh_tw": "鬼燈×白澤", + "romaji": "onishiromatahahoohaku" + }, + "던파": { + "romaji": "donnpa" + }, + "夢術廻戦": { + "en": "", + "ko": "주술회전 창작", + "zh": "", + "zh_tw": "", + "romaji": "mujutsukaisenn" + }, + "東京【腐】リベンジャーズ": { + "en": "Tokyo Revengers yaoi", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "toukyouribennja-zufumuke" + }, + "腐術廻戦": { + "en": "Jujutsu Kaisen yaoi", + "ko": "주술회전 (BL)", + "zh": "咒术回战【腐】", + "zh_tw": "咒術迴戰(腐)", + "romaji": "fujutsukaisenn" + }, + "夢小説": { + "en": "dream novel", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "yumeshousetsu" + }, + "五悠": { + "en": "Gojo/Yuji", + "ko": "고죠유우", + "zh": "五条悟×虎杖悠仁", + "zh_tw": "", + "romaji": "goyuu" + }, + "佐野万次郎": { + "en": "Manjiro Sano", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "sanomannjirou" + }, + "クロスオーバー": { + "en": "crossover", + "ko": "", + "zh": "跨界作品", + "zh_tw": "跨界作品", + "romaji": "kurosuo-ba-" + }, + "夏油傑": { + "en": "Suguru Geto", + "ko": "", + "zh": "夏油杰", + "zh_tw": "", + "romaji": "getousuguru" + }, + "五条悟": { + "en": "Satoru Gojo", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "gojousatoru" + }, + "女体化": { + "en": "transforming into a woman", + "ko": "여체화", + "zh": "娘化", + "zh_tw": "女體化", + "romaji": "nyotaika" + }, + "腐向け": { + "en": "yaoi", + "ko": "부녀자향", + "zh": "腐向", + "zh_tw": "腐向", + "romaji": "fumuke" + }, + "マイキー": { + "en": "mikey", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "maiki-" + }, + "twst夢": { + "en": "Twisted-Wonderland fanfiction", + "ko": "트위스티드 원더랜드", + "zh": "", + "zh_tw": "", + "romaji": "tsuisuteyume" + }, + "本好きの下剋上": { + "en": "Ascendance of a Bookworm", + "ko": "", + "zh": "小书痴的下克上", + "zh_tw": "", + "romaji": "honnzukinogekokujou" + }, + "東京卍リベンジャーズ": { + "en": "Tokyo Revengers", + "ko": "", + "zh": "东京卍复仇者", + "zh_tw": "東京卍復仇者", + "romaji": "toukyouribennja-zu" + }, + "オリ主": { + "romaji": "orishuorinushi" + }, + "女主人公": { + "en": "female protagonist", + "ko": "", + "zh": "女主角", + "zh_tw": "女主人翁", + "romaji": "onnnashujinnkou" + }, + "続きを全裸待機": { + "en": "waiting for the sequel full naked", + "ko": "", + "zh": "全裸等待后续", + "zh_tw": "後續全裸待機", + "romaji": "tsudukiwozennrataiki" + }, + "女監督生": { + "en": "Female Prefect", + "ko": "", + "zh": "女监督生", + "zh_tw": "", + "romaji": "onnnakanntokusei" + }, + "現パロ": { + "en": "Modern AU", + "ko": "", + "zh": "现代改编", + "zh_tw": "現代paro", + "romaji": "gennparo" + }, + "やはり俺の青春ラブコメはまちがっている。": { + "en": "My Youth Romantic Comedy Is Wrong, As I Expected", + "ko": "역시 내 청춘코미디는 잘못됐다", + "zh": "果然我的青春恋爱喜剧搞错了。", + "zh_tw": "果然我的青春戀愛喜劇搞錯了。", + "romaji": "yahariorenoseishunnrabukomehamachigatteiru" + }, + "魔道祖師": { + "en": "MoDaoZuShi", + "ko": "", + "zh": "魔道祖师", + "zh_tw": "", + "romaji": "madousoshi" + }, + "比企谷八幡": { + "en": "Hachiman Hikigaya", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "hikigayahachimann" + }, + "場地圭介": { + "romaji": "bajikeisuke" + }, + "東京リベンジャーズ": { + "en": "Tokyo Revengers", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "toukyouribennja-zu" + }, + "虎杖悠仁": { + "en": "Yuji Itadori", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "itadoriyuuji" + }, + "待ってました!": { + "en": "", + "ko": "", + "zh": "", + "zh_tw": "等好久了!", + "romaji": "mattemashita" + }, + "呪術廻戦": { + "en": "Jujutsu Kaisen", + "ko": "주술회전", + "zh": "", + "zh_tw": "咒術迴戰", + "romaji": "jujutsukaisenn" + }, + "五伏": { + "en": "Gojo/Fushiguro", + "ko": "고죠후시", + "zh": "", + "zh_tw": "", + "romaji": "gofushi" + }, + "二次創作": { + "en": "fan work", + "ko": "2차 창작", + "zh": "二次创作", + "zh_tw": "", + "romaji": "nijisousaku" + }, + "ヤンデレ": { + "en": "yandere", + "ko": "얀데레", + "zh": "病娇", + "zh_tw": "病嬌", + "romaji": "yanndere" + }, + "クトゥルフ神話TRPG": { + "en": "Call of Cthulhu", + "ko": "", + "zh": "", + "zh_tw": "克蘇魯神話TRPG", + "romaji": "kutoxurufushinnwathi-a-rupi-ji-" + }, + "CoCシナリオ": { + "en": "", + "ko": "CoC시나리오", + "zh": "", + "zh_tw": "", + "romaji": "kutoxurufushinnwashinario" + }, + "ハリポタ": { + "en": "harry potter", + "ko": "해리 포터", + "zh": "哈利波特", + "zh_tw": "", + "romaji": "hari-potta-shiri-zu" + }, + "キャラ崩壊": { + "en": "out of character", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "kyarahoukai" + }, + "松野千冬": { + "romaji": "matsunochifuyu" + }, + "煉獄杏寿郎": { + "en": "Kyojuro Rengoku", + "ko": "", + "zh": "炼狱杏寿郎", + "zh_tw": "煉獄杏壽郎", + "romaji": "renngokukyoujurou" + }, + "loli": { + "en": "", + "ko": "", + "zh": "萝莉", + "zh_tw": "", + "romaji": "" + }, + "七七(原神)": { + "en": "Qiqi (Genshin Impact)", + "ko": "치치(원신)", + "zh": "", + "zh_tw": "", + "romaji": "nana" + }, + "けもみみ": { + "en": "animal ears", + "ko": "동물귀", + "zh": "兽耳", + "zh_tw": "獸耳", + "romaji": "kemomimi" + }, + "クレー(原神)": { + "en": "Klee (Genshin Impact)", + "ko": "클레(원신)", + "zh": "可莉(原神)", + "zh_tw": "", + "romaji": "kure-" + }, + "百合": { + "en": "yuri", + "ko": "백합", + "zh": "", + "zh_tw": "", + "romaji": "yuri" + }, + "空(原神)": { + "en": "Aether (Genshin Impact)", + "ko": "남행자(원신)", + "zh": "", + "zh_tw": "", + "romaji": "sora" + }, + "可愛い": { + "en": "kawaii", + "ko": "귀여워", + "zh": "可爱", + "zh_tw": "", + "romaji": "kawaii" + }, + "迪奥娜": { + "en": "Diona", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "" + }, + "七七": { + "en": "Qiqi", + "ko": "치치", + "zh": "", + "zh_tw": "", + "romaji": "nana" + }, + "ロリ": { + "en": "loli", + "ko": "로리", + "zh": "萝莉", + "zh_tw": "蘿莉", + "romaji": "rori" + }, + "ケモミミ": { + "en": "animal ears", + "ko": "동물귀", + "zh": "兽耳", + "zh_tw": "獸耳", + "romaji": "kemomimi" + }, + "猫耳": { + "en": "cat ears", + "ko": "고양이귀", + "zh": "", + "zh_tw": "貓耳", + "romaji": "nekomimi" + }, + "ディオナ(原神)": { + "en": "Diona (Genshin Impact)", + "ko": "디오나(원신)", + "zh": "迪奥娜(原神)", + "zh_tw": "", + "romaji": "dexiona" + }, + "萝莉": { + "en": "loli", + "ko": "로리", + "zh": "", + "zh_tw": "蘿莉", + "romaji": "rori" + }, + "女孩子": { + "en": "girl", + "ko": "", + "zh": "", + "zh_tw": "", + "romaji": "-" + }, + "ジョジョ立ち": { + "en": "jojo stand", + "ko": "", + "zh": "JoJo立", + "zh_tw": "", + "romaji": "jojodachi" + }, + "甘雨(原神)": { + "en": "Ganyu (Genshin Impact)", + "ko": "감우(원신)", + "zh": "", + "zh_tw": "", + "romaji": "kannu" + }, + "パイモン(原神)": { + "en": "Paimon (Genshin Impact)", + "ko": "페이몬(원신)", + "zh": "派蒙(原神)", + "zh_tw": "", + "romaji": "paimonn" + } + }, + "thumbnails": [ + { + "id": "87387148", + "title": "FATUI", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/01/29/21/59/00/87387148_p0_custom1200.jpg", + "description": "", + "tags": [ + "GenshinImpact", + "タルタリヤ", + "原神", + "childe", + "tartaglia", + "fatui", + "fanart", + "game", + "男", + "ファデュイ" + ], + "userId": "13072125", + "userName": "Sakon04", + "width": 2205, + "height": 1240, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#GenshinImpact FATUI - Sakon04的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-29T21:59:00+09:00", + "updateDate": "2021-01-29T21:59:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/12/16/00/27/28/8726991_aded4cb36017c75358144e7c902d6ead_50.jpg" + }, + { + "id": "89843345", + "title": "Eula - 原神", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/15/03/31/53/89843345_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "eula", + "エウルア", + "girl", + "fanart", + "夏", + "足", + "ビーチ", + "GenshinImpact", + "水着" + ], + "userId": "19114171", + "userName": "Sciamano240", + "width": 1225, + "height": 1320, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Eula - 原神 - Sciamano240的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-15T03:31:53+09:00", + "updateDate": "2021-05-15T03:31:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/23/11/52/40/18166130_25ded65943474188e64bffd1b423a5a2_50.jpg" + }, + { + "id": "87162139", + "title": "Mikasa", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/19/19/57/27/87162139_p0_square1200.jpg", + "description": "", + "tags": [ + "fanart", + "sexy", + "girl", + "thai", + "attackontitan", + "mikasa", + "進撃の巨人", + "Tight", + "尻" + ], + "userId": "17073719", + "userName": "Moi'dukdum", + "width": 1240, + "height": 1754, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#fanart Mikasa - Moi'dukdum的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-19T19:57:27+09:00", + "updateDate": "2021-01-19T19:57:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/06/23/03/20/48/20920050_111ecaa029872c76859691740ff0152b_50.jpg" + }, + { + "id": "57808612", + "title": "邪ンヌ・オルタ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/09/00/10/10/57808612_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "ジャンヌ・オルタ", + "FGO", + "魅惑のふともも", + "鬱くしい", + "これはいいふともも", + "骸骨", + "アヴェンジャー(Fate)", + "女の子", + "Fate/GO200000users入り" + ], + "userId": "73152", + "userName": "光崎", + "width": 1355, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 邪ンヌ・オルタ - 光崎的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-09T00:10:10+09:00", + "updateDate": "2016-07-09T00:10:10+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/24/17/50/20/20585046_e7a841f4f99a0703b8fe28552df0cfad_50.jpg" + }, + { + "id": "59665299", + "title": "FGO沖田総司", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/10/28/00/12/16/59665299_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "FGO", + "沖田総司", + "沖田総司(Fate)", + "菊一文字則宗", + "桜セイバー", + "Fate", + "Fate/GO100000users入り", + "版権", + "女の子" + ], + "userId": "73152", + "userName": "光崎", + "width": 1355, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder FGO沖田総司 - 光崎的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-10-28T00:12:16+09:00", + "updateDate": "2016-10-28T00:12:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/24/17/50/20/20585046_e7a841f4f99a0703b8fe28552df0cfad_50.jpg" + }, + { + "id": "82432085", + "title": "水着アナスタシアちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/06/20/00/00/11/82432085_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "FGO", + "アナスタシア(Fate)", + "水着", + "パレオ", + "アナスタシア・ニコラエヴナ・ロマノヴァ(Fate)", + "シースルー", + "麦わら帽子", + "Fate/GO100000users入り", + "白ビキニ" + ], + "userId": "73152", + "userName": "光崎", + "width": 750, + "height": 1179, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 水着アナスタシアちゃん - 光崎的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-20T00:00:11+09:00", + "updateDate": "2020-06-20T00:00:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/24/17/50/20/20585046_e7a841f4f99a0703b8fe28552df0cfad_50.jpg" + }, + { + "id": "61169484", + "title": "新年快樂!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/01/29/11/55/50/61169484_p0_square1200.jpg", + "description": "", + "tags": [ + "FGO", + "fate", + "年賀状", + "アルトリア・ペンドラゴン", + "セイバー(Fate/staynight)", + "Wセイバー", + "Fate/GO100000users入り", + "ネロ・クラウディウス(Fate)", + "春節", + "Fate/EXTRA作品ではありません" + ], + "userId": "529590", + "userName": "STAR影法師", + "width": 700, + "height": 959, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#FGO 新年快樂! - STAR影法師的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-01-29T11:55:50+09:00", + "updateDate": "2017-01-29T11:55:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/10/22/02/16/52/3751939_e70c1a9f4733d551a2ebc31deb68008f_50.jpg" + }, + { + "id": "68126965", + "title": "武蔵ちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/04/08/00/10/38/68126965_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "FGO", + "宮本武蔵(Fate)", + "ジーンズ", + "モッズコート", + "魅惑の谷間", + "おっぱい", + "Fate/GO100000users入り", + "巨乳", + "女の子" + ], + "userId": "162475", + "userName": "煎茶", + "width": 721, + "height": 1021, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 武蔵ちゃん - 煎茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-04-08T00:10:38+09:00", + "updateDate": "2018-04-08T00:10:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/01/21/01/17/56/16882907_c0aca74285bf3d8432387229dce02383_50.jpg" + }, + { + "id": "80567870", + "title": "Lumine", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/04/05/00/00/10/80567870_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "百合の花", + "荧", + "Lumine", + "原神project", + "GenshinImpact", + "旅行者", + "蛍(原神)", + "原神50000users入り", + "原神10000users入り" + ], + "userId": "15657814", + "userName": "Lunacle", + "width": 1325, + "height": 765, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Lumine - Lunacle的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-04-05T00:00:10+09:00", + "updateDate": "2020-04-05T00:00:10+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/02/19/18/21/25/12170140_91433554c3d8f06f3d579ff276489ff9_50.jpg" + }, + { + "id": "86425919", + "title": "水着甘雨", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/12/21/19/35/14/86425919_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "甘雨", + "水着", + "女の子", + "GenshinImpact", + "甘雨(原神)", + "おっぱい", + "剥ぎ取りたいブラ", + "剥ぎ取りたいビキニ(パンツ)", + "原神50000users入り" + ], + "userId": "5302293", + "userName": "雲こ猫", + "width": 1910, + "height": 2703, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 水着甘雨 - 雲こ猫的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-21T00:00:09+09:00", + "updateDate": "2020-12-21T19:35:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/12/19/19/08/22/19853469_65cc5442b06b94f94d2371f45bda33fc_50.png" + }, + { + "id": "86464433", + "title": "cheeky", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/22/23/57/16/86464433_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "胡桃", + "胡桃(原神)", + "GenshinImpact", + "マニキュア", + "原神50000users入り" + ], + "userId": "4028484", + "userName": "pellas", + "width": 1848, + "height": 2888, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 cheeky - pellas的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-22T23:57:16+09:00", + "updateDate": "2020-12-22T23:57:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/10/22/47/32/21015272_77dd1a81b932bb019689de5bc50053d9_50.png" + }, + { + "id": "75748320", + "title": "竈門禰豆子/Kamado Nezuko", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/07/16/01/16/52/75748320_p0_square1200.jpg", + "description": "", + "tags": [ + "girl", + "少女", + "鬼滅の刃", + "竈門禰豆子", + "鬼滅の刃10000users入り", + "胸チラ", + "鬼滅の刃50000users入り", + "仰臥", + "善逸ホイホイ", + "色気の刃" + ], + "userId": "38847253", + "userName": "Xeonomi", + "width": 2000, + "height": 3020, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#girl 竈門禰豆子/Kamado Nezuko - Xeonomi的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-07-16T01:16:52+09:00", + "updateDate": "2019-07-16T01:16:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/12/12/42/58/16402675_465e68dcc5756d22c925f1a72390aaef_50.jpg" + }, + { + "id": "83199735", + "title": "临光", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/07/25/01/08/14/83199735_p0_square1200.jpg", + "description": "", + "tags": [ + "明日方舟", + "Arknights", + "临光", + "布洛卡", + "泳装", + "贾维", + "うなじ", + "girl", + "おっぱい", + "ニアール(アークナイツ)" + ], + "userId": "7263576", + "userName": "♠Sea", + "width": 1800, + "height": 2698, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#明日方舟 临光 - ♠Sea的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-25T01:08:14+09:00", + "updateDate": "2020-07-25T01:08:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/06/16/13/45/37/6380279_d9718071432fd61ff3e7e5c9a1d83614_50.jpg" + }, + { + "id": "63150612", + "title": "Catwalk", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/05/31/01/39/28/63150612_p0_square1200.jpg", + "description": "", + "tags": [ + "illustration", + "concept", + "sketch", + "painting", + "art", + "Original", + "girl", + "cat", + "city", + "blue" + ], + "userId": "3143520", + "userName": "snatti", + "width": 1200, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#illustration Catwalk - snatti的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-05-31T01:39:28+09:00", + "updateDate": "2017-05-31T01:39:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/10/24/14/59/07/6974808_32cfae5c5558599ade59663e6b1452e6_50.jpg" + }, + { + "id": "67329067", + "title": "霧の湖", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/18/00/00/34/67329067_p0_square1200.jpg", + "description": "", + "tags": [ + "古明地こいし", + "東方", + "幻想郷の風景", + "紅魔館", + "東方Project", + "ふつくしい", + "東方Project10000users入り", + "イラスト", + "fanart", + "illustration" + ], + "userId": "4790", + "userName": "ぢせ", + "width": 1200, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#古明地こいし 霧の湖 - ぢせ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-18T00:00:34+09:00", + "updateDate": "2018-02-18T00:00:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/10/15/21/33/58/13346842_913debc5c54b23bab635cde7e963e25c_50.png" + }, + { + "id": "68670776", + "title": "地上", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/05/10/00/00/13/68670776_p0_square1200.jpg", + "description": "", + "tags": [ + "東方", + "古明地こいし", + "空", + "風船", + "雲", + "東方Project", + "東方Project10000users入り", + "イラスト", + "fanart", + "illustration" + ], + "userId": "4790", + "userName": "ぢせ", + "width": 1600, + "height": 681, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方 地上 - ぢせ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-05-10T00:00:13+09:00", + "updateDate": "2018-05-10T00:00:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/10/15/21/33/58/13346842_913debc5c54b23bab635cde7e963e25c_50.png" + }, + { + "id": "57746661", + "title": "レディバグはまりました", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/05/01/11/52/57746661_p0_square1200.jpg", + "description": "", + "tags": [ + "MiraculousLadybug", + "レディバグ", + "MiraculousLadybug5000users入り", + "ミラキュラスレディバグ&シャノワール" + ], + "userId": "68845", + "userName": "こんぐ", + "width": 776, + "height": 629, + "pageCount": 17, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MiraculousLadybug レディバグはまりました - こんぐ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-05T01:11:52+09:00", + "updateDate": "2016-07-05T01:11:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/07/30/13/04/10/2027455_cc98fa5a7e25b6a222c186b9b847f661_50.jpg" + }, + { + "id": "76208126", + "title": "Miraculous Ladybug.2", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/08/12/00/44/48/76208126_p0_square1200.jpg", + "description": "", + "tags": [ + "MiraculousLadybug", + "アドマリ", + "ノワバグ", + "MiraculousLadybug1000users入り", + "ミラキュラスレディバグ&シャノワール" + ], + "userId": "10838026", + "userName": "mg", + "width": 680, + "height": 522, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MiraculousLadybug Miraculous Ladybug.2 - mg的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-08-12T00:44:48+09:00", + "updateDate": "2019-08-12T00:44:48+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "53366642", + "title": "my lady", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/11/03/18/50/59/53366642_p0_square1200.jpg", + "description": "", + "tags": [ + "Ladybug", + "レディーバグ", + "MiraculousLadybug", + "MiraculousLadybug1000users入り", + "タイツがかっこよく見える不思議" + ], + "userId": "3085863", + "userName": "天然風", + "width": 1000, + "height": 885, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Ladybug my lady - 天然風的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-11-03T18:50:59+09:00", + "updateDate": "2015-11-03T18:50:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/08/25/17/32/00/11405511_9c81d659c2f9cbf5bd8c1f2c41d2b573_50.jpg" + }, + { + "id": "76220766", + "title": "Moonlight", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/08/12/20/48/31/76220766_p0_square1200.jpg", + "description": "", + "tags": [ + "SUMMER", + "sky", + "Melancholy", + "Cloud", + "Evening", + "sunset", + "moon", + "stars", + "背景", + "風景" + ], + "userId": "29871659", + "userName": "istomin_denis", + "width": 816, + "height": 900, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#SUMMER Moonlight - istomin_denis的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-08-12T20:48:31+09:00", + "updateDate": "2019-08-12T20:48:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/07/09/23/57/21/14466131_715330667fca28f68bf380486130fa02_50.jpg" + }, + { + "id": "74955694", + "title": "暑い 落書き", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/29/05/43/22/74955694_p0_square1200.jpg", + "description": "", + "tags": [ + "セーラームーン", + "ちびうさ", + "美少女戦士セーラームーン", + "sailor", + "moon", + "ブラック・レディ", + "BlackLady", + "ブラックレディ", + "セーラームーン1000users入り" + ], + "userId": "7369463", + "userName": "NEWZニューズ", + "width": 1000, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#セーラームーン 暑い 落書き - NEWZニューズ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-29T05:43:22+09:00", + "updateDate": "2019-05-29T05:43:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/01/07/19/10/21/10349639_4989e89cdf36532f5a48493c766ac7f4_50.png" + }, + { + "id": "74723171", + "title": "Sailor moon", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/14/13/36/29/74723171_p0_square1200.jpg", + "description": "", + "tags": [ + "sailor", + "moon", + "sailormoon", + "美少女戦士セーラームーン", + "月野うさぎ", + "セーラームーン1000users入り" + ], + "userId": "20283127", + "userName": "hoobamon", + "width": 999, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#sailor Sailor moon - hoobamon的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-14T13:36:29+09:00", + "updateDate": "2019-05-14T13:36:29+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/10/08/11/26/22/11593066_b1cff2986627ccec1a78236292230337_50.jpg" + }, + { + "id": "41686664", + "title": "母ログ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/02/17/00/06/28/41686664_p0_square1200.jpg", + "description": "", + "tags": [ + "MOTHER", + "MOTHER2", + "MOTHER3", + "MOTHER3000users入り" + ], + "userId": "1246592", + "userName": "磯部", + "width": 718, + "height": 687, + "pageCount": 18, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MOTHER 母ログ - 磯部的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-02-17T00:06:28+09:00", + "updateDate": "2014-02-17T00:06:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/05/05/15/02/38/7826596_c8bc1d8055915d51c6b6c6d309479e4a_50.jpg" + }, + { + "id": "56436164", + "title": "MOTHER", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/04/20/00/02/52/56436164_p0_square1200.jpg", + "description": "", + "tags": [ + "MOTHER", + "MOTHER2", + "MOTHER3", + "集合絵", + "MOTHER1000users入り", + "愛を感じる", + "MOTHERシリーズ" + ], + "userId": "794658", + "userName": "ラリアット", + "width": 1200, + "height": 1788, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MOTHER MOTHER - ラリアット的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-04-20T00:02:52+09:00", + "updateDate": "2016-04-20T00:02:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/12/14/01/31/13/3948367_a73a4537e3c689be244716d57352e2d8_50.png" + }, + { + "id": "11765689", + "title": "強くならなきゃ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2010/07/09/02/40/47/11765689_p0_square1200.jpg", + "description": "", + "tags": [ + "リュカ", + "背景", + "MOTHER", + "MOTHER3", + "お絵描き掲示板", + "ドット絵", + "お絵描き掲示板の本気", + "(´;ω;`)", + "MOTHER1000users入り" + ], + "userId": "1553813", + "userName": "夏道", + "width": 500, + "height": 500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#リュカ 強くならなきゃ - 夏道的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2010-07-09T02:40:47+09:00", + "updateDate": "2010-07-09T02:40:47+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/07/11/20/47/57/1951068_374b5c668f8924193821810c610d7f3f_50.png" + }, + { + "id": "58122126", + "title": "今日は一日おやすみぞい!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/28/09/00/00/58122126_p0_square1200.jpg", + "description": "", + "tags": [ + "NEWGAME!", + "涼風青葉", + "ファミコン", + "戦士の休息", + "NEWGAME!10000users入り", + "パジャマ", + "イーグルジャンプ", + "コントローラー" + ], + "userId": "3145937", + "userName": "goribote", + "width": 700, + "height": 750, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NEWGAME! 今日は一日おやすみぞい! - goribote的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-28T09:00:00+09:00", + "updateDate": "2016-07-28T09:00:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/29/18/51/15/20612203_699482ee7e73a291dc9da97a9a4397d6_50.png" + }, + { + "id": "64433132", + "title": "NEWGAME!!のひふみん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/08/15/20/16/32/64433132_p0_square1200.jpg", + "description": "", + "tags": [ + "NEWGAME!!", + "滝本ひふみ", + "NEWGAME!", + "ポニーテール", + "上目遣い", + "NEWGAME!5000users入り" + ], + "userId": "5852420", + "userName": "妄想", + "width": 3035, + "height": 2149, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NEWGAME!! NEWGAME!!のひふみん - 妄想的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-08-15T20:16:32+09:00", + "updateDate": "2017-08-15T20:16:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/07/04/13/46/09/18931171_902f60459063bcd49d4adfd81d4fa3b9_50.jpg" + }, + { + "id": "57681432", + "title": "ひふみん!ひふみん!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/01/19/23/59/57681432_p0_square1200.jpg", + "description": "", + "tags": [ + "NEWGAME!", + "涼風青葉", + "滝本ひふみ", + "青ひふ", + "NEWGAME!5000users入り" + ], + "userId": "27691", + "userName": "結城辰也", + "width": 1280, + "height": 720, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NEWGAME! ひふみん!ひふみん! - 結城辰也的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-01T19:23:59+09:00", + "updateDate": "2016-07-01T19:23:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/02/10/06/33/01/10509654_53f715342b56f00451b79169200c892e_50.jpg" + }, + { + "id": "61784598", + "title": "朽ち果てた世界で", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/03/07/00/06/44/61784598_p0_square1200.jpg", + "description": "", + "tags": [ + "NieR:Automata", + "NieR", + "ニーアオートマタ", + "ニーア", + "2B", + "9S", + "ヨルハ九号S型", + "ヨルハ二号B型", + "NieR10000users入り" + ], + "userId": "1249098", + "userName": "サイトー@FANBOX開設!", + "width": 4784, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NieR:Automata 朽ち果てた世界で - サイトー@FANBOX開設!的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-03-07T00:06:44+09:00", + "updateDate": "2017-03-07T00:06:44+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/04/21/00/34/41/9262731_c59b2d62d8f4693ac246403ff6b4e1ed_50.png" + }, + { + "id": "61599251", + "title": "ふたりなら", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/02/23/16/54/53/61599251_p0_square1200.jpg", + "description": "", + "tags": [ + "ニーア", + "NieR", + "NieR:Automata", + "ニーアオートマタ", + "9S", + "ヨルハ九号S型", + "ヨルハ二号B型", + "2B", + "2B9S", + "NieR10000users入り" + ], + "userId": "2119953", + "userName": "風李たゆ", + "width": 2400, + "height": 1600, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ニーア ふたりなら - 風李たゆ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-02-23T16:54:53+09:00", + "updateDate": "2017-02-23T16:54:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/10/09/16/36/20/9975377_6ceb780f31ab86bca5886a827c951275_50.png" + }, + { + "id": "62039907", + "title": "ヨルハ二号B型", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/03/22/14/37/14/62039907_p0_square1200.jpg", + "description": "", + "tags": [ + "NieR:Automata", + "ニーアオートマタ", + "NieR", + "ヨルハ二号B型", + "2B", + "女の子", + "艶ぼくろ", + "唇", + "魅惑の谷間", + "NieR10000users入り" + ], + "userId": "23509413", + "userName": "GATORIX", + "width": 800, + "height": 742, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#NieR:Automata ヨルハ二号B型 - GATORIX的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-03-22T14:37:14+09:00", + "updateDate": "2017-03-22T14:37:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/03/17/12/44/01/12279748_d420b1447387f77179190e18df6baa63_50.jpg" + }, + { + "id": "90390199", + "title": "Finana", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/07/14/16/51/90390199_p0_square1200.jpg", + "description": "", + "tags": [ + "VTuber", + "バーチャルYouTuber", + "にじさんじ", + "FinanaRyugu", + "NIJISANJI_EN", + "LazuLight", + "バーチャルYouTuber5000users入り", + "目がハート" + ], + "userId": "16105069", + "userName": "pumpkinspice", + "width": 2121, + "height": 3000, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#VTuber Finana - pumpkinspice的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-07T14:16:51+09:00", + "updateDate": "2021-06-07T14:16:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/02/08/33/10/14571013_74e1cdb0d17f64b538924a54648fe90f_50.jpg" + }, + { + "id": "69463109", + "title": "Life's Journey", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/06/30/02/12/46/69463109_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "女の子", + "original", + "鉄道駅", + "線路", + "白いドレス", + "白髪", + "植物", + "オリジナル10000users入り", + "廃墟" + ], + "userId": "3137712", + "userName": "Yuu", + "width": 2000, + "height": 1139, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル Life's Journey - Yuu的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-06-30T02:12:46+09:00", + "updateDate": "2018-06-30T02:12:46+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/24/05/04/05/7350366_aeafa41f311a5b915d83d68e97e131f2_50.jpg" + }, + { + "id": "33414104", + "title": "アンダーグラウンド", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/02/08/15/21/25/33414104_p0_square1200.jpg", + "description": "", + "tags": [ + "カラー", + "original", + "落書き", + "ハッカー", + "サイバーパンク", + "バイオリン", + "オリジナル", + "ヘッドフォン", + "オリジナル10000users入り", + "ハイカットスニーカー" + ], + "userId": "3137712", + "userName": "Yuu", + "width": 1000, + "height": 1333, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#カラー アンダーグラウンド - Yuu的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-02-08T15:21:25+09:00", + "updateDate": "2013-02-08T15:21:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/24/05/04/05/7350366_aeafa41f311a5b915d83d68e97e131f2_50.jpg" + }, + { + "id": "69139520", + "title": "Still Waiting", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/06/09/03/30/36/69139520_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "original", + "東京", + "背景", + "都市", + "風景", + "魚眼", + "オリジナル10000users入り", + "素晴らしすぎる", + "夜景" + ], + "userId": "3137712", + "userName": "Yuu", + "width": 1500, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 Still Waiting - Yuu的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-06-09T03:30:36+09:00", + "updateDate": "2018-06-09T03:30:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/24/05/04/05/7350366_aeafa41f311a5b915d83d68e97e131f2_50.jpg" + }, + { + "id": "91411248", + "title": "kawaii", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/22/10/39/45/91411248_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "PetraArt", + "petragurin", + "NIJISANJI_EN", + "にじさんじ", + "Petra", + "Vtuber", + "バーチャルYouTuber", + "ペトラ・グリン" + ], + "userId": "32627210", + "userName": "キケン⚠️", + "width": 1191, + "height": 1684, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 kawaii - キケン⚠️的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-22T10:39:45+09:00", + "updateDate": "2021-07-22T10:39:45+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/13/20/42/31/19173359_92cf372e5256c65100558611aae295c1_50.jpg" + }, + { + "id": "89338355", + "title": "Violet at the Beach", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/04/23/19/19/37/89338355_p0_custom1200.jpg", + "description": "", + "tags": [ + "3D", + "DAZStudio", + "3DCG", + "bikini", + "micro_bikini", + "Beach", + "Incredibles", + "violet", + "pregnant", + "Violet_Parr" + ], + "userId": "66263727", + "userName": "13Amps", + "width": 1080, + "height": 1920, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#3D Violet at the Beach - 13Amps的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-04-23T19:19:37+09:00", + "updateDate": "2021-04-23T19:19:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/11/22/50/30/20340516_0b41ce78da86fa7875387b7f5c771cba_50.jpg" + }, + { + "id": "83468525", + "title": "【終】Helltaker、私的結婚子育てルート編Part3", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/05/21/54/24/83468525_p0_square1200.jpg", + "description": "", + "tags": [ + "Helltaker", + "pregnant", + "ボテ腹", + "妊娠", + "親子妄想", + "ハーレム", + "Beelzebub", + "Zdrada", + "Cerberus", + "授乳" + ], + "userId": "36855466", + "userName": "リリT", + "width": 700, + "height": 700, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Helltaker 【終】Helltaker、私的結婚子育てルート編Part3 - リリT的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-05T21:54:24+09:00", + "updateDate": "2020-08-05T21:54:24+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/12/28/11/25/50/15182836_bd70ac1e76b0e68f35050c93696c7245_50.jpg" + }, + { + "id": "83295372", + "title": "Helltaker、私的結婚子育てルート編part2", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/03/18/30/12/83295372_p0_square1200.jpg", + "description": "", + "tags": [ + "pregnant", + "Helltaker", + "妊娠", + "ボテ腹", + "Lucifer", + "Judgement", + "azazel", + "malina", + "親子妄想", + "育児" + ], + "userId": "36855466", + "userName": "リリT", + "width": 700, + "height": 700, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#pregnant Helltaker、私的結婚子育てルート編part2 - リリT的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-29T01:18:37+09:00", + "updateDate": "2020-08-03T18:30:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/12/28/11/25/50/15182836_bd70ac1e76b0e68f35050c93696c7245_50.jpg" + }, + { + "id": "70833260", + "title": "白いR(ローズ)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/23/20/36/42/70833260_p0_square1200.jpg", + "description": "", + "tags": [ + "湊友希那", + "BanG_Dream!", + "バンドリ", + "roselia", + "ロゼリア", + "バンドリ500users入り", + "バンドリ1000users入り" + ], + "userId": "3027037", + "userName": "瓶紫", + "width": 667, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#湊友希那 白いR(ローズ) - 瓶紫的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-23T20:36:42+09:00", + "updateDate": "2018-09-23T20:36:42+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/19/04/14/26/20029658_7028bacd56b3e9949f77e15fdfffdeab_50.jpg" + }, + { + "id": "78311723", + "title": "OC Tess - Stay hydrated 2", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/12/15/21/07/27/78311723_p0_square1200.jpg", + "description": "", + "tags": [ + "oc", + "scifi", + "spy", + "tess", + "ビキニ", + "夏", + "後ろの存在感", + "足を浸す", + "オリジナル10000users入り", + "白ビキニ" + ], + "userId": "12969170", + "userName": "ライコ", + "width": 850, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#oc OC Tess - Stay hydrated 2 - ライコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-12-15T21:07:27+09:00", + "updateDate": "2019-12-15T21:07:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/02/28/11/15/31/12207625_a6dc65155a5e7a51a7ed5df19f9bae63_50.png" + }, + { + "id": "53034161", + "title": "Church FFVII", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/10/14/18/24/43/53034161_p0_square1200.jpg", + "description": "", + "tags": [ + "FFVII", + "FinalFantasyVII", + "CloudStrife", + "TifaLockhart", + "2d", + "fantasy", + "scifi", + "クラウド・ストライフ", + "ティファ・ロックハート", + "ファイナルファンタジ" + ], + "userId": "13537252", + "userName": "SayaArt", + "width": 2100, + "height": 1093, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#FFVII Church FFVII - SayaArt的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-10-14T18:24:43+09:00", + "updateDate": "2015-10-14T18:24:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/06/18/46/31/20655480_de2cf7281fc772cc3ed313e1009e8c0b_50.jpg" + }, + { + "id": "77079433", + "title": "OC Tess - That's how mafia works", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/10/02/23/18/50/77079433_p0_square1200.jpg", + "description": "", + "tags": [ + "oc", + "tess", + "scifi", + "Spy", + "イブニングドレス", + "Tess_Turner", + "アクション" + ], + "userId": "12969170", + "userName": "ライコ", + "width": 960, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#oc OC Tess - That's how mafia works - ライコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-10-02T23:18:50+09:00", + "updateDate": "2019-10-02T23:18:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/02/28/11/15/31/12207625_a6dc65155a5e7a51a7ed5df19f9bae63_50.png" + }, + { + "id": "87944694", + "title": "ラン暦まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/02/21/20/13/05/87944694_p0_square1200.jpg", + "description": "", + "tags": [ + "sk∞", + "エスケーエイト", + "ラン暦", + "エ腐ケーエイト5000users入り", + "SK∞" + ], + "userId": "59050197", + "userName": "🐟", + "width": 1629, + "height": 1139, + "pageCount": 12, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#sk∞ ラン暦まとめ - 🐟的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-21T20:13:05+09:00", + "updateDate": "2021-02-21T20:13:05+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "87615344", + "title": "ランガ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/02/08/09/47/36/87615344_p0_square1200.jpg", + "description": "", + "tags": [ + "エスケーエイト", + "SK∞", + "馳河ランガ", + "愛抱夢", + "SK∞1000users入り", + "SK∞3000users入り" + ], + "userId": "49693", + "userName": "JaneMere", + "width": 880, + "height": 1245, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#エスケーエイト ランガ - JaneMere的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-08T06:35:25+09:00", + "updateDate": "2021-02-08T09:47:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/09/19/20/41/20/3633096_1eaf96ca4072d4c0b1f81a6b3371614a_50.jpg" + }, + { + "id": "87840158", + "title": "skate board", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/02/17/14/31/43/87840158_p0_custom1200.jpg", + "description": "", + "tags": [ + "sk", + "エスケーエイト", + "SK8", + "SK∞", + "SK∞1000users入り", + "馳河ランガ", + "喜屋武暦" + ], + "userId": "12342223", + "userName": "Lococo:p", + "width": 900, + "height": 1379, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#sk skate board - Lococo:p的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-17T08:40:36+09:00", + "updateDate": "2021-02-17T14:31:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/01/17/47/13/17840863_cfad4ab6109bb01f59ed8a8ce530a5f7_50.jpg" + }, + { + "id": "72655663", + "title": "KDA Sona X DJ ahri", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/01/14/11/57/06/72655663_p0_square1200.jpg", + "description": "", + "tags": [ + "League_of_Legends", + "ahri", + "sona", + "尻神様", + "英雄联盟", + "Sona", + "Ahri", + "ハイレグスーツ", + "LOL10000users入り", + "けしからん乳" + ], + "userId": "3384404", + "userName": "sakimichan", + "width": 1000, + "height": 707, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#League_of_Legends KDA Sona X DJ ahri - sakimichan的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-01-14T11:57:06+09:00", + "updateDate": "2019-01-14T11:57:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/04/10/20/01/05/14077934_df136ab55825bc335ee2c3b32879fbae_50.jpg" + }, + { + "id": "85617306", + "title": "Arknights - Surtr", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/12/06/01/58/85617306_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "solo", + "Arknights", + "アークナイツ", + "Surtr", + "sword", + "スルト(アークナイツ)", + "アークナイツ1000users入り" + ], + "userId": "9690454", + "userName": "Pinlin", + "width": 1368, + "height": 1779, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 Arknights - Surtr - Pinlin的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-12T06:01:58+09:00", + "updateDate": "2020-11-12T06:01:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/26/21/51/49/18187458_1d8c31845077ee0284542baa4deb609d_50.png" + }, + { + "id": "78679716", + "title": "能代", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/01/03/09/31/28/78679716_p0_square1200.jpg", + "description": "", + "tags": [ + "アズールレーン", + "能代(アズールレーン)", + "黒タイツ", + "アズールレーン1000users入り", + "黒セーラー", + "sword", + "おへそ" + ], + "userId": "923205", + "userName": "Ka11_CA", + "width": 1309, + "height": 1576, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#アズールレーン 能代 - Ka11_CA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-03T09:31:28+09:00", + "updateDate": "2020-01-03T09:31:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/12/05/41/11/20342070_68d5c18f1f3c85149dabe8512eb322f0_50.png" + }, + { + "id": "41086111", + "title": "master artoria 重制", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/01/21/00/22/34/41086111_p0_square1200.jpg", + "description": "", + "tags": [ + "saber", + "fate/zero", + "fatezero", + "fate", + "king", + "剑", + "聖杯", + "sword", + "セイバー", + "アルトリア・ペンドラゴン" + ], + "userId": "4278669", + "userName": "AIOVIA", + "width": 2100, + "height": 1440, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#saber master artoria 重制 - AIOVIA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-01-21T00:22:34+09:00", + "updateDate": "2014-01-21T00:22:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/01/07/11/50/40/8815279_660a343fb3587ec430618d0d0ce2b941_50.jpg" + }, + { + "id": "83432825", + "title": "❤ Maron x Kurilin x N18 ❤", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/04/01/01/43/83432825_p0_square1200.jpg", + "description": "", + "tags": [ + "hentai", + "manga", + "tits", + "anime", + "dragonball", + "ドラゴンボール", + "oppai", + "おっぱい", + "18号", + "人造人間18号" + ], + "userId": "16220317", + "userName": "山本同人", + "width": 1283, + "height": 720, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#hentai ❤ Maron x Kurilin x N18 ❤ - 山本同人的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-04T01:01:43+09:00", + "updateDate": "2020-08-04T01:01:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/16/03/45/07/20540227_260df86a29841c0115d986a722323d35_50.jpg" + }, + { + "id": "70823889", + "title": "Elf girl エルフ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/23/04/25/07/70823889_p0_square1200.jpg", + "description": "", + "tags": [ + "おっぱい", + "巨乳", + "胸の谷間", + "挟まれたい谷間", + "爆乳", + "エルフ", + "boobs", + "breasts", + "tits", + "超次元ゲイム" + ], + "userId": "15037284", + "userName": "Kainkout", + "width": 868, + "height": 1220, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#おっぱい Elf girl エルフ - Kainkout的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-23T04:25:07+09:00", + "updateDate": "2018-09-23T04:25:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/14/03/57/23/18327182_b263676753b4f22ee2a32fd21ea61757_50.png" + }, + { + "id": "73213860", + "title": "Boulder Booty Pt.1 comic", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/02/16/13/40/37/73213860_p0_square1200.jpg", + "description": "", + "tags": [ + "toph", + "avatar", + "ass", + "big", + "tits", + "curvy", + "まんこ" + ], + "userId": "14726154", + "userName": "Modaw", + "width": 866, + "height": 806, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#toph Boulder Booty Pt.1 comic - Modaw的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-02-16T13:40:37+09:00", + "updateDate": "2019-02-16T13:40:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/08/19/02/04/29/16162970_de6477639e101045dc7994b840a0fd1a_50.png" + }, + { + "id": "56551573", + "title": "罪過の轟鳴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/04/27/00/17/14/56551573_p0_square1200.jpg", + "description": "", + "tags": [ + "東方", + "鍵山雛", + "東方Project", + "東方風神録", + "Touhou", + "东方", + "厄をため込む程度の能力", + "東方Project250users入り", + "Touhou_Project", + "ハイセンス" + ], + "userId": "236979", + "userName": "七支刀しう", + "width": 800, + "height": 600, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方 罪過の轟鳴 - 七支刀しう的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-04-27T00:17:14+09:00", + "updateDate": "2016-04-27T00:17:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/01/17/21/27/54/15272213_f82ce518fb888fcc24e94b475dd1f18c_50.jpg" + }, + { + "id": "84222181", + "title": "お茶会", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/09/17/51/03/84222181_p0_square1200.jpg", + "description": "", + "tags": [ + "東方LostWordイラコン", + "東方Project", + "東方", + "touhou", + "Touhou_Project", + "八雲紫", + "茨木華扇", + "摩多羅隠岐奈", + "西行寺幽々子", + "ゆかぱい" + ], + "userId": "24929537", + "userName": "信仰", + "width": 6544, + "height": 3472, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方LostWordイラコン お茶会 - 信仰的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-07T20:28:26+09:00", + "updateDate": "2020-09-09T17:51:03+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/18/22/59/58/19690181_5e40f2ac69f95802985edd9ef4d0eb4f_50.jpg" + }, + { + "id": "90521833", + "title": "Broken", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/13/13/09/50/90521833_p0_square1200.jpg", + "description": "", + "tags": [ + "Touhou_Project", + "東方Project100users入り", + "西行寺幽々子", + "もっと評価されるべき" + ], + "userId": "18905574", + "userName": "Xumi", + "width": 3789, + "height": 2131, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Touhou_Project Broken - Xumi的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-13T13:09:50+09:00", + "updateDate": "2021-06-13T13:09:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/01/10/03/48/23/16830342_f44fe0e501e17ef32b154b241b54fb05_50.jpg" + }, + { + "id": "73483984", + "title": "Bloodborne - A Song of Crows", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/03/10/32/58/73483984_p0_square1200.jpg", + "description": "", + "tags": [ + "ComicCover", + "ClipStudio", + "Traditionalart", + "CoverArt", + "Comicbookart", + "Comics", + "Soulsborne", + "ブラッドボーン", + "Bloodborne" + ], + "userId": "17785359", + "userName": "jeffstokely", + "width": 3155, + "height": 4807, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ComicCover Bloodborne - A Song of Crows - jeffstokely的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-03T10:32:58+09:00", + "updateDate": "2019-03-03T10:32:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/02/27/15/55/56/15457497_4352e6046ddc625e3e618602a04015a7_50.jpg" + }, + { + "id": "26064013", + "title": "Transformers prime fanart", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2012/03/25/11/04/59/26064013_p0_square1200.jpg", + "description": "", + "tags": [ + "transformers", + "prime", + "optimus", + "megatron", + "soundwave", + "ratchet", + "オプティマス", + "トランスフォーマー", + "メガトロン", + "トランスフォーマー500user入り" + ], + "userId": "3491516", + "userName": "ユラ(Kim yura )", + "width": 730, + "height": 1027, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#transformers Transformers prime fanart - ユラ(Kim yura )的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2012-03-25T11:04:59+09:00", + "updateDate": "2012-03-25T11:04:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/17/00/09/31/16714837_810f877e9b39e0155000bd0ca279c129_50.png" + }, + { + "id": "50067770", + "title": "トランスフォーマー ログ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/04/28/08/28/49/50067770_p0_square1200.jpg", + "description": "", + "tags": [ + "オプティマスプライム", + "ノックアウト", + "ウルトラマグナス", + "スタースクリーム", + "ホイルジャック", + "トランスフォーマー", + "transformers", + "メカ", + "トランスフォーマー500user入り", + "トランスフォーマー1000users入り" + ], + "userId": "3491516", + "userName": "ユラ(Kim yura )", + "width": 650, + "height": 876, + "pageCount": 14, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オプティマスプライム トランスフォーマー ログ - ユラ(Kim yura )的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-04-28T08:28:49+09:00", + "updateDate": "2015-04-28T08:28:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/17/00/09/31/16714837_810f877e9b39e0155000bd0ca279c129_50.png" + }, + { + "id": "45571240", + "title": "Transformers Prime scientists", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/08/25/00/30/43/45571240_p0_square1200.jpg", + "description": "", + "tags": [ + "トランスフォーマー", + "プライム", + "transformers", + "ノックアウト", + "ショックウェーブ", + "ラチェット", + "トランスフォーマー500user入り", + "科学者", + "トランスフォーマープライム", + "トランスフォーマー1000users入り" + ], + "userId": "3491516", + "userName": "ユラ(Kim yura )", + "width": 800, + "height": 1600, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#トランスフォーマー Transformers Prime scientists - ユラ(Kim yura )的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-08-25T00:30:43+09:00", + "updateDate": "2014-08-25T00:30:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/17/00/09/31/16714837_810f877e9b39e0155000bd0ca279c129_50.png" + }, + { + "id": "57936213", + "title": "神様と男の子", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/16/21/21/33/57936213_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "人間×人外", + "オリジナル", + "続編希望", + "transfur", + "オリジナル10000users入り", + "衝撃のラスト" + ], + "userId": "18718654", + "userName": "四六がま野", + "width": 800, + "height": 1131, + "pageCount": 18, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#人間×人外 神様と男の子 - 四六がま野的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-16T21:21:33+09:00", + "updateDate": "2016-07-16T21:21:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/06/18/21/28/06/11082269_298a4059b38e1b64a39cd8857d0c034d_50.png" + }, + { + "id": "81973222", + "title": "山月記のクソ雑魚メンタルメスガキTF李徴の女体化", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/30/23/35/39/81973222_p0_square1200.jpg", + "description": "", + "tags": [ + "山月記", + "メスガキ", + "transfur", + "国語の教科書", + "擬獣化", + "女体化", + "教科書オールスターズ", + "だいたいあってる", + "属性の交通渋滞", + "李徴" + ], + "userId": "7499778", + "userName": "DiZ", + "width": 2332, + "height": 2924, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#山月記 山月記のクソ雑魚メンタルメスガキTF李徴の女体化 - DiZ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-30T23:35:39+09:00", + "updateDate": "2020-05-30T23:35:39+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/13/04/37/36/19994816_9af9107dfd594e24fada419d2cafecd9_50.jpg" + }, + { + "id": "53601510", + "title": "Level ケモナー", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/11/17/16/48/57/53601510_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "佐天涙子", + "とある科学の超電磁砲", + "ケモノ", + "メスケモ", + "続編希望", + "transfur", + "18禁版希望", + "続編期待", + "とある1000users入り" + ], + "userId": "5773248", + "userName": "川上真樹", + "width": 1559, + "height": 2196, + "pageCount": 14, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#佐天涙子 Level ケモナー - 川上真樹的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-11-17T16:48:57+09:00", + "updateDate": "2015-11-17T16:48:57+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/11/04/13/15/15/8586058_1ee0b06f1e31520d420097d039e687c5_50.jpg" + }, + { + "id": "73518990", + "title": "白上フブキ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/05/03/09/55/73518990_p0_square1200.jpg", + "description": "", + "tags": [ + "VTuber", + "バーチャルYouTuber", + "白上フブキ", + "寝起き", + "腋", + "咥え髪留め", + "狐耳", + "おへそ", + "バーチャルYouTuber100000users入り", + "ホロライブ" + ], + "userId": "19880053", + "userName": "れいなま", + "width": 913, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#VTuber 白上フブキ - れいなま的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-05T03:09:55+09:00", + "updateDate": "2019-03-05T03:09:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "83603397", + "title": "雪花ラミィ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/11/17/02/07/83603397_p0_square1200.jpg", + "description": "", + "tags": [ + "ホロライブ", + "雪花ラミィ", + "VTuber", + "バーチャルYouTuber", + "マニキュア", + "ウィンク", + "圧倒的胸囲", + "本家", + "バーチャルYouTuber50000users入り" + ], + "userId": "4754550", + "userName": "リン☆ユウ@新刊通販委託中", + "width": 1489, + "height": 1326, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ホロライブ 雪花ラミィ - リン☆ユウ@新刊通販委託中的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-11T17:02:07+09:00", + "updateDate": "2020-08-11T17:02:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/10/06/12/04/30/9964580_13765b1f2f2796a014f43072b7316d3f_50.png" + }, + { + "id": "83442129", + "title": "【創作】新人Vと新人に感情ぐちゃぐちゃにされるVTuber", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/04/17/00/01/83442129_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "オリジナル", + "限界化", + "続きを正座待機", + "VTuber", + "職質などとんでもない", + "すし", + "反応が限界オタクのそれ", + "オリジナル50000users入り", + "…好き…" + ], + "userId": "22479045", + "userName": "ミキマキ", + "width": 607, + "height": 894, + "pageCount": 7, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 【創作】新人Vと新人に感情ぐちゃぐちゃにされるVTuber - ミキマキ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-04T17:00:01+09:00", + "updateDate": "2020-08-04T17:00:01+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/04/11/14/06/05/15636342_add07575cc3a5b8a70fbd7b66ce31e17_50.jpg" + }, + { + "id": "73593539", + "title": "Panzer Commander", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/09/21/03/18/73593539_p0_square1200.jpg", + "description": "", + "tags": [ + "制服", + "女の子", + "ドイツ", + "落書き", + "ww2", + "国防軍", + "戦乙女", + "オリジナル1000users入り" + ], + "userId": "8194684", + "userName": "Tuziki兔子或是熊?!", + "width": 1132, + "height": 1436, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#制服 Panzer Commander - Tuziki兔子或是熊?!的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-09T21:03:18+09:00", + "updateDate": "2019-03-09T21:03:18+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/09/14/23/22/38/19359853_ab4e92dc7c8e144ab6a0de7c072b9c03_50.jpg" + }, + { + "id": "82266993", + "title": "どうぶつの森", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/06/12/17/45/55/82266993_p0_square1200.jpg", + "description": "", + "tags": [ + "どうぶつの森", + "水彩画", + "兄妹", + "双子", + "あつ森", + "なにこれ素敵", + "なにこれあったかい", + "兄妹愛", + "どうぶつの森10000users入り", + "なにこれ微笑ましい" + ], + "userId": "11980572", + "userName": "ハヌル‏", + "width": 1800, + "height": 2450, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#どうぶつの森 どうぶつの森 - ハヌル‏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-12T17:45:55+09:00", + "updateDate": "2020-06-12T17:45:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/07/12/14/48/55/14476391_2eaa83fc1356493491cb9bfb16a8aa1b_50.png" + }, + { + "id": "81593683", + "title": "ちゃちゃまる無人島0円生活", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/16/01/50/31/81593683_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "あつまれどうぶつの森", + "あつ森", + "ちゃちゃまる" + ], + "userId": "2684343", + "userName": "茜りう@LINEスタンプ販売中", + "width": 2823, + "height": 3686, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#あつまれどうぶつの森 ちゃちゃまる無人島0円生活 - 茜りう@LINEスタンプ販売中的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-16T01:50:31+09:00", + "updateDate": "2020-05-16T01:50:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/29/09/33/32/18437102_375b05f292258036ea004fae26b1741d_50.jpg" + }, + { + "id": "82753312", + "title": "離島ガチャ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/07/04/22/34/06/82753312_p0_square1200.jpg", + "description": "", + "tags": [ + "あつ森", + "どうぶつの森", + "ジャック", + "ジャック(どうぶつの森)", + "何これ素敵", + "どうぶつの森5000users入り" + ], + "userId": "54779330", + "userName": "muty", + "width": 900, + "height": 1200, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#あつ森 離島ガチャ - muty的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-04T22:34:06+09:00", + "updateDate": "2020-07-04T22:34:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/13/23/21/19/19507253_a2e5e619860f928b4ad36bbdf5ea9592_50.jpg" + }, + { + "id": "67407348", + "title": "dnf", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/03/18/18/29/18/67407348_p0_square1200.jpg", + "description": "", + "tags": [ + "dnf", + "던파", + "w.gunner", + "여거너", + "地下城与勇士", + "魅惑の谷間", + "アラド戦記", + "おっぱい", + "極上の女体", + "アラド戦記400000users入り" + ], + "userId": "18380615", + "userName": "monaim", + "width": 1500, + "height": 1539, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#dnf dnf - monaim的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-22T21:00:23+09:00", + "updateDate": "2018-03-18T18:29:18+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/05/01/17/47/12372343_109f075bfce6c2c08a3490f8002c472f_50.png" + }, + { + "id": "60865838", + "title": "ジャンヌ・ダルク", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/01/10/00/08/06/60865838_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "ジャンヌ・ダルク", + "Fate/Apocrypha", + "版権", + "ジャンヌ・ダルク(Fate)", + "聖女", + "Fate/GO100000users入り", + "Fate/Apocrypha100000users入り", + "おっぱい", + "着衣巨乳" + ], + "userId": "64561", + "userName": "有坂", + "width": 984, + "height": 1403, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder ジャンヌ・ダルク - 有坂的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-01-10T00:08:06+09:00", + "updateDate": "2017-01-10T00:08:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/09/01/08/17/20502579_f6c2186e0985d1506ee39bc6e7290993_50.jpg" + }, + { + "id": "71431430", + "title": "すとぷりTwitter落書き詰め", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/10/31/11/45/17/71431430_p0_square1200.jpg", + "description": "", + "tags": [ + "歌い手", + "ころん", + "さとみ", + "すとぷり", + "やっぱころちゃんの可愛さを知るべき!", + "さとちゃんがバカみたいに可愛ええよ!" + ], + "userId": "9742249", + "userName": "壷漬け", + "width": 1000, + "height": 1000, + "pageCount": 8, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#歌い手 すとぷりTwitter落書き詰め - 壷漬け的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-10-31T11:45:17+09:00", + "updateDate": "2018-10-31T11:45:17+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/06/22/22/53/45/15921856_105472de1df9185cdc8427dedf50894c_50.jpg" + }, + { + "id": "67271336", + "title": "ハッピーバレンタイン!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/14/18/12/14/67271336_p0_square1200.jpg", + "description": "", + "tags": [ + "莉犬", + "ころん", + "歌い手", + "すとぷり", + "歌い手1000users入り", + "やっぱころちゃんの可愛さを知るべき!", + "もう…莉犬君が可愛いって言わせんなばかぁ!" + ], + "userId": "7841181", + "userName": "しずく茶", + "width": 1024, + "height": 722, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#莉犬 ハッピーバレンタイン! - しずく茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-14T18:12:14+09:00", + "updateDate": "2018-02-14T18:12:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/16/20/46/31/14644166_2029535e0e668611456c328f286a2b6a_50.jpg" + }, + { + "id": "77385145", + "title": "すとぷりlog4", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/10/20/12/30/34/77385145_p0_square1200.jpg", + "description": "", + "tags": [ + "すとぷり", + "ころん", + "さとみ", + "ななもり。", + "るぅと", + "ジェル", + "莉犬" + ], + "userId": "10860103", + "userName": "来茶", + "width": 1206, + "height": 892, + "pageCount": 33, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#すとぷり すとぷりlog4 - 来茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-10-20T12:30:34+09:00", + "updateDate": "2019-10-20T12:30:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/27/20/50/37/20774358_2422228e00c9f2808c5e1ed8e1b30754_50.jpg" + }, + { + "id": "87045706", + "title": "19歳の夢見りあむと、26歳の佐藤心", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/14/18/20/14/87045706_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "デレステ", + "アイドルマスターシンデレラガールズ", + "夢見りあむ", + "佐藤心", + "しゅがーはぁと", + "しゅがりあ", + "泣けるモバマス", + "アイマス5000users入り" + ], + "userId": "20154152", + "userName": "夏目げんり👑げりっちゃん", + "width": 2516, + "height": 4096, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#デレステ 19歳の夢見りあむと、26歳の佐藤心 - 夏目げんり👑げりっちゃん的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-14T18:20:14+09:00", + "updateDate": "2021-01-14T18:20:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/15/23/01/12/20009204_c2c43abbb35d8dafb0d62bd326caaf20_50.jpg" + }, + { + "id": "85779247", + "title": "PINK", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/20/06/20/28/85779247_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "笹木咲", + "魔界ノりりむ", + "椎名唯華", + "バーチャルYouTuber", + "ピンク", + "バーチャルYouTuber50000users入り" + ], + "userId": "1193008", + "userName": "望月けい", + "width": 2459, + "height": 1788, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ PINK - 望月けい的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-20T06:20:28+09:00", + "updateDate": "2020-11-20T06:20:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/05/18/21/31/16/9381806_44583aff765acd5db042696bfd279371_50.jpg" + }, + { + "id": "79024638", + "title": "妄メントA", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/01/21/22/00/12/79024638_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "にじさんじ妄想トーナメント戦", + "葛葉", + "なにこれかっこいい", + "バーチャルYouTuber10000users入り", + "剣持刀也", + "バーチャルYouTuber30000users入り", + "なにこれすごい" + ], + "userId": "3605360", + "userName": "名智ゆいち", + "width": 1530, + "height": 2360, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ 妄メントA - 名智ゆいち的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-21T22:00:12+09:00", + "updateDate": "2020-01-21T22:00:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/08/11/21/11/12/16127978_f9d037ce4dc07502c4443b6eb4694d37_50.jpg" + }, + { + "id": "84419825", + "title": "京と秋のにじさんじ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/17/00/20/10/84419825_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "加賀美ハヤト", + "ジョー・力一", + "剣持刀也", + "叶/葉加瀬冬雪/夜見れな/舞元啓介", + "バーチャルYouTuber10000users入り" + ], + "userId": "1193008", + "userName": "望月けい", + "width": 1736, + "height": 2201, + "pageCount": 8, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ 京と秋のにじさんじ - 望月けい的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-17T00:20:10+09:00", + "updateDate": "2020-09-17T00:20:10+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/05/18/21/31/16/9381806_44583aff765acd5db042696bfd279371_50.jpg" + }, + { + "id": "70582093", + "title": "りゅうこ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/07/18/00/38/70582093_p0_square1200.jpg", + "description": "", + "tags": [ + "キルラキル", + "纏流子", + "流子", + "鮮血", + "アナログ", + "らくがき", + "なにこれすごい", + "鮮血(キルラキル)", + "キルラキル10000users入り" + ], + "userId": "3869665", + "userName": "河CY", + "width": 815, + "height": 1024, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#キルラキル りゅうこ - 河CY的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-07T18:00:38+09:00", + "updateDate": "2018-09-07T18:00:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/05/31/14/38/50/11002845_8506eb1a3648f39fdf399e749988688b_50.jpg" + }, + { + "id": "77491275", + "title": "赤子炭治郎と上弦の話", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/10/26/22/25/15/77491275_p0_square1200.jpg", + "description": "", + "tags": [ + "アナログ", + "腐滅の刃", + "上弦×炭", + "スクロールバーが仕事しない", + "腐滅の刃30000users入り" + ], + "userId": "4851699", + "userName": "miyazawa", + "width": 575, + "height": 1024, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#アナログ 赤子炭治郎と上弦の話 - miyazawa的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-10-26T22:25:15+09:00", + "updateDate": "2019-10-26T22:25:15+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/12/12/55/28/18810667_6cda7403ba80f2092a06fdf3f50623d8_50.jpg" + }, + { + "id": "13754871", + "title": "秋の水彩テクスチャ集", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2010/10/09/00/55/29/13754871_p0_square1200.jpg", + "description": "", + "tags": [ + "商用利用可", + "キセツチャ", + "テクスチャ", + "使ってもいいのよ", + "フリー素材", + "アナログ", + "フリー素材1000users入り", + "透明水彩", + "フリー素材5000users入り", + "フリー素材10000users入り" + ], + "userId": "59219", + "userName": "夏香子", + "width": 1200, + "height": 800, + "pageCount": 30, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#商用利用可 秋の水彩テクスチャ集 - 夏香子的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2010-10-09T00:55:29+09:00", + "updateDate": "2010-10-09T00:55:29+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/05/30/22/36/16/7930504_65465580cf6e504db243dec801b8aefa_50.png" + }, + { + "id": "80431317", + "title": "ツイステ保育園", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/03/29/18/49/12/80431317_p0_square1200.jpg", + "description": "", + "tags": [ + "イラスト", + "ツイステッドワンダーランド", + "フロイド", + "ジェイド", + "ツイステ", + "ディア・クロウリー", + "幼児化", + "フロイド・リーチ", + "ジェイド・リーチ" + ], + "userId": "30857749", + "userName": "ぐら ぺぴ子", + "width": 768, + "height": 1024, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#イラスト ツイステ保育園 - ぐら ぺぴ子的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-03-29T18:49:12+09:00", + "updateDate": "2020-03-29T18:49:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/11/00/51/02/20513177_deec0cef61b47c0b51696cf2a173dcff_50.jpg" + }, + { + "id": "57877623", + "title": "星つかみ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/07/07/17/38/35/57877623_p0_square1200.jpg", + "description": "", + "tags": [ + "背景", + "風景", + "オリジナル", + "廃墟", + "天の川", + "C90", + "オリジナル50000users入り", + "風景50000users入り", + "イラスト" + ], + "userId": "648285", + "userName": "mocha@「背景作画」改訂版", + "width": 636, + "height": 1908, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#背景 星つかみ - mocha@「背景作画」改訂版的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-13T00:08:41+09:00", + "updateDate": "2019-07-07T17:38:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/11/28/18/38/41/11807428_38b7d5ff662fd4b00c25ed608332a0e9_50.jpg" + }, + { + "id": "74650454", + "title": "星は港に満ちる", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/10/00/34/42/74650454_p0_square1200.jpg", + "description": "", + "tags": [ + "背景", + "風景", + "オリジナル", + "天の川", + "星空", + "水鏡", + "ふつくしい", + "オリジナル50000users入り", + "風景50000users入り", + "イラスト" + ], + "userId": "648285", + "userName": "mocha@「背景作画」改訂版", + "width": 992, + "height": 1398, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#背景 星は港に満ちる - mocha@「背景作画」改訂版的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-10T00:34:42+09:00", + "updateDate": "2019-05-10T00:34:42+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/11/28/18/38/41/11807428_38b7d5ff662fd4b00c25ed608332a0e9_50.jpg" + }, + { + "id": "89657320", + "title": "ライスシャワー", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/07/00/05/04/89657320_p0_custom1200.jpg", + "description": "", + "tags": [ + "ライスシャワー(ウマ娘)", + "ウマ娘プリティーダービー", + "ウマ娘", + "鳥籠", + "薔薇", + "青薔薇", + "祝福の名", + "ウマ娘プリティーダービー30000users入り", + "守護らねば" + ], + "userId": "341433", + "userName": "Nardack", + "width": 1080, + "height": 1920, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ライスシャワー(ウマ娘) ライスシャワー - Nardack的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-07T00:04:25+09:00", + "updateDate": "2021-05-07T00:05:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/07/00/08/27/20490701_3049d470ede5ccbe35c35b1f904c02e9_50.jpg" + }, + { + "id": "90263277", + "title": ".", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/02/02/48/48/90263277_p0_square1200.jpg", + "description": "", + "tags": [ + "ウマ娘", + "サイレンススズカ", + "サイレンススズカ(ウマ娘)", + "ウマ娘プリティーダービー", + "ウマ娘プリティーダービー10000users入り" + ], + "userId": "6558698", + "userName": "siki", + "width": 2500, + "height": 3584, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘 . - siki的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-02T02:48:48+09:00", + "updateDate": "2021-06-02T02:48:48+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/15/03/32/07/20359533_74b079be00fb724ad35b54f43281547e_50.jpg" + }, + { + "id": "89694199", + "title": "ウマ娘まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/08/18/36/04/89694199_p0_square1200.jpg", + "description": "", + "tags": [ + "ウマ娘プリティーダービー", + "ウマ娘", + "サトノダイヤモンド(ウマ娘)", + "キタサンブラック(ウマ娘)", + "サイレンススズカ(ウマ娘)", + "ミホノブルボン(ウマ娘)", + "スーパークリーク(ウマ娘)", + "メジロマックイーン(ウマ娘)", + "ウマ娘プリティーダービー10000users入り" + ], + "userId": "8129277", + "userName": "Sak", + "width": 7067, + "height": 5584, + "pageCount": 6, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘プリティーダービー ウマ娘まとめ - Sak的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-08T18:36:04+09:00", + "updateDate": "2021-05-08T18:36:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/29/16/01/09/19584193_a04c8fff7691481790e49876dfdb6d82_50.png" + }, + { + "id": "89197783", + "title": "ダイワスカーレット", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/04/17/03/59/07/89197783_p0_square1200.jpg", + "description": "", + "tags": [ + "ダイワスカーレット", + "ダイワスカーレット(ウマ娘)", + "極上の乳", + "ウマ娘プリティーダービー", + "スク水", + "プール", + "横乳", + "水着ウマ娘", + "ウマ娘プリティーダービー10000users入り" + ], + "userId": "4338012", + "userName": "hews", + "width": 1079, + "height": 1737, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ダイワスカーレット ダイワスカーレット - hews的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-04-17T03:59:07+09:00", + "updateDate": "2021-04-17T03:59:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/15/08/09/24/19670750_c735c3c5dfd1299a26faf92b7a81064e_50.jpg" + }, + { + "id": "89682656", + "title": "最近描いたウマ娘まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/08/04/06/06/89682656_p0_square1200.jpg", + "description": "", + "tags": [ + "ウマ娘", + "ウマ娘プリティーダービー", + "ライスシャワー(ウマ娘)", + "メジロマックイーン(ウマ娘)", + "ゴールドシップ(ウマ娘)", + "ハルウララ(ウマ娘)", + "スペシャルウィーク(ウマ娘)", + "ツインターボ(ウマ娘)", + "トウカイテイオー(ウマ娘)", + "ウマ娘プリティーダービー30000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1500, + "height": 1179, + "pageCount": 15, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘 最近描いたウマ娘まとめ - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-08T04:06:06+09:00", + "updateDate": "2021-05-08T04:06:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "88742579", + "title": "ゴルシ意味わからん…でも好き…", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/04/12/09/25/13/88742579_p0_custom1200.jpg", + "description": "", + "tags": [ + "ウマ娘", + "ウマ娘プリティーダービー", + "ゴルシ", + "ゴールドシップ(ウマ娘)", + "ゴールドシップ", + "だいたいあってる", + "120億円事件", + "まぁゴルシだし", + "ウマ娘プリティーダービー30000users入り", + "黙れば美人、喋ると奇人、走る姿は不沈艦" + ], + "userId": "7092420", + "userName": "あんの", + "width": 992, + "height": 2159, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ウマ娘 ゴルシ意味わからん…でも好き… - あんの的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-03-27T20:47:22+09:00", + "updateDate": "2021-04-12T09:25:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/05/02/16/05/49/18460195_633168591c4c2be9cb3f0637c052887e_50.jpg" + }, + { + "id": "62800098", + "title": "Θ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/05/08/00/22/23/62800098_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "オリジナル", + "白髪", + "オリキャラ", + "創作", + "本", + "モノクル", + "オリジナル10000users入り", + "色白" + ], + "userId": "1831843", + "userName": "尾上廉", + "width": 1853, + "height": 3038, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 Θ - 尾上廉的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-05-08T00:22:23+09:00", + "updateDate": "2017-05-08T00:22:23+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/15/00/08/34/20701142_7b7afb7037477ec86cf1da84d9a7d46b_50.jpg" + }, + { + "id": "61444625", + "title": "【オリキャラねつ造注意】おそ娘ちゃん、おそ松に会いに行く", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/02/14/06/46/02/61444625_p0_square1200.jpg", + "description": "", + "tags": [ + "おそカラ", + "パパ松", + "パパカラ", + "BL松", + "不覚にも泣いてしまった", + "オリキャラ", + "BL松10000users入り" + ], + "userId": "1862466", + "userName": "しら", + "width": 705, + "height": 1000, + "pageCount": 41, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#おそカラ 【オリキャラねつ造注意】おそ娘ちゃん、おそ松に会いに行く - しら的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-02-14T06:46:02+09:00", + "updateDate": "2017-02-14T06:46:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/01/16/00/39/29/12013715_d0b758f49f65fefc514213479eaf2f7b_50.png" + }, + { + "id": "65894188", + "title": "おまカプ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/11/15/08/27/36/65894188_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "オリキャラ設定メモ", + "オリキャラ", + "創作", + "平和", + "控えめに言って最高", + "あなたが神か", + "おまカプ", + "オリジナル10000users入り", + "最高かよ" + ], + "userId": "2937627", + "userName": "タロウ・マドロミ", + "width": 1000, + "height": 1412, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリキャラ設定メモ おまカプ - タロウ・マドロミ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-11-14T21:00:01+09:00", + "updateDate": "2017-11-15T08:27:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/12/18/18/59/14/13577161_2aa7cd40c588b2ccf6a02cf60b2a9fc4_50.png" + }, + { + "id": "84116049", + "title": "雪花ラミィ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/03/00/00/06/84116049_p0_square1200.jpg", + "description": "", + "tags": [ + "雪花ラミィ", + "hololive", + "ホロライブ", + "バーチャルYouTuber", + "ふともも", + "Vtuber", + "ミュシャ風", + "バーチャルYouTuber50000users入り", + "本家" + ], + "userId": "4754550", + "userName": "リン☆ユウ@新刊通販委託中", + "width": 1018, + "height": 1903, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#雪花ラミィ 雪花ラミィ - リン☆ユウ@新刊通販委託中的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-03T00:00:06+09:00", + "updateDate": "2020-09-03T00:00:06+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/10/06/12/04/30/9964580_13765b1f2f2796a014f43072b7316d3f_50.png" + }, + { + "id": "85423310", + "title": "にじさんじまとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/03/00/04/16/85423310_p0_square1200.jpg", + "description": "", + "tags": [ + "にじさんじ", + "バーチャルYouTuber", + "月ノ美兎/周央サンゴ/竜胆尊/魔界ノりりむ/鈴原るる", + "みつあみ", + "シスタークレア", + "バーチャルYouTuber50000users入り", + "シスター・クレア" + ], + "userId": "10495320", + "userName": "かやはら", + "width": 860, + "height": 1000, + "pageCount": 6, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#にじさんじ にじさんじまとめ - かやはら的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-03T00:04:16+09:00", + "updateDate": "2020-11-03T00:04:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/01/12/07/24/25/11996565_05d32d8788bda5d9b98f328f0d462a83_50.png" + }, + { + "id": "70352399", + "title": "log4", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/08/24/00/00/15/70352399_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "VTuber", + "バーチャルYouTuber", + "ホロライブ", + "白上フブキ", + "狐耳", + "オリジナル50000users入り", + "バーチャルYouTuber50000users入り", + "hololive" + ], + "userId": "8189060", + "userName": "凪白みと", + "width": 896, + "height": 1487, + "pageCount": 23, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル log4 - 凪白みと的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-08-24T00:00:15+09:00", + "updateDate": "2018-08-24T00:00:15+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/20/14/52/16/12442990_d1f845924e29f9f7f3e6376650783404_50.png" + }, + { + "id": "82618568", + "title": "兎田ぺこら +", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/06/28/16/37/26/82618568_p0_custom1200.jpg", + "description": "", + "tags": [ + "バーチャルYouTuber", + "ホロライブ", + "兎田ぺこら", + "宝鐘マリン", + "潤羽るしあ", + "夏色まつり", + "百鬼あやめ", + "水着", + "バーチャルYouTuber50000users入り", + "腋" + ], + "userId": "176825", + "userName": "Seicoh", + "width": 2048, + "height": 3280, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#バーチャルYouTuber 兎田ぺこら + - Seicoh的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-28T16:37:26+09:00", + "updateDate": "2020-06-28T16:37:26+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/25/14/26/25/18409164_fbf5207baf4d06802026bca7a5fcba31_50.png" + }, + { + "id": "41805526", + "title": "とうちゃん", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/02/22/23/03/59/41805526_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "ポケモン", + "リザードン", + "なにこれあったかい", + "涙腺崩壊", + "なにこれ素敵", + "目からハイドロカノン", + "ヒトカゲ", + "ポケモン100000users入り", + "衝撃のラスト" + ], + "userId": "1119595", + "userName": "真吉", + "width": 500, + "height": 800, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ポケモン とうちゃん - 真吉的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-02-22T23:03:59+09:00", + "updateDate": "2014-02-22T23:03:59+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2009/08/11/14/20/43/994304_33953b9e90d87e8915b4b6003f789df3_50.jpg" + }, + { + "id": "17104931", + "title": "ポケモン15thアアアアアアアアアアアアアアアアアアアアアアアア", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2011/03/04/00/19/38/17104931_p0_square1200.jpg", + "description": "", + "tags": [ + "ポケモン15周年", + "色違い", + "ポケモン", + "クリック推奨", + "愛しか感じない", + "目からハイドロカノン", + "愛がなければ描けない", + "版権", + "ポケモン100000users入り", + "ポケモンだいすきクラブ" + ], + "userId": "497532", + "userName": "ココロコ", + "width": 2027, + "height": 2011, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ポケモン15周年 ポケモン15thアアアアアアアアアアアアアアアアアアアアアアアア - ココロコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2011-03-04T00:19:38+09:00", + "updateDate": "2011-03-04T00:19:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/11/02/02/22/07/8576035_b6e687980724b79aabc96854e61fedff_50.png" + }, + { + "id": "14231474", + "title": "男女主人公まとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2010/10/31/04/02/38/14231474_p0_square1200.jpg", + "description": "", + "tags": [ + "ポケモン", + "なにこれかわいい", + "いろいろと達観してしまったユウキ", + "なにこれ素敵", + "男前なブルーさん", + "お姫様が抱っこ", + "歪みないレッド", + "ポケモン50000users入り", + "ユウキ(トレーナー)" + ], + "userId": "1201348", + "userName": "m@オレサマヨウスケマルカジリ", + "width": 5000, + "height": 800, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ポケモン 男女主人公まとめ - m@オレサマヨウスケマルカジリ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2010-10-31T04:02:38+09:00", + "updateDate": "2010-10-31T04:02:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2011/06/04/21/56/44/3209897_3a40547df0e2a2c7972a46514555cabd_50.jpg" + }, + { + "id": "57800451", + "title": "山姥切国広と歌仙兼定", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/07/08/15/30/53/57800451_p0_square1200.jpg", + "description": "", + "tags": [ + "刀剣乱舞", + "山姥切国広", + "歌仙兼定", + "なにこれ素敵", + "100点でも足りない", + "目から冷却材", + "なにこれ雅", + "刀剣乱舞100000users入り", + "貴方が神か" + ], + "userId": "8269746", + "userName": "こまどりもどき", + "width": 508, + "height": 700, + "pageCount": 58, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#刀剣乱舞 山姥切国広と歌仙兼定 - こまどりもどき的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-07-08T15:30:53+09:00", + "updateDate": "2016-07-08T15:30:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/09/06/20/27/38/6779858_5c5846f61b4d33b80b611988f3bc3b0f_50.png" + }, + { + "id": "50379267", + "title": "ツイログ", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/05/15/02/23/13/50379267_p0_square1200.jpg", + "description": "", + "tags": [ + "刀剣乱舞", + "岩融", + "へし切長谷部", + "歌仙兼定", + "弁慶", + "目から冷却材", + "女子力", + "10点じゃ足りない", + "刀剣乱舞100000users入り", + "ちょっと中尊寺拝んでくる泣" + ], + "userId": "13779971", + "userName": "Z豚", + "width": 700, + "height": 933, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#刀剣乱舞 ツイログ - Z豚的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-05-15T02:17:38+09:00", + "updateDate": "2015-05-15T02:23:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/03/01/19/28/59/9037674_23c9eba0cdf3b5787716929e34499321_50.png" + }, + { + "id": "48559220", + "title": "【クロスオーバー】しょたじじと日本が描きたかっただけの", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/02/04/22/59/39/48559220_p0_square1200.jpg", + "description": "", + "tags": [ + "クロスオーバー", + "ヘタリア", + "刀剣乱舞", + "刀剣ヘタ", + "刀剣乱舞10000users入り" + ], + "userId": "1324853", + "userName": "甘酒", + "width": 717, + "height": 1004, + "pageCount": 7, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#クロスオーバー 【クロスオーバー】しょたじじと日本が描きたかっただけの - 甘酒的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-02-04T22:59:39+09:00", + "updateDate": "2015-02-04T22:59:39+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/03/14/08/21/19452774_96a9d66e4365306bf0ede2f5219fd6ce_50.png" + }, + { + "id": "67260707", + "title": "エジプト魔女の逆襲譚 【魔女集会】", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/14/00/49/39/67260707_p0_square1200.jpg", + "description": "", + "tags": [ + "魔女集会で会いましょう", + "創作", + "オリジナル", + "魔女", + "エジプト", + "漫画", + "優しい世界", + "100点でも足りない", + "魔女集会200000users入り", + "おばぁちゃまとお呼び" + ], + "userId": "20822524", + "userName": "森下真", + "width": 1240, + "height": 1754, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#魔女集会で会いましょう エジプト魔女の逆襲譚 【魔女集会】 - 森下真的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-14T00:49:39+09:00", + "updateDate": "2018-02-14T00:49:39+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/10/28/15/26/57/11676440_9ae175195d5967387f6409ad620a33f1_50.jpg" + }, + { + "id": "74481708", + "title": "「それじゃあな、 元気でな!」", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/01/01/20/43/74481708_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "創作", + "元号", + "平成", + "令和", + "全員終号", + "ありがとう平成", + "オリジナル100000users入り", + "あぁぁ我らが平成ーーッ!!", + "新しい時代の幕開け" + ], + "userId": "20822524", + "userName": "森下真", + "width": 2048, + "height": 1450, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 「それじゃあな、 元気でな!」 - 森下真的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-01T01:20:43+09:00", + "updateDate": "2019-05-01T01:20:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/10/28/15/26/57/11676440_9ae175195d5967387f6409ad620a33f1_50.jpg" + }, + { + "id": "74478908", + "title": "メバル", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/05/01/00/01/00/74478908_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "創作", + "伝説の始まり", + "なにこれかっこいい", + "オリジナル50000users入り", + "オリジナル100000users入り", + "ドMホイホイ" + ], + "userId": "23975745", + "userName": "一", + "width": 2894, + "height": 4093, + "pageCount": 32, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#創作 メバル - 一的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-05-01T00:01:00+09:00", + "updateDate": "2019-05-01T00:01:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "84602943", + "title": "刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/25/19/25/49/84602943_p0_square1200.jpg", + "description": "", + "tags": [ + "刻晴", + "女の子", + "黒タイツ", + "原神", + "ソックス足裏", + "美脚", + "足チョコ", + "足指", + "原神100000users入り" + ], + "userId": "21505771", + "userName": "乌橄榄菜", + "width": 2480, + "height": 3600, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#刻晴 刻晴 - 乌橄榄菜的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-25T19:25:49+09:00", + "updateDate": "2020-09-25T19:25:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/21/18/34/40/17964437_c67677aff44fd21bd08ff9829a2923b8_50.jpg" + }, + { + "id": "85085701", + "title": "刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/18/13/00/00/85085701_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "女の子", + "I字バランス", + "刻晴", + "タイツ", + "黒スト", + "尻神様", + "腋", + "原神10000users入り", + "原神50000users入り" + ], + "userId": "4023292", + "userName": "苏翼丶", + "width": 2894, + "height": 4093, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 刻晴 - 苏翼丶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-18T13:00:00+09:00", + "updateDate": "2020-10-18T13:00:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/13/23/44/44/19663797_a123bd2921301b98148b46f11d055d17_50.jpg" + }, + { + "id": "85633671", + "title": "原神头像", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/13/01/32/47/85633671_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "刻晴", + "フィッシュル(原神)", + "クレー(原神)", + "可莉", + "七七", + "lumine", + "刻晴(原神)", + "原神50000users入り", + "バーバラ/ジン・グンヒルド/ウェンティ/空/蛍" + ], + "userId": "6657532", + "userName": "QuAn_", + "width": 700, + "height": 700, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 原神头像 - QuAn_的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-13T01:32:47+09:00", + "updateDate": "2020-11-13T01:32:47+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/06/23/42/39/17873112_8ab94db64257ce869d75e525eab9fb39_50.jpg" + }, + { + "id": "63120410", + "title": "ぎゅっとしている紗霧ちゃんをぎゅっとしたい", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/05/29/00/37/30/63120410_p0_square1200.jpg", + "description": "", + "tags": [ + "エロマンガ先生", + "和泉紗霧", + "ぬいぐるみ", + "魅惑のふともも", + "横臥", + "恥じらい", + "プリケツ", + "女の子", + "エロマンガ先生400000users入り" + ], + "userId": "21076169", + "userName": "秋タケ", + "width": 707, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#エロマンガ先生 ぎゅっとしている紗霧ちゃんをぎゅっとしたい - 秋タケ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-05-29T00:37:30+09:00", + "updateDate": "2017-05-29T00:37:30+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/20/14/10/56/12442839_e74beebe662a733d7a06cf66c5928d4a_50.jpg" + }, + { + "id": "54618347", + "title": "黒タイツ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/01/09/11/50/00/54618347_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "女子高生", + "黒髪ロング", + "黒タイツ", + "美脚", + "裾上げタイツ脱ぎ", + "オリジナル", + "JK", + "制服", + "オリジナル200000users入り" + ], + "userId": "409226", + "userName": "KRSK", + "width": 944, + "height": 1280, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 黒タイツ - KRSK的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-01-09T11:50:00+09:00", + "updateDate": "2016-01-09T11:50:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/04/05/17/39/54/6068280_2d621c6f7278a350b2fc61337ed23fdc_50.png" + }, + { + "id": "62406788", + "title": "アリスの青い庭", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/04/15/00/04/16/62406788_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "青", + "女の子", + "プラチナブロンド", + "青薔薇", + "窓辺", + "銀髪碧眼", + "リボン", + "オリジナル200000users入り" + ], + "userId": "27517", + "userName": "藤原", + "width": 859, + "height": 1215, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル アリスの青い庭 - 藤原的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-04-15T00:04:16+09:00", + "updateDate": "2017-04-15T00:04:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2008/03/31/01/13/19/95581_886b0c6eadefd9d6df6a6776a015920d_50.jpg" + }, + { + "id": "63304069", + "title": "☆", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/06/10/00/35/38/63304069_p0_square1200.jpg", + "description": "", + "tags": [ + "少女", + "女の子", + "オリジナル", + "おさげ", + "白ワンピ", + "清涼感", + "麦わら帽子", + "サマードレス", + "オリジナル50000users入り" + ], + "userId": "15866498", + "userName": "NARU", + "width": 682, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#少女 ☆ - NARU的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-06-10T00:35:38+09:00", + "updateDate": "2017-06-10T00:35:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/05/17/14/42/14/14239879_47747fd9a4e74906648c7ea9a31ec688_50.png" + }, + { + "id": "69297688", + "title": "✧︎ * ... * ✧", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/06/22/04/09/54/69297688_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "オリジナル", + "少女", + "金髪ロング", + "金髪碧眼", + "ロリィタファッション", + "白ワンピ", + "オリジナル50000users入り", + "リボン", + "マニキュア" + ], + "userId": "4780571", + "userName": "Snow is", + "width": 1000, + "height": 1400, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 ✧︎ * ... * ✧ - Snow is的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-06-19T00:00:09+09:00", + "updateDate": "2018-06-22T04:09:54+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/01/01/38/05/20619822_1bfbaaf067e40872f12b4bbf104adb31_50.jpg" + }, + { + "id": "59612057", + "title": "Avalon", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/10/24/00/01/09/59612057_p0_square1200.jpg", + "description": "", + "tags": [ + "fate", + "セイバー", + "Fate/GrandOrder", + "少女", + "Fate/GO10000users入り", + "FGOイラコン2", + "アルトリア・ペンドラゴン", + "Fate50000users入り", + "Fate/GO50000users入り", + "全て遠き理想郷" + ], + "userId": "9580845", + "userName": "Magicians", + "width": 749, + "height": 977, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#fate Avalon - Magicians的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-10-24T00:01:09+09:00", + "updateDate": "2016-10-24T00:01:09+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/07/03/35/51/19959419_838d93bb19e82dc3c2abbe4c9c7174d4_50.png" + }, + { + "id": "57534432", + "title": "「魂音泉」碎華変「三次創作」", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/06/22/18/39/44/57534432_p0_square1200.jpg", + "description": "", + "tags": [ + "東方", + "魂音泉", + "三次創作", + "Touhou", + "东方Project", + "Touhou_Project", + "東方三次創作", + "東方Project", + "東方Project50000users入り", + "ハイセンス" + ], + "userId": "74184", + "userName": "零@通販始めた", + "width": 1000, + "height": 740, + "pageCount": 42, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方 「魂音泉」碎華変「三次創作」 - 零@通販始めた的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-06-22T18:39:44+09:00", + "updateDate": "2016-06-22T18:39:44+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/27/10/00/38/12474975_a0a699ea19f387df0f98bc5a9b7d26d3_50.png" + }, + { + "id": "17184292", + "title": "幽愁楼閣", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2011/03/07/00/37/33/17184292_p0_square1200.jpg", + "description": "", + "tags": [ + "富士見の娘", + "扇", + "桜", + "魂魄妖夢", + "西行寺幽々子", + "東方", + "溢れるカリスマ", + "なにこれきれい", + "東方Project", + "東方Project50000users入り" + ], + "userId": "27517", + "userName": "藤原", + "width": 1818, + "height": 1999, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#富士見の娘 幽愁楼閣 - 藤原的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2011-03-07T00:37:33+09:00", + "updateDate": "2011-03-07T00:37:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2008/03/31/01/13/19/95581_886b0c6eadefd9d6df6a6776a015920d_50.jpg" + }, + { + "id": "62512328", + "title": "PAPER MOON", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/04/22/00/15/32/62512328_p0_square1200.jpg", + "description": "", + "tags": [ + "東方Project", + "犬走椛", + "射命丸文" + ], + "userId": "11246082", + "userName": "Miv4t", + "width": 896, + "height": 1300, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東方Project PAPER MOON - Miv4t的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-04-22T00:07:10+09:00", + "updateDate": "2017-04-22T00:15:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/04/18/00/26/23/9248135_a9df8403bea4528461489ffd9219fbd7_50.jpg" + }, + { + "id": "67507815", + "title": "blue", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/02/28/21/23/33/67507815_p0_square1200.jpg", + "description": "", + "tags": [ + "MOE2018", + "オリジナル", + "水着", + "海", + "魅惑の谷間", + "水着パーカー", + "極上の女体", + "女の子", + "オリジナル100000users入り", + "巨乳" + ], + "userId": "867590", + "userName": "米白粕", + "width": 1400, + "height": 1980, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#MOE2018 blue - 米白粕的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-02-28T21:23:33+09:00", + "updateDate": "2018-02-28T21:23:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/31/16/14/31/19283130_9a5b6797568d2f7b5e93d2294f42bdd2_50.jpg" + }, + { + "id": "65913057", + "title": "水着オルタ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/11/18/18/47/51/65913057_p0_square1200.jpg", + "description": "", + "tags": [ + "Fate/GrandOrder", + "セイバーオルタ", + "アルトリア・ペンドラゴン", + "FGO", + "水着", + "アルトリア・オルタ(水着)", + "メイドビキニ", + "ニーソックス", + "Fate/GO100000users入り", + "勝てる気がしない" + ], + "userId": "18403608", + "userName": "マシマサキ", + "width": 2500, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#Fate/GrandOrder 水着オルタ - マシマサキ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-11-16T07:00:01+09:00", + "updateDate": "2017-11-18T18:47:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/05/31/10/07/33/11002376_a5ed35bafb27e4a9c55279149e71d6de_50.png" + }, + { + "id": "39316587", + "title": "ひとりぼっちを切って", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/10/25/00/12/02/39316587_p0_square1200.jpg", + "description": "", + "tags": [ + "創作", + "ハイセンス", + "鬱くしい", + "部屋", + "男の子", + "ショタ", + "ぬいぐるみ", + "オリジナル50000users入り", + "オリジナル" + ], + "userId": "97298", + "userName": "祐壱", + "width": 845, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#創作 ひとりぼっちを切って - 祐壱的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-10-25T00:12:02+09:00", + "updateDate": "2013-10-25T00:12:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/04/17/08/44/14582054_460f8bf6f48cfd928de83375434b2905_50.png" + }, + { + "id": "79372430", + "title": "view of their back", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/09/13/12/24/79372430_p0_square1200.jpg", + "description": "", + "tags": [ + "落書き", + "同人", + "女の子", + "男の子", + "鬼滅の刃", + "甘露寺蜜璃", + "胡蝶しのぶ", + "うなじ", + "時透無一郎", + "鬼滅の刃50000users入り" + ], + "userId": "5133163", + "userName": "DEER", + "width": 1080, + "height": 1080, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#落書き view of their back - DEER的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-09T13:12:24+09:00", + "updateDate": "2020-02-09T13:12:24+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/01/14/00/23/31/13689984_0f655438a809b747d90cd29730a48b5b_50.jpg" + }, + { + "id": "73838405", + "title": "JO☾ER", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/03/24/00/00/04/73838405_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "少年", + "トランプ", + "男の子", + "帽子屋", + "ジョーカー", + "ガスマスク", + "杖", + "オリジナル30000users入り" + ], + "userId": "24218478", + "userName": "₩ANKE", + "width": 1069, + "height": 1500, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル JO☾ER - ₩ANKE的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-03-24T00:00:04+09:00", + "updateDate": "2019-03-24T00:00:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/22/04/04/45/16445257_404ce224320f5dac49b6715fafd3824d_50.jpg" + }, + { + "id": "72032423", + "title": "なかよしTDDが解散するまんが+ハマ後日談(追加)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/12/16/03/42/37/72032423_p0_square1200.jpg", + "description": "", + "tags": [ + "ヒプノシスマイク", + "碧棺左馬刻", + "飴村乱数", + "神宮寺寂雷", + "山田一郎", + "TDD", + "どうしてこうならなかった", + "最高", + "ヒプマイ50000users入り" + ], + "userId": "16758020", + "userName": "トビッコ", + "width": 600, + "height": 800, + "pageCount": 8, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ヒプノシスマイク なかよしTDDが解散するまんが+ハマ後日談(追加) - トビッコ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-12-09T10:16:37+09:00", + "updateDate": "2018-12-16T03:42:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/02/19/04/54/35/15416900_9dd01ea008916ff232a90cf987007504_50.jpg" + }, + { + "id": "72987019", + "title": "【ヒプマイ】TDDでおひるね", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/02/03/18/55/25/72987019_p0_square1200.jpg", + "description": "", + "tags": [ + "ヒプノシスマイク", + "ヒプマイ", + "TDD", + "飴村乱数", + "山田一郎", + "神宮寺寂雷", + "碧棺左馬刻", + "なにこれかわいい", + "ヒプマイ30000users入り", + "天使しかいない" + ], + "userId": "275404", + "userName": "コノサキ", + "width": 600, + "height": 900, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ヒプノシスマイク 【ヒプマイ】TDDでおひるね - コノサキ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-02-03T18:55:25+09:00", + "updateDate": "2019-02-03T18:55:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/14/16/17/26/19510358_2a4c7cb09b10f72e11ab2cf936e8b5dc_50.jpg" + }, + { + "id": "70480279", + "title": "【麻天狼&ひふど】漫画まとめログ①", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/09/01/00/12/46/70480279_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "ヒプノシスマイク", + "ヒ腐マイ", + "ひふど", + "麻天狼", + "伊弉冉一二三", + "観音坂独歩", + "神宮寺寂雷", + "ヒ腐マイ10000users入り" + ], + "userId": "32453963", + "userName": "ゼッカ@7/25さロ【D26】", + "width": 637, + "height": 900, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ヒプノシスマイク 【麻天狼&ひふど】漫画まとめログ① - ゼッカ@7/25さロ【D26】的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-09-01T00:12:46+09:00", + "updateDate": "2018-09-01T00:12:46+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/04/19/01/35/02/15664253_9e80ad6a010a7b6daa3335de13620f78_50.png" + }, + { + "id": "76419627", + "title": "無料背景素材", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/08/23/21/40/43/76419627_p0_square1200.jpg", + "description": "", + "tags": [ + "背景", + "背景素材", + "フリー素材", + "和風", + "和室", + "ここに行きたい", + "フリー素材5000users入り", + "春夏秋冬", + "これがフリー…だと…⁉", + "作者は我々から金をとるべき" + ], + "userId": "300907", + "userName": "たかし", + "width": 1920, + "height": 1440, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#背景 無料背景素材 - たかし的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-08-23T21:40:43+09:00", + "updateDate": "2019-08-23T21:40:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/09/24/08/36/02/16321405_a2ac8521a4653d4f57690b1e8cdac7b2_50.jpg" + }, + { + "id": "39379535", + "title": "【Apophysis】宇宙01-星空編-【フリー素材】", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/10/27/22/01/13/39379535_p0_square1200.jpg", + "description": "", + "tags": [ + "フリー素材", + "背景素材", + "加工自由", + "テクスチャ", + "Apophysis", + "宇宙", + "星空", + "ふつくしい", + "フリー素材5000users入り" + ], + "userId": "5998574", + "userName": "瀝青炭@休眠中", + "width": 1000, + "height": 750, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#フリー素材 【Apophysis】宇宙01-星空編-【フリー素材】 - 瀝青炭@休眠中的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-10-27T22:01:13+09:00", + "updateDate": "2013-10-27T22:01:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/05/03/14/49/45/10882037_e2f35f604eee88991ee828d8f0e2ee77_50.jpg" + }, + { + "id": "60800103", + "title": "FGO召喚素材", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/01/06/19/05/31/60800103_p0_square1200.jpg", + "description": "", + "tags": [ + "FGO", + "フリー素材", + "背景素材", + "Fate/GrandOrder" + ], + "userId": "17591386", + "userName": "白扉", + "width": 2668, + "height": 1500, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#FGO FGO召喚素材 - 白扉的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-01-06T19:05:31+09:00", + "updateDate": "2017-01-06T19:05:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2016/03/20/12/30/51/10689734_c5d055723799f570530fb52876093a6b_50.jpg" + }, + { + "id": "43436652", + "title": "詰め【腐】", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/05/11/12/11/55/43436652_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼白", + "丁白丁", + "腐向け", + "これはいい鬼白", + "愛を感じる", + "鬼灯の冷徹", + "鬼灯の腐向け10000users入り", + "ショタ鬼灯様の「モフモフ!」の破壊力", + "あざと神獣マジあざとい" + ], + "userId": "2249236", + "userName": "hagi", + "width": 900, + "height": 667, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼白 詰め【腐】 - hagi的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2014-05-11T12:11:55+09:00", + "updateDate": "2014-05-11T12:11:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/01/19/16/08/19/7329261_96a29a8b0bb18013963daee5e3b3775d_50.jpg" + }, + { + "id": "51846917", + "title": "【鬼白】まんが④", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/08/08/11/06/33/51846917_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "鬼白", + "鬼灯の腐向け", + "鬼灯様テライケメン", + "甘酸っぱすぎていっそ泣けてくる", + "鬼灯の腐向け10000users入り", + "④ばーーん!!", + "これはいい鬼白" + ], + "userId": "12322313", + "userName": "うゆ", + "width": 600, + "height": 800, + "pageCount": 56, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼白 【鬼白】まんが④ - うゆ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-08-08T11:06:33+09:00", + "updateDate": "2015-08-08T11:06:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/09/16/00/42/45/8403076_2e8106c1203847b00a8b6ec9be3c58ec_50.jpg" + }, + { + "id": "48286222", + "title": "【鬼白】まんが③", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/01/21/00/37/38/48286222_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼白", + "鬼灯の腐向け", + "漫画", + "ここは天国か...", + "そいや!!", + "オカン閻魔様", + "鬼灯の腐向け10000users入り" + ], + "userId": "12322313", + "userName": "うゆ", + "width": 600, + "height": 800, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼白 【鬼白】まんが③ - うゆ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-01-21T00:37:38+09:00", + "updateDate": "2015-01-21T00:37:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2014/09/16/00/42/45/8403076_2e8106c1203847b00a8b6ec9be3c58ec_50.jpg" + }, + { + "id": "77844238", + "title": "DNF", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2019/11/16/19/33/04/77844238_p0_custom1200.jpg", + "description": "", + "tags": [ + "던전앤파이터", + "DNF", + "美少女", + "rain", + "던파", + "아니스" + ], + "userId": "28181378", + "userName": "POHO / @_P0H0_", + "width": 983, + "height": 1878, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#던전앤파이터 DNF - POHO / @_P0H0_的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-11-16T19:33:04+09:00", + "updateDate": "2019-11-16T19:33:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/10/20/00/34/23/13360904_c9561b04e72370f518ccd8972a03c14c_50.jpg" + }, + { + "id": "81890250", + "title": "DNF commission", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/27/14/00/45/81890250_p0_square1200.jpg", + "description": "", + "tags": [ + "던파", + "commission", + "여귀검사", + "DNF", + "ハイヒール", + "R-18" + ], + "userId": "8879338", + "userName": "Lohel", + "width": 1857, + "height": 1543, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#던파 DNF commission - Lohel的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-27T14:00:45+09:00", + "updateDate": "2020-05-27T14:00:45+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/27/00/06/47/16465314_9ae821a514cd6645d80ce66d42a9a75f_50.png" + }, + { + "id": "67979905", + "title": "2018", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/03/31/06/59/14/67979905_p0_square1200.jpg", + "description": "", + "tags": [ + "dnf", + "던파", + "w.gunner", + "여거너", + "地下城与勇士", + "アラド戦記", + "おっぱい", + "女神", + "アラド戦記10000users入り" + ], + "userId": "18380615", + "userName": "monaim", + "width": 1117, + "height": 1293, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#dnf 2018 - monaim的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-03-30T02:16:41+09:00", + "updateDate": "2018-03-31T06:59:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/04/05/01/17/47/12372343_109f075bfce6c2c08a3490f8002c472f_50.png" + }, + { + "id": "85625860", + "title": "呪詰め4", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/12/19/58/36/85625860_p0_square1200.jpg", + "description": "", + "tags": [ + "夢術廻戦", + "夢術廻戦10000users入り" + ], + "userId": "696172", + "userName": "もらす", + "width": 2087, + "height": 1585, + "pageCount": 161, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#夢術廻戦 呪詰め4 - もらす的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-12T19:58:36+09:00", + "updateDate": "2020-11-12T19:58:36+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/01/21/20/03/41/8871170_a49419ec900738eb3ad2daa6ed9838cb_50.jpg" + }, + { + "id": "90985115", + "title": "武右LOG 1", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/03/20/16/31/90985115_p0_square1200.jpg", + "description": "", + "tags": [ + "マイ武", + "ふゆタケ", + "タケミチ受け", + "東京【腐】リベンジャーズ", + "たけみち受け", + "東京【腐】リベンジャーズ10000users入り", + "なにこれ幸せ" + ], + "userId": "2292595", + "userName": "矢代", + "width": 650, + "height": 919, + "pageCount": 20, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#マイ武 武右LOG 1 - 矢代的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-03T20:16:31+09:00", + "updateDate": "2021-07-03T20:16:31+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/12/13/28/54/21024925_058c7c9830c6561e8dff9ea3cfe85dd1_50.jpg" + }, + { + "id": "85850572", + "title": "五悠ログ1", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/23/10/34/52/85850572_p0_square1200.jpg", + "description": "", + "tags": [ + "腐術廻戦", + "五悠", + "腐術廻戦50000users入り", + "これはいい五悠", + "腐向け", + "おひさまの匂い…" + ], + "userId": "22731624", + "userName": "茶白", + "width": 800, + "height": 800, + "pageCount": 36, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#腐術廻戦 五悠ログ1 - 茶白的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-23T10:34:52+09:00", + "updateDate": "2020-11-23T10:34:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/14/17/16/11/19666992_5ebe6be9c92a692f7b81c6507e3b2604_50.jpg" + }, + { + "id": "85951712", + "title": "夢小説本|呪術廻戦 夏油・五条・伏黒四角関係|A6体裁サンプル", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/28/10/09/13/85951712_p0_square1200.jpg", + "description": "", + "tags": [ + "夢本", + "夢小説", + "夢ノ箱庭", + "夢術廻戦", + "妖言", + "超妖言", + "ユメミ2nd", + "夢術廻戦1000users入り" + ], + "userId": "15570616", + "userName": "桐原🍋夢箱欠席", + "width": 1000, + "height": 1421, + "pageCount": 13, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#夢本 夢小説本|呪術廻戦 夏油・五条・伏黒四角関係|A6体裁サンプル - 桐原🍋夢箱欠席的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-28T10:09:13+09:00", + "updateDate": "2020-11-28T10:09:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/06/02/18/35/14589935_0e9b6fc8473c895b5af6735af2549fe6_50.jpg" + }, + { + "id": "85547905", + "title": "無題", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/08/21/39/03/85547905_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "五悠", + "腐術廻戦", + "これはいい五悠", + "腐術廻戦50000users入り", + "腐向け" + ], + "userId": "61088628", + "userName": "須田", + "width": 3679, + "height": 5154, + "pageCount": 6, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#五悠 無題 - 須田的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-08T21:39:03+09:00", + "updateDate": "2020-11-08T21:39:03+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/05/19/14/33/19620820_517388ca0256c1433591013baca5f64d_50.jpg" + }, + { + "id": "89844674", + "title": "マイキ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/15/06/12/25/89844674_p0_square1200.jpg", + "description": "", + "tags": [ + "イラスト", + "絵", + "fanart", + "anime", + "東京リベンジャーズ", + "佐野万次郎", + "マイキ", + "male", + "マイキー" + ], + "userId": "54871092", + "userName": "Lan", + "width": 3812, + "height": 2583, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#イラスト マイキ - Lan的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-15T06:12:25+09:00", + "updateDate": "2021-05-15T06:12:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/22/09/51/06/20399454_b3df6e3d0293f463b6dfcf346c7d4a52_50.jpg" + }, + { + "id": "63457814", + "title": "【コナン×YOI】氷上の愛讃歌(ラブアンドライフ)", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/06/19/01/08/28/63457814_p0_square1200.jpg", + "description": "", + "tags": [ + "ユーリ!!!onICE", + "名探偵コナン", + "クロスオーバー", + "なにこれすごい", + "野生の公式", + "スゴ過ぎる!!!", + "混合50000users入り", + "天才か", + "本格的に劇場版化を求む....!!!", + "クロスオーバー界きってのクオリティ…‼︎!" + ], + "userId": "635762", + "userName": "アケ", + "width": 700, + "height": 784, + "pageCount": 34, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ユーリ!!!onICE 【コナン×YOI】氷上の愛讃歌(ラブアンドライフ) - アケ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-06-19T01:08:28+09:00", + "updateDate": "2017-06-19T01:08:28+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/02/05/16/28/30/5784146_cb9ed92939ba4b5ac051ad74cd105645_50.jpg" + }, + { + "id": "86655276", + "title": "ログ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/30/21/26/35/86655276_p0_square1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "五条悟", + "夏油傑", + "これはいい最強同期", + "呪術廻戦30000users入り", + "五+夏" + ], + "userId": "18059582", + "userName": "hk", + "width": 1960, + "height": 2850, + "pageCount": 19, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 ログ - hk的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-30T21:26:35+09:00", + "updateDate": "2020-12-30T21:26:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "85842343", + "title": "五条悟", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/23/00/00/08/85842343_p0_square1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "五条悟", + "テライケメン", + "キャプションに激しく同意", + "呪術廻戦50000users入り" + ], + "userId": "1731804", + "userName": "わるつ", + "width": 1113, + "height": 1418, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 五条悟 - わるつ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-23T00:00:08+09:00", + "updateDate": "2020-11-23T00:00:08+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/11/21/06/43/40/13479828_74cecd092b1e9a851e5ccb06abf8ee4a_50.png" + }, + { + "id": "81798260", + "title": "【WEB再録】男女反転廻戦", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/05/23/22/37/52/81798260_p0_custom1200.jpg", + "description": "", + "tags": [ + "腐術廻戦", + "女体化", + "男体化", + "性転換", + "笑撃のラスト", + "腐術廻戦50000users入り", + "ちょもちょも可愛い", + "続きを待機!!", + "植物トリオ" + ], + "userId": "6703987", + "userName": "永流", + "width": 2622, + "height": 3720, + "pageCount": 22, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#腐術廻戦 【WEB再録】男女反転廻戦 - 永流的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-23T22:37:52+09:00", + "updateDate": "2020-05-23T22:37:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/08/24/21/34/59/13100641_312c2271cc2af53e7e77700b496470c5_50.png" + }, + { + "id": "71152750", + "title": "BFLOG", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/10/13/01/09/40/71152750_p0_square1200.jpg", + "description": "", + "tags": [ + "BANANAFISH", + "A英", + "腐向け", + "あなたが神か", + "野生の公式", + "尊い", + "涙腺崩壊", + "BF【腐】50000users入り", + "幸せな世界よどうか" + ], + "userId": "920707", + "userName": "サワ", + "width": 782, + "height": 648, + "pageCount": 29, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#BANANAFISH BFLOG - サワ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-10-13T01:09:40+09:00", + "updateDate": "2018-10-13T01:09:40+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/09/15/17/44/06/6817679_23f1fd929f9caa04ebad6e29b11cf415_50.jpg" + }, + { + "id": "90602994", + "title": "東京卍會総長", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/17/00/00/03/90602994_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "マイキー", + "なにこれかっこいい", + "東京卍リベンジャーズ5000入り" + ], + "userId": "44869033", + "userName": "はらけんし", + "width": 2580, + "height": 3643, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 東京卍會総長 - はらけんし的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-17T00:00:03+09:00", + "updateDate": "2021-06-17T00:00:03+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/09/07/19/02/41/19321849_400fbe87362c18a38d35bd19191b2491_50.png" + }, + { + "id": "82082820", + "title": "フロ監・ジェイ監log", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/06/04/16/43/45/82082820_p0_square1200.jpg", + "description": "", + "tags": [ + "twstプラス", + "フロ監", + "ジェイ監", + "twst夢", + "女監督生", + "これはいいフロ監", + "これはいいジェイ監", + "おねむなアズール優しい", + "twst夢100000users入り", + "#『しりとり』とは、、、⁇" + ], + "userId": "54918134", + "userName": "にぱち", + "width": 2150, + "height": 3035, + "pageCount": 21, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#twstプラス フロ監・ジェイ監log - にぱち的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-06-04T16:43:45+09:00", + "updateDate": "2020-06-04T16:43:45+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/07/20/17/26/00/19022245_67a0b8efb3a5af87edc5de56262fe749_50.png" + }, + { + "id": "78709507", + "title": "本好きまとめ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/01/04/20/20/55/78709507_p0_custom1200.jpg", + "description": "", + "tags": [ + "本好きの下剋上", + "フェルマイ", + "本好きの下剋上10000users入り", + "シュミミマント" + ], + "userId": "46399856", + "userName": "イノ", + "width": 1254, + "height": 1850, + "pageCount": 29, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#本好きの下剋上 本好きまとめ - イノ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-04T20:20:55+09:00", + "updateDate": "2020-01-04T20:20:55+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/26/04/31/17/16751537_fb6c9514567c67a52aa6d5a4412cd026_50.jpg" + }, + { + "id": "89322687", + "title": "東卍ログ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/04/22/22/12/35/89322687_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "ドラマイ", + "佐野万次郎", + "東京卍リベンジャーズ10000users入り" + ], + "userId": "4055953", + "userName": "メイメイ", + "width": 3000, + "height": 3000, + "pageCount": 24, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 東卍ログ - メイメイ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-04-22T22:12:35+09:00", + "updateDate": "2021-04-22T22:12:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "66204889", + "title": "閃華新刊(クロスオーバー)", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2017/12/08/10/51/35/66204889_p0_square1200.jpg", + "description": "", + "tags": [ + "女審神者", + "跡部景吾", + "閃華の刻18年納", + "どこから聞こえてくるぞ、、『氷帝!氷帝!勝つのは氷帝!』", + "クロスオーバー", + "C93", + "夢漫画", + "混合5000users入り", + "オリ主" + ], + "userId": "4372483", + "userName": "弓削リカコ", + "width": 800, + "height": 800, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女審神者 閃華新刊(クロスオーバー) - 弓削リカコ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2017-12-08T10:51:35+09:00", + "updateDate": "2017-12-08T10:51:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/11/07/18/14/52/14988971_ef54bee78b867bfac2c07dd35e340fad_50.png" + }, + { + "id": "80630584", + "title": "twst夢詰め", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/04/07/20/14/20/80630584_p0_square1200.jpg", + "description": "", + "tags": [ + "twst夢", + "夢漫画", + "女主人公", + "あなた様でしたか", + "twst夢10000users入り", + "フロ監", + "twst夢20000users入り" + ], + "userId": "16457604", + "userName": "菊二", + "width": 900, + "height": 900, + "pageCount": 17, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#twst夢 twst夢詰め - 菊二的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-04-07T20:14:20+09:00", + "updateDate": "2020-04-07T20:14:20+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/01/05/22/49/47/11965775_509f5108cc53c0c61ab953773f80b19a_50.jpg" + }, + { + "id": "83242494", + "title": "転校先の学校が不穏そうな話", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/07/26/19/00/58/83242494_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "オリジナル", + "創作", + "続きを全裸待機", + "愛すべき馬鹿", + "優しい世界", + "伝説の始まり", + "タッパァァァ", + "はなメガネ", + "オリジナル100000users入り" + ], + "userId": "6015205", + "userName": "立葵", + "width": 1247, + "height": 1757, + "pageCount": 20, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 転校先の学校が不穏そうな話 - 立葵的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-07-26T19:00:58+09:00", + "updateDate": "2020-07-26T19:00:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/10/28/17/01/34/14953131_1c486fca5e8339531e0818e42484c310_50.jpg" + }, + { + "id": "81850096", + "title": "twstまとめ①", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/05/30/17/15/34/81850096_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "twst夢", + "twstプラス", + "女監督生", + "マレ監", + "友情フォーエバー", + "デュース元ヤンの底力", + "腹筋がオーバーブロット", + "監督生愛され", + "twst夢80000users入り" + ], + "userId": "10312004", + "userName": "うづ菌", + "width": 4497, + "height": 3335, + "pageCount": 22, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#twst夢 twstまとめ① - うづ菌的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-05-25T20:00:13+09:00", + "updateDate": "2020-05-30T17:15:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/05/01/16/53/51/18453320_a365dc2caa5409b8bcf6e1f79e84f511_50.jpg" + }, + { + "id": "72727118", + "title": "現代ジブリカップルたちの日常", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/01/19/00/01/14/72727118_p0_square1200.jpg", + "description": "", + "tags": [ + "ジブリ", + "千と千尋の神隠し", + "ハウルの動く城", + "もののけ姫", + "現パロ", + "あなたが神か", + "ジブリ50000users入り", + "ハク千", + "ハウソフィ", + "アシサン" + ], + "userId": "5155946", + "userName": "ダンミル", + "width": 900, + "height": 1273, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ジブリ 現代ジブリカップルたちの日常 - ダンミル的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-01-19T00:01:14+09:00", + "updateDate": "2019-01-19T00:01:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/07/03/10/55/30/12797398_1982f9bf699bd2ff2b67855b276bbb8c_50.png" + }, + { + "id": "49831005", + "title": "雪*", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2015/04/14/00/00/53/49831005_p0_square1200.jpg", + "description": "", + "tags": [ + "やはり俺の青春ラブコメはまちがっている。", + "雪ノ下雪乃", + "ふつくしい", + "黒髪", + "横顔", + "マフラー", + "ビニール傘", + "雪", + "冬", + "俺ガイル10000users入り" + ], + "userId": "5572922", + "userName": "GKN", + "width": 1257, + "height": 793, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#やはり俺の青春ラブコメはまちがっている。 雪* - GKN的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2015-04-14T00:00:53+09:00", + "updateDate": "2015-04-14T00:00:53+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/04/05/20/31/17/9196658_65cd47f348f2b2428d7ac86d9e153aad_50.png" + }, + { + "id": "79167696", + "title": "🧡", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/01/29/23/26/38/79167696_p0_square1200.jpg", + "description": "", + "tags": [ + "魔道祖師", + "WangXian", + "魔道祖師1000users入り" + ], + "userId": "3205611", + "userName": "KimPeul/キムプル", + "width": 800, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#魔道祖師 🧡 - KimPeul/キムプル的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-01-29T23:26:38+09:00", + "updateDate": "2020-01-29T23:26:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/04/27/22/32/16/15696585_72e49a8445a19896d1e3e09f28c3b984_50.png" + }, + { + "id": "80873983", + "title": "大学生八色", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/04/18/14/16/15/80873983_p0_square1200.jpg", + "description": "", + "tags": [ + "ロング化", + "同棲", + "大学生", + "八色", + "一色いろは", + "比企谷八幡", + "俺ガイル", + "やはり俺の青春ラブコメはまちがっている。", + "イチャラブ", + "俺ガイル10000users入り" + ], + "userId": "23496118", + "userName": "ライト", + "width": 5236, + "height": 4685, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ロング化 大学生八色 - ライト的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-04-18T14:16:15+09:00", + "updateDate": "2020-04-18T14:16:15+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/05/15/10/38/18047544_aff5474a6785add948e48034b22dad3f_50.jpg" + }, + { + "id": "90828399", + "title": "場地圭介の相方と幼馴染の話", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/06/26/22/24/46/90828399_p0_custom1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "場地圭介", + "松野千冬", + "マイキー", + "佐野万次郎" + ], + "userId": "10300651", + "userName": "飯田 はと@お仕事募集中", + "width": 1400, + "height": 785, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 場地圭介の相方と幼馴染の話 - 飯田 はと@お仕事募集中的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-26T22:24:46+09:00", + "updateDate": "2021-06-26T22:24:46+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/10/19/41/22/19979990_2d38fc0821847543547c3577679b32fa_50.jpg" + }, + { + "id": "89602868", + "title": "救。", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/04/23/11/11/89602868_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "東京リベンジャーズ", + "東卍FA", + "花垣武道", + "東京卍リベンジャーズ1000users入り", + "なにこれ素敵", + "東京卍リベンジャーズ5000users入り" + ], + "userId": "1608503", + "userName": "空野蒼空", + "width": 485, + "height": 2461, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ 救。 - 空野蒼空的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-04T23:11:11+09:00", + "updateDate": "2021-05-04T23:11:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/04/13/16/10/23/20527284_1c996152ab18386d7345aa48c8cd5748_50.jpg" + }, + { + "id": "87630784", + "title": "無下限あればウイルスにも無敵な五条先生", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/02/08/23/23/19/87630784_p0_custom1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "五条悟", + "釘崎野薔薇", + "虎杖悠仁", + "伏黒恵", + "なにこれかわいい", + "なにこれ尊い", + "なにこれ癒し", + "呪術廻戦50000users入り" + ], + "userId": "1921530", + "userName": "つくし", + "width": 1100, + "height": 1372, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 無下限あればウイルスにも無敵な五条先生 - つくし的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-08T23:23:19+09:00", + "updateDate": "2021-02-08T23:23:19+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/14/03/47/00/14773236_ef375cd354778c894cc0d8a239aac9c4_50.jpg" + }, + { + "id": "36022374", + "title": "新緑廃工場", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2013/05/30/00/44/18/36022374_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "クリック推奨", + "ここに行きたい", + "待ってました!", + "俯瞰", + "メイキング希望", + "立体都市", + "神々しい美しさ", + "オリジナル30000users入り", + "風景10000users入り" + ], + "userId": "107492", + "userName": "たみ。", + "width": 1049, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#オリジナル 新緑廃工場 - たみ。的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2013-05-30T00:44:18+09:00", + "updateDate": "2013-05-30T00:44:18+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/08/20/14/45/29/2106137_1e31e2994890d3d51f3f5952e3be912e_50.png" + }, + { + "id": "78510327", + "title": "野薔薇ちゃんも女の子", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/12/26/23/17/12/78510327_p0_square1200.jpg", + "description": "", + "tags": [ + "呪術廻戦", + "釘崎野薔薇", + "虎杖悠仁", + "伏黒恵", + "お前のまぶたをまつりぬい♡", + "呪術廻戦50000users入り", + "植物トリオ", + "なにこれかわいい", + "なにこれあったかい" + ], + "userId": "10157426", + "userName": "みねお", + "width": 2508, + "height": 3541, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#呪術廻戦 野薔薇ちゃんも女の子 - みねお的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-12-26T23:17:12+09:00", + "updateDate": "2019-12-26T23:17:12+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/26/01/17/43/14821249_e709e832412339346ab88360655d744c_50.jpg" + }, + { + "id": "79379089", + "title": "五伏ログ①", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/09/19/23/02/79379089_p0_square1200.jpg", + "description": "", + "tags": [ + "腐術廻戦", + "五伏", + "腐向け", + "腐術廻戦10000users入り" + ], + "userId": "12181917", + "userName": "五臓六腑", + "width": 744, + "height": 1052, + "pageCount": 25, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#腐術廻戦 五伏ログ① - 五臓六腑的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-09T19:16:18+09:00", + "updateDate": "2020-02-09T19:23:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/12/30/14/41/14/16771071_b7d7a4c30db00906018592d84ad416bd_50.png" + }, + { + "id": "79363893", + "title": "冨岡義勇誕生祭!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/09/00/19/00/79363893_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼滅の刃", + "二次創作", + "漫画", + "冨岡義勇", + "胡蝶しのぶ", + "時透無一郎", + "不死川実弥", + "俺は嫌われてない", + "鬼滅の刃40000users入り", + "冨岡義勇誕生祭" + ], + "userId": "10006345", + "userName": "Aya", + "width": 1240, + "height": 1754, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼滅の刃 冨岡義勇誕生祭! - Aya的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-09T00:19:00+09:00", + "updateDate": "2020-02-09T00:19:00+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/08/16/38/23/19636554_11d0158c0517308a0bd3bc2c618eea57_50.jpg" + }, + { + "id": "77673634", + "title": "【創作】山奥の村の双子の話", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/11/06/00/03/08/77673634_p0_square1200.jpg", + "description": "", + "tags": [ + "漫画", + "創作", + "オリジナル", + "イイハナシダナ-", + "おとぎ話(?)", + "殺し愛", + "兄妹愛", + "イイハナシナノカナー?", + "ヤンデレ" + ], + "userId": "1281456", + "userName": "磐秋", + "width": 636, + "height": 900, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#創作 【創作】山奥の村の双子の話 - 磐秋的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2019-11-06T00:03:08+09:00", + "updateDate": "2019-11-06T00:03:08+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2015/12/19/03/10/56/10258103_e4ac1d929c08d78f0ee8b2a5d40fe31f_50.jpg" + }, + { + "id": "58393816", + "title": "実はめっちゃ面白いクトゥルフ神話TRPG", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2016/08/12/00/01/44/58393816_p0_square1200.jpg", + "description": "", + "tags": [ + "実はめっちゃ面白いクトゥルフ神話TRPG", + "クトゥルフ神話TRPG", + "クトゥルフ神話TRPG5000users入り" + ], + "userId": "1143884", + "userName": "やまかわ", + "width": 1200, + "height": 828, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#実はめっちゃ面白いクトゥルフ神話TRPG 実はめっちゃ面白いクトゥルフ神話TRPG - やまかわ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-08-12T00:01:44+09:00", + "updateDate": "2016-08-12T00:01:44+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/05/27/01/25/26/14280592_a9d5540758b5a7c3bb2e071ba6ca5e0c_50.png" + }, + { + "id": "60520282", + "title": "【CoCシナリオ】まずはダイスを振れ、話はそれからだ(資料画像)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2019/12/06/18/32/13/60520282_p0_square1200.jpg", + "description": "", + "tags": [ + "クトゥルフ神話TRPG", + "TRPG用資料", + "CoCシナリオ" + ], + "userId": "20529565", + "userName": "にこいち(nikoichi)", + "width": 2893, + "height": 4092, + "pageCount": 15, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#クトゥルフ神話TRPG 【CoCシナリオ】まずはダイスを振れ、話はそれからだ(資料画像) - にこいち(nikoichi)的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2016-12-24T11:55:44+09:00", + "updateDate": "2019-12-06T18:32:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/10/13/10/44/45/14897316_6cd3133506a7eadda27905f4587fed93_50.png" + }, + { + "id": "16658773", + "title": "437.15と16の間(7巻ネタバレ)", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2011/02/14/01/11/52/16658773_p0_square1200.jpg", + "description": "", + "tags": [ + "ハリーポッター", + "セブリリ", + "スネイプ", + "目からアグアメンティ", + "こんな素敵な話、きっとあった。", + "涙腺崩壊", + "ハリポタ10000users入り", + "ハリポタ", + "セブルス・スネイプ" + ], + "userId": "97152", + "userName": "kdm", + "width": 504, + "height": 700, + "pageCount": 9, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ハリーポッター 437.15と16の間(7巻ネタバレ) - kdm的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2011-02-14T01:11:52+09:00", + "updateDate": "2011-02-14T01:11:52+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2010/09/20/02/18/09/2215331_ca53ee7fabd3651baa0d658a0b4cfeb7_50.jpg" + }, + { + "id": "31220217", + "title": "ハrrrrrロウィンイエアアアアアア", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2012/11/01/23/59/33/31220217_p0_square1200.jpg", + "description": "", + "tags": [ + "黒子のバスケ", + "親戚の多い黄瀬君", + "赤司様まじ赤司様", + "お前らほんと仲良いな", + "青峰終了のお知らせ", + "謎の疾走感", + "キセキの世代", + "アリババーン!!", + "黒バス30000users入り", + "キャラ崩壊" + ], + "userId": "3946863", + "userName": "ユモ", + "width": 1300, + "height": 1017, + "pageCount": 10, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#黒子のバスケ ハrrrrrロウィンイエアアアアアア - ユモ的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2012-11-01T23:59:33+09:00", + "updateDate": "2012-11-01T23:59:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "85184256", + "title": "ウインクしてください!-東卍", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/23/13/20/35/85184256_p0_square1200.jpg", + "description": "", + "tags": [ + "東京卍リベンジャーズ", + "東卍", + "三ツ谷隆", + "龍宮寺堅", + "佐野万次郎", + "松野千冬", + "花垣武道", + "林良平", + "ウインク" + ], + "userId": "60540746", + "userName": "ぷらぐ", + "width": 900, + "height": 1390, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#東京卍リベンジャーズ ウインクしてください!-東卍 - ぷらぐ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-23T13:20:35+09:00", + "updateDate": "2020-10-23T13:20:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/04/01/28/13/20638532_c471619d7aa9e846372eac79e7a6a352_50.jpg" + }, + { + "id": "79429809", + "title": "炎柱と蛇柱", + "illustType": 1, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/02/12/00/43/23/79429809_p0_square1200.jpg", + "description": "", + "tags": [ + "鬼滅の刃", + "伊黒小芭内", + "煉獄杏寿郎", + "涙腺崩壊", + "なにこれ尊い", + "煉獄兄弟", + "目から水の呼吸", + "何これ泣いちゃう", + "かっこいい", + "鬼滅の刃100000users入り" + ], + "userId": "24889541", + "userName": "も な", + "width": 850, + "height": 1515, + "pageCount": 4, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#鬼滅の刃 炎柱と蛇柱 - も な的漫画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-02-12T00:43:23+09:00", + "updateDate": "2020-02-12T00:43:23+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/01/18/06/33/14721487_2cdb9ba9f508e2d85a3ae4916caa70dd_50.jpg" + }, + { + "id": "85596117", + "title": "Cocogoat!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/11/05/25/32/85596117_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー", + "Klee", + "GenshinImpact", + "Qiqi", + "七七", + "ココナッツヒツジ" + ], + "userId": "13387921", + "userName": "Sketchien", + "width": 3071, + "height": 2536, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11862002032", + "private": false + }, + "alt": "#原神 Cocogoat! - Sketchien的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-11T05:25:32+09:00", + "updateDate": "2020-11-11T05:25:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/12/29/08/12/30/19902583_8c1babd26c2490e878c9d1807dff5012_50.png" + }, + { + "id": "83519895", + "title": "[Commission] 壊理/Eri", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/08/08/06/38/02/83519895_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "loli", + "ロリ", + "壊理", + "掴みピロー", + "へそ", + "僕のヒーローアカデミア" + ], + "userId": "16105069", + "userName": "pumpkinspice", + "width": 707, + "height": 1000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12343402583", + "private": false + }, + "alt": "#loli [Commission] 壊理/Eri - pumpkinspice的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-08-08T06:38:02+09:00", + "updateDate": "2020-08-08T06:38:02+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/08/02/08/33/10/14571013_74e1cdb0d17f64b538924a54648fe90f_50.jpg" + }, + { + "id": "85653642", + "title": "背くらべ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/14/02/46/50/85653642_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "七七(原神)", + "ディオナ(原神)", + "背伸び", + "GenshinImpact", + "ブーツ", + "原神10000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1382, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190765784", + "private": false + }, + "alt": "#原神 背くらべ - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-14T02:46:50+09:00", + "updateDate": "2020-11-14T02:46:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "91339695", + "title": "nugi", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/23/31/17/91339695_p0_square1200.jpg", + "description": "", + "tags": [ + "オリジナル", + "女の子", + "けもみみ", + "部屋", + "獣耳", + "創作", + "おしり" + ], + "userId": "19133926", + "userName": "HOJI", + "width": 1768, + "height": 2500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352332092", + "private": false + }, + "alt": "#オリジナル nugi - HOJI的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T23:31:17+09:00", + "updateDate": "2021-07-18T23:31:17+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/11/17/54/39/17902589_cddd85b744eefa4d9debe484dd11bc3d_50.jpg" + }, + { + "id": "86419304", + "title": "スペース鍾離先生", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/20/20/04/14/86419304_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "鍾離", + "GenshinImpact", + "スペースキャット", + "宇宙猫", + "原神5000users入り" + ], + "userId": "142323", + "userName": "猫囃子", + "width": 1600, + "height": 904, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352178089", + "private": false + }, + "alt": "#原神 スペース鍾離先生 - 猫囃子的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-20T20:04:14+09:00", + "updateDate": "2020-12-20T20:04:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2013/09/10/17/52/56/6797485_7244c01e9197f421df4171e0db5ab92e_50.jpg" + }, + { + "id": "86907465", + "title": "Hu Tao 💀 Qiqi", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/01/08/19/24/58/86907465_p0_custom1200.jpg", + "description": "", + "tags": [ + "GenshinImpact", + "Genshin", + "hutao", + "qiqi", + "原神" + ], + "userId": "18584738", + "userName": "Ninjacat", + "width": 2480, + "height": 1748, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352269546", + "private": false + }, + "alt": "#GenshinImpact Hu Tao 💀 Qiqi - Ninjacat的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-08T19:24:58+09:00", + "updateDate": "2021-01-08T19:24:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/08/19/10/23/19967648_046402112047691bb87d3fb7ea86ffc0_50.jpg" + }, + { + "id": "85349943", + "title": "森林冰火人", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/31/11/55/22/85349943_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "クレー(原神)", + "原神1000users入り" + ], + "userId": "30716447", + "userName": "ginklaga", + "width": 900, + "height": 1282, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11568152040", + "private": false + }, + "alt": "#原神 森林冰火人 - ginklaga的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-31T11:55:22+09:00", + "updateDate": "2020-10-31T11:55:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/10/02/08/29/58/14846443_38890f901917803f5dd96f1f90e31b41_50.jpg" + }, + { + "id": "89519018", + "title": "Naughty Cat", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/01/19/51/42/89519018_p0_custom1200.jpg", + "description": "", + "tags": [ + "R-18", + "ロリ", + "genshinimpact", + "ディオナ(原神)", + "ディオナ", + "クレー(原神)", + "可莉", + "百合", + "klee", + "原神" + ], + "userId": "51238383", + "userName": "Luxuriou S", + "width": 2432, + "height": 2394, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": { + "id": "12331278173", + "private": false + }, + "alt": "#ロリ Naughty Cat - Luxuriou S的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-01T19:51:42+09:00", + "updateDate": "2021-05-01T19:51:42+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/21/22/45/18/18864399_aed5908e8db5d0cc4ec161329ef77619_50.png" + }, + { + "id": "91187479", + "title": "🌪🌪🌪🌪", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/07/12/03/52/21/91187479_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "空(原神)", + "楓原万葉", + "ウェンティ", + "魈(原神)", + "原神5000users入り" + ], + "userId": "3420822", + "userName": "Csyday", + "width": 1106, + "height": 1350, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352158866", + "private": false + }, + "alt": "#原神 🌪🌪🌪🌪 - Csyday的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-12T03:52:21+09:00", + "updateDate": "2021-07-12T03:52:21+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/12/16/05/37/13/19837561_b06123df96281c2c1670bbde90af5286_50.jpg" + }, + { + "id": "86465064", + "title": "肉蛋冲鸡", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/12/23/00/13/25/86465064_p0_custom1200.jpg", + "description": "", + "tags": [ + "R-18", + "女の子", + "loli", + "原神", + "幼女", + "七七(原神)", + "七七" + ], + "userId": "7270720", + "userName": "提比爷爷", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190813445", + "private": false + }, + "alt": "#女の子 肉蛋冲鸡 - 提比爷爷的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-23T00:13:25+09:00", + "updateDate": "2020-12-23T00:13:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/12/10/00/50/09/13545222_e4be8a9c803ec0a57c2cd364bc5fd603_50.png" + }, + { + "id": "90885211", + "title": "Diona with bang", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/29/04/18/50/90885211_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "可愛い", + "catgirl", + "GenshinImpact", + "原神", + "ケモミミ", + "猫耳", + "ディオナ(原神)" + ], + "userId": "3603730", + "userName": "loentar", + "width": 2048, + "height": 2048, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": { + "id": "12351968641", + "private": false + }, + "alt": "#女の子 Diona with bang - loentar的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-29T04:18:50+09:00", + "updateDate": "2021-06-29T04:18:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/09/04/36/16/19142331_d4f92b2f1a411c73a6d0e98733b9cc02_50.png" + }, + { + "id": "90690399", + "title": "养猫日常", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/20/19/19/13/90690399_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "迪奥娜", + "原神", + "萝莉" + ], + "userId": "21635902", + "userName": "无啼", + "width": 3000, + "height": 3000, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352029300", + "private": false + }, + "alt": "#迪奥娜 养猫日常 - 无啼的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-20T19:19:13+09:00", + "updateDate": "2021-06-20T19:19:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "90370584", + "title": "七七", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/06/19/25/11/90370584_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "原神", + "七七", + "空七", + "揉みしだきたい乳" + ], + "userId": "13535755", + "userName": "偷腥の狄璐卡", + "width": 767, + "height": 1100, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12331384372", + "private": false + }, + "alt": "#原神 七七 - 偷腥の狄璐卡的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-06T19:25:11+09:00", + "updateDate": "2021-06-06T19:25:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/06/28/15/44/27/20948691_00468de6095aec3411b6998596a571d8_50.jpg" + }, + { + "id": "86086558", + "title": "クレー | レザー", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/12/04/18/32/13/86086558_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "ロリ", + "クレー(原神)", + "原神", + "少女" + ], + "userId": "40169508", + "userName": "crumbles", + "width": 1300, + "height": 1625, + "pageCount": 5, + "isBookmarkable": true, + "bookmarkData": { + "id": "12331339990", + "private": false + }, + "alt": "#ロリ クレー | レザー - crumbles的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-04T18:32:13+09:00", + "updateDate": "2020-12-04T18:32:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/11/25/08/06/44/16582607_b2c1907a9a817c770a86515ac3f9cbd6_50.gif" + }, + { + "id": "89694803", + "title": "Diona (just cats chatting)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/05/08/19/01/23/89694803_p0_square1200.jpg", + "description": "", + "tags": [ + "猫耳", + "女の子", + "原神", + "迪奥娜", + "ディオナ(原神)", + "GenshinImpact", + "猫", + "ケモミミ", + "可愛い" + ], + "userId": "3603730", + "userName": "loentar", + "width": 2048, + "height": 2048, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352007886", + "private": false + }, + "alt": "#猫耳 Diona (just cats chatting) - loentar的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-08T19:01:23+09:00", + "updateDate": "2021-05-08T19:01:23+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/08/09/04/36/16/19142331_d4f92b2f1a411c73a6d0e98733b9cc02_50.png" + }, + { + "id": "71553807", + "title": "paff女神", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2018/11/08/01/33/27/71553807_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "paff", + "cytus" + ], + "userId": "13046221", + "userName": "teslamax", + "width": 2732, + "height": 2048, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "5092259170", + "private": false + }, + "alt": "#paff paff女神 - teslamax的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-11-08T01:33:27+09:00", + "updateDate": "2018-11-08T01:33:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://s.pximg.net/common/images/no_profile_s.png" + }, + { + "id": "89900124", + "title": "无题", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/26/10/20/51/89900124_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "萝莉", + "Genshinimpact", + "七七", + "裸足", + "百合", + "女孩子", + "可莉", + "猫耳", + "ディオナ(原神)" + ], + "userId": "15205988", + "userName": "貢 茶", + "width": 2195, + "height": 3233, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": { + "id": "12292943415", + "private": false + }, + "alt": "#原神 无题 - 貢 茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-17T09:01:13+09:00", + "updateDate": "2021-05-26T10:20:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/01/03/57/51/18746616_dc83e97e1ced85765c290ba14c426418_50.jpg" + }, + { + "id": "90630791", + "title": "twitter落書きまとめ③", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/18/10/52/22/90630791_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "パイモン(原神)", + "ディオナ(原神)", + "ルナ(シャドウバース)", + "黒羽アリス", + "スヤリス姫", + "キョウカ(プリコネ)", + "シャドウバース", + "シャドウバース(アニメ)", + "原神" + ], + "userId": "50766103", + "userName": "庵葉こはく", + "width": 1196, + "height": 1664, + "pageCount": 11, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352081601", + "private": false + }, + "alt": "#パイモン(原神) twitter落書きまとめ③ - 庵葉こはく的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-18T10:52:22+09:00", + "updateDate": "2021-06-18T10:52:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/08/20/40/44/18069569_2a0b920c4d6613c044367174f6018041_50.png" + }, + { + "id": "84818149", + "title": "开瓶器", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/05/13/50/38/84818149_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "派蒙", + "表情包" + ], + "userId": "13530129", + "userName": "奔跑的弱鸡", + "width": 2097, + "height": 2178, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12352172100", + "private": false + }, + "alt": "#原神 开瓶器 - 奔跑的弱鸡的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-05T13:50:38+09:00", + "updateDate": "2020-10-05T13:50:38+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/02/13/19/21/37/17915445_a8401c1a1f4ae74635cacebb41122370_50.jpg" + }, + { + "id": "89708888", + "title": "水个进度", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/05/09/06/02/58/89708888_p0_custom1200.jpg", + "description": "", + "tags": [ + "萝莉", + "迪奥娜", + "七七", + "百合", + "可莉", + "原神" + ], + "userId": "15205988", + "userName": "貢 茶", + "width": 4980, + "height": 2063, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12292977145", + "private": false + }, + "alt": "#萝莉 水个进度 - 貢 茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-09T06:02:58+09:00", + "updateDate": "2021-05-09T06:02:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/01/03/57/51/18746616_dc83e97e1ced85765c290ba14c426418_50.jpg" + }, + { + "id": "85540784", + "title": "七七和可莉", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/08/17/03/33/85540784_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "可莉", + "七七", + "女孩子", + "哈哈", + "同人", + "赤と青" + ], + "userId": "18478848", + "userName": "鱼鹅BABA", + "width": 3508, + "height": 2480, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190905925", + "private": false + }, + "alt": "#原神 七七和可莉 - 鱼鹅BABA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-08T17:03:33+09:00", + "updateDate": "2020-11-08T17:03:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/24/22/51/34/21094082_aa00db3bdad8fc5caaa883a600cfb5ca_50.png" + }, + { + "id": "84378134", + "title": "原神の奇妙な冒険", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/14/23/10/50/84378134_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "Genshin", + "迪卢克", + "琴", + "温迪", + "ジョジョ立ち", + "可莉", + "西風騎士団", + "だいたいあってる" + ], + "userId": "2046536", + "userName": "Grover.Y", + "width": 3292, + "height": 2059, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190785843", + "private": false + }, + "alt": "#原神 原神の奇妙な冒険 - Grover.Y的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-14T23:10:50+09:00", + "updateDate": "2020-09-14T23:10:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/06/09/04/14/10/14335625_52a126f7a4d0b28424aa61595a2fb2f5_50.png" + }, + { + "id": "91024154", + "title": "又()又()", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/07/05/03/32/21/91024154_p0_custom1200.jpg", + "description": "", + "tags": [ + "甘雨(原神)", + "刻晴", + "原神", + "甘雨", + "百合", + "魅惑の谷間", + "濡れ透け", + "着衣巨乳", + "刻甘", + "keqing" + ], + "userId": "15205988", + "userName": "貢 茶", + "width": 3522, + "height": 3084, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": { + "id": "12293006208", + "private": false + }, + "alt": "#甘雨(原神) 又()又() - 貢 茶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-05T03:08:02+09:00", + "updateDate": "2021-07-05T03:32:21+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/01/03/57/51/18746616_dc83e97e1ced85765c290ba14c426418_50.jpg" + }, + { + "id": "85261529", + "title": "パイモンちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2020/10/26/23/11/48/85261529_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "パイモン(原神)", + "嫁分身", + "原神5000users入り" + ], + "userId": "3822903", + "userName": "しよへえ", + "width": 2074, + "height": 1649, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "12360115602", + "private": false + }, + "alt": "#原神 パイモンちゃん - しよへえ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-26T23:11:48+09:00", + "updateDate": "2020-10-26T23:11:48+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/26/23/06/41/19571112_5731cf614ab667f20e10c5a1be49399e_50.jpg" + }, + { + "id": "91303962", + "title": "原神七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/17/17/34/54/91303962_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "ゾンビ", + "ゾンビ娘", + "七七(原神)", + "ストッキング", + "ロリ", + "岛", + "渡厄真君", + "萝莉" + ], + "userId": "20953205", + "userName": "崩解释", + "width": 6137, + "height": 8000, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 原神七七 - 崩解释的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-17T17:34:54+09:00", + "updateDate": "2021-07-17T17:34:54+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/05/24/23/49/40/12602988_72801e3419db6efa59b072558316c2a3_50.jpg" + }, + { + "id": "85010295", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 6, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/14/19/03/13/85010295_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "ミルク", + "お腹", + "ロリ", + "幼女", + "キョンシー", + "ぺたん座り", + "たくしあげ", + "原神10000users入り" + ], + "userId": "31133701", + "userName": "カンザリン", + "width": 1148, + "height": 1684, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七 - カンザリン的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-14T19:03:13+09:00", + "updateDate": "2020-10-14T19:03:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/04/18/00/00/20/14108360_b5fe7057125584b6a3ffe7ca7c61f0be_50.png" + }, + { + "id": "85047720", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/16/19/30/07/85047720_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七", + "七七(原神)", + "ナナ(原神)", + "原神10000users入り" + ], + "userId": "3172636", + "userName": "雨傘ゆん", + "width": 1404, + "height": 2240, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七 - 雨傘ゆん的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-16T19:30:07+09:00", + "updateDate": "2020-10-16T19:30:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/06/10/48/11/20990790_6fad49198fd6cdea8e5d50f625b8cc01_50.jpg" + }, + { + "id": "85109931", + "title": "七七ちゃん貯金箱", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/19/14/14/37/85109931_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "言い出しっぺの法則" + ], + "userId": "83521", + "userName": "蒔島梓", + "width": 860, + "height": 1200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七ちゃん貯金箱 - 蒔島梓的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-19T14:14:37+09:00", + "updateDate": "2020-10-19T14:14:37+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/01/29/00/10/53/20087560_12d70e6c5fcc5cd64de079af6fc750f1_50.png" + }, + { + "id": "87173315", + "title": "甘雨お姉ちゃん見て!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/20/07/15/26/87173315_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "七七(原神)", + "甘雨(原神)", + "あっ", + "to_be_continued", + "オイオイオイ", + "このあと滅茶苦茶", + "志村後ろー!", + "原神5000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1378, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨お姉ちゃん見て! - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-20T07:15:26+09:00", + "updateDate": "2021-01-20T07:15:26+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "85377856", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/01/03/23/47/85377856_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "原神", + "GenshinImpact", + "七七(原神)", + "原神10000users入り" + ], + "userId": "38909135", + "userName": "コポリ", + "width": 3500, + "height": 3232, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 七七 - コポリ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-01T03:23:47+09:00", + "updateDate": "2020-11-01T03:23:47+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/27/19/58/18/19575800_362a0d7098ef214dae70ef7f90389b9d_50.jpg" + }, + { + "id": "85294099", + "title": "七七", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/28/19/38/17/85294099_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "お腹", + "幼女", + "たくしあげ", + "キョンシー", + "白丝", + "ぱんつ", + "七七", + "原神10000users入り" + ], + "userId": "4023292", + "userName": "苏翼丶", + "width": 2434, + "height": 3819, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 七七 - 苏翼丶的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-28T19:38:17+09:00", + "updateDate": "2020-10-28T19:38:17+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/11/13/23/44/44/19663797_a123bd2921301b98148b46f11d055d17_50.jpg" + }, + { + "id": "85026747", + "title": "クレー 七七 I字バランス", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/10/15/17/11/04/85026747_p0_square1200.jpg", + "description": "", + "tags": [ + "I字バランス", + "七七(原神)", + "クレー(原神)", + "原神", + "ロリ", + "強視", + "白ハイソックス" + ], + "userId": "19562097", + "userName": "J_Violet", + "width": 4904, + "height": 3969, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#I字バランス クレー 七七 I字バランス - J_Violet的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-15T17:11:04+09:00", + "updateDate": "2020-10-15T17:11:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/10/15/17/38/30/19515091_256c74ba22ba329316115050469e6dae_50.png" + }, + { + "id": "91314025", + "title": "甘雨", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/07/18/00/06/41/91314025_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "Genshin", + "甘雨", + "甘雨(原神)", + "女の子", + "少女", + "セーラー服" + ], + "userId": "6890797", + "userName": "マッタン", + "width": 1056, + "height": 1715, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨 - マッタン的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T00:06:41+09:00", + "updateDate": "2021-07-18T00:06:41+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/11/11/00/00/41/15000535_1bc5becadf2737418bc482149cc992a4_50.png" + }, + { + "id": "91196524", + "title": "百合", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/12/18/01/34/91196524_p0_square1200.jpg", + "description": "", + "tags": [ + "黒タイツ", + "甘雨(原神)", + "百合", + "原神", + "黑丝", + "刻晴", + "濡れ透け", + "裸ワイシャツ", + "半脱ぎ", + "ソックス足裏" + ], + "userId": "12778394", + "userName": "MZ也也爱吃泡面", + "width": 3058, + "height": 3822, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#黒タイツ 百合 - MZ也也爱吃泡面的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-12T18:01:34+09:00", + "updateDate": "2021-07-12T18:01:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/04/06/21/16/44/18275842_ad35957bf77e1b38c4aa3235e5ec189e_50.jpg" + }, + { + "id": "91326691", + "title": "(✪ω✪)", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/15/22/11/91326691_p0_square1200.jpg", + "description": "", + "tags": [ + "甘雨(原神)", + "甘雨", + "原神", + "刻晴", + "水着", + "刻甘" + ], + "userId": "3213809", + "userName": "茶餅", + "width": 2044, + "height": 972, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#甘雨(原神) (✪ω✪) - 茶餅的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T15:22:11+09:00", + "updateDate": "2021-07-18T15:22:11+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/06/12/16/13/22/20860579_79b812f71759d274a252f864d8cc35f9_50.jpg" + }, + { + "id": "90533611", + "title": "甘雨 x 刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/06/13/23/39/54/90533611_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "甘雨(原神)", + "甘雨", + "刻晴", + "百合", + "キス", + "刻甘" + ], + "userId": "4250280", + "userName": "Daram", + "width": 2500, + "height": 2500, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨 x 刻晴 - Daram的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-13T21:22:31+09:00", + "updateDate": "2021-06-13T23:39:54+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/22/15/37/22/21080648_19281eae84c35bfd216360091a4ac22d_50.png" + }, + { + "id": "91314136", + "title": "甘雨", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/00/09/04/91314136_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "감우", + "Ganyu", + "GenshinImapct", + "Genshin", + "少女", + "魅惑のふともも", + "girl", + "甘雨(原神)", + "甘雨" + ], + "userId": "62011283", + "userName": "zonunoll", + "width": 4000, + "height": 5657, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 甘雨 - zonunoll的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T00:09:04+09:00", + "updateDate": "2021-07-18T00:09:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/05/20/14/33/31/20733474_dd2cc99b80217068ee1623fb47686ece_50.jpg" + }, + { + "id": "91054709", + "title": "甘雨脑袋", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/06/17/54/58/91054709_p0_square1200.jpg", + "description": "", + "tags": [ + "女の子", + "原神", + "甘雨(原神)", + "極上の女体" + ], + "userId": "17519639", + "userName": "蓝白姬♪康康微博可以吗", + "width": 2400, + "height": 2400, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#女の子 甘雨脑袋 - 蓝白姬♪康康微博可以吗的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-06T17:54:58+09:00", + "updateDate": "2021-07-06T17:54:58+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/06/16/00/24/44/18832285_a0db85475e15b3ea6fcc069952d513a9_50.jpg" + }, + { + "id": "91289344", + "title": "甘雨 刻晴", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/17/00/00/04/91289344_p0_square1200.jpg", + "description": "", + "tags": [ + "甘雨(原神)", + "刻晴", + "原神", + "Genshin", + "水着", + "魅惑の谷間", + "海", + "原神1000users入り", + "刻甘", + "乳合わせ" + ], + "userId": "28279345", + "userName": "Sora", + "width": 1982, + "height": 1754, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#甘雨(原神) 甘雨 刻晴 - Sora的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-17T00:00:04+09:00", + "updateDate": "2021-07-17T00:00:04+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/09/01/16/30/47/19288482_bf7d7dee06da726489343149ce2e4888_50.png" + }, + { + "id": "90493204", + "title": "刻甘", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/custom-thumb/img/2021/06/12/09/32/14/90493204_p0_custom1200.jpg", + "description": "", + "tags": [ + "GenshinImpact", + "原神", + "甘雨(原神)", + "刻晴(原神)", + "刻甘", + "百合" + ], + "userId": "58466728", + "userName": "tana", + "width": 2354, + "height": 1741, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#GenshinImpact 刻甘 - tana的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-06-12T09:32:14+09:00", + "updateDate": "2021-06-12T09:32:14+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/16/13/35/08/21046508_bf301173f4c292eaeca02b8109f8733e_50.png" + }, + { + "id": "91290724", + "title": "社会凯瑟琳", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/17/00/40/43/91290724_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "凯瑟琳", + "キャサリン" + ], + "userId": "8673088", + "userName": "菲洛猫", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 社会凯瑟琳 - 菲洛猫的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-17T00:40:43+09:00", + "updateDate": "2021-07-17T00:40:43+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/01/10/01/27/07/15238950_9cc37e57920e90eba13bf3273ae58eab_50.jpg" + }, + { + "id": "91384160", + "title": "2.0", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/21/00/35/13/91384160_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "원신", + "Genshin_Impact", + "Baal", + "雷電将軍", + "蛍(原神)" + ], + "userId": "3607631", + "userName": "hayaroB", + "width": 1000, + "height": 621, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 2.0 - hayaroB的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-21T00:35:13+09:00", + "updateDate": "2021-07-21T00:35:13+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/09/03/23/05/41/14732314_6365fdd58dbf377ddbff45ca7e5a7b3b_50.jpg" + }, + { + "id": "84553956", + "title": "派蒙 改", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/09/23/01/32/07/84553956_p0_square1200.jpg", + "description": "", + "tags": [ + "派蒙", + "原神", + "パイモン(原神)", + "非常食" + ], + "userId": "9471676", + "userName": "ミュート", + "width": 640, + "height": 640, + "pageCount": 3, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#派蒙 派蒙 改 - ミュート的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-23T01:32:07+09:00", + "updateDate": "2020-09-23T01:32:07+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2020/03/14/06/17/27/18106315_2d9e94d073e864044c9c6d5059900de5_50.jpg" + }, + { + "id": "91403730", + "title": "原神", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/22/00/00/16/91403730_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "アルベド", + "クレー", + "パイモン" + ], + "userId": "483730", + "userName": "あるてら", + "width": 1275, + "height": 1800, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 原神 - あるてら的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-22T00:00:16+09:00", + "updateDate": "2021-07-22T00:00:16+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/03/28/23/41/49/20437119_59ce94ccf89b7009d258c2ece756b498_50.png" + }, + { + "id": "87236094", + "title": "わたくしの後に続きなさい", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/01/23/08/46/49/87236094_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "フィッシュル(原神)", + "なにこれかわいい", + "船場吉兆", + "大地を減らす(爆発痕)", + "ノバキッズ", + "原神10000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1028, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 わたくしの後に続きなさい - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-01-23T08:46:49+09:00", + "updateDate": "2021-01-23T08:46:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2021/07/19/06/28/06/21062839_2d3f239a9ac892d848a3ed1b3760041b_50.png" + }, + { + "id": "91428641", + "title": "パイモンちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/23/16/56/34/91428641_p0_square1200.jpg", + "description": "", + "tags": [ + "幼女", + "可愛い", + "パイモン(原神)", + "原神", + "空(原神)", + "同人", + "非常食", + "握りしめたい、その笑顔" + ], + "userId": "9153585", + "userName": "haku89", + "width": 5016, + "height": 3541, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#幼女 パイモンちゃん - haku89的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-23T01:15:33+09:00", + "updateDate": "2021-07-23T16:56:34+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2018/06/26/14/26/03/14408330_3de67ff59732d611d71369bddd8ea287_50.jpg" + }, + { + "id": "85667426", + "title": "F", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 4, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2020/11/14/20/39/29/85667426_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "フィッシュル(原神)", + "腋", + "原神5000users入り", + "フィッシュル・ヴォン・ルフシュロス・ナフィードット" + ], + "userId": "5151250", + "userName": "litsvn", + "width": 813, + "height": 1214, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 F - litsvn的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-14T20:39:29+09:00", + "updateDate": "2020-11-14T20:39:29+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2017/11/06/04/28/02/13425181_25615276d25e09f2ee365e4934bcff9b_50.jpg" + }, + { + "id": "91336876", + "title": "Raiden Shogun", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "https://i.pximg.net/c/250x250_80_a2/img-master/img/2021/07/18/22/06/49/91336876_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "GenshinImpact", + "원신", + "Raiden", + "RaidenShogun", + "巴尔", + "Baal", + "雷電将軍" + ], + "userId": "13482756", + "userName": "MMLYNO", + "width": 1600, + "height": 2263, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Raiden Shogun - MMLYNO的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-18T22:06:49+09:00", + "updateDate": "2021-07-18T22:06:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "https://i.pximg.net/user-profile/img/2019/10/13/00/45/24/16405892_c58203d67369f3fac263cc72c290949f_50.png" + } + ] + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f0dcb8 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +
+ +![PixivNow Logo](src/assets/LogoH.png) + +Pixiv Service Proxy + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FFreeNowOrg%2FPixivNow&demo-title=PixivNow) + +免费部署一个一模一样的服务步骤很简单——点上面的按钮然后一直下一步即可。
+各位爹不要再爬我的服务了好吗?100GB/h的额度都能被您爬完了,我自己还怎么看色图呢?
+好自为之喵,不要怪我骂人喵。 + +
+ +## API + +您可以使用以下方式传递用户 token 来鉴权: + +- Header 以`Authorization`传递 +- Cookie 以键名`PHPSESSID`传递 + +请求路径 `/ajax/*` 的返回结果与 `https://pixiv.net/ajax/*` 的行为完全一致。 + +以下列举部分 PixivNow 的独特接口: + +### `/api/illust/random` + +返回随机图片,其实是 `/ajax/illust/discovery` 的语法糖,也支持直接返回图片。 + +- `max` `{number}` 返回图片的个数 +- `mode` `{'all' | 'safe' | 'r18'}` 其中 `r18` 只有在登录状态且参数设置允许时才会返回 +- `format` `{'image' | 'json'}` 返回的格式,如果 `Accept` 包含 `image` 则预设为 `image` + +### `/api/ranking` + +是 `/ranking.php` 的重定向。 + +### `/user` + +通过传入的 token,以 json 格式返回源站 `` 中的用户信息。 + +## 图片代理 + +本站的图片使用 CloudFlare Workers 进行代理,可以直接访问欣赏众多插画。 + +但是由于遭遇了大量不明流量,因此我们暂时开启了图片代理服务的防盗链。如果您有自行部署整站的需要,可以通过在Vercel环境变量`VITE_PXIMG_BASEURL_I`中传入反代url(首选),或修改 `vercel.json`中的对于图片的重定向配置,图片的请求路径与源站完全一致。 + +--- + +_For communication and learning only._ + +**All data & pictures from query:** ©Pixiv & Illusts' authors + +> Copyright 2021 PixivNow +> +> Licensed under the Apache License, Version 2.0 (the "License");
+> you may not use this file except in compliance with the License.
+> You may obtain a copy of the License at +> +> http://www.apache.org/licenses/LICENSE-2.0 +> +> Unless required by applicable law or agreed to in writing, software
+> distributed under the License is distributed on an "AS IS" BASIS,
+> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+> See the License for the specific language governing permissions and
+> limitations under the License. diff --git a/api/http.ts b/api/http.ts new file mode 100644 index 0000000..f74dd74 --- /dev/null +++ b/api/http.ts @@ -0,0 +1,43 @@ +import type { VercelRequest, VercelResponse } from '@vercel/node' +import escapeRegExp from 'lodash.escaperegexp' +import { ajax } from './utils.js' + +export default async function (req: VercelRequest, res: VercelResponse) { + if (!isAccepted(req)) { + return res.status(403).send('403') + } + + try { + const { __PREFIX, __PATH } = req.query + const { data } = await ajax({ + method: req.method ?? 'GET', + url: `/${encodeURI(`${__PREFIX}${__PATH ? '/' + __PATH : ''}`)}`, + params: req.query ?? {}, + data: req.body || undefined, + headers: req.headers as Record, + }) + res.status(200).send(data) + } catch (e: any) { + res.status(e?.response?.status || 500).send(e?.response?.data || e) + } +} + +function isAccepted(req: VercelRequest) { + const { UA_BLACKLIST = '[]' } = process.env + try { + const list: string[] = JSON.parse(UA_BLACKLIST) + const ua = req.headers['user-agent'] ?? '' + return ( + !!ua && + Array.isArray(list) && + (list.length > 0 + ? !new RegExp( + `(${list.map((str) => escapeRegExp(str)).join('|')})`, + 'gi' + ).test(ua) + : true) + ) + } catch (e) { + return false + } +} diff --git a/api/image.ts b/api/image.ts new file mode 100644 index 0000000..93831de --- /dev/null +++ b/api/image.ts @@ -0,0 +1,82 @@ +import { VercelRequest, VercelResponse } from '@vercel/node' +import axios from 'axios' +import { USER_AGENT } from './utils.js' + +export default async (req: VercelRequest, res: VercelResponse) => { + const { __PREFIX, __PATH } = req.query + if (!__PREFIX || !__PATH) { + return res.status(400).send({ message: 'Missing param(s)' }) + } + + let url = '' + + switch (__PREFIX) { + case '-': { + url = `https://i.pximg.net/${__PATH}` + break + } + case '~': { + url = `https://s.pximg.net/${__PATH}` + break + } + default: + return res.status(400).send({ message: 'Invalid request' }) + } + + const proxyHeaders = [ + 'accept', + 'accept-encoding', + 'accept-language', + 'range', + 'if-range', + 'if-none-match', + 'if-modified-since', + 'cache-control', + ] + + const headers = {} as Record + for (const h of proxyHeaders) { + if (typeof req.headers[h] === 'string') { + headers[h] = req.headers[h] + } + } + Object.assign(headers, { + referer: 'https://www.pixiv.net/', + 'user-agent': USER_AGENT, + }) + + console.log('Proxy image:', url, headers) + + return axios + .get(url, { + responseType: 'arraybuffer', + headers, + }) + .then( + ({ data, headers, status }) => { + const exposeHeaders = [ + 'content-type', + 'content-length', + 'cache-control', + 'content-disposition', + 'last-modified', + 'etag', + 'accept-ranges', + 'content-range', + 'vary', + ] + for (const h of exposeHeaders) { + if (typeof headers[h] === 'string') { + res.setHeader(h, headers[h]) + } + } + res.status(status).send(Buffer.from(data)) + }, + (err) => { + console.error('Image proxy error:', err) + return res + .status(err?.response?.status || 500) + .send(err?.response?.data || err) + } + ) +} diff --git a/api/random.ts b/api/random.ts new file mode 100644 index 0000000..51bdeed --- /dev/null +++ b/api/random.ts @@ -0,0 +1,50 @@ +import { VercelRequest, VercelResponse } from '@vercel/node' +import { formatInTimeZone } from 'date-fns-tz' +import { PXIMG_BASEURL_I, ajax } from './utils.js' +import { Artwork } from '../src/types/Artworks.js' + +type ArtworkOrAd = Artwork | { isAdContainer: boolean } + +export default async (req: VercelRequest, res: VercelResponse) => { + const requestImage = + (req.headers.accept?.includes('image') || req.query.format === 'image') && + req.query.format !== 'json' + try { + const data: { illusts?: ArtworkOrAd[] } = ( + await ajax({ + url: '/ajax/illust/discovery', + params: { + mode: req.query.mode ?? 'safe', + max: requestImage ? '1' : req.query.max ?? '18', + }, + headers: req.headers, + }) + ).data + const illusts = (data.illusts ?? []).filter((value): value is Artwork => + Object.keys(value).includes('id') + ) + illusts.forEach((value) => { + const middle = `img/${formatInTimeZone( + value.updateDate, + 'Asia/Tokyo', + 'yyyy/MM/dd/HH/mm/ss' + )}/${value.id}` + value.urls = { + mini: `${PXIMG_BASEURL_I}c/48x48/img-master/${middle}_p0_square1200.jpg`, + thumb: `${PXIMG_BASEURL_I}c/250x250_80_a2/img-master/${middle}_p0_square1200.jpg`, + small: `${PXIMG_BASEURL_I}c/540x540_70/img-master/${middle}_p0_master1200.jpg`, + regular: `${PXIMG_BASEURL_I}img-master/${middle}_p0_master1200.jpg`, + original: `${PXIMG_BASEURL_I}img-original/${middle}_p0.jpg`, + } + }) + if (requestImage) { + res.redirect(illusts[0].urls.regular) + return + } else { + res.send(illusts) + return + } + } catch (e: any) { + res.status(e?.response?.status ?? 500).send(e?.response?.data ?? e) + } +} diff --git a/api/user.ts b/api/user.ts new file mode 100644 index 0000000..271e45e --- /dev/null +++ b/api/user.ts @@ -0,0 +1,137 @@ +import { VercelRequest, VercelResponse } from '@vercel/node' +import { CheerioAPI, load } from 'cheerio' +import { ajax, replacePximgUrlsInObject } from './utils.js' + +export default async (req: VercelRequest, res: VercelResponse) => { + const token = req.cookies.PHPSESSID || req.query.token + if (!token) { + return res.status(403).send({ message: '未配置用户密钥' }) + } + + ajax + .get('/', { params: req.query, headers: req.headers }) + .then(async ({ data }) => { + const $ = load(data) + + let meta: { userData: any; token: string } + const $legacyGlobalMeta = $('meta[name="global-data"]') + const $nextDataScript = $('script#__NEXT_DATA__') + + try { + if ($legacyGlobalMeta.length > 0) { + meta = resolveLegacyGlobalMeta($) + } else if ($nextDataScript.length > 0) { + meta = resolveNextData($) + } else { + throw new Error('未知的元数据类型', { + cause: { + error: new TypeError('No valid resolver found'), + meta: null, + }, + }) + } + } catch (error: any) { + return res.status(401).send({ + message: error.message, + cause: error.cause, + }) + } + + res.setHeader('cache-control', 'no-cache') + res.setHeader( + 'set-cookie', + `CSRFTOKEN=${meta.token}; path=/; secure; sameSite=Lax` + ) + res.send(replacePximgUrlsInObject(meta)) + }) + .catch((err) => { + return res + .status(err?.response?.status || 500) + .send(err?.response?.data || err) + }) +} + +function resolveLegacyGlobalMeta($: CheerioAPI): { + userData: any + token: string +} { + const $meta = $('meta[name="global-data"]') + if ($meta.length === 0 || !$meta.attr('content')) { + throw new Error('无效的用户密钥', { + cause: { + error: new TypeError('No global-data meta found'), + meta: $meta.prop('outerHTML'), + }, + }) + } + + let meta: any + try { + meta = JSON.parse($meta.attr('content') as string) + } catch (error) { + throw new Error('解析元数据时出错', { + cause: { + error, + meta: $meta.attr('content'), + }, + }) + } + + if (!meta.userData) { + throw new Error('无法获取登录状态', { + cause: { + error: new TypeError('userData is not defined'), + meta, + }, + }) + } + + return { + userData: meta.userData, + token: meta.token || '', + } +} + +function resolveNextData($: CheerioAPI): { + userData: any + token: string +} { + const $nextDataScript = $('script#__NEXT_DATA__') + if ($nextDataScript.length === 0) { + throw new Error('无法获取元数据', { + cause: { + error: new TypeError('No #__NEXT_DATA__ script found'), + meta: null, + }, + }) + } + + let nextData: any + let perloadState: any + try { + nextData = JSON.parse($nextDataScript.text()) + perloadState = JSON.parse( + nextData?.props?.pageProps?.serverSerializedPreloadedState + ) + } catch (error) { + throw new Error('解析元数据时出错', { + cause: { + error, + meta: $nextDataScript.text(), + }, + }) + } + + const userData = perloadState?.userData?.self + if (!userData) { + throw new Error('意料外的元数据', { + cause: { + error: new TypeError('userData is not defined'), + meta: nextData, + }, + }) + } + + const token = perloadState?.api?.token || '' + return { userData, token } +} diff --git a/api/utils.ts b/api/utils.ts new file mode 100644 index 0000000..b26b3ea --- /dev/null +++ b/api/utils.ts @@ -0,0 +1,186 @@ +import { VercelRequest, VercelResponse } from '@vercel/node' +import axios from 'axios' +import colors from 'picocolors' + +// HTTP handler +export default async function (req: VercelRequest, res: VercelResponse) { + res.status(404).send({ + error: true, + message: 'Not Found', + body: null, + }) +} + +export const PROD = process.env.NODE_ENV === 'production' +export const DEV = !PROD +export const USER_AGENT = + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0' +export const PXIMG_BASEURL_I = (() => { + const i = process.env.VITE_PXIMG_BASEURL_I + return i ? i.replace(/\/$/, '') + '/' : 'https://i.pximg.net/' +})() +export const PXIMG_BASEURL_S = (() => { + const s = process.env.VITE_PXIMG_BASEURL_S + return s ? s.replace(/\/$/, '') + '/' : 'https://s.pximg.net/' +})() + +export class CookieUtils { + static toJSON(raw: string) { + return Object.fromEntries(new URLSearchParams(raw.replace(/;\s*/g, '&'))) + } + static toString(obj: any) { + return Object.keys(obj) + .map((i) => `${i}=${obj[i]}`) + .join(';') + } +} + +export const ajax = axios.create({ + baseURL: 'https://www.pixiv.net/', + params: {}, + headers: { + 'user-agent': USER_AGENT, + }, + timeout: 9 * 1000, +}) +ajax.interceptors.request.use((ctx) => { + // 去除内部参数 + ctx.params = ctx.params || {} + delete ctx.params.__PATH + delete ctx.params.__PREFIX + + const cookies = CookieUtils.toJSON(ctx.headers.cookie || '') + const csrfToken = ctx.headers['x-csrf-token'] ?? cookies.CSRFTOKEN ?? '' + // 强制覆写部分 headers + ctx.headers = ctx.headers || {} + ctx.headers.host = 'www.pixiv.net' + ctx.headers.origin = 'https://www.pixiv.net' + ctx.headers.referer = 'https://www.pixiv.net/' + ctx.headers['user-agent'] = USER_AGENT + ctx.headers['accept-language'] ??= + 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' + csrfToken && (ctx.headers['x-csrf-token'] = csrfToken) + + if (DEV) { + console.info( + colors.green(`[${ctx.method?.toUpperCase()}] <`), + colors.cyan(ctx.url || '') + ) + console.info({ + params: ctx.params, + data: ctx.data, + cookies, + }) + } + + return ctx +}) +ajax.interceptors.response.use((ctx) => { + typeof ctx.data === 'object' && + (ctx.data = replacePximgUrlsInObject(ctx.data?.body ?? ctx.data)) + if (DEV) { + const out: string = + typeof ctx.data === 'object' + ? JSON.stringify(ctx.data, null, 2) + : ctx.data.toString().trim() + console.info( + colors.green('[SEND] >'), + colors.cyan(ctx.request?.path?.replace('https://www.pixiv.net', '')), + `\n${colors.yellow(typeof ctx.data)} ${ + out.length >= 200 ? out.slice(0, 200).trim() + '\n...' : out + }` + ) + } + return ctx +}) + +export function replacePximgUrlsInString(str: string): string { + if (!str.includes('pximg.net')) return str + return str + .replaceAll('https://i.pximg.net/', PXIMG_BASEURL_I) + .replaceAll('https://s.pximg.net/', PXIMG_BASEURL_S) +} + +export function replacePximgUrlsInObject( + obj: Record | string +): Record | string { + if (typeof obj === 'string') return replacePximgUrlsInString(obj) + + return deepReplaceString(obj, replacePximgUrlsInString) +} + +function isObject(value: any): value is Record { + return typeof value === 'object' && value !== null +} + +export function deepReplaceString( + obj: T, + replacer: (value: string) => string +): T { + if (Array.isArray(obj)) { + return obj.map((value) => + deepReplaceString(value, replacer) + ) as unknown as T + } else if (isObject(obj)) { + if ( + ['arraybuffer', 'blob', 'formdata'].includes( + obj.constructor.name.toLowerCase() + ) + ) { + return obj + } + const result: Record = {} + for (const [key, value] of Object.entries(obj)) { + result[key] = deepReplaceString(value, replacer) + } + return result as T + } else if (typeof obj === 'string') { + return replacer(obj) as unknown as T + } + return obj +} + +export function safelyStringify(value: any, space?: number) { + const visited = new WeakSet() + + const replacer = (key: string, val: any) => { + // 处理 BigInt + if (typeof val === 'bigint') { + return val.toString() + } + + // 处理 Set + if (val instanceof Set) { + return Array.from(val) + } + + // 处理 Map + if (val instanceof Map) { + return Array.from(val.entries()) + } + + // 处理 function + if (typeof val === 'function') { + return val.toString() + } + + // 处理自循环引用 + if (typeof val === 'object' && val !== null) { + if (visited.has(val)) { + return '' + } + visited.add(val) + } + + return val + } + + return JSON.stringify(value, replacer, space) +} + +JSON.safelyStringify = safelyStringify +declare global { + interface JSON { + safelyStringify: typeof safelyStringify + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..c5462b7 --- /dev/null +++ b/index.html @@ -0,0 +1,45 @@ + + + + + + + PixivNow + + + + + + + + + + + + + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..c230008 --- /dev/null +++ b/package.json @@ -0,0 +1,68 @@ +{ + "name": "pixiv-now", + "version": "3.5.0", + "private": true, + "main": "index.js", + "type": "module", + "repository": "https://github.com/FreeNowOrg/PixivNow.git", + "contributors": [ + "Dragon-Fish <824399619@qq.com>", + "AlPha5130 <34984380+AlPha5130@users.noreply.github.com>" + ], + "license": "MIT", + "scripts": { + "start": "vite", + "serve": "vercel dev", + "build": "vite build", + "preview": "vercel deploy", + "changelog": "conventional-changelog -p jquery -i CHANGELOG.md -s -r 0" + }, + "dependencies": { + "axios": "^1.11.0", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "fflate": "^0.8.2", + "gif.js": "^0.2.0", + "js-cookie": "^3.0.5", + "modern-mp4": "^0.2.0", + "naive-ui": "^2.42.0", + "nprogress": "^0.2.0", + "pinia": "^3.0.3", + "vue": "^3.5.20", + "vue-gtag": "^3.5.2", + "vue-i18n": "^11.1.11", + "vue-router": "^4.5.1", + "vue-waterfall-plugin-next": "^2.6.9" + }, + "devDependencies": { + "@dragon-fish/sensitive-words-filter": "^2.0.1", + "@iconify-json/fa-solid": "^1.2.2", + "@prettier/plugin-pug": "^3.4.2", + "@tabler/icons-vue": "^3.34.1", + "@types/gif.js": "^0.2.5", + "@types/js-cookie": "^3.0.6", + "@types/lodash.escaperegexp": "^4.1.9", + "@types/node": "^22.17.2", + "@types/nprogress": "^0.2.3", + "@vercel/node": "^5.3.13", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/language-plugin-pug": "^3.0.6", + "@vueuse/core": "^13.7.0", + "cheerio": "^1.1.2", + "conventional-changelog-cli": "^5.0.0", + "cookie": "^1.0.2", + "lodash.escaperegexp": "^4.1.2", + "picocolors": "^1.1.1", + "prettier": "^3.6.2", + "pug": "^3.0.3", + "sass": "^1.90.0", + "tslib": "^2.8.1", + "typescript": "^5.9.2", + "unplugin-auto-import": "^20.0.0", + "unplugin-icons": "^22.2.0", + "unplugin-vue-components": "^29.0.0", + "vercel": "^46.0.2", + "vite": "^7.1.3" + }, + "packageManager": "pnpm@10.18.1" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c587ccd --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5185 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + axios: + specifier: ^1.11.0 + version: 1.12.2 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + date-fns-tz: + specifier: ^3.2.0 + version: 3.2.0(date-fns@4.1.0) + fflate: + specifier: ^0.8.2 + version: 0.8.2 + gif.js: + specifier: ^0.2.0 + version: 0.2.0 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + modern-mp4: + specifier: ^0.2.0 + version: 0.2.0(mp4box@0.5.3) + naive-ui: + specifier: ^2.42.0 + version: 2.43.1(vue@3.5.22(typescript@5.9.3)) + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^3.0.3 + version: 3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) + vue: + specifier: ^3.5.20 + version: 3.5.22(typescript@5.9.3) + vue-gtag: + specifier: ^3.5.2 + version: 3.6.1(vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) + vue-i18n: + specifier: ^11.1.11 + version: 11.1.12(vue@3.5.22(typescript@5.9.3)) + vue-router: + specifier: ^4.5.1 + version: 4.5.1(vue@3.5.22(typescript@5.9.3)) + vue-waterfall-plugin-next: + specifier: ^2.6.9 + version: 2.6.9 + devDependencies: + '@dragon-fish/sensitive-words-filter': + specifier: ^2.0.1 + version: 2.0.1 + '@iconify-json/fa-solid': + specifier: ^1.2.2 + version: 1.2.2 + '@prettier/plugin-pug': + specifier: ^3.4.2 + version: 3.4.2(prettier@3.6.2) + '@tabler/icons-vue': + specifier: ^3.34.1 + version: 3.35.0(vue@3.5.22(typescript@5.9.3)) + '@types/gif.js': + specifier: ^0.2.5 + version: 0.2.5 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/lodash.escaperegexp': + specifier: ^4.1.9 + version: 4.1.9 + '@types/node': + specifier: ^22.17.2 + version: 22.18.8 + '@types/nprogress': + specifier: ^0.2.3 + version: 0.2.3 + '@vercel/node': + specifier: ^5.3.13 + version: 5.3.24(rollup@4.52.3) + '@vitejs/plugin-vue': + specifier: ^6.0.1 + version: 6.0.1(vite@7.1.9(@types/node@22.18.8)(sass@1.93.2))(vue@3.5.22(typescript@5.9.3)) + '@vue/language-plugin-pug': + specifier: ^3.0.6 + version: 3.1.1 + '@vueuse/core': + specifier: ^13.7.0 + version: 13.9.0(vue@3.5.22(typescript@5.9.3)) + cheerio: + specifier: ^1.1.2 + version: 1.1.2 + conventional-changelog-cli: + specifier: ^5.0.0 + version: 5.0.0(conventional-commits-filter@5.0.0) + cookie: + specifier: ^1.0.2 + version: 1.0.2 + lodash.escaperegexp: + specifier: ^4.1.2 + version: 4.1.2 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + pug: + specifier: ^3.0.3 + version: 3.0.3 + sass: + specifier: ^1.90.0 + version: 1.93.2 + tslib: + specifier: ^2.8.1 + version: 2.8.1 + typescript: + specifier: ^5.9.2 + version: 5.9.3 + unplugin-auto-import: + specifier: ^20.0.0 + version: 20.2.0(@vueuse/core@13.9.0(vue@3.5.22(typescript@5.9.3))) + unplugin-icons: + specifier: ^22.2.0 + version: 22.4.2(@vue/compiler-sfc@3.5.22) + unplugin-vue-components: + specifier: ^29.0.0 + version: 29.1.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)) + vercel: + specifier: ^46.0.2 + version: 46.1.1(rollup@4.52.3) + vite: + specifier: ^7.1.3 + version: 7.1.9(@types/node@22.18.8)(sass@1.93.2) + +packages: + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@9.2.1': + resolution: {integrity: sha512-TMilPqXyii1AsiEii6l6ubRzbo76p6oshUSYPaKsmXDavyMLqjzVDkcp3pHp5ELMUNJHATcEOGxKTTsX9yYhGg==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@conventional-changelog/git-client@1.0.1': + resolution: {integrity: sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==} + engines: {node: '>=18'} + peerDependencies: + conventional-commits-filter: ^5.0.0 + conventional-commits-parser: ^6.0.0 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@css-render/plugin-bem@0.15.14': + resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==} + peerDependencies: + css-render: ~0.15.14 + + '@css-render/vue3-ssr@0.15.14': + resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==} + peerDependencies: + vue: ^3.0.11 + + '@dragon-fish/sensitive-words-filter@2.0.1': + resolution: {integrity: sha512-VeFjf6P631/2O/3STD5NFTL+RjyK0Bk6rvZSCN9YFuNfct5qfUjz+ugBMZnqjTEA+seYepJMFVro/USHHMt4Lw==} + + '@edge-runtime/format@2.2.1': + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + + '@edge-runtime/node-utils@2.3.0': + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + + '@edge-runtime/ponyfill@2.4.2': + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + + '@edge-runtime/primitives@4.1.0': + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + + '@edge-runtime/vm@3.2.0': + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@hutson/parse-repository-url@5.0.0': + resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} + engines: {node: '>=10.13.0'} + + '@iconify-json/fa-solid@1.2.2': + resolution: {integrity: sha512-V8TDk62dGswAwbWwoSTnaoiTVEfQyjLCq4/TPmI29evFb9GwPyU0OGX4+BdQMGsDDzk8ByR81RjR618FtELSaw==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + + '@intlify/core-base@11.1.12': + resolution: {integrity: sha512-whh0trqRsSqVLNEUCwU59pyJZYpU8AmSWl8M3Jz2Mv5ESPP6kFh4juas2NpZ1iCvy7GlNRffUD1xr84gceimjg==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@11.1.12': + resolution: {integrity: sha512-Fv9iQSJoJaXl4ZGkOCN1LDM3trzze0AS2zRz2EHLiwenwL6t0Ki9KySYlyr27yVOj5aVz0e55JePO+kELIvfdQ==} + engines: {node: '>= 16'} + + '@intlify/shared@11.1.12': + resolution: {integrity: sha512-Om86EjuQtA69hdNj3GQec9ZC0L0vPSAnXzB3gP/gyJ7+mA7t06d9aOAiqMZ+xEOsumGP4eEBlfl8zF2LOTzf2A==} + engines: {node: '>= 16'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@mapbox/node-pre-gyp@2.0.0': + resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} + engines: {node: '>=18'} + hasBin: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@prettier/plugin-pug@3.4.2': + resolution: {integrity: sha512-/VOVeIscKYlPpsZrjrRV+44ZftCEIJq9Z/zR8PtAz/EDv82TKscw3z+fhTVqRz68G1TqQ/5COMFUVfPwPBH90w==} + engines: {node: '>=20.0.0', npm: '>=10.0.0'} + peerDependencies: + prettier: ^3.0.0 + + '@rolldown/pluginutils@1.0.0-beta.29': + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.3': + resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.3': + resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.3': + resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.3': + resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.3': + resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.3': + resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': + resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.52.3': + resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.52.3': + resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.52.3': + resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.52.3': + resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-gnu@4.52.3': + resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.52.3': + resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.52.3': + resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.52.3': + resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.52.3': + resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.52.3': + resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openharmony-arm64@4.52.3': + resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.3': + resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.3': + resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.3': + resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.3': + resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.25.24': + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + + '@tabler/icons-vue@3.35.0': + resolution: {integrity: sha512-m5ugq8mWYfTzx0opMcX49ADFxr3xu0IhJaOddw8Djlhx30pBOPWwOiIUBMAqlgP9TFHAysdwqrq50hBw5DxPSQ==} + peerDependencies: + vue: '>=3.0.1' + + '@tabler/icons@3.35.0': + resolution: {integrity: sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ==} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@ts-morph/common@0.11.1': + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/events@3.0.3': + resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} + + '@types/gif.js@0.2.5': + resolution: {integrity: sha512-OdDQYh9v7td9ztjaooBSqjUBAyAuui2xwDDmQcyRLd6c9T0iWgkebAoCBEdEEBoZG3ekJE/6UnH63Dzq0S3bvw==} + + '@types/js-cookie@3.0.6': + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash.escaperegexp@4.1.9': + resolution: {integrity: sha512-CMQc8v16YzhnPZnMhYQuJUksI8BmL1jy/lHJkiXi4/t24Lx7Qvy7qxew1abrDJGa1T2i0NzLLaR27NK1/qp5Ow==} + + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} + + '@types/node@16.18.11': + resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} + + '@types/node@22.18.8': + resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@vercel/blob@1.0.2': + resolution: {integrity: sha512-Im/KeFH4oPx7UsM+QiteimnE07bIUD7JK6CBafI9Z0jRFogaialTBMiZj8EKk/30ctUYsrpIIyP9iIY1YxWnUQ==} + engines: {node: '>=16.14'} + + '@vercel/build-utils@11.0.2': + resolution: {integrity: sha512-Y48OT9IsvAFU21LJ3m5SbrXpQaD++h4v4nQoQjCUDZORxXzPf3doVQfrQBBIX45xoSkfq/Fuq0VNF0yRbJw/aA==} + + '@vercel/build-utils@12.1.0': + resolution: {integrity: sha512-yqpAh2KHm9iWUXo/aRWiLIxi8dMAwFtse2iZsg2QNEMs9W20va6L8PMFvdAa5MX9pgRwc38gbjD3V7drxSwq4g==} + + '@vercel/detect-agent@0.2.0': + resolution: {integrity: sha512-qf10Q2UwlbJAcWVqQGkyp9OlLBn9Aj2VVE0M4mTDe0gpB7Fo8qycTJLccDbHeyLrWnT6Q12sVy9ZYHas7B+rwg==} + + '@vercel/error-utils@2.0.3': + resolution: {integrity: sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==} + + '@vercel/express@0.0.10': + resolution: {integrity: sha512-t2rVsyCeh+ayu2gMno16UNF4xmX/FDTzfREVd1v6sEfzY80qAS9qvKWSuFKfV3VjAiqlSnWBpiw4gU6Mu0gNQg==} + + '@vercel/fun@1.1.6': + resolution: {integrity: sha512-xDiM+bD0fSZyzcjsAua3D+guXclvHOSTzr03UcZEQwYzIjwWjLduT7bl2gAaeNIe7fASAIZd0P00clcj0On4rQ==} + engines: {node: '>= 18'} + + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + + '@vercel/gatsby-plugin-vercel-builder@2.0.93': + resolution: {integrity: sha512-Vh1Dt+Wa3DUtyc1ety3XG//jRST9M01WiF1W1taAW2k+SfKEjAbTJWoRblj97ah5Boz+uqSBIBg2ULZvNf+xzw==} + + '@vercel/go@3.2.3': + resolution: {integrity: sha512-PErgHlV7cf8hyPq31aRsL4xm5t4rCSO6vN5AQLlAGSy3ctdgqG7sI6hq/CAKo3CfgIhVHUwNYapFJgGJB/s4OA==} + + '@vercel/hono@0.0.18': + resolution: {integrity: sha512-Ie6JOW/uzWvlxg3OH0itSlzetAcWqqVYrhuHnzAJi2/9InusEmWE104rOj/5D3yyvJ9aXInPj3KoUldDVwJ81Q==} + + '@vercel/hydrogen@1.2.4': + resolution: {integrity: sha512-eb16oesfgHuBlXxe+WqI+rMdP4QpeHXLJh9ropFy+StkWC2F0ZFKegutEpvJCRg0FHttRnn9uMzMmzJ2F4xKkg==} + + '@vercel/next@4.12.3': + resolution: {integrity: sha512-Ukvf5Q1DpuQJmUjImTU2i90/iVCxRHGp51FC48Qdw62hh31SV1kBIzarm8VOb1UFFDdARqFsBlib9lx9vuJ+Dw==} + + '@vercel/nft@0.30.1': + resolution: {integrity: sha512-2mgJZv4AYBFkD/nJ4QmiX5Ymxi+AisPLPcS/KPXVqniyQNqKXX+wjieAbDXQP3HcogfEbpHoRMs49Cd4pfkk8g==} + engines: {node: '>=18'} + hasBin: true + + '@vercel/node@5.3.17': + resolution: {integrity: sha512-quNnXO1XuMMid9MXJKPDtpwiNZUFrJgTvdcUu+AXRZg99rOw9N5pk+M0rM4+0FwVXVCIlXzjfKelEOXC8SxGQw==} + + '@vercel/node@5.3.24': + resolution: {integrity: sha512-yk8pdoNbAbUO5zcmqyMPQ6kNvN896c/gJbsiGS5RvO9Gyehib5IxUOap6SnLSExH4tWAl1XTbOptfuysqZpYog==} + + '@vercel/python@5.0.0': + resolution: {integrity: sha512-JHpYKQ8d478REzmF7NcJTJcncFziJhVOwzan8wW4F1RJOHGDBTPkATAgi4CPQIijToRamPCkgeECzNOvLUDR+w==} + + '@vercel/redwood@2.3.6': + resolution: {integrity: sha512-Rm9xECWNIJOwtPsZ1/XcgyJj95KM7cWwNHYPMw8dzFAnLQGyapGe/YHEjxV6POI2RF8R0nFmU1t+45XBweYJJA==} + + '@vercel/remix-builder@5.4.12': + resolution: {integrity: sha512-25HHNUpIu3TfuZnphDDX7yG+4QugbxDq0bB8d1KCeOWsKH+z0Zscg7rchs3Pqy6kdhV/US6zH+YAogtwMvdDMg==} + + '@vercel/ruby@2.2.1': + resolution: {integrity: sha512-DsmTCggOa/Uvt/9JkafXx9U+Bz5eNIb6Bs422EOQo2zKwcxW88ITSh8mM5m0dQ0+B4k02X/moVim6iFa4sjazg==} + + '@vercel/static-build@2.7.20': + resolution: {integrity: sha512-2Ggjk0fsVG2LgFjDmunIA6i9/UEaVxcinJblkR8aHeKecVL4ibqXhluiyXygAobfpRiYJlU9gXgS2veieB57sw==} + + '@vercel/static-config@3.1.2': + resolution: {integrity: sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==} + + '@vitejs/plugin-vue@6.0.1': + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} + + '@volar/language-service@2.4.23': + resolution: {integrity: sha512-h5mU9DZ/6u3LCB9xomJtorNG6awBNnk9VuCioGsp6UtFiM8amvS5FcsaC3dabdL9zO0z+Gq9vIEMb/5u9K6jGQ==} + + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} + + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} + + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.7': + resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} + + '@vue/devtools-kit@7.7.7': + resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} + + '@vue/devtools-shared@7.7.7': + resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} + + '@vue/language-plugin-pug@3.1.1': + resolution: {integrity: sha512-o9Y+vUPaDtSvjpQrY5ay0dhokwaTkdjKpaJ03nyT+Z5FgwVzK3cCMdwZoHxTwG3EDDa7n31Lnu3VEerCBXTAtw==} + + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} + + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} + + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} + + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} + peerDependencies: + vue: 3.5.22 + + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + + '@vueuse/core@13.9.0': + resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@13.9.0': + resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} + + '@vueuse/shared@13.9.0': + resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} + peerDependencies: + vue: ^3.5.0 + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assert-never@1.4.0: + resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} + + async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + + async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + + async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} + + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + birpc@2.5.0: + resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.1.2: + resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + engines: {node: '>=20.18.1'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.0: + resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} + engines: {node: '>= 14.16.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + + content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@8.0.0: + resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} + engines: {node: '>=18'} + + conventional-changelog-atom@5.0.0: + resolution: {integrity: sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==} + engines: {node: '>=18'} + + conventional-changelog-cli@5.0.0: + resolution: {integrity: sha512-9Y8fucJe18/6ef6ZlyIlT2YQUbczvoQZZuYmDLaGvcSBP+M6h+LAvf7ON7waRxKJemcCII8Yqu5/8HEfskTxJQ==} + engines: {node: '>=18'} + hasBin: true + + conventional-changelog-codemirror@5.0.0: + resolution: {integrity: sha512-8gsBDI5Y3vrKUCxN6Ue8xr6occZ5nsDEc4C7jO/EovFGozx8uttCAyfhRrvoUAWi2WMm3OmYs+0mPJU7kQdYWQ==} + engines: {node: '>=18'} + + conventional-changelog-conventionalcommits@8.0.0: + resolution: {integrity: sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==} + engines: {node: '>=18'} + + conventional-changelog-core@8.0.0: + resolution: {integrity: sha512-EATUx5y9xewpEe10UEGNpbSHRC6cVZgO+hXQjofMqpy+gFIrcGvH3Fl6yk2VFKh7m+ffenup2N7SZJYpyD9evw==} + engines: {node: '>=18'} + + conventional-changelog-ember@5.0.0: + resolution: {integrity: sha512-RPflVfm5s4cSO33GH/Ey26oxhiC67akcxSKL8CLRT3kQX2W3dbE19sSOM56iFqUJYEwv9mD9r6k79weWe1urfg==} + engines: {node: '>=18'} + + conventional-changelog-eslint@6.0.0: + resolution: {integrity: sha512-eiUyULWjzq+ybPjXwU6NNRflApDWlPEQEHvI8UAItYW/h22RKkMnOAtfCZxMmrcMO1OKUWtcf2MxKYMWe9zJuw==} + engines: {node: '>=18'} + + conventional-changelog-express@5.0.0: + resolution: {integrity: sha512-D8Q6WctPkQpvr2HNCCmwU5GkX22BVHM0r4EW8vN0230TSyS/d6VQJDAxGb84lbg0dFjpO22MwmsikKL++Oo/oQ==} + engines: {node: '>=18'} + + conventional-changelog-jquery@6.0.0: + resolution: {integrity: sha512-2kxmVakyehgyrho2ZHBi90v4AHswkGzHuTaoH40bmeNqUt20yEkDOSpw8HlPBfvEQBwGtbE+5HpRwzj6ac2UfA==} + engines: {node: '>=18'} + + conventional-changelog-jshint@5.0.0: + resolution: {integrity: sha512-gGNphSb/opc76n2eWaO6ma4/Wqu3tpa2w7i9WYqI6Cs2fncDSI2/ihOfMvXveeTTeld0oFvwMVNV+IYQIk3F3g==} + engines: {node: '>=18'} + + conventional-changelog-preset-loader@5.0.0: + resolution: {integrity: sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==} + engines: {node: '>=18'} + + conventional-changelog-writer@8.2.0: + resolution: {integrity: sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==} + engines: {node: '>=18'} + hasBin: true + + conventional-changelog@6.0.0: + resolution: {integrity: sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==} + engines: {node: '>=18'} + + conventional-commits-filter@5.0.0: + resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + engines: {node: '>=18'} + + conventional-commits-parser@6.2.0: + resolution: {integrity: sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==} + engines: {node: '>=18'} + hasBin: true + + convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-render@0.15.14: + resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + date-fns-tz@3.2.0: + resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} + peerDependencies: + date-fns: ^3.0.0 || ^4.0.0 + + date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + engines: {node: '>=8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + + evtd@0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gif.js@0.2.0: + resolution: {integrity: sha512-bYxCoT8OZKmbxY8RN4qDiYuj4nrQDTzgLRcFVovyona1PTWNePzI4nzOmotnlOFIzTk/ZxAHtv+TfVLiBWj/hw==} + + git-raw-commits@5.0.0: + resolution: {integrity: sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==} + engines: {node: '>=18'} + hasBin: true + + git-semver-tags@8.0.0: + resolution: {integrity: sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==} + engines: {node: '>=18'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + + http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + + http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + immutable@5.1.3: + resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} + engines: {node: '>=18'} + + inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mint-filter@3.0.1: + resolution: {integrity: sha512-mBMrNggwa5JtMvBWx0hC4t04iGwHChovV7gg+43CQg+vHYxPiHCwEc3DYHC0Wdq+Hxt2HBP0HdsT0QKmSxE9tA==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + modern-mp4@0.2.0: + resolution: {integrity: sha512-Z2X7+B1Kru8MTI2E6mpcSqm1E7FMxYg61DXoTkwq/KnMMfeyFcMCY4UVjvklFtdw4/NnvKA93bxw7XsqtMB1Tw==} + peerDependencies: + mp4box: '*' + + mp4box@0.5.3: + resolution: {integrity: sha512-RIvyFZdPDIg3+mL6vUdPBSyQRrEfKO3ryAeJ4xJJV7HBHQUH3KfLlZRzfSpBHCd/HqR63HfbrWQI/CwXDvYENQ==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + naive-ui@2.43.1: + resolution: {integrity: sha512-w52W0mOhdOGt4uucFSZmP0DI44PCsFyuxeLSs9aoUThfIuxms90MYjv46Qrr7xprjyJRw5RU6vYpCx4o9ind3A==} + peerDependencies: + vue: ^3.0.0 + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + + os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + deprecated: This package is archived and no longer maintained. For support, visit https://github.com/expressjs/express/discussions + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@3.0.3: + resolution: {integrity: sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.3: + resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.3: + resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.52.3: + resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} + engines: {node: '>=14.0.0'} + hasBin: true + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + seemly@0.3.10: + resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + + stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + tar@7.4.4: + resolution: {integrity: sha512-O1z7ajPkjTgEgmTGz0v9X4eqeEXTDREPTO77pVC1Nbs86feBU1Zhdg+edzavPmYW1olxkwsqA2v4uOw6E8LeDg==} + engines: {node: '>=18'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + tempfile@5.0.0: + resolution: {integrity: sha512-bX655WZI/F7EoTDw9JvQURqAXiPHi8o8+yFxPF2lWYyz1aHnmMRuXWqL6YB6GmeO0o4DIYWHLgGNi/X64T+X4Q==} + engines: {node: '>=14.18'} + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + treemate@0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + + ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + undici@7.15.0: + resolution: {integrity: sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==} + engines: {node: '>=20.18.1'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unimport@5.4.0: + resolution: {integrity: sha512-g/OLFZR2mEfqbC6NC9b2225eCJGvufxq34mj6kM3OmI5gdSL0qyqtnv+9qmsGpAmnzSl6x0IWZj4W+8j2hLkMA==} + engines: {node: '>=18.12.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin-auto-import@20.2.0: + resolution: {integrity: sha512-vfBI/SvD9hJqYNinipVOAj5n8dS8DJXFlCKFR5iLDp2SaQwsfdnfLXgZ+34Kd3YY3YEY9omk8XQg0bwos3Q8ug==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^4.0.0 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-icons@22.4.2: + resolution: {integrity: sha512-Yv15405unO67Chme0Slk0JRA/H2AiAZLK5t7ebt8/ZpTDlBfM4d4En2qD3MX2rzOSkIteQ0syIm3q8MSofeoBA==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + svelte: + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + + unplugin-utils@0.3.0: + resolution: {integrity: sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==} + engines: {node: '>=20.19.0'} + + unplugin-vue-components@29.1.0: + resolution: {integrity: sha512-z/9ACPXth199s9aCTCdKZAhe5QGOpvzJYP+Hkd0GN1/PpAmsu+W3UlRY3BJAewPqQxh5xi56+Og6mfiCV1Jzpg==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 || ^4.0.0 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vdirs@0.1.8: + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + + vercel@46.1.1: + resolution: {integrity: sha512-nYkT8KFK9M/GlYn7eTSOF3bEFXD+SCLctCTPbGxX/xi2dU+mg6/RFgA7/2w89zhUUxQdB9LlvgKWoIbPTlWrwA==} + engines: {node: '>= 18'} + hasBin: true + + vite@7.1.9: + resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + volar-service-html@0.0.65: + resolution: {integrity: sha512-AxXckCTbCr5j5z81d3bNiRRL32xCaBSa8lmYhq0QfzBPVPaRv06YYaxp22XizM061f96iizM7ZkSHCu1RuSwRA==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-pug@0.0.65: + resolution: {integrity: sha512-QTpxpLmpwNjSPASM4n5d+MF9DHKaBUuHeoV7SXVH5wmrx513da6wljlXNk34IU1npBglNp9sO0qaNokP1Gn42g==} + + vooks@0.2.12: + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + + vscode-html-languageservice@5.5.2: + resolution: {integrity: sha512-QpaUhCjvb7U/qThOzo4V6grwsRE62Jk/vf8BRJZoABlMw3oplLB5uovrvcrLO9vYhkeMiSjyqLnCxbfHzzZqmw==} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-gtag@3.6.1: + resolution: {integrity: sha512-gsEt3vconVtZlYJTel9B/qVjdmW87XMl2KDrz0ds1sGSHjzqZ1c6KXl4M/Qjiem57FixQR8RDTDDX7MTKa3rFw==} + peerDependencies: + vue: ^3.5.13 + vue-router: ^4.5.0 + peerDependenciesMeta: + vue-router: + optional: true + + vue-i18n@11.1.12: + resolution: {integrity: sha512-BnstPj3KLHLrsqbVU2UOrPmr0+Mv11bsUZG0PyCOzsawCivk8W00GMXHeVUWIDOgNaScCuZah47CZFE+Wnl8mw==} + engines: {node: '>= 16'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + peerDependencies: + vue: ^3.2.0 + + vue-waterfall-plugin-next@2.6.9: + resolution: {integrity: sha512-b6DGrH39RHPebRIVvj3kxBxJABbQx288YXrhBTpdzeA4aHQmHtqpvH8xwOHO+mkmz4WoXrTA5TapzMXjkVZKfQ==} + + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vueuc@0.4.65: + resolution: {integrity: sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==} + peerDependencies: + vue: ^3.0.11 + + web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + + xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + + yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + +snapshots: + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@9.2.1': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0)': + dependencies: + '@types/semver': 7.7.0 + semver: 7.7.2 + optionalDependencies: + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.2.0 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@css-render/plugin-bem@0.15.14(css-render@0.15.14)': + dependencies: + css-render: 0.15.14 + + '@css-render/vue3-ssr@0.15.14(vue@3.5.22(typescript@5.9.3))': + dependencies: + vue: 3.5.22(typescript@5.9.3) + + '@dragon-fish/sensitive-words-filter@2.0.1': + dependencies: + mint-filter: 3.0.1 + tslib: 2.8.1 + + '@edge-runtime/format@2.2.1': {} + + '@edge-runtime/node-utils@2.3.0': {} + + '@edge-runtime/ponyfill@2.4.2': {} + + '@edge-runtime/primitives@4.1.0': {} + + '@edge-runtime/vm@3.2.0': + dependencies: + '@edge-runtime/primitives': 4.1.0 + + '@emotion/hash@0.8.0': {} + + '@esbuild/aix-ppc64@0.25.10': + optional: true + + '@esbuild/android-arm64@0.25.10': + optional: true + + '@esbuild/android-arm@0.25.10': + optional: true + + '@esbuild/android-x64@0.25.10': + optional: true + + '@esbuild/darwin-arm64@0.25.10': + optional: true + + '@esbuild/darwin-x64@0.25.10': + optional: true + + '@esbuild/freebsd-arm64@0.25.10': + optional: true + + '@esbuild/freebsd-x64@0.25.10': + optional: true + + '@esbuild/linux-arm64@0.25.10': + optional: true + + '@esbuild/linux-arm@0.25.10': + optional: true + + '@esbuild/linux-ia32@0.25.10': + optional: true + + '@esbuild/linux-loong64@0.25.10': + optional: true + + '@esbuild/linux-mips64el@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@fastify/busboy@2.1.1': {} + + '@hutson/parse-repository-url@5.0.0': {} + + '@iconify-json/fa-solid@1.2.2': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.0.2': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.2.1 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + + '@intlify/core-base@11.1.12': + dependencies: + '@intlify/message-compiler': 11.1.12 + '@intlify/shared': 11.1.12 + + '@intlify/message-compiler@11.1.12': + dependencies: + '@intlify/shared': 11.1.12 + source-map-js: 1.2.1 + + '@intlify/shared@11.1.12': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@juggle/resize-observer@3.4.0': {} + + '@mapbox/node-pre-gyp@2.0.0': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.0 + https-proxy-agent: 7.0.6 + node-fetch: 2.6.9 + nopt: 8.1.0 + semver: 7.7.2 + tar: 7.4.4 + transitivePeerDependencies: + - encoding + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@prettier/plugin-pug@3.4.2(prettier@3.6.2)': + dependencies: + prettier: 3.6.2 + pug-lexer: 5.0.1 + + '@rolldown/pluginutils@1.0.0-beta.29': {} + + '@rollup/pluginutils@5.3.0(rollup@4.52.3)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.3 + + '@rollup/rollup-android-arm-eabi@4.52.3': + optional: true + + '@rollup/rollup-android-arm64@4.52.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.3': + optional: true + + '@rollup/rollup-darwin-x64@4.52.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.3': + optional: true + + '@sinclair/typebox@0.25.24': {} + + '@tabler/icons-vue@3.35.0(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@tabler/icons': 3.35.0 + vue: 3.5.22(typescript@5.9.3) + + '@tabler/icons@3.35.0': {} + + '@tootallnate/once@2.0.0': {} + + '@ts-morph/common@0.11.1': + dependencies: + fast-glob: 3.3.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/estree@1.0.8': {} + + '@types/events@3.0.3': {} + + '@types/gif.js@0.2.5': + dependencies: + '@types/events': 3.0.3 + + '@types/js-cookie@3.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/katex@0.16.7': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.20 + + '@types/lodash.escaperegexp@4.1.9': + dependencies: + '@types/lodash': 4.17.20 + + '@types/lodash@4.17.20': {} + + '@types/node@16.18.11': {} + + '@types/node@22.18.8': + dependencies: + undici-types: 6.21.0 + + '@types/normalize-package-data@2.4.4': {} + + '@types/nprogress@0.2.3': {} + + '@types/semver@7.7.0': {} + + '@types/web-bluetooth@0.0.21': {} + + '@vercel/blob@1.0.2': + dependencies: + async-retry: 1.3.3 + is-buffer: 2.0.5 + is-node-process: 1.2.0 + throttleit: 2.1.0 + undici: 5.29.0 + + '@vercel/build-utils@11.0.2': {} + + '@vercel/build-utils@12.1.0': {} + + '@vercel/detect-agent@0.2.0': {} + + '@vercel/error-utils@2.0.3': {} + + '@vercel/express@0.0.10(rollup@4.52.3)': + dependencies: + '@vercel/node': 5.3.17(rollup@4.52.3) + '@vercel/static-config': 3.1.2 + ts-morph: 12.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + + '@vercel/fun@1.1.6': + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.3.4 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.5.4 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 6.2.1 + tinyexec: 0.3.2 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': + dependencies: + web-vitals: 0.2.4 + + '@vercel/gatsby-plugin-vercel-builder@2.0.93': + dependencies: + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 11.0.2 + esbuild: 0.14.47 + etag: 1.8.1 + fs-extra: 11.1.0 + + '@vercel/go@3.2.3': {} + + '@vercel/hono@0.0.18(rollup@4.52.3)': + dependencies: + '@vercel/node': 5.3.17(rollup@4.52.3) + '@vercel/static-config': 3.1.2 + ts-morph: 12.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + + '@vercel/hydrogen@1.2.4': + dependencies: + '@vercel/static-config': 3.1.2 + ts-morph: 12.0.0 + + '@vercel/next@4.12.3(rollup@4.52.3)': + dependencies: + '@vercel/nft': 0.30.1(rollup@4.52.3) + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/nft@0.30.1(rollup@4.52.3)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0 + '@rollup/pluginutils': 5.3.0(rollup@4.52.3) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/node@5.3.17(rollup@4.52.3)': + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 16.18.11 + '@vercel/build-utils': 11.0.2 + '@vercel/error-utils': 2.0.3 + '@vercel/nft': 0.30.1(rollup@4.52.3) + '@vercel/static-config': 3.1.2 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + node-fetch: 2.6.9 + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.28.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + + '@vercel/node@5.3.24(rollup@4.52.3)': + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 16.18.11 + '@vercel/build-utils': 12.1.0 + '@vercel/error-utils': 2.0.3 + '@vercel/nft': 0.30.1(rollup@4.52.3) + '@vercel/static-config': 3.1.2 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + mime-types: 2.1.35 + node-fetch: 2.6.9 + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@16.18.11)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.28.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + + '@vercel/python@5.0.0': {} + + '@vercel/redwood@2.3.6(rollup@4.52.3)': + dependencies: + '@vercel/nft': 0.30.1(rollup@4.52.3) + '@vercel/static-config': 3.1.2 + semver: 6.3.1 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/remix-builder@5.4.12(rollup@4.52.3)': + dependencies: + '@vercel/error-utils': 2.0.3 + '@vercel/nft': 0.30.1(rollup@4.52.3) + '@vercel/static-config': 3.1.2 + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/ruby@2.2.1': {} + + '@vercel/static-build@2.7.20': + dependencies: + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.93 + '@vercel/static-config': 3.1.2 + ts-morph: 12.0.0 + + '@vercel/static-config@3.1.2': + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + + '@vitejs/plugin-vue@6.0.1(vite@7.1.9(@types/node@22.18.8)(sass@1.93.2))(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.9(@types/node@22.18.8)(sass@1.93.2) + vue: 3.5.22(typescript@5.9.3) + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 + + '@volar/language-service@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.23': {} + + '@vscode/l10n@0.0.18': {} + + '@vue/compiler-core@3.5.22': + dependencies: + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.22': + dependencies: + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-sfc@3.5.22': + dependencies: + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + estree-walker: 2.0.2 + magic-string: 0.30.19 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.22': + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.7': + dependencies: + '@vue/devtools-kit': 7.7.7 + + '@vue/devtools-kit@7.7.7': + dependencies: + '@vue/devtools-shared': 7.7.7 + birpc: 2.5.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.2 + + '@vue/devtools-shared@7.7.7': + dependencies: + rfdc: 1.4.1 + + '@vue/language-plugin-pug@3.1.1': + dependencies: + '@volar/source-map': 2.4.23 + volar-service-pug: 0.0.65 + + '@vue/reactivity@3.5.22': + dependencies: + '@vue/shared': 3.5.22 + + '@vue/runtime-core@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/runtime-dom@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.9.3) + + '@vue/shared@3.5.22': {} + + '@vueuse/core@13.9.0(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.22(typescript@5.9.3)) + vue: 3.5.22(typescript@5.9.3) + + '@vueuse/metadata@13.9.0': {} + + '@vueuse/shared@13.9.0(vue@3.5.22(typescript@5.9.3))': + dependencies: + vue: 3.5.22(typescript@5.9.3) + + abbrev@3.0.1: {} + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@7.4.1: {} + + acorn@8.15.0: {} + + add-stream@1.0.0: {} + + agent-base@7.1.4: {} + + ajv@8.6.3: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.0: {} + + arg@4.1.3: {} + + array-ify@1.0.0: {} + + asap@2.0.6: {} + + assert-never@1.4.0: {} + + async-listen@1.2.0: {} + + async-listen@3.0.0: {} + + async-listen@3.0.1: {} + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + + async-sema@3.1.1: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + axios@1.12.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.28.2 + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + birpc@2.5.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-crc32@0.2.13: {} + + bytes@3.1.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + character-parser@2.2.0: + dependencies: + is-regex: 1.2.1 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.1.2: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.0.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.15.0 + whatwg-mimetype: 4.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.0: + dependencies: + readdirp: 4.1.2 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@2.0.0: {} + + chownr@3.0.0: {} + + cjs-module-lexer@1.2.3: {} + + code-block-writer@10.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + consola@3.4.2: {} + + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.2 + + content-type@1.0.4: {} + + conventional-changelog-angular@8.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-atom@5.0.0: {} + + conventional-changelog-cli@5.0.0(conventional-commits-filter@5.0.0): + dependencies: + add-stream: 1.0.0 + conventional-changelog: 6.0.0(conventional-commits-filter@5.0.0) + meow: 13.2.0 + tempfile: 5.0.0 + transitivePeerDependencies: + - conventional-commits-filter + + conventional-changelog-codemirror@5.0.0: {} + + conventional-changelog-conventionalcommits@8.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-core@8.0.0(conventional-commits-filter@5.0.0): + dependencies: + '@hutson/parse-repository-url': 5.0.0 + add-stream: 1.0.0 + conventional-changelog-writer: 8.2.0 + conventional-commits-parser: 6.2.0 + git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + git-semver-tags: 8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + hosted-git-info: 7.0.2 + normalize-package-data: 6.0.2 + read-package-up: 11.0.0 + read-pkg: 9.0.1 + transitivePeerDependencies: + - conventional-commits-filter + + conventional-changelog-ember@5.0.0: {} + + conventional-changelog-eslint@6.0.0: {} + + conventional-changelog-express@5.0.0: {} + + conventional-changelog-jquery@6.0.0: {} + + conventional-changelog-jshint@5.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-preset-loader@5.0.0: {} + + conventional-changelog-writer@8.2.0: + dependencies: + conventional-commits-filter: 5.0.0 + handlebars: 4.7.8 + meow: 13.2.0 + semver: 7.7.2 + + conventional-changelog@6.0.0(conventional-commits-filter@5.0.0): + dependencies: + conventional-changelog-angular: 8.0.0 + conventional-changelog-atom: 5.0.0 + conventional-changelog-codemirror: 5.0.0 + conventional-changelog-conventionalcommits: 8.0.0 + conventional-changelog-core: 8.0.0(conventional-commits-filter@5.0.0) + conventional-changelog-ember: 5.0.0 + conventional-changelog-eslint: 6.0.0 + conventional-changelog-express: 5.0.0 + conventional-changelog-jquery: 6.0.0 + conventional-changelog-jshint: 5.0.0 + conventional-changelog-preset-loader: 5.0.0 + transitivePeerDependencies: + - conventional-commits-filter + + conventional-commits-filter@5.0.0: {} + + conventional-commits-parser@6.2.0: + dependencies: + meow: 13.2.0 + + convert-hrtime@3.0.0: {} + + cookie@1.0.2: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + create-require@1.1.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-render@0.15.14: + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + csstype@3.0.11: {} + + csstype@3.1.3: {} + + date-fns-tz@3.2.0(date-fns@3.6.0): + dependencies: + date-fns: 3.6.0 + + date-fns-tz@3.2.0(date-fns@4.1.0): + dependencies: + date-fns: 4.1.0 + + date-fns@3.6.0: {} + + date-fns@4.1.0: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + delayed-stream@1.0.0: {} + + depd@1.1.2: {} + + detect-libc@1.0.3: + optional: true + + detect-libc@2.1.0: {} + + diff@4.0.2: {} + + doctypes@1.1.0: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + edge-runtime@2.5.9: + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.1.0: + dependencies: + once: 1.3.3 + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.4.1: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild-android-64@0.14.47: + optional: true + + esbuild-android-arm64@0.14.47: + optional: true + + esbuild-darwin-64@0.14.47: + optional: true + + esbuild-darwin-arm64@0.14.47: + optional: true + + esbuild-freebsd-64@0.14.47: + optional: true + + esbuild-freebsd-arm64@0.14.47: + optional: true + + esbuild-linux-32@0.14.47: + optional: true + + esbuild-linux-64@0.14.47: + optional: true + + esbuild-linux-arm64@0.14.47: + optional: true + + esbuild-linux-arm@0.14.47: + optional: true + + esbuild-linux-mips64le@0.14.47: + optional: true + + esbuild-linux-ppc64le@0.14.47: + optional: true + + esbuild-linux-riscv64@0.14.47: + optional: true + + esbuild-linux-s390x@0.14.47: + optional: true + + esbuild-netbsd-64@0.14.47: + optional: true + + esbuild-openbsd-64@0.14.47: + optional: true + + esbuild-sunos-64@0.14.47: + optional: true + + esbuild-windows-32@0.14.47: + optional: true + + esbuild-windows-64@0.14.47: + optional: true + + esbuild-windows-arm64@0.14.47: + optional: true + + esbuild@0.14.47: + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + + esbuild@0.25.10: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + escape-string-regexp@5.0.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + etag@1.8.1: {} + + events-intercept@2.0.0: {} + + evtd@0.2.4: {} + + exsolve@1.0.7: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fflate@0.8.2: {} + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up-simple@1.0.1: {} + + follow-redirects@1.15.11: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fs-extra@11.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + generic-pool@3.4.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gif.js@0.2.0: {} + + git-raw-commits@5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): + dependencies: + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + git-semver-tags@8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): + dependencies: + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + meow: 13.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@15.15.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + highlight.js@11.11.1: {} + + hookable@5.5.3: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + + http-errors@1.4.0: + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + + http-errors@1.7.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + immutable@5.1.3: {} + + index-to-position@1.1.0: {} + + inherits@2.0.1: {} + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@2.0.5: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-node-process@1.2.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-promise@2.2.2: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-what@4.1.16: {} + + isarray@0.0.1: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jose@5.9.6: {} + + js-cookie@3.0.5: {} + + js-stringify@1.0.2: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + json-schema-to-ts@1.6.4: + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + + json-schema-traverse@1.0.0: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + + kolorist@1.8.0: {} + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + lodash-es@4.17.21: {} + + lodash.escaperegexp@4.1.2: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-error@1.3.6: {} + + math-intrinsics@1.1.0: {} + + meow@13.2.0: {} + + merge2@1.4.1: {} + + micro@9.3.5-canary.3: + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mint-filter@3.0.1: {} + + mitt@3.0.1: {} + + mkdirp@1.0.4: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + modern-mp4@0.2.0(mp4box@0.5.3): + dependencies: + mp4box: 0.5.3 + + mp4box@0.5.3: {} + + mri@1.2.0: {} + + ms@2.1.1: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + naive-ui@2.43.1(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) + '@css-render/vue3-ssr': 0.15.14(vue@3.5.22(typescript@5.9.3)) + '@types/katex': 0.16.7 + '@types/lodash': 4.17.20 + '@types/lodash-es': 4.17.12 + async-validator: 4.2.5 + css-render: 0.15.14 + csstype: 3.1.3 + date-fns: 3.6.0 + date-fns-tz: 3.2.0(date-fns@3.6.0) + evtd: 0.2.4 + highlight.js: 11.11.1 + lodash: 4.17.21 + lodash-es: 4.17.21 + seemly: 0.3.10 + treemate: 0.3.11 + vdirs: 0.1.8(vue@3.5.22(typescript@5.9.3)) + vooks: 0.2.12(vue@3.5.22(typescript@5.9.3)) + vue: 3.5.22(typescript@5.9.3) + vueuc: 0.4.65(vue@3.5.22(typescript@5.9.3)) + + nanoid@3.3.11: {} + + neo-async@2.6.2: {} + + node-addon-api@7.1.1: + optional: true + + node-fetch@2.6.7: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@2.6.9: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + once@1.3.3: + dependencies: + wrappy: 1.0.2 + + os-paths@4.4.0: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.3.0: {} + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.1.0 + type-fest: 4.41.0 + + parse-ms@2.1.0: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-browserify@1.0.1: {} + + path-key@3.1.1: {} + + path-match@1.2.4: + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.9.0 + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@1.9.0: + dependencies: + isarray: 0.0.1 + + path-to-regexp@6.1.0: {} + + path-to-regexp@6.3.0: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pinia@3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 7.7.7 + vue: 3.5.22(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.6.2: {} + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + promise@7.3.1: + dependencies: + asap: 2.0.6 + + promisepipe@3.0.0: {} + + proxy-from-env@1.1.0: {} + + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.3: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.10 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.3: + dependencies: + pug-code-gen: 3.0.3 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + + punycode@2.3.1: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + raw-body@2.4.1: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rollup@4.52.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.3 + '@rollup/rollup-android-arm64': 4.52.3 + '@rollup/rollup-darwin-arm64': 4.52.3 + '@rollup/rollup-darwin-x64': 4.52.3 + '@rollup/rollup-freebsd-arm64': 4.52.3 + '@rollup/rollup-freebsd-x64': 4.52.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.3 + '@rollup/rollup-linux-arm-musleabihf': 4.52.3 + '@rollup/rollup-linux-arm64-gnu': 4.52.3 + '@rollup/rollup-linux-arm64-musl': 4.52.3 + '@rollup/rollup-linux-loong64-gnu': 4.52.3 + '@rollup/rollup-linux-ppc64-gnu': 4.52.3 + '@rollup/rollup-linux-riscv64-gnu': 4.52.3 + '@rollup/rollup-linux-riscv64-musl': 4.52.3 + '@rollup/rollup-linux-s390x-gnu': 4.52.3 + '@rollup/rollup-linux-x64-gnu': 4.52.3 + '@rollup/rollup-linux-x64-musl': 4.52.3 + '@rollup/rollup-openharmony-arm64': 4.52.3 + '@rollup/rollup-win32-arm64-msvc': 4.52.3 + '@rollup/rollup-win32-ia32-msvc': 4.52.3 + '@rollup/rollup-win32-x64-gnu': 4.52.3 + '@rollup/rollup-win32-x64-msvc': 4.52.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + sass@1.93.2: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + scule@1.3.0: {} + + seemly@0.3.10: {} + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.2: {} + + setprototypeof@1.1.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.0.2: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + speakingurl@14.0.1: {} + + stat-mode@0.3.0: {} + + statuses@1.5.0: {} + + stream-to-array@2.3.0: + dependencies: + any-promise: 1.3.0 + + stream-to-promise@2.2.0: + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + supports-preserve-symlinks-flag@1.0.0: {} + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tar@7.4.4: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + temp-dir@3.0.0: {} + + tempfile@5.0.0: + dependencies: + temp-dir: 3.0.0 + + throttleit@2.1.0: {} + + time-span@4.0.0: + dependencies: + convert-hrtime: 3.0.0 + + tinyexec@0.3.2: {} + + tinyexec@1.0.1: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.0: {} + + token-stream@1.0.0: {} + + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + + treemate@0.3.11: {} + + ts-morph@12.0.0: + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + + ts-node@10.9.1(@types/node@16.18.11)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.11 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-toolbelt@6.15.5: {} + + tslib@2.8.1: {} + + type-fest@4.41.0: {} + + typescript@4.9.5: {} + + typescript@5.9.3: {} + + ufo@1.6.1: {} + + uglify-js@3.19.3: + optional: true + + uid-promise@1.0.0: {} + + undici-types@6.21.0: {} + + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@7.15.0: {} + + unicorn-magic@0.1.0: {} + + unimport@5.4.0: + dependencies: + acorn: 8.15.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 + pathe: 2.0.3 + picomatch: 4.0.3 + pkg-types: 2.3.0 + scule: 1.3.0 + strip-literal: 3.0.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.0 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unplugin-auto-import@20.2.0(@vueuse/core@13.9.0(vue@3.5.22(typescript@5.9.3))): + dependencies: + local-pkg: 1.1.2 + magic-string: 0.30.19 + picomatch: 4.0.3 + unimport: 5.4.0 + unplugin: 2.3.10 + unplugin-utils: 0.3.0 + optionalDependencies: + '@vueuse/core': 13.9.0(vue@3.5.22(typescript@5.9.3)) + + unplugin-icons@22.4.2(@vue/compiler-sfc@3.5.22): + dependencies: + '@antfu/install-pkg': 1.1.0 + '@iconify/utils': 3.0.2 + debug: 4.4.3 + local-pkg: 1.1.2 + unplugin: 2.3.10 + optionalDependencies: + '@vue/compiler-sfc': 3.5.22 + transitivePeerDependencies: + - supports-color + + unplugin-utils@0.3.0: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-vue-components@29.1.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)): + dependencies: + chokidar: 3.6.0 + debug: 4.4.3 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.0 + vue: 3.5.22(typescript@5.9.3) + optionalDependencies: + '@babel/parser': 7.28.4 + transitivePeerDependencies: + - supports-color + + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vdirs@0.1.8(vue@3.5.22(typescript@5.9.3)): + dependencies: + evtd: 0.2.4 + vue: 3.5.22(typescript@5.9.3) + + vercel@46.1.1(rollup@4.52.3): + dependencies: + '@vercel/blob': 1.0.2 + '@vercel/build-utils': 11.0.2 + '@vercel/detect-agent': 0.2.0 + '@vercel/express': 0.0.10(rollup@4.52.3) + '@vercel/fun': 1.1.6 + '@vercel/go': 3.2.3 + '@vercel/hono': 0.0.18(rollup@4.52.3) + '@vercel/hydrogen': 1.2.4 + '@vercel/next': 4.12.3(rollup@4.52.3) + '@vercel/node': 5.3.17(rollup@4.52.3) + '@vercel/python': 5.0.0 + '@vercel/redwood': 2.3.6(rollup@4.52.3) + '@vercel/remix-builder': 5.4.12(rollup@4.52.3) + '@vercel/ruby': 2.2.1 + '@vercel/static-build': 2.7.20 + chokidar: 4.0.0 + jose: 5.9.6 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + + vite@7.1.9(@types/node@22.18.8)(sass@1.93.2): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.3 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.18.8 + fsevents: 2.3.3 + sass: 1.93.2 + + void-elements@3.1.0: {} + + volar-service-html@0.0.65(@volar/language-service@2.4.23): + dependencies: + vscode-html-languageservice: 5.5.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-pug@0.0.65: + dependencies: + '@volar/language-service': 2.4.23 + muggle-string: 0.4.1 + pug-lexer: 5.0.1 + pug-parser: 6.0.0 + volar-service-html: 0.0.65(@volar/language-service@2.4.23) + vscode-html-languageservice: 5.5.2 + vscode-languageserver-textdocument: 1.0.12 + + vooks@0.2.12(vue@3.5.22(typescript@5.9.3)): + dependencies: + evtd: 0.2.4 + vue: 3.5.22(typescript@5.9.3) + + vscode-html-languageservice@5.5.2: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-uri@3.1.0: {} + + vue-gtag@3.6.1(vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)): + dependencies: + vue: 3.5.22(typescript@5.9.3) + optionalDependencies: + vue-router: 4.5.1(vue@3.5.22(typescript@5.9.3)) + + vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@intlify/core-base': 11.1.12 + '@intlify/shared': 11.1.12 + '@vue/devtools-api': 6.6.4 + vue: 3.5.22(typescript@5.9.3) + + vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.22(typescript@5.9.3) + + vue-waterfall-plugin-next@2.6.9: {} + + vue@3.5.22(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) + '@vue/shared': 3.5.22 + optionalDependencies: + typescript: 5.9.3 + + vueuc@0.4.65(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@css-render/vue3-ssr': 0.15.14(vue@3.5.22(typescript@5.9.3)) + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.14 + evtd: 0.2.4 + seemly: 0.3.10 + vdirs: 0.1.8(vue@3.5.22(typescript@5.9.3)) + vooks: 0.2.12(vue@3.5.22(typescript@5.9.3)) + vue: 3.5.22(typescript@5.9.3) + + web-vitals@0.2.4: {} + + webidl-conversions@3.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + with@7.0.2: + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.2 + assert-never: 1.4.0 + babel-walk: 3.0.0-canary-5 + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + xdg-app-paths@5.1.0: + dependencies: + xdg-portable: 7.3.0 + + xdg-portable@7.3.0: + dependencies: + os-paths: 4.4.0 + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yauzl-clone@1.0.4: + dependencies: + events-intercept: 2.0.0 + + yauzl-promise@2.1.3: + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yn@3.1.1: {} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..651ef56 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/images/spinner.svg b/public/images/spinner.svg new file mode 100644 index 0000000..b9cbfeb --- /dev/null +++ b/public/images/spinner.svg @@ -0,0 +1,295 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..89127ac --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,10 @@ +User-agent: * +Disallow: +Disallow: /ajax/ +Disallow: /user/ +Disallow: /api/ +Disallow: *.php + +# Google的爬虫太顶了,扛不住 +User-agent: googlebot-image +Disallow: / diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..3bab219 --- /dev/null +++ b/renovate.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended"], + "labels": ["dependencies"], + "baseBranches": ["dev"], + "packageRules": [ + { + "groupName": "framework", + "matchPackageNames": [ + "vue", + "vue-i18n", + "vue-router", + "axios", + "pinia", + "@vercel/node" + ] + }, + { + "groupName": "ui", + "matchPackageNames": [ + "naive-ui", + "vue-flex-waterfall", + "vue-gtag", + "nprogress", + "@iconify{/,}**" + ] + }, + { + "groupName": "build", + "matchPackageNames": [ + "typescript", + "vite", + "pug", + "sass", + "tslib", + "vercel", + "@vue/language-plugin-pug", + "@vitejs{/,}**", + "unplugin{/,}**", + "@vueuse{/,}**" + ] + }, + { + "groupName": "types", + "matchPackageNames": ["@types{/,}**"] + }, + { + "groupName": "utils", + "matchPackageNames": [ + "picocolors", + "js-cookie", + "cookie", + "cheerio", + "conventional-changelog-cli", + "lodash{/,}**", + "date{/,}**" + ] + }, + { + "matchUpdateTypes": ["minor", "patch", "pin", "digest"], + "automerge": true + } + ] +} diff --git a/script/getStampList.js b/script/getStampList.js new file mode 100644 index 0000000..015f77f --- /dev/null +++ b/script/getStampList.js @@ -0,0 +1,24 @@ +/** + * @desc 获取绘文字的映射表 + * 这个是扔到浏览器控制台里用的 + * 点开评论框旁边的笑脸然后运行 + * @example (normal) => https://pixiv.js.org/~/common/images/emoji/101.png + */ +!(() => { + const btn = document.querySelectorAll('.emoji-mart-category-list button') + const list = {} + for (let i of btn) { + const label = i.attributes['aria-label'].value.replace(/[\(\)]/g, '') + const url = i + .querySelector('span') + .style.backgroundImage.replace( + /url\("https:\/\/s\.pximg\.net(.+)"\)/g, + '/~$1' + ) + list[label] = url + } + console.log(list) +})() + +// 表情贴图的地址 +// `/common/images/stamp/generated-stamps/${stampId}_s.jpg` diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..0782169 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/assets/LogoH.png b/src/assets/LogoH.png new file mode 100644 index 0000000..d44c4c4 Binary files /dev/null and b/src/assets/LogoH.png differ diff --git a/src/assets/LogoV.png b/src/assets/LogoV.png new file mode 100644 index 0000000..5e3b6bd Binary files /dev/null and b/src/assets/LogoV.png differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/pixiv-rabbit.svg b/src/assets/pixiv-rabbit.svg new file mode 100644 index 0000000..d61267f --- /dev/null +++ b/src/assets/pixiv-rabbit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/placeholder.svg b/src/assets/placeholder.svg new file mode 100644 index 0000000..a284ef4 --- /dev/null +++ b/src/assets/placeholder.svg @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts new file mode 100644 index 0000000..2e06bfc --- /dev/null +++ b/src/auto-imports.d.ts @@ -0,0 +1,347 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: typeof import('vue')['EffectScope'] + const IllustType: typeof import('./types/Artworks')['IllustType'] + const UgoiraPlayer: typeof import('./utils/UgoiraPlayer')['UgoiraPlayer'] + const UserPrivacyLevel: typeof import('./types/Users')['UserPrivacyLevel'] + const UserXRestrict: typeof import('./types/Users')['UserXRestrict'] + const ZipDownloader: typeof import('./utils/ZipDownloader')['ZipDownloader'] + const addBookmark: typeof import('./utils/artworkActions')['addBookmark'] + const addUserFollow: typeof import('./utils/userActions')['addUserFollow'] + const ajax: typeof import('./utils/ajax')['ajax'] + const ajaxPostWithFormData: typeof import('./utils/ajax')['ajaxPostWithFormData'] + const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] + const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] + const axios: typeof import('axios')['default'] + const computed: typeof import('vue')['computed'] + const computedAsync: typeof import('@vueuse/core')['computedAsync'] + const computedEager: typeof import('@vueuse/core')['computedEager'] + const computedInject: typeof import('@vueuse/core')['computedInject'] + const computedWithControl: typeof import('@vueuse/core')['computedWithControl'] + const controlledComputed: typeof import('@vueuse/core')['controlledComputed'] + const controlledRef: typeof import('@vueuse/core')['controlledRef'] + const createApp: typeof import('vue')['createApp'] + const createEventHook: typeof import('@vueuse/core')['createEventHook'] + const createGlobalState: typeof import('@vueuse/core')['createGlobalState'] + const createInjectionState: typeof import('@vueuse/core')['createInjectionState'] + const createOptimizedUgoiraPlayer: typeof import('./src/utils/UgoiraPlayerExample')['createOptimizedUgoiraPlayer'] + const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn'] + const createRef: typeof import('@vueuse/core')['createRef'] + const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate'] + const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable'] + const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise'] + const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn'] + const customRef: typeof import('vue')['customRef'] + const debouncedRef: typeof import('@vueuse/core')['debouncedRef'] + const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch'] + const defaultArtwork: typeof import('./utils/index')['defaultArtwork'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const demonstrateOptimizedPlayer: typeof import('./src/utils/UgoiraPlayerExample')['demonstrateOptimizedPlayer'] + const eagerComputed: typeof import('@vueuse/core')['eagerComputed'] + const effectScope: typeof import('vue')['effectScope'] + const exampleSessionId: typeof import('./components/userData')['exampleSessionId'] + const existsSessionId: typeof import('./components/userData')['existsSessionId'] + const extendRef: typeof import('@vueuse/core')['extendRef'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const getCurrentWatcher: typeof import('vue')['getCurrentWatcher'] + const h: typeof import('vue')['h'] + const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] + const initUser: typeof import('./components/userData')['initUser'] + const inject: typeof import('vue')['inject'] + const injectLocal: typeof import('@vueuse/core')['injectLocal'] + const isArtwork: typeof import('./utils/artworkActions')['isArtwork'] + const isDefined: typeof import('@vueuse/core')['isDefined'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const isShallow: typeof import('vue')['isShallow'] + const login: typeof import('./components/userData')['login'] + const logout: typeof import('./components/userData')['logout'] + const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onElementRemoval: typeof import('@vueuse/core')['onElementRemoval'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke'] + const onLongPress: typeof import('@vueuse/core')['onLongPress'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onStartTyping: typeof import('@vueuse/core')['onStartTyping'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] + const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] + const provide: typeof import('vue')['provide'] + const provideLocal: typeof import('@vueuse/core')['provideLocal'] + const reactify: typeof import('@vueuse/core')['reactify'] + const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] + const reactive: typeof import('vue')['reactive'] + const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed'] + const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit'] + const reactivePick: typeof import('@vueuse/core')['reactivePick'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const refAutoReset: typeof import('@vueuse/core')['refAutoReset'] + const refDebounced: typeof import('@vueuse/core')['refDebounced'] + const refDefault: typeof import('@vueuse/core')['refDefault'] + const refThrottled: typeof import('@vueuse/core')['refThrottled'] + const refWithControl: typeof import('@vueuse/core')['refWithControl'] + const removeBookmark: typeof import('./utils/artworkActions')['removeBookmark'] + const removeUserFollow: typeof import('./utils/userActions')['removeUserFollow'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const resolveRef: typeof import('@vueuse/core')['resolveRef'] + const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] + const setTitle: typeof import('./utils/setTitle')['setTitle'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const sortArtList: typeof import('./utils/artworkActions')['sortArtList'] + const syncRef: typeof import('@vueuse/core')['syncRef'] + const syncRefs: typeof import('@vueuse/core')['syncRefs'] + const templateRef: typeof import('@vueuse/core')['templateRef'] + const throttledRef: typeof import('@vueuse/core')['throttledRef'] + const throttledWatch: typeof import('@vueuse/core')['throttledWatch'] + const toRaw: typeof import('vue')['toRaw'] + const toReactive: typeof import('@vueuse/core')['toReactive'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount'] + const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount'] + const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted'] + const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose'] + const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted'] + const unref: typeof import('vue')['unref'] + const unrefElement: typeof import('@vueuse/core')['unrefElement'] + const until: typeof import('@vueuse/core')['until'] + const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] + const useAnimate: typeof import('@vueuse/core')['useAnimate'] + const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference'] + const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery'] + const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter'] + const useArrayFind: typeof import('@vueuse/core')['useArrayFind'] + const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex'] + const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast'] + const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes'] + const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin'] + const useArrayMap: typeof import('@vueuse/core')['useArrayMap'] + const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce'] + const useArraySome: typeof import('@vueuse/core')['useArraySome'] + const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique'] + const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue'] + const useAsyncState: typeof import('@vueuse/core')['useAsyncState'] + const useAttrs: typeof import('vue')['useAttrs'] + const useBase64: typeof import('@vueuse/core')['useBase64'] + const useBattery: typeof import('@vueuse/core')['useBattery'] + const useBluetooth: typeof import('@vueuse/core')['useBluetooth'] + const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints'] + const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] + const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] + const useCached: typeof import('@vueuse/core')['useCached'] + const useClipboard: typeof import('@vueuse/core')['useClipboard'] + const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] + const useCloned: typeof import('@vueuse/core')['useCloned'] + const useColorMode: typeof import('@vueuse/core')['useColorMode'] + const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] + const useCountdown: typeof import('@vueuse/core')['useCountdown'] + const useCounter: typeof import('@vueuse/core')['useCounter'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVar: typeof import('@vueuse/core')['useCssVar'] + const useCssVars: typeof import('vue')['useCssVars'] + const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement'] + const useCycleList: typeof import('@vueuse/core')['useCycleList'] + const useDark: typeof import('@vueuse/core')['useDark'] + const useDateFormat: typeof import('@vueuse/core')['useDateFormat'] + const useDebounce: typeof import('@vueuse/core')['useDebounce'] + const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn'] + const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory'] + const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion'] + const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation'] + const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio'] + const useDevicesList: typeof import('@vueuse/core')['useDevicesList'] + const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia'] + const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility'] + const useDraggable: typeof import('@vueuse/core')['useDraggable'] + const useDropZone: typeof import('@vueuse/core')['useDropZone'] + const useElementBounding: typeof import('@vueuse/core')['useElementBounding'] + const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint'] + const useElementHover: typeof import('@vueuse/core')['useElementHover'] + const useElementSize: typeof import('@vueuse/core')['useElementSize'] + const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility'] + const useEventBus: typeof import('@vueuse/core')['useEventBus'] + const useEventListener: typeof import('@vueuse/core')['useEventListener'] + const useEventSource: typeof import('@vueuse/core')['useEventSource'] + const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper'] + const useFavicon: typeof import('@vueuse/core')['useFavicon'] + const useFetch: typeof import('@vueuse/core')['useFetch'] + const useFileDialog: typeof import('@vueuse/core')['useFileDialog'] + const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess'] + const useFocus: typeof import('@vueuse/core')['useFocus'] + const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin'] + const useFps: typeof import('@vueuse/core')['useFps'] + const useFullscreen: typeof import('@vueuse/core')['useFullscreen'] + const useGamepad: typeof import('@vueuse/core')['useGamepad'] + const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] + const useI18n: typeof import('vue-i18n')['useI18n'] + const useId: typeof import('vue')['useId'] + const useIdle: typeof import('@vueuse/core')['useIdle'] + const useImage: typeof import('@vueuse/core')['useImage'] + const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] + const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] + const useInterval: typeof import('@vueuse/core')['useInterval'] + const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] + const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] + const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] + const useLink: typeof import('vue-router')['useLink'] + const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] + const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys'] + const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory'] + const useMediaControls: typeof import('@vueuse/core')['useMediaControls'] + const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery'] + const useMemoize: typeof import('@vueuse/core')['useMemoize'] + const useMemory: typeof import('@vueuse/core')['useMemory'] + const useModel: typeof import('vue')['useModel'] + const useMounted: typeof import('@vueuse/core')['useMounted'] + const useMouse: typeof import('@vueuse/core')['useMouse'] + const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement'] + const useMousePressed: typeof import('@vueuse/core')['useMousePressed'] + const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver'] + const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage'] + const useNetwork: typeof import('@vueuse/core')['useNetwork'] + const useNow: typeof import('@vueuse/core')['useNow'] + const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl'] + const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination'] + const useOnline: typeof import('@vueuse/core')['useOnline'] + const usePageLeave: typeof import('@vueuse/core')['usePageLeave'] + const useParallax: typeof import('@vueuse/core')['useParallax'] + const useParentElement: typeof import('@vueuse/core')['useParentElement'] + const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver'] + const usePermission: typeof import('@vueuse/core')['usePermission'] + const usePointer: typeof import('@vueuse/core')['usePointer'] + const usePointerLock: typeof import('@vueuse/core')['usePointerLock'] + const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe'] + const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme'] + const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast'] + const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] + const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] + const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] + const usePreferredReducedTransparency: typeof import('@vueuse/core')['usePreferredReducedTransparency'] + const usePrevious: typeof import('@vueuse/core')['usePrevious'] + const useRafFn: typeof import('@vueuse/core')['useRafFn'] + const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] + const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useSSRWidth: typeof import('@vueuse/core')['useSSRWidth'] + const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] + const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] + const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] + const useScroll: typeof import('@vueuse/core')['useScroll'] + const useScrollLock: typeof import('@vueuse/core')['useScrollLock'] + const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] + const useShare: typeof import('@vueuse/core')['useShare'] + const useSideNavStore: typeof import('./composables/states')['useSideNavStore'] + const useSlots: typeof import('vue')['useSlots'] + const useSorted: typeof import('@vueuse/core')['useSorted'] + const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] + const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] + const useStepper: typeof import('@vueuse/core')['useStepper'] + const useStorage: typeof import('@vueuse/core')['useStorage'] + const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync'] + const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] + const useSupported: typeof import('@vueuse/core')['useSupported'] + const useSwipe: typeof import('@vueuse/core')['useSwipe'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] + const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] + const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] + const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] + const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize'] + const useThrottle: typeof import('@vueuse/core')['useThrottle'] + const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn'] + const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory'] + const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo'] + const useTimeAgoIntl: typeof import('@vueuse/core')['useTimeAgoIntl'] + const useTimeout: typeof import('@vueuse/core')['useTimeout'] + const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn'] + const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll'] + const useTimestamp: typeof import('@vueuse/core')['useTimestamp'] + const useTitle: typeof import('@vueuse/core')['useTitle'] + const useToNumber: typeof import('@vueuse/core')['useToNumber'] + const useToString: typeof import('@vueuse/core')['useToString'] + const useToggle: typeof import('@vueuse/core')['useToggle'] + const useTransition: typeof import('@vueuse/core')['useTransition'] + const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams'] + const useUserMedia: typeof import('@vueuse/core')['useUserMedia'] + const useUserStore: typeof import('./composables/states')['useUserStore'] + const useVModel: typeof import('@vueuse/core')['useVModel'] + const useVModels: typeof import('@vueuse/core')['useVModels'] + const useVibrate: typeof import('@vueuse/core')['useVibrate'] + const useVirtualList: typeof import('@vueuse/core')['useVirtualList'] + const useWakeLock: typeof import('@vueuse/core')['useWakeLock'] + const useWebNotification: typeof import('@vueuse/core')['useWebNotification'] + const useWebSocket: typeof import('@vueuse/core')['useWebSocket'] + const useWebWorker: typeof import('@vueuse/core')['useWebWorker'] + const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn'] + const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus'] + const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll'] + const useWindowSize: typeof import('@vueuse/core')['useWindowSize'] + const validateSessionId: typeof import('./components/userData')['validateSessionId'] + const watch: typeof import('vue')['watch'] + const watchArray: typeof import('@vueuse/core')['watchArray'] + const watchAtMost: typeof import('@vueuse/core')['watchAtMost'] + const watchDebounced: typeof import('@vueuse/core')['watchDebounced'] + const watchDeep: typeof import('@vueuse/core')['watchDeep'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable'] + const watchImmediate: typeof import('@vueuse/core')['watchImmediate'] + const watchOnce: typeof import('@vueuse/core')['watchOnce'] + const watchPausable: typeof import('@vueuse/core')['watchPausable'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] + const watchThrottled: typeof import('@vueuse/core')['watchThrottled'] + const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable'] + const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter'] + const whenever: typeof import('@vueuse/core')['whenever'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') + // @ts-ignore + export type { UgoiraPlayer, UgoiraPlayerOptions, UgoiraFrame, UgoiraMeta } from './utils/UgoiraPlayer' + import('./utils/UgoiraPlayer') + // @ts-ignore + export type { ZipDownloader, FetchLike, ZipDownloaderOptions, ZipEntry, ZipEntryWithData, ZipOverview, DataRange } from './utils/ZipDownloader' + import('./utils/ZipDownloader') + // @ts-ignore + export type { IllustType, ArtworkUrls, ArtworkPageUrls, ArtworkTag, ArtworkGallery, ArtworkInfo, ArtworkInfoOrAd, ArtworkRank, Artwork, IllustType } from './types/Artworks' + import('./types/Artworks') + // @ts-ignore + export type { Comments } from './types/Comment' + import('./types/Comment') + // @ts-ignore + export type { UserXRestrict, UserPrivacyLevel, User, PixivUser, UserListItem, UserXRestrict, UserPrivacyLevel } from './types/Users' + import('./types/Users') +} diff --git a/src/components.d.ts b/src/components.d.ts new file mode 100644 index 0000000..db751ef --- /dev/null +++ b/src/components.d.ts @@ -0,0 +1,46 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + ArtTag: typeof import('./components/ArtTag.vue')['default'] + ArtworkCard: typeof import('./components/ArtworksList/ArtworkCard.vue')['default'] + ArtworkLargeCard: typeof import('./components/ArtworksList/ArtworkLargeCard.vue')['default'] + ArtworkLargeList: typeof import('./components/ArtworksList/ArtworkLargeList.vue')['default'] + ArtworkList: typeof import('./components/ArtworksList/ArtworkList.vue')['default'] + ArtworksByUser: typeof import('./components/ArtworksList/ArtworksByUser.vue')['default'] + AuthorCard: typeof import('./components/AuthorCard.vue')['default'] + Card: typeof import('./components/Card.vue')['default'] + Comment: typeof import('./components/Comment/Comment.vue')['default'] + CommentsArea: typeof import('./components/Comment/CommentsArea.vue')['default'] + CommentSubmit: typeof import('./components/Comment/CommentSubmit.vue')['default'] + ErrorPage: typeof import('./components/ErrorPage.vue')['default'] + ExternalLink: typeof import('./components/ExternalLink.vue')['default'] + FollowUserCard: typeof import('./components/FollowUserCard.vue')['default'] + Gallery: typeof import('./components/Gallery.vue')['default'] + LazyLoad: typeof import('./components/LazyLoad.vue')['default'] + ListLink: typeof import('./components/SideNav/ListLink.vue')['default'] + NaiveuiProvider: typeof import('./components/NaiveuiProvider.vue')['default'] + NAlert: typeof import('naive-ui')['NAlert'] + NLi: typeof import('naive-ui')['NLi'] + NProgress: typeof import('./components/NProgress.vue')['default'] + NSpace: typeof import('naive-ui')['NSpace'] + NTag: typeof import('naive-ui')['NTag'] + NUl: typeof import('naive-ui')['NUl'] + Placeholder: typeof import('./components/Placeholder.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SearchBox: typeof import('./components/SearchBox.vue')['default'] + ShowMore: typeof import('./components/ShowMore.vue')['default'] + SideNav: typeof import('./components/SideNav/SideNav.vue')['default'] + SiteFooter: typeof import('./components/SiteFooter.vue')['default'] + SiteHeader: typeof import('./components/SiteHeader.vue')['default'] + SiteNoticeBanner: typeof import('./components/SiteNoticeBanner.vue')['default'] + UgoiraViewer: typeof import('./components/UgoiraViewer.vue')['default'] + } +} diff --git a/src/components/ArtTag.vue b/src/components/ArtTag.vue new file mode 100644 index 0000000..3747fc4 --- /dev/null +++ b/src/components/ArtTag.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/ArtworksList/ArtworkCard.vue b/src/components/ArtworksList/ArtworkCard.vue new file mode 100644 index 0000000..8ff5deb --- /dev/null +++ b/src/components/ArtworksList/ArtworkCard.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/src/components/ArtworksList/ArtworkLargeCard.vue b/src/components/ArtworksList/ArtworkLargeCard.vue new file mode 100644 index 0000000..a746e18 --- /dev/null +++ b/src/components/ArtworksList/ArtworkLargeCard.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/src/components/ArtworksList/ArtworkLargeList.vue b/src/components/ArtworksList/ArtworkLargeList.vue new file mode 100644 index 0000000..801af75 --- /dev/null +++ b/src/components/ArtworksList/ArtworkLargeList.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/components/ArtworksList/ArtworkList.vue b/src/components/ArtworksList/ArtworkList.vue new file mode 100644 index 0000000..c22a7b9 --- /dev/null +++ b/src/components/ArtworksList/ArtworkList.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components/ArtworksList/ArtworksByUser.vue b/src/components/ArtworksList/ArtworksByUser.vue new file mode 100644 index 0000000..5652b10 --- /dev/null +++ b/src/components/ArtworksList/ArtworksByUser.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/components/AuthorCard.vue b/src/components/AuthorCard.vue new file mode 100644 index 0000000..59c0539 --- /dev/null +++ b/src/components/AuthorCard.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/components/Card.vue b/src/components/Card.vue new file mode 100644 index 0000000..b09cdac --- /dev/null +++ b/src/components/Card.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/Comment/Comment.vue b/src/components/Comment/Comment.vue new file mode 100644 index 0000000..fdd3859 --- /dev/null +++ b/src/components/Comment/Comment.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/components/Comment/CommentSubmit.vue b/src/components/Comment/CommentSubmit.vue new file mode 100644 index 0000000..6556d40 --- /dev/null +++ b/src/components/Comment/CommentSubmit.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/components/Comment/CommentsArea.vue b/src/components/Comment/CommentsArea.vue new file mode 100644 index 0000000..55c34a9 --- /dev/null +++ b/src/components/Comment/CommentsArea.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/components/Comment/stampList.json b/src/components/Comment/stampList.json new file mode 100644 index 0000000..bebe2af --- /dev/null +++ b/src/components/Comment/stampList.json @@ -0,0 +1,40 @@ +{ + "normal": "/~/common/images/emoji/101.png", + "surprise": "/~/common/images/emoji/102.png", + "serious": "/~/common/images/emoji/103.png", + "heaven": "/~/common/images/emoji/104.png", + "happy": "/~/common/images/emoji/105.png", + "excited": "/~/common/images/emoji/106.png", + "sing": "/~/common/images/emoji/107.png", + "cry": "/~/common/images/emoji/108.png", + "normal2": "/~/common/images/emoji/201.png", + "shame2": "/~/common/images/emoji/202.png", + "love2": "/~/common/images/emoji/203.png", + "interesting2": "/~/common/images/emoji/204.png", + "blush2": "/~/common/images/emoji/205.png", + "fire2": "/~/common/images/emoji/206.png", + "angry2": "/~/common/images/emoji/207.png", + "shine2": "/~/common/images/emoji/208.png", + "panic2": "/~/common/images/emoji/209.png", + "normal3": "/~/common/images/emoji/301.png", + "satisfaction3": "/~/common/images/emoji/302.png", + "surprise3": "/~/common/images/emoji/303.png", + "smile3": "/~/common/images/emoji/304.png", + "shock3": "/~/common/images/emoji/305.png", + "gaze3": "/~/common/images/emoji/306.png", + "wink3": "/~/common/images/emoji/307.png", + "happy3": "/~/common/images/emoji/308.png", + "excited3": "/~/common/images/emoji/309.png", + "love3": "/~/common/images/emoji/310.png", + "normal4": "/~/common/images/emoji/401.png", + "surprise4": "/~/common/images/emoji/402.png", + "serious4": "/~/common/images/emoji/403.png", + "love4": "/~/common/images/emoji/404.png", + "shine4": "/~/common/images/emoji/405.png", + "sweat4": "/~/common/images/emoji/406.png", + "shame4": "/~/common/images/emoji/407.png", + "sleep4": "/~/common/images/emoji/408.png", + "heart": "/~/common/images/emoji/501.png", + "teardrop": "/~/common/images/emoji/502.png", + "star": "/~/common/images/emoji/503.png" +} diff --git a/src/components/ErrorPage.vue b/src/components/ErrorPage.vue new file mode 100644 index 0000000..44d1d43 --- /dev/null +++ b/src/components/ErrorPage.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/components/ExternalLink.vue b/src/components/ExternalLink.vue new file mode 100644 index 0000000..62919d7 --- /dev/null +++ b/src/components/ExternalLink.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/FollowUserCard.vue b/src/components/FollowUserCard.vue new file mode 100644 index 0000000..069ff25 --- /dev/null +++ b/src/components/FollowUserCard.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/components/Gallery.vue b/src/components/Gallery.vue new file mode 100644 index 0000000..67fce3f --- /dev/null +++ b/src/components/Gallery.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/components/LazyLoad.vue b/src/components/LazyLoad.vue new file mode 100644 index 0000000..772fe87 --- /dev/null +++ b/src/components/LazyLoad.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/NProgress.vue b/src/components/NProgress.vue new file mode 100644 index 0000000..5a9f6be --- /dev/null +++ b/src/components/NProgress.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/NaiveuiProvider.vue b/src/components/NaiveuiProvider.vue new file mode 100644 index 0000000..5767169 --- /dev/null +++ b/src/components/NaiveuiProvider.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/Placeholder.vue b/src/components/Placeholder.vue new file mode 100644 index 0000000..6f35f8c --- /dev/null +++ b/src/components/Placeholder.vue @@ -0,0 +1,44 @@ + + + diff --git a/src/components/SearchBox.vue b/src/components/SearchBox.vue new file mode 100644 index 0000000..5b0a065 --- /dev/null +++ b/src/components/SearchBox.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/components/ShowMore.vue b/src/components/ShowMore.vue new file mode 100644 index 0000000..6f35ef2 --- /dev/null +++ b/src/components/ShowMore.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/SideNav/ListLink.vue b/src/components/SideNav/ListLink.vue new file mode 100644 index 0000000..db30cd4 --- /dev/null +++ b/src/components/SideNav/ListLink.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/SideNav/SideNav.vue b/src/components/SideNav/SideNav.vue new file mode 100644 index 0000000..291acd3 --- /dev/null +++ b/src/components/SideNav/SideNav.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/components/SiteFooter.vue b/src/components/SiteFooter.vue new file mode 100644 index 0000000..3aba1eb --- /dev/null +++ b/src/components/SiteFooter.vue @@ -0,0 +1,101 @@ + + + + diff --git a/src/components/SiteHeader.vue b/src/components/SiteHeader.vue new file mode 100644 index 0000000..2ef5a36 --- /dev/null +++ b/src/components/SiteHeader.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/components/SiteNoticeBanner.vue b/src/components/SiteNoticeBanner.vue new file mode 100644 index 0000000..602198b --- /dev/null +++ b/src/components/SiteNoticeBanner.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/UgoiraViewer.vue b/src/components/UgoiraViewer.vue new file mode 100644 index 0000000..accb271 --- /dev/null +++ b/src/components/UgoiraViewer.vue @@ -0,0 +1,319 @@ + + + + + diff --git a/src/components/userData.ts b/src/components/userData.ts new file mode 100644 index 0000000..840c133 --- /dev/null +++ b/src/components/userData.ts @@ -0,0 +1,81 @@ +import { PixivUser } from '@/types' +import Cookies from 'js-cookie' + +export function existsSessionId(): boolean { + const sessionId = Cookies.get('PHPSESSID') + if (sessionId) { + return true + } else { + Cookies.remove('CSRFTOKEN') + return false + } +} + +export async function initUser(): Promise { + try { + const { data } = await axios.get<{ userData: PixivUser; token: string }>( + `/api/user`, + { + headers: { + 'Cache-Control': 'no-store', + }, + } + ) + if (data.token) { + console.log('session ID认证成功', data) + Cookies.set('CSRFTOKEN', data.token, { secure: true, sameSite: 'Strict' }) + const res = data.userData + return res + } else { + Cookies.remove('CSRFTOKEN') + return Promise.reject('无效的session ID') + } + } catch (err) { + Cookies.remove('CSRFTOKEN') + return Promise.reject(err) + } +} + +export function login(token: string): Promise { + if (!validateSessionId(token)) { + console.error('访问令牌格式错误') + return Promise.reject('访问令牌格式错误') + } + Cookies.set('PHPSESSID', token, { + expires: 180, + path: '/', + secure: true, + sameSite: 'Strict', + }) + return initUser() +} + +export function logout(): void { + const token = Cookies.get('PHPSESSID') + if (token && confirm(`您要移除您的令牌吗?\n${token}`)) { + Cookies.remove('PHPSESSID') + Cookies.remove('CSRFTOKEN') + } +} + +export function validateSessionId(token: string): boolean { + return /^\d{2,10}_[0-9A-Za-z]{32}$/.test(token) +} + +export function exampleSessionId(): string { + const uid = new Uint32Array(1) + window.crypto.getRandomValues(uid) + const secret = (() => { + const strSet = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + const final = [] + const indexes = new Uint8Array(32) + window.crypto.getRandomValues(indexes) + for (const i of indexes) { + const charIndex = Math.floor((i * strSet.length) / 256) + final.push(strSet[charIndex]) + } + return final.join('') + })() + return `${uid[0]}_${secret}` +} diff --git a/src/composables/states.ts b/src/composables/states.ts new file mode 100644 index 0000000..74e9bb4 --- /dev/null +++ b/src/composables/states.ts @@ -0,0 +1,44 @@ +import { defineStore } from 'pinia' +import { PixivUser } from '@/types' + +export const useSideNavStore = defineStore('sidenav', () => { + const openState = ref(false) + const isOpened = computed(() => openState.value) + function toggle() { + openState.value = !openState.value + } + function open() { + openState.value = true + } + function close() { + openState.value = false + } + return { openState, isOpened, toggle, open, close } +}) + +export const useUserStore = defineStore('user', () => { + const user = ref(null) + const isLoggedIn = computed(() => !!user.value) + const userId = computed(() => user.value?.id) + const userName = computed(() => user.value?.name) + const userPixivId = computed(() => user.value?.pixivId) + const userProfileImg = computed(() => user.value?.profileImg) + const userProfileImgBig = computed(() => user.value?.profileImgBig) + function login(data: PixivUser) { + user.value = data + } + function logout() { + user.value = null + } + return { + user, + isLoggedIn, + userId, + userName, + userPixivId, + userProfileImg, + userProfileImgBig, + login, + logout, + } +}) diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..4a7a186 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,23 @@ +// Env +import { version } from '../package.json' +export { version } + +export const SITE_ENV = + import.meta.env.MODE === 'development' || + version.includes('-') || + location.hostname === 'pixiv-next.vercel.app' + ? 'development' + : 'production' + +// Copyright links +// Do not modify please +export const GITHUB_OWNER = 'FreeNowOrg' +export const GITHUB_REPO = 'PixivNow' +export const GITHUB_URL = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}` + +// Site name +export const PROJECT_NAME = 'PixivNow' +export const PROJECT_TAGLINE = 'Enjoy Pixiv Now (pixiv.js.org)' + +// Image proxy cache seconds +export const IMAGE_CACHE_SECONDS = 12 * 60 * 60 * 1000 diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..f86d5a0 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,7 @@ +/// + +// declare module '*.vue' { +// import { ComponentOptions } from 'vue' +// const componentOptions: ComponentOptions +// export default componentOptions +// } diff --git a/src/locales/zh-Hans.json b/src/locales/zh-Hans.json new file mode 100644 index 0000000..0aa6155 --- /dev/null +++ b/src/locales/zh-Hans.json @@ -0,0 +1,3 @@ +{ + "ArtworkCard.pageCount": "共{0}张" +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..3cc4358 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,14 @@ +import { createApp } from 'vue' +import { SITE_ENV } from '@/config' +import { registerPlugins } from '@/plugins' +import App from './App.vue' +import '@/styles/index.sass' + +// Create App +const app = createApp(App) + +registerPlugins(app) + +// Mount +app.mount('#app') +document.body?.setAttribute('data-env', SITE_ENV) diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts new file mode 100644 index 0000000..55e63af --- /dev/null +++ b/src/plugins/i18n.ts @@ -0,0 +1,30 @@ +import { createI18n, I18n } from 'vue-i18n' + +export const SUPPORTED_LOCALES = ['zh-Hans'] + +export function setupI18n(options = { locale: 'zh-Hans' }) { + const i18n = createI18n({ ...options, legacy: false }) + setI18nLanguage(i18n, options.locale) + return i18n +} + +export function setI18nLanguage( + i18n: I18n, + locale: string +) { + i18n.global.locale.value = locale + document.querySelector('html')?.setAttribute('lang', locale) +} + +export async function loadLocaleMessages( + i18n: I18n, + locale: string +) { + const messages = await import( + /* webpackChunkName: "locale-[request]" */ `@/locales/${locale}.json` + ) + i18n.global.setLocaleMessage(locale, messages.default) + setI18nLanguage(i18n, locale) + + return nextTick() +} diff --git a/src/plugins/index.ts b/src/plugins/index.ts new file mode 100644 index 0000000..1001a1e --- /dev/null +++ b/src/plugins/index.ts @@ -0,0 +1,26 @@ +import { router } from './router' +import { loadLocaleMessages, setupI18n } from './i18n' +import { createPinia } from 'pinia' +import { createGtag } from 'vue-gtag' +import type { App } from 'vue' + +export async function registerPlugins(app: App) { + const i18n = setupI18n() + const initialLocale = 'zh-Hans' + app.use(i18n) + app.use(router) + app.use(createPinia()) + + if (import.meta.env.VITE_GOOGLE_ANALYTICS_ID) { + app.use( + createGtag({ + tagId: import.meta.env.VITE_GOOGLE_ANALYTICS_ID, + pageTracker: { + router, + }, + }) + ) + } + + await loadLocaleMessages(i18n, initialLocale) +} diff --git a/src/plugins/router.ts b/src/plugins/router.ts new file mode 100644 index 0000000..b4f05ef --- /dev/null +++ b/src/plugins/router.ts @@ -0,0 +1,116 @@ +import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' +import { createDiscreteApi } from 'naive-ui' +const { message } = createDiscreteApi(['message']) + +const routes: RouteRecordRaw[] = [ + { + path: '/', + name: 'home', + component: () => import('@/view/index.vue'), + }, + { + path: '/artworks/:id', + alias: ['/illust/:id', '/i/:id'], + name: 'artworks', + component: () => import('@/view/artworks.vue'), + }, + { + path: '/following/latest', + alias: ['/bookmark_new_illust'], + name: 'following-latest', + component: () => import('@/view/following-latest.vue'), + }, + { + path: '/users/:id', + name: 'users', + alias: ['/u/:id'], + component: () => import('@/view/users.vue'), + }, + { + path: '/users/:id/following', + name: 'following', + component: () => import('@/view/following.vue'), + }, + { + path: '/search/:keyword', + name: 'search-index-redirect', + redirect: (to) => `/search/${to.params.keyword}/1`, + }, + { + path: '/search/:keyword/:p', + name: 'search', + component: () => import('@/view/search.vue'), + }, + { + path: '/discovery', + name: 'discovery', + component: () => import('@/view/discovery.vue'), + }, + { + path: '/ranking', + name: 'ranking', + component: () => import('@/view/ranking.vue'), + }, + { + path: '/login', + name: 'user-login', + component: () => import('@/view/login.vue'), + }, + { + path: '/about', + name: 'about-us', + component: () => import('@/view/about.vue'), + }, + { + path: '/notifications/2024-04-26', + name: 'notification-2024-04-26', + component: () => import('@/view/notifications/2024-04-26.vue'), + }, + { + path: '/:pathMatch(.*)*', + name: 'not-found', + component: () => import('@/view/404.vue'), + }, +] + +if (import.meta.env.DEV) { + routes.push({ + path: '/_debug', + name: 'debug', + children: [ + { + path: 'zip', + name: 'debug-zip', + component: () => import('@/view/_debug/zip.vue'), + }, + ], + }) +} + +export const router = createRouter({ + history: createWebHistory(), + routes, + scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return savedPosition + } else { + return { + top: 0, + behavior: 'smooth', + } + } + }, +}) + +router.afterEach(({ name }) => { + document.body.setAttribute('data-route', name as string) + // Fix route when modal opened + document.body.style.overflow = 'visible' +}) + +router.onError((error, to, from) => { + console.log(error, to, from) + message.error(error) +}) + +export default router diff --git a/src/styles/animate.sass b/src/styles/animate.sass new file mode 100644 index 0000000..6749b10 --- /dev/null +++ b/src/styles/animate.sass @@ -0,0 +1,39 @@ +@use "sass:color" + +.fade-in-up + animation: fadeInUp 0.24s ease + +.fade-out-down + animation: fadeOutDown 0.4s ease + +svg.spin + animation: spin 2s linear infinite + +@keyframes fadeInUp + 0% + opacity: 0 + transform: translate3d(0, 1rem, 0) + + to + opacity: 1 + transform: translateZ(0) + +@keyframes fadeOutDown + 0% + opacity: 1 + + to + opacity: 0 + transform: translate3d(0, 1rem, 0) + +@keyframes imgProgress + from + background-color: color.adjust(#e8e8e8, $lightness: 4%) + to + background-color: #e8e8e8 + +@keyframes spin + from + transform: rotate(0deg) + to + transform: rotate(360deg) diff --git a/src/styles/elements.sass b/src/styles/elements.sass new file mode 100644 index 0000000..946f856 --- /dev/null +++ b/src/styles/elements.sass @@ -0,0 +1,141 @@ +// Headers +@mixin header-shared($font-size, $shadow-color) + font-size: $font-size + text-shadow: 1px 1px 0 var(--theme-text-shadow-color), -1px -1px 0 var(--theme-text-shadow-color) + box-shadow: 0 0.1em 0 $shadow-color + +article + h1 + font-size: 1.8rem + + h2, h3, h4, h5, h6 + font-weight: 700 + padding: 0.2rem + color: var(--theme-text-color) + position: relative + &::before + content: "" + display: block + position: absolute + top: 50% + left: 0 + transform: translateY(-50%) + border-radius: 1em + &.plain::before + display: none + // 用于辅助目录进行定位,让锚点不会被顶部导航遮住 + [id] + padding-top: 60px + margin-top: -60px + + h2:not(.plain) + font-size: 1.5em + margin: 1rem 0 + padding-left: 1rem + &::before + width: 0.25em + height: 70% + background-color: var(--theme-accent-color) + + h3:not(.plain) + font-size: 1.3rem + margin: 0.5em 0 + padding-left: 0.8rem + &::before + width: 0.2em + height: 60% + background-color: rgba(var(--theme-accent-color--rgb), 0.75) + h4:not(.plain) + font-size: 1.2rem + margin: 0.5em 0 + padding-left: 0.6rem + &::before + width: 0.15em + height: 50% + background-color: rgba(var(--theme-accent-color--rgb), 0.6) + h5:not(.plain) + font-size: 1.125rem + margin: 0.5em 0 + padding-left: 0.4rem + &::before + width: 0.1em + height: 40% + background-color: rgba(var(--theme-accent-color--rgb), 0.5) + h6:not(.plain) + font-size: 1.125rem + margin: 0.5em 0 + +// Links +a + --color: var(--theme-link-color) + color: var(--color) + text-decoration: none + position: relative + display: inline-block + + &.plain + display: unset + + &:not(.plain)::after + content: '' + display: block + position: absolute + width: 100% + height: 0.1em + bottom: -0.1em + left: 0 + background-color: var(--color) + visibility: hidden + transform: scaleX(0) + transition: all 0.4s ease-in-out + + &:not(.plain):hover::after, + &.router-link-active::after, + &.tab-active::after, + &.is-active::after + visibility: visible + transform: scaleX(1) + + &.button + padding: 0.2rem 0.4rem + background-color: var(--theme-tag-color) + transition: all .4s ease + cursor: pointer + + &:hover + background-color: rgba(var(--theme-link-color--rgb), 1) + color: var(--theme-accent-link-color) + +// Code +pre + overflow: auto + background: #efefef + padding: 4px + +code + background-color: #efefef + display: inline + border-radius: 2px + padding: .1rem .2rem + color: #e02080 + word-break: break-word + +// Responsive +.responsive, +.body-inner + @media (min-width: 1280px) + margin-left: auto + margin-right: auto + width: 1200px + @media (max-width: 1280px) + margin-left: 1rem + margin-right: 1rem + +svg.svg--inline + display: inline-block + vertical-align: -0.125em + overflow: visible + +.n-modal + width: 600px + max-width: 86vw diff --git a/src/styles/formats.sass b/src/styles/formats.sass new file mode 100644 index 0000000..b4dc563 --- /dev/null +++ b/src/styles/formats.sass @@ -0,0 +1,70 @@ +.align-center + text-align: center + +.align-left + text-align: left + +.align-right + text-align: right + +.position-center + text-align: left + position: relative + left: 50% + transform: translateX(-50%) + +.flex-center + display: flex + align-items: center + +.pre, +.poem + white-space: pre-wrap + +.flex + display: flex + +.flex-1 + flex: 1 + +.flex-list + .list-item + display: flex + gap: 0.5rem + + &:not(:first-of-type) + margin-top: 4px + + > div + flex: 1 + + .key + font-weight: 600 + box-shadow: 2px 0 #dedede + +.pointer + cursor: pointer + +// Loading +.loading-cover + position: relative + &::before,&::after + content: "" + width: 100% + height: 100% + display: block + position: absolute + &::before + background-image: url(/images/spinner.svg) + background-size: 75px + background-repeat: no-repeat + background-position: center + top: 50% + left: 50% + transform: translateX(-50%) translateY(-50%) + z-index: 6 + &::after + top: 0 + left: 0 + background-color: rgba(255,255,255,0.25) + z-index: 5 diff --git a/src/styles/index.sass b/src/styles/index.sass new file mode 100644 index 0000000..a8722b3 --- /dev/null +++ b/src/styles/index.sass @@ -0,0 +1,49 @@ +@use 'animate' +@use 'elements' +@use 'formats' +@use 'variables' + +html, +body + margin: 0 + padding: 0 + position: relative + +* + box-sizing: border-box + +#app + font-family: Avenir, Helvetica, Arial, sans-serif + -webkit-font-smoothing: antialiased + -moz-osx-font-smoothing: grayscale + color: var(--theme-text-color) + display: flex + flex-direction: column + min-height: 100vh + +// Env specific +[data-env="production"] + .dev-only, .dev-test + display: none !important +[data-env="development"] + .prod-only + display: none !important + +.container + margin-left: 10% + margin-right: 10% + +.narrow-only + display: none + +.isAdContainer + display: none !important + +@media screen and (max-width: 800px) + .container + margin-left: 2rem + margin-right: 2rem + .narrow-only + display: inherit + .wide-only + display: none diff --git a/src/styles/variables.sass b/src/styles/variables.sass new file mode 100644 index 0000000..38f18ee --- /dev/null +++ b/src/styles/variables.sass @@ -0,0 +1,25 @@ +@use 'sass:color' + +$accent-color: rgb(73, 147, 255) + +:root + font-size: 16px + --theme-accent-color: #{$accent-color} + --theme-accent-color--rgb: 73, 147, 255 + --theme-accent-color-darken: #{color.scale($accent-color, $lightness: -12%)} + --theme-accent-link-color: rgb(255, 255, 255) + --theme-secondary-color: rgb(224, 32, 128) + --theme-secondary-color--rgb: 224, 32, 128 + --theme-text-color: rgb(44, 62, 80) + --theme-link-color: rgb(63, 81, 181) + --theme-link-color--rgb: 63, 81, 181 + --theme-background-color: rgb(255, 255, 255) + --theme-text-shadow-color: rgb(255, 255, 255) + --theme-box-shadow-color: rgb(204, 204, 204) + --theme-box-shadow-color-hover: rgb(170, 170, 170) + --theme-border-color: rgb(136, 136, 136) + --theme-box-shadow: 0 0 4px var(--theme-box-shadow-color) + --theme-box-shadow-hover: 0 0 8px var(--theme-box-shadow-color-hover) + --theme-tag-color: rgb(214, 228, 255) + --theme-danger-color: rgb(255, 85, 85) + --theme-bookmark-color: rgb(255, 105, 180) diff --git a/src/types/Artworks.ts b/src/types/Artworks.ts new file mode 100644 index 0000000..1894c5f --- /dev/null +++ b/src/types/Artworks.ts @@ -0,0 +1,210 @@ +export interface ArtworkUrls { + mini: string + thumb: string + small: string + regular: string + original: string +} + +export interface ArtworkPageUrls { + original: string + small: string + regular: string + thumb_mini: string +} + +export interface ArtworkTag { + tag: string + locked: boolean + deletable: boolean + userId: `${number}` + translation?: { + en?: string + } + userName: string +} + +export interface ArtworkGallery { + urls: ArtworkPageUrls + width: number + height: number +} + +interface ArtworkCommon { + id: `${number}` + title: string + description: string + createDate: string + updateDate: string + illustType: IllustType + restrict: 0 + xRestrict: 0 | 1 | 2 + sl: number + userId: `${number}` + userName: string + alt: string + width: number + height: number + pageCount: number + isBookmarkable: boolean + bookmarkData: { + id: `${number}` + private: boolean + } | null + titleCaptionTranslation: { + workTitle: string | null + workCaption: string | null + } + isUnlisted: boolean + aiType: number +} + +export interface ArtworkInfo extends ArtworkCommon { + url: string + tags: string[] + profileImageUrl: string + type: 'illust' | 'novel' +} + +export type ArtworkInfoOrAd = + | ArtworkInfo + | { + isAdContainer: true + } + +export enum IllustType { + ILLUST = 0, + MANGA = 1, + UGOIRA = 2, +} + +export interface ArtworkRank { + title: string + date: string + tags: string[] + url: string + illust_type: IllustType + illust_book_style: '0' + illust_page_count: `${number}` + user_name: string + profile_img: string + illust_content_type: { + sexual: 0 | 1 | 2 + lo: boolean + grotesque: boolean + violent: boolean + homosexual: boolean + drug: boolean + thoughts: boolean + antisocial: boolean + religional: boolean + original: boolean + furry: boolean + bl: boolean + yuri: boolean + } + illust_series: + | { + illustSeriesId: `${number}` + illustSeriesUserId: `${number}` + illustSeriesTitle: string + illustSeriesCaption: string + illustSeriesContentCount: `${number}` + illustSeriesCreateDatetime: string + illustSeriesContentIllustId: `${number}` + illustSeriesContentOrder: `${number}` + pageUrl: string + } + | false + illust_id: number + width: number + height: number + user_id: number + rank: number + yes_rank: number + rating_count: number + view_count: number + illust_upload_timestamp: number + attr: string +} + +export interface Artwork extends ArtworkCommon { + illustId: `${number}` + illustTitle: string + illustComment: string + urls: ArtworkUrls + tags: { + authorId: `${number}` + isLocked: boolean + tags: ArtworkTag[] + writable: boolean + } + storableTags: string[] + userAccount: string + userIllusts: Record<`${number}`, ArtworkInfo | null> + likeData: boolean + bookmarkCount: number + likeCount: number + commentCount: number + responseCount: number + viewCount: number + isHowto: boolean + isOriginal: boolean + imageResponseOutData: any[] + imageResponseData: any[] + imageResponseCount: number + pollData: any + seriesNavData: any + descriptionBoothId: any + descriptionYoutubeId: any + comicPromotion: any + fanboxPromotion: any + contestBanners: any[] + contestData: any + profileImageUrl: string + zoneConfig?: any + extraData?: { + meta: { + title: string + description: string + canonical: string + alternateLanguages: { + ja: string + en: string + } + descriptionHeader: string + ogp: { + description: string + image: string + title: string + type: string + } + twitter: { + description: string + image: string + title: string + card: string + } + } + } + noLoginData?: { + breadcrumbs: { + successor: any[] + current: { + zh?: string + } + } + zengoIdWorks: ArtworkInfo[] + zengoWorkData: { + nextWork: { + id: `${number}` + title: string + } + prevWork: { + id: `${number}` + title: string + } + } + } + pages: ArtworkGallery[] +} diff --git a/src/types/Comment.ts b/src/types/Comment.ts new file mode 100644 index 0000000..26bce46 --- /dev/null +++ b/src/types/Comment.ts @@ -0,0 +1,18 @@ +export interface Comments { + userId: `${number}` + userName: string + isDeletedUser: boolean + img: string + id: `${number}` + comment: string + stampId: number | null + stampLink: null + commentDate: string + commentRootId: string | null + commentParentId: string | null + commentUserId: `${number}` + replyToUserId: string | null + replyToUserName: string | null + editable: boolean + hasReplies: boolean +} diff --git a/src/types/Users.ts b/src/types/Users.ts new file mode 100644 index 0000000..ca42b95 --- /dev/null +++ b/src/types/Users.ts @@ -0,0 +1,119 @@ +import { Artwork, ArtworkInfo } from './Artworks' + +export enum UserXRestrict { + SAFE, + R18, + R18G, +} +export enum UserPrivacyLevel { + PUBLIC_FOR_ALL, + PUBLIC_FOR_FRIENDS, + PRIVATE, +} + +export interface User { + userId: `${number}` + name: string + image: string + imageBig: string + premium: boolean + isFollowed: boolean + isMypixiv: boolean + isBlocking: boolean + background: { + url: string | null + color: string | null + repeat: string | null + isPrivate: boolean + } | null + sketchLiveId: {} | null + partial: number + acceptRequest: boolean + sketchLives: any[] + following: number + followedBack: boolean + comment: string + commentHtml: string + webpage: string | null + social: { + twitter?: { + url: string + } + facebook?: { + url: string + } + instagram?: { + url: string + } + [key: string]: any + } + region: { + name: string + privacyLevel: UserPrivacyLevel + } | null + birthDay: { + name: string + privacyLevel: UserPrivacyLevel + } | null + gender: { + name: string + privacyLevel: UserPrivacyLevel + } | null + job: { + name: string + privacyLevel: UserPrivacyLevel + } | null + workspace: { + userWorkspacePc?: string + userWorkspaceMonitor?: string + userWorkspaceTool?: string + userWorkspaceScanner?: string + userWorkspaceTablet?: string + userWorkspaceMouse?: string + userWorkspacePrinter?: string + userWorkspaceDesktop?: string + userWorkspaceMusic?: string + userWorkspaceDesk?: string + userWorkspaceChair?: string + userWorkspaceComment?: string + wsUrl?: string + wsBigUrl?: string + } + official: boolean + group: null + illusts: ArtworkInfo[] + manga: ArtworkInfo[] + novels: ArtworkInfo[] +} + +export interface PixivUser { + id: `${number}` + pixivId: string + name: string + profileImg: string + profileImgBig: string + premium: boolean + xRestrict: UserXRestrict + adult: boolean + illustCreator: boolean + novelCreator: boolean + hideAiWorks: boolean + readingStatusEnabled: boolean + illustMaskRules: any[] + location: string + isSensitiveViewable: boolean +} + +export interface UserListItem { + userId: `${number}` + userName: string + profileImageUrl: string + userComment: string + following: boolean + followed: boolean + isBlocking: boolean + isMypixiv: boolean + illusts: ArtworkInfo[] + novels: any[] + acceptRequest: boolean +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..e319f70 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,3 @@ +export * from './Artworks' +export * from './Comment' +export * from './Users' diff --git a/src/utils/UgoiraPlayer.ts b/src/utils/UgoiraPlayer.ts new file mode 100644 index 0000000..5dcde12 --- /dev/null +++ b/src/utils/UgoiraPlayer.ts @@ -0,0 +1,610 @@ +import { Artwork } from '@/types' +import gifWorkerUrl from 'gif.js/dist/gif.worker.js?url' +import { ZipDownloader, ZipDownloaderOptions } from './ZipDownloader' + +/** + * Public options + */ +export interface UgoiraPlayerOptions { + onDownloadProgress?: ( + progress: number, + frameIndex: number, + totalFrames: number + ) => void + onDownloadComplete?: () => void + onDownloadError?: (error: Error) => void + zipDownloaderOptions?: ZipDownloaderOptions + requestTimeoutMs?: number + preferImageBitmap?: boolean + playbackRate?: number + progressiveRender?: boolean +} + +export interface UgoiraFrame { + file: string + delay: number +} +export interface UgoiraMeta { + frames: UgoiraFrame[] + mime_type: string + originalSrc: string + src: string +} + +/** Internal structures */ +interface CachedVisual { + /** kept for backward-compat paths (gif/mp4) */ + img?: HTMLImageElement + /** preferred for runtime drawing */ + bitmap?: ImageBitmap + /** object URL for cleanup */ + url: string + /** raw bytes for re-encode */ + buf: Uint8Array +} + +/** Player state */ +const enum PlayerState { + Idle, + Downloading, + Ready, + Playing, + Paused, + Destroyed, +} + +/** + * UgoiraPlayer + * @author dragon-fish + * @license MIT + */ +export class UgoiraPlayer { + // ====== private fields ====== + private _canvas?: HTMLCanvasElement + private _illust!: Artwork + private _meta?: UgoiraMeta + + private state: PlayerState = PlayerState.Idle + private isPlaying = false + + private curFrame = 0 + private lastFrameTime = 0 + private nextFrameDue = 0 + + private cached: Map = new Map() + private objectURLs: Set = new Set() + private files: Record = {} + + private zipDownloader?: ZipDownloader + private aborter?: AbortController + + private downloadProgress = 0 + private isDownloading = false + private isDownloadComplete = false + private downloadStartTime = 0 + private frameDownloadTimes: number[] = [] + private frameReady: boolean[] = [] + + private lastRenderedFrameIndex = -1 + private renderTimer: number | undefined + + // New: runtime settings + private _playbackRate = 1 + private _preferImageBitmap = true + private _progressiveRender = true + + constructor( + illust: Artwork, + public options: UgoiraPlayerOptions = {} + ) { + this._preferImageBitmap = options.preferImageBitmap ?? true + this._playbackRate = options.playbackRate ?? 1 + this._progressiveRender = options.progressiveRender ?? true + this.reset(illust) + } + + // ====== lifecycle ====== + reset(illust: Artwork) { + this.destroy() + this._canvas = undefined + this._illust = illust + + this.downloadProgress = 0 + this.isDownloading = false + this.isDownloadComplete = false + this.downloadStartTime = 0 + this.frameDownloadTimes = [] + this.frameReady = [] + this.lastRenderedFrameIndex = -1 + this.curFrame = 0 + this.lastFrameTime = 0 + this.nextFrameDue = 0 + + if (this.renderTimer) { + clearTimeout(this.renderTimer) + this.renderTimer = undefined + } + + this.state = PlayerState.Idle + } + + setupCanvas(canvas: HTMLCanvasElement) { + this._canvas = canvas + this._canvas.width = this.initWidth + this._canvas.height = this.initHeight + } + + // ====== getters (public API preserved) ====== + get isReady() { + return !!this._meta && Object.keys(this.files).length > 0 + } + get canExport() { + return this.isDownloadComplete && this.isReady + } + get downloadProgressPercent() { + return this.downloadProgress + } + get downloadStats() { + if (!this.isDownloadComplete && this.frameDownloadTimes.length === 0) { + return null + } + const totalTime = performance.now() - this.downloadStartTime + const avgFrameTime = + this.frameDownloadTimes.length > 0 + ? this.frameDownloadTimes.reduce((a, b) => a + b, 0) / + this.frameDownloadTimes.length + : 0 + + return { + totalDownloadTime: totalTime, + averageFrameTime: avgFrameTime, + totalFrames: this.frameDownloadTimes.length, + isComplete: this.isDownloadComplete, + progress: this.downloadProgress, + } + } + get isUgoira() { + return this._illust.illustType === 2 + } + get canvas() { + return this._canvas + } + get illust() { + return this._illust + } + get meta() { + return this._meta + } + get totalFrames() { + return this._meta?.frames.length ?? 0 + } + get now() { + return performance.now() + } + get initWidth() { + return this._illust.width + } + get initHeight() { + return this._illust.height + } + get mimeType() { + return this._meta?.mime_type ?? '' + } + /** New: playbackRate getter/setter */ + get playbackRate() { + return this._playbackRate + } + set playbackRate(v: number) { + this._playbackRate = Math.max(0.1, v || 1) + } + + // ====== network / assets ====== + async fetchMeta() { + this._meta = await fetch( + new URL(`/ajax/illust/${this._illust.id}/ugoira_meta`, location.href) + .href, + { + cache: 'default', + } + ).then((res) => res.json()) + return this + } + + async fetchFrames(originalQuality = false) { + if (!this._meta) { + await this.fetchMeta() + } + if (!this._meta) { + throw new Error('Failed to fetch meta') + } + return this.streamingFetchAndDrawFrames(originalQuality) + } + + /** + * Optimized streaming download + */ + private async streamingFetchAndDrawFrames(originalQuality = false) { + if (this.isDownloading) { + throw new Error('Download already in progress') + } + + this.isDownloading = true + this.state = PlayerState.Downloading + this.downloadStartTime = performance.now() + this.downloadProgress = 0 + this.frameDownloadTimes = [] + + // Abort any previous network work + this.aborter?.abort() + this.aborter = new AbortController() + + try { + const zipUrl = new URL( + this._meta![originalQuality ? 'originalSrc' : 'src'], + location.href + ).href + + if (!this.zipDownloader) { + this.zipDownloader = new ZipDownloader('') + } + this.zipDownloader.setUrl(zipUrl).setOptions({ + chunkSize: 256 * 1024, + maxConcurrentRequests: 3, + tryDecompress: true, + timeoutMs: this.options.requestTimeoutMs ?? 10000, + retries: 2, + ...this.options.zipDownloaderOptions, + }) + + const { frames } = this._meta! + const totalFrames = frames.length + let processedFrames = 0 + + this.frameReady = new Array(totalFrames).fill(false) + this.lastRenderedFrameIndex = -1 + + const result = await this.zipDownloader.streamingDownload({ + signal: this.aborter.signal, + onFileComplete: (entryWithData, info) => { + if (this.state === PlayerState.Destroyed) return + + const frameIndex = frames.findIndex( + (f) => f.file === entryWithData.fileName + ) + if (frameIndex === -1) { + console.warn( + `[UgoiraPlayer] Unknown frame: ${entryWithData.fileName}` + ) + return + } + + const frame = frames[frameIndex] + + // Store bytes & prepare visual cache lazily + this.files[frame.file] = entryWithData.data + this.frameDownloadTimes[frameIndex] = info.downloadTime + processedFrames++ + + // update progress + this.downloadProgress = (processedFrames / totalFrames) * 100 + this.options.onDownloadProgress?.( + this.downloadProgress, + frameIndex, + totalFrames + ) + + // flag ready and optionally schedule render + this.frameReady[frameIndex] = true + if (this._progressiveRender) this.scheduleNextFrame() + }, + }) + + console.info('[UgoiraPlayer] download complete', result) + + // completed + this.isDownloadComplete = true + this.isDownloading = false + this.state = PlayerState.Ready + + this.options.onDownloadComplete?.() + + return this + } catch (error) { + this.isDownloading = false + this.state = PlayerState.Idle + this.options.onDownloadError?.(error as Error) + throw error + } + } + + /** + * Sequential scheduler: render frames 0..N in order as soon as each is ready. + * If a gap is encountered, pause until the missing frame arrives. + */ + private scheduleNextFrame() { + if (!this._canvas || !this._meta) return + if (this.renderTimer) return + + const { frames } = this._meta + const nextIndex = this.lastRenderedFrameIndex + 1 + if (!this.frameReady[nextIndex]) return + + const renderSequential = async () => { + while (true) { + const idx = this.lastRenderedFrameIndex + 1 + if (idx >= frames.length) { + this.renderTimer = undefined + return + } + if (!this.frameReady[idx]) { + this.renderTimer = undefined + return + } + const frame = frames[idx] + await this.renderFrameToCanvas(idx, frame) + this.lastRenderedFrameIndex = idx + + await new Promise((resolve) => { + this.renderTimer = window.setTimeout( + () => { + this.renderTimer = undefined + resolve() + }, + Math.max(0, frame.delay / this._playbackRate) + ) + }) + } + } + + renderSequential().catch((e) => { + console.error('[UgoiraPlayer] sequential render error:', e) + this.renderTimer = undefined + }) + } + + /** Render a single frame to the canvas */ + private async renderFrameToCanvas(frameIndex: number, frame: UgoiraFrame) { + if (!this._canvas) return + const ctx = this._canvas.getContext('2d') + if (!ctx) return + + try { + const visual = await this.getVisual(frame.file) + const source = visual.bitmap ?? visual.img! + // drawImage supports both HTMLImageElement and ImageBitmap + ctx.drawImage(source as any, 0, 0, this.initWidth, this.initHeight) + // console.debug(`[UgoiraPlayer] rendered frame ${frameIndex+1}`) + } catch (error) { + console.error( + `[UgoiraPlayer] frame ${frameIndex + 1} render failed:`, + error + ) + } + } + + // ====== caching primitives ====== + private async getVisual(fileName: string): Promise { + const hit = this.cached.get(fileName) + if (hit) { + // Ensure image element fully loaded if present + if (hit.img && !(hit.img.complete && hit.img.naturalWidth > 0)) { + await new Promise((resolve, reject) => { + hit.img!.onload = () => resolve() + hit.img!.onerror = () => reject(new Error('image load error')) + }) + } + return hit + } + + const buf = this.files[fileName] + if (!buf) throw new Error(`File ${fileName} not found`) + + const blob = new Blob([new Uint8Array(buf)], { type: this.mimeType }) + const url = URL.createObjectURL(blob) + this.objectURLs.add(url) + + const visual: CachedVisual = { url, buf, img: undefined, bitmap: undefined } + + // Prefer ImageBitmap for runtime rendering; keep HTMLImageElement for encoders + if (this._preferImageBitmap && 'createImageBitmap' in window) { + try { + visual.bitmap = await createImageBitmap(blob) + } catch { + // Fallback to HTMLImageElement + } + } + + if (!visual.bitmap) { + const img = new Image() + img.src = url + await new Promise((resolve, reject) => { + img.onload = () => resolve() + img.onerror = () => reject(new Error('image load error')) + }) + visual.img = img + } + + this.cached.set(fileName, visual) + return visual + } + + /** Back-compat helper returning HTMLImageElement (may synthesize from cache) */ + private getImage(fileName: string): HTMLImageElement { + const cached = this.cached.get(fileName) + if (cached?.img) return cached.img + + const buf = this.files[fileName] + if (!buf) throw new Error(`File ${fileName} not found`) + + const blob = new Blob([new Uint8Array(buf)], { type: this.mimeType }) + const url = URL.createObjectURL(blob) + this.objectURLs.add(url) + + const img = new Image() + img.src = url + + this.cached.set(fileName, { url, buf, img, bitmap: undefined }) + return img + } + + /** Back-compat async image getter */ + private async getImageAsync(fileName: string): Promise { + const v = await this.getVisual(fileName) + if (v.img) return v.img + // need to synthesize from existing blob URL for encoders + const img = new Image() + img.src = v.url + await new Promise((resolve, reject) => { + img.onload = () => resolve() + img.onerror = () => reject(new Error('image load error')) + }) + v.img = img + return img + } + + getRealFrameSize() { + if (!this.isReady) { + throw new Error('Ugoira assets not ready, please fetch first') + } + const firstFrame = this.getImage(this.meta!.frames[0].file) + return { width: firstFrame.width, height: firstFrame.height } + } + + // ====== classic playback loop (preserved) ====== + private drawFrame() { + if (!this.canvas || !this._meta || !this.isPlaying) return + + const ctx = this.canvas.getContext('2d')! + const frame = this._meta.frames[this.curFrame] + const delay = Math.max(0, frame.delay / this._playbackRate) + + const now = this.now + if (this.nextFrameDue === 0) this.nextFrameDue = now + delay + + if (now >= this.nextFrameDue) { + this.lastFrameTime = now + this.curFrame = (this.curFrame + 1) % this.totalFrames + this.nextFrameDue = now + delay + } + + // Render current frame + const img = this.getImage(frame.file) + ctx.drawImage(img, 0, 0, this.initWidth, this.initHeight) + + requestAnimationFrame(() => this.drawFrame()) + } + + // ====== controls ====== + play() { + this.isPlaying = true + this.lastFrameTime = this.now + this.nextFrameDue = 0 + this.state = PlayerState.Playing + this.drawFrame() + } + + pause() { + this.isPlaying = false + if (this.state !== PlayerState.Destroyed) this.state = PlayerState.Paused + } + + /** Cancel any in-flight downloads */ + cancelDownload() { + this.aborter?.abort() + } + + destroy() { + this.pause() + + if (this.renderTimer) { + clearTimeout(this.renderTimer) + this.renderTimer = undefined + } + + this.cancelDownload() + + // Revoke URLs & clear caches + this.objectURLs.forEach((url) => URL.revokeObjectURL(url)) + this.objectURLs.clear() + + this.cached.clear() + this.files = {} + + this._meta = undefined + this.zipDownloader = undefined + this.isDownloading = false + this.isDownloadComplete = false + this.downloadProgress = 0 + this.downloadStartTime = 0 + this.frameDownloadTimes = [] + this.frameReady = [] + this.lastRenderedFrameIndex = -1 + + this.state = PlayerState.Destroyed + } + + // ====== encoders ====== + private async genGifEncoder() { + const { width, height } = this.getRealFrameSize() + const GifJs = (await import('gif.js')).default + return new GifJs({ + debug: import.meta.env.DEV, + workers: 5, + workerScript: gifWorkerUrl, + width, + height, + }) + } + + async renderGif(): Promise { + if (!this.canExport) { + throw new Error( + 'Cannot export: download not complete or assets not ready' + ) + } + + const encoder = await this.genGifEncoder() + const frames = this._meta!.frames + + // Prepare HTMLImageElements for gif.js + const imageList = await Promise.all( + frames.map((f) => this.getImageAsync(f.file)) + ) + + return new Promise((resolve, reject) => { + try { + imageList.forEach((img, idx) => { + encoder.addFrame(img, { delay: Math.max(0, frames[idx].delay) }) + }) + encoder.on('finished', (blob: Blob) => { + // Best-effort worker cleanup (gif.js specific) + // @ts-ignore + encoder.freeWorkers?.forEach?.((w: Worker) => w?.terminate?.()) + resolve(blob) + }) + encoder.on('abort', () => reject(new Error('GIF encoding aborted'))) + encoder.render() + } catch (e) { + reject(e as Error) + } + }) + } + + async renderMp4() { + if (!this.canExport) { + throw new Error( + 'Cannot export: download not complete or assets not ready' + ) + } + + const { width, height } = this.getRealFrameSize() + const frames = this._meta!.frames.map((i) => ({ + data: this.getImage(i.file).src!, + duration: Math.max(0, i.delay), + })) + + const { encode } = await import('modern-mp4') + const buf = await encode({ frames, width, height, audio: false }) + return new Blob([buf], { type: 'video/mp4' }) + } +} diff --git a/src/utils/ZipDownloader.ts b/src/utils/ZipDownloader.ts new file mode 100644 index 0000000..ce6f3db --- /dev/null +++ b/src/utils/ZipDownloader.ts @@ -0,0 +1,1002 @@ +/** + * ZipDownloader - 支持分片下载和缓存的 ZIP 文件下载器 + * + * 使用示例: + * + * // 使用默认配置(128KB 分片,32KB 初始尾部抓取) + * const downloader = new ZipDownloader('https://example.com/file.zip') + * + * // 自定义分片大小和尾部抓取策略 + * const downloader = new ZipDownloader('https://example.com/file.zip', { + * chunkSize: 256 * 1024, // 256KB 分片 + * initialTailSize: 16 * 1024, // 16KB 初始尾部抓取 + * maxTailSize: 128 * 1024, // 128KB 最大尾部抓取 + * timeoutMs: 10000, // 10秒超时 + * retries: 3, // 重试3次 + * lruBytes: 32 * 1024 * 1024, // 32MB 缓存 + * parallelProbe: 4, // 4个并发探测 + * maxConcurrentRequests: 6, // 最大6个并发请求 + * tryDecompress: true // 尝试解压 + * }) + * + * // 获取文件列表 + * const overview = await downloader.getCentralDirectory() + * + * // 下载单个文件 + * const result = await downloader.downloadByIndex(0) + * const fileData = result.bytes + * + * // 流式下载模式(从头开始下载整个zip,每完成一个文件就回调) + * const result = await downloader.streamingDownload({ + * onFileComplete: (entryWithData, info) => { + * console.log(`文件完成: ${entryWithData.fileName}`) + * console.log(`MIME类型: ${info.mimeType}`) + * console.log(`数据大小: ${entryWithData.data.length} 字节`) + * // 处理文件数据 entryWithData.data + * }, + * onProgress: (downloaded, total) => { + * console.log(`下载进度: ${(downloaded / total * 100).toFixed(2)}%`) + * } + * }) + */ +/* + * ZipDownloader (refactored) — a smaller, composable ZIP range-downloader + * + * Goals of this refactor: + * - Keep the public API backwards-compatible with your original class. + * - Split responsibilities into focused helpers to shrink cognitive size. + * - Make network, caching, parsing, and streaming parts swappable/testable. + * - Trim incidental complexity; add a `debug` flag instead of console noise. + * - Keep zero-dependency runtime (browser/Workers/Node via injected fetch). + * + * Public API preserved: + * - constructor(url, options?) + * - setOptions(partial) + * - getSize(signal?) + * - getCentralDirectory(signal?) + * - downloadByIndex(index, signal?) + * - downloadByPath(path, signal?) + * - getDataRanges(signal?) + * - streamingDownload({ onFileComplete?, onProgress?, chunkSize?, signal? }) + * - cleanup() + * - setUrl(url) + */ + +// --------------------------- Types --------------------------- +export type FetchLike = ( + input: RequestInfo | URL, + init?: RequestInit +) => Promise + +export interface ZipDownloaderOptions { + fetch?: FetchLike + timeoutMs?: number + retries?: number + lruBytes?: number + parallelProbe?: number + maxConcurrentRequests?: number + tryDecompress?: boolean + chunkSize?: number + initialTailSize?: number + maxTailSize?: number + debug?: boolean +} + +export interface ZipEntry { + index: number + fileName: string + compressedSize: number + uncompressedSize: number + crc32: number + compressionMethod: number // 0=store, 8=deflate + generalPurposeBitFlag: number + localHeaderOffset: number + centralHeaderOffset: number + requiresZip64: boolean + mimeType?: string +} + +export interface ZipEntryWithData extends ZipEntry { + data: Uint8Array +} + +export interface ZipOverview { + url: string + contentLength: number + centralDirectoryOffset: number + centralDirectorySize: number + entryCount: number + entries: ZipEntry[] +} + +export interface DataRange { + index: number + fileName: string + dataStart: number + dataLength: number +} + +// ----------------------- Small utilities ----------------------- +const TEXT_DECODER = new TextDecoder() + +const SIG = { + EOCD: 0x06054b50, + ZIP64_EOCD_LOCATOR: 0x07064b50, + ZIP64_EOCD: 0x06064b50, + CD_FILE_HEADER: 0x02014b50, + LOCAL_FILE_HEADER: 0x04034b50, +} as const + +type Mutable = { -readonly [K in keyof T]: T[K] } + +class ConcurrencyLimiter { + private running = 0 + private q: Array<() => void> = [] + constructor(private max: number) {} + async acquire(): Promise { + if (this.running < this.max) { + this.running++ + return + } + return new Promise((res) => this.q.push(res)) + } + release() { + this.running-- + if (this.q.length) { + this.running++ + this.q.shift()!() + } + } + async run(fn: () => Promise): Promise { + await this.acquire() + try { + return await fn() + } finally { + this.release() + } + } +} + +class ByteLRU { + private map = new Map() + private total = 0 + constructor(private maxBytes: number) {} + get(k: string) { + const v = this.map.get(k) + if (!v) return + this.map.delete(k) + this.map.set(k, v) + return v + } + set(k: string, v: Uint8Array) { + if (v.byteLength > this.maxBytes) return + const old = this.map.get(k) + if (old) { + this.total -= old.byteLength + this.map.delete(k) + } + this.map.set(k, v) + this.total += v.byteLength + while (this.total > this.maxBytes && this.map.size) { + const [oldK, oldV] = this.map.entries().next().value as [ + string, + Uint8Array, + ] + this.map.delete(oldK) + this.total -= oldV.byteLength + } + } + resize(n: number) { + this.maxBytes = n + while (this.total > this.maxBytes && this.map.size) { + const [k, v] = this.map.entries().next().value! + this.map.delete(k) + this.total -= v.byteLength + } + } +} + +const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms)) + +async function withRetries( + fn: () => Promise, + retries: number, + baseDelay = 200 +): Promise { + let n = 0 + for (;;) { + try { + return await fn() + } catch (e) { + if (n++ >= retries) throw e + await sleep(baseDelay * 2 ** (n - 1) * (1 + Math.random() * 0.2)) + } + } +} + +function withTimeout(p: Promise, ms?: number): Promise { + if (!ms || ms <= 0) return p + return new Promise((resolve, reject) => { + const t = setTimeout(() => reject(new Error(`Timeout ${ms}ms`)), ms) + p.then( + (v) => { + clearTimeout(t) + resolve(v) + }, + (e) => { + clearTimeout(t) + reject(e) + } + ) + }) +} + +function findSignatureFromEnd(buf: Uint8Array, signature: number): number { + const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength) + for (let i = buf.byteLength - 4; i >= 0; i--) + if (dv.getUint32(i, true) === signature) return i + return -1 +} + +function readAscii(dv: DataView, offset: number, length: number): string { + return TEXT_DECODER.decode( + new Uint8Array(dv.buffer, dv.byteOffset + offset, length) + ) +} + +// -------------------- MIME detection (lean) -------------------- +const MIME_TYPES: Record = { + png: 'image/png', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + gif: 'image/gif', + webp: 'image/webp', + bmp: 'image/bmp', + svg: 'image/svg+xml', + ico: 'image/x-icon', + tiff: 'image/tiff', + tif: 'image/tiff', + mp4: 'video/mp4', + webm: 'video/webm', + avi: 'video/x-msvideo', + mov: 'video/quicktime', + wmv: 'video/x-ms-wmv', + flv: 'video/x-flv', + mkv: 'video/x-matroska', + mp3: 'audio/mpeg', + wav: 'audio/wav', + ogg: 'audio/ogg', + aac: 'audio/aac', + flac: 'audio/flac', + m4a: 'audio/mp4', + pdf: 'application/pdf', + doc: 'application/msword', + docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + xls: 'application/vnd.ms-excel', + xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ppt: 'application/vnd.ms-powerpoint', + pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + txt: 'text/plain', + html: 'text/html', + htm: 'text/html', + css: 'text/css', + js: 'application/javascript', + json: 'application/json', + xml: 'application/xml', + csv: 'text/csv', + zip: 'application/zip', + rar: 'application/vnd.rar', + '7z': 'application/x-7z-compressed', + tar: 'application/x-tar', + gz: 'application/gzip', + exe: 'application/x-msdownload', + dmg: 'application/x-apple-diskimage', + iso: 'application/x-iso9660-image', +} + +function getMimeTypeFromExtension(name: string): string { + const ext = name.split('.').pop()?.toLowerCase() + return ext + ? MIME_TYPES[ext] || 'application/octet-stream' + : 'application/octet-stream' +} + +function getMimeFromMagic(u8: Uint8Array): string { + if (u8.length < 4) return 'application/octet-stream' + const h = Array.from(u8.slice(0, 16)) + .map((b) => b.toString(16).padStart(2, '0')) + .join('') + if (h.startsWith('89504e470d0a1a0a')) return 'image/png' + if (h.startsWith('ffd8ff')) return 'image/jpeg' + if (h.startsWith('47494638')) return 'image/gif' + if (h.startsWith('25504446')) return 'application/pdf' + if ( + h.startsWith('504b0304') || + h.startsWith('504b0506') || + h.startsWith('504b0708') + ) + return 'application/zip' + // webp/wav quick checks + if (h.startsWith('52494646') && u8.length >= 12) { + const tag = String.fromCharCode(...u8.slice(8, 12)) + if (tag === 'WEBP') return 'image/webp' + if (tag === 'WAVE') return 'audio/wav' + } + // mp4 ftyp + if (u8.length >= 8) { + const size = new DataView(u8.buffer, u8.byteOffset, 4).getUint32(0, false) + if (size >= 8 && u8.length >= size) { + const type = new TextDecoder().decode(u8.slice(4, 8)) + if (type === 'ftyp') return 'video/mp4' + } + } + return 'application/octet-stream' +} + +function getMimeType(fileName: string, data?: Uint8Array): string { + if (data && data.length) { + const m = getMimeFromMagic(data) + if (m !== 'application/octet-stream') return m + } + return getMimeTypeFromExtension(fileName) +} + +// -------------------- Decompression helper -------------------- +async function maybeDecompress( + method: number, + data: Uint8Array, + tryDecompress: boolean +): Promise<{ bytes: Uint8Array; isDecompressed: boolean; method: number }> { + if (!tryDecompress) return { bytes: data, isDecompressed: false, method } + if (method === 0) return { bytes: data, isDecompressed: true, method } + const DS: any = (globalThis as any).DecompressionStream + if (method === 8 && typeof DS === 'function') { + const ds = new DS('deflate-raw') + const res = new Response( + new Blob([data as Uint8Array]).stream().pipeThrough(ds) + ) + const ab = await res.arrayBuffer() + return { bytes: new Uint8Array(ab), isDecompressed: true, method } + } + return { bytes: data, isDecompressed: false, method } +} + +// -------------------- Networking layer -------------------- +class RangeRequestManager { + private inflight = new Map>() + constructor( + private url: string, + private fetcher: FetchLike, + private timeoutMs: number, + private retries: number, + private limiter: ConcurrencyLimiter, + private cache: ByteLRU + ) {} + + setUrl(url: string) { + this.url = url + this.inflight.clear() + } + setTimeout(ms: number) { + this.timeoutMs = ms + } + setRetries(n: number) { + this.retries = n + } + setLimiter(l: ConcurrencyLimiter) { + this.limiter = l + } + setCache(c: ByteLRU) { + this.cache = c + } + + async headSize(signal?: AbortSignal): Promise { + const doHead = async () => { + const res = await withTimeout( + this.fetcher(this.url, { method: 'HEAD', signal }), + this.timeoutMs + ) + if (!res.ok) throw new Error(`HEAD ${res.status}`) + const len = res.headers.get('content-length') + if (!len) throw new Error('Missing content-length') + const n = Number(len) + if (!Number.isFinite(n) || n < 0) + throw new Error(`Bad content-length: ${len}`) + return n + } + const doRange = async () => { + const res = await withTimeout( + this.fetcher(this.url, { headers: { Range: 'bytes=0-0' }, signal }), + this.timeoutMs + ) + const cr = res.headers.get('content-range') + if (!cr) throw new Error('Missing content-range') + const m = cr.match(/\/(\d+)$/) + if (!m) throw new Error(`Bad content-range: ${cr}`) + return Number(m[1]) + } + return withRetries(async () => { + try { + return await doHead() + } catch { + return await doRange() + } + }, this.retries) + } + + async range( + start: number, + end: number, + signal?: AbortSignal + ): Promise { + const cacheKey = `r:${start}-${end}` + const hit = this.cache.get(cacheKey) + if (hit) return hit + + const inflightKey = `f:${start}-${end}` + if (!this.inflight.has(inflightKey)) { + this.inflight.set( + inflightKey, + this.limiter + .run(async () => { + const res = await withRetries(async () => { + const r = await withTimeout( + this.fetcher(this.url, { + headers: { Range: `bytes=${start}-${end}` }, + signal, + }), + this.timeoutMs + ) + if (!(r.status === 206 || r.status === 200)) + throw new Error(`HTTP ${r.status} for ${start}-${end}`) + return r + }, this.retries) + const u8 = new Uint8Array(await res.arrayBuffer()) + this.cache.set(cacheKey, u8) + return u8 + }) + .catch((err) => { + this.inflight.delete(inflightKey) + throw err + }) + ) + } + return this.inflight.get(inflightKey)! + } +} + +// ------------------------ ZIP parsing ------------------------ +class ZipParser { + constructor( + private rangeHelper: RangeRequestManager, + private opts: Required< + Pick< + ZipDownloaderOptions, + 'initialTailSize' | 'maxTailSize' | 'chunkSize' + > + > & { tryDecompress: boolean } + ) {} + + async overview(signal?: AbortSignal, url?: string): Promise { + const contentLength = await this.rangeHelper.headSize(signal) + + // progressive tail fetch + let tailSize = Math.min(this.opts.initialTailSize, contentLength) + let tailStart = contentLength - tailSize + let tail = await this.rangeHelper.range( + tailStart, + contentLength - 1, + signal + ) + let eocdPos = findSignatureFromEnd(tail, SIG.EOCD) + + while (eocdPos === -1 && tailSize < contentLength) { + const newTailSize = Math.min( + tailSize + this.opts.initialTailSize, + this.opts.maxTailSize, + contentLength + ) + if (newTailSize === tailSize) break + tailSize = newTailSize + tailStart = contentLength - tailSize + tail = await this.rangeHelper.range(tailStart, contentLength - 1, signal) + eocdPos = findSignatureFromEnd(tail, SIG.EOCD) + } + if (eocdPos === -1) throw new Error('EOCD not found') + + const tailDV = new DataView(tail.buffer, tail.byteOffset, tail.byteLength) + let cdCount = tailDV.getUint16(eocdPos + 10, true) + let cdSize = tailDV.getUint32(eocdPos + 12, true) + let cdOffset = tailDV.getUint32(eocdPos + 16, true) + + const needsZip64 = + cdCount === 0xffff || cdSize === 0xffffffff || cdOffset === 0xffffffff + if (needsZip64) { + const locPos = findSignatureFromEnd(tail, SIG.ZIP64_EOCD_LOCATOR) + if (locPos === -1) throw new Error('ZIP64 locator missing') + const z64Off = Number(tailDV.getBigUint64(locPos + 8, true)) + const z64Hdr = await this.rangeHelper.range( + z64Off, + z64Off + 160 - 1, + signal + ) + const dv = new DataView( + z64Hdr.buffer, + z64Hdr.byteOffset, + z64Hdr.byteLength + ) + if (dv.getUint32(0, true) !== SIG.ZIP64_EOCD) + throw new Error('ZIP64 EOCD signature mismatch') + cdCount = Number(dv.getBigUint64(32, true)) + cdSize = Number(dv.getBigUint64(40, true)) + cdOffset = Number(dv.getBigUint64(48, true)) + } + + const cdBuf = await this.rangeHelper.range( + cdOffset, + cdOffset + cdSize - 1, + signal + ) + const cdDV = new DataView(cdBuf.buffer, cdBuf.byteOffset, cdBuf.byteLength) + + const entries: ZipEntry[] = [] + for (let p = 0, i = 0; p < cdBuf.byteLength && i < cdCount; i++) { + if (cdDV.getUint32(p, true) !== SIG.CD_FILE_HEADER) break + const flags = cdDV.getUint16(p + 8, true) + const method = cdDV.getUint16(p + 10, true) + const crc32 = cdDV.getUint32(p + 16, true) + const comp32 = cdDV.getUint32(p + 20, true) + const uncomp32 = cdDV.getUint32(p + 24, true) + const fnLen = cdDV.getUint16(p + 28, true) + const extraLen = cdDV.getUint16(p + 30, true) + const cmtLen = cdDV.getUint16(p + 32, true) + const lho32 = cdDV.getUint32(p + 42, true) + const name = readAscii(cdDV, p + 46, fnLen) + + let compressedSize = comp32 + let uncompressedSize = uncomp32 + let localHeaderOffset = lho32 + let requiresZip64 = false + + const extraStart = p + 46 + fnLen + const extra = new DataView( + cdBuf.buffer, + cdBuf.byteOffset + extraStart, + extraLen + ) + for (let ep = 0; ep + 4 <= extraLen; ) { + const id = extra.getUint16(ep, true) + const size = extra.getUint16(ep + 2, true) + const s = ep + 4 + if (id === 0x0001) { + // ZIP64 + requiresZip64 = true + let z = s + if (uncompressedSize === 0xffffffff && z + 8 <= s + size) { + uncompressedSize = Number(extra.getBigUint64(z, true)) + z += 8 + } + if (compressedSize === 0xffffffff && z + 8 <= s + size) { + compressedSize = Number(extra.getBigUint64(z, true)) + z += 8 + } + if (localHeaderOffset === 0xffffffff && z + 8 <= s + size) { + localHeaderOffset = Number(extra.getBigUint64(z, true)) + z += 8 + } + } + ep += 4 + size + } + + entries.push({ + index: i, + fileName: name, + compressedSize, + uncompressedSize, + crc32, + compressionMethod: method, + generalPurposeBitFlag: flags, + localHeaderOffset, + centralHeaderOffset: cdOffset + p, + requiresZip64, + mimeType: getMimeTypeFromExtension(name), + }) + + p = extraStart + extraLen + cmtLen + } + + return { + url: url ?? '', + contentLength, + centralDirectoryOffset: cdOffset, + centralDirectorySize: cdSize, + entryCount: entries.length, + entries, + } + } + + async probeLocalHeader( + entry: ZipEntry, + signal?: AbortSignal + ): Promise { + const probe = await this.rangeHelper.range( + entry.localHeaderOffset, + entry.localHeaderOffset + 30 + this.opts.chunkSize - 1, + signal + ) + const dv = new DataView(probe.buffer, probe.byteOffset, probe.byteLength) + if (dv.getUint32(0, true) !== SIG.LOCAL_FILE_HEADER) + throw new Error( + `Local header signature mismatch at ${entry.localHeaderOffset}` + ) + const fnLen = dv.getUint16(26, true) + const extraLen = dv.getUint16(28, true) + const dataStart = entry.localHeaderOffset + 30 + fnLen + extraLen + return { + index: entry.index, + fileName: entry.fileName, + dataStart, + dataLength: entry.compressedSize, + } + } +} + +// ---------------------- Public class ---------------------- +export class ZipDownloader { + private opts: Required + private cache: ByteLRU + private limiter: ConcurrencyLimiter + private rangeHelper: RangeRequestManager + private parser: ZipParser + + private inflight = new Map>() + private overview?: ZipOverview + private dataRanges?: DataRange[] + private pathToIndex = new Map() + + constructor( + private url: string, + options: ZipDownloaderOptions = {} + ) { + this.opts = { + fetch: options.fetch ?? fetch.bind(globalThis), + timeoutMs: options.timeoutMs ?? 15000, + retries: options.retries ?? 2, + lruBytes: options.lruBytes ?? 16 * 1024 * 1024, + parallelProbe: options.parallelProbe ?? 4, + maxConcurrentRequests: options.maxConcurrentRequests ?? 6, + tryDecompress: options.tryDecompress ?? true, + chunkSize: options.chunkSize ?? 128 * 1024, + initialTailSize: options.initialTailSize ?? 16 * 1024, + maxTailSize: options.maxTailSize ?? 128 * 1024, + debug: options.debug ?? false, + } + this.cache = new ByteLRU(this.opts.lruBytes) + this.limiter = new ConcurrencyLimiter(this.opts.maxConcurrentRequests) + this.rangeHelper = new RangeRequestManager( + this.url, + this.opts.fetch, + this.opts.timeoutMs, + this.opts.retries, + this.limiter, + this.cache + ) + this.parser = new ZipParser(this.rangeHelper, { + initialTailSize: this.opts.initialTailSize, + maxTailSize: this.opts.maxTailSize, + chunkSize: this.opts.chunkSize, + tryDecompress: this.opts.tryDecompress, + }) + } + + setOptions(partial: ZipDownloaderOptions): this { + const next: Mutable> = { + ...this.opts, + ...partial, + fetch: partial.fetch ?? this.opts.fetch, + } + const changedConcurrency = + next.maxConcurrentRequests !== this.opts.maxConcurrentRequests + const changedLRU = next.lruBytes !== this.opts.lruBytes + + this.opts = next + + if (changedLRU) { + this.cache.resize(this.opts.lruBytes) + } + if (changedConcurrency) { + this.limiter = new ConcurrencyLimiter(this.opts.maxConcurrentRequests) + this.rangeHelper.setLimiter(this.limiter) + } + + this.rangeHelper.setTimeout(this.opts.timeoutMs) + this.rangeHelper.setRetries(this.opts.retries) + this.parser = new ZipParser(this.rangeHelper, { + initialTailSize: this.opts.initialTailSize, + maxTailSize: this.opts.maxTailSize, + chunkSize: this.opts.chunkSize, + tryDecompress: this.opts.tryDecompress, + }) + return this + } + + async getSize(signal?: AbortSignal): Promise { + const k = 'size' + if (!this.inflight.has(k)) + this.inflight.set( + k, + this.rangeHelper.headSize(signal).catch((e) => { + this.inflight.delete(k) + throw e + }) + ) + return this.inflight.get(k)! + } + + async getCentralDirectory(signal?: AbortSignal): Promise { + if (this.overview) return this.overview + const k = 'overview' + if (!this.inflight.has(k)) { + this.inflight.set( + k, + this.parser + .overview(signal, this.url) + .then((ov) => { + this.overview = { ...ov, url: this.url } + ov.entries.forEach((e) => this.pathToIndex.set(e.fileName, e.index)) + return this.overview! + }) + .catch((e) => { + this.inflight.delete(k) + throw e + }) + ) + } + return this.inflight.get(k)! + } + + async downloadByIndex(index: number, signal?: AbortSignal) { + const ov = await this.getCentralDirectory(signal) + if (index < 0 || index >= ov.entryCount) + throw new Error(`index out of range: ${index}`) + const e = ov.entries[index] + const ranges = await this._ensureDataRanges(signal) + const r = ranges[index] + const key = `entry:${index}:${r.dataStart}-${r.dataLength}` + + if (!this.inflight.has(key)) { + this.inflight.set( + key, + (async () => { + const body = await this.rangeHelper.range( + r.dataStart, + r.dataStart + r.dataLength - 1, + signal + ) + const { bytes, isDecompressed, method } = await maybeDecompress( + e.compressionMethod, + body, + this.opts.tryDecompress + ) + const mimeTypeFromExtension = getMimeTypeFromExtension(e.fileName) + const mimeType = getMimeType(e.fileName, bytes) + return { + fileName: e.fileName, + index: e.index, + bytes, + isDecompressed, + method, + compressedSize: e.compressedSize, + uncompressedSize: e.uncompressedSize, + mimeType, + mimeTypeFromExtension, + } + })().catch((err) => { + this.inflight.delete(key) + throw err + }) + ) + } + return this.inflight.get(key)! + } + + async downloadByPath(path: string, signal?: AbortSignal) { + const ov = await this.getCentralDirectory(signal) + const idx = + this.pathToIndex.get(path) ?? + ov.entries.find((e) => e.fileName === path)?.index + if (idx == null) throw new Error(`file not found in zip: ${path}`) + return this.downloadByIndex(idx, signal) + } + + private async _ensureDataRanges(signal?: AbortSignal): Promise { + if (this.dataRanges) return this.dataRanges + const k = 'ranges' + if (!this.inflight.has(k)) { + this.inflight.set( + k, + (async () => { + const ov = await this.getCentralDirectory(signal) + const out: DataRange[] = new Array(ov.entryCount) + const limit = Math.min( + this.opts.parallelProbe, + this.opts.maxConcurrentRequests + ) + const sem = new ConcurrencyLimiter(limit) + const batchSize = Math.min(limit, 8) + const indices = ov.entries.map((e) => e.index) + for (let i = 0; i < indices.length; i += batchSize) { + const batch = indices.slice(i, i + batchSize) + await Promise.all( + batch.map((idx) => + sem.run(async () => { + out[idx] = await this.parser.probeLocalHeader( + ov.entries[idx], + signal + ) + }) + ) + ) + } + for (let j = 0; j < out.length; j++) + if (!out[j]) { + const e = ov.entries[j] + out[j] = { + index: e.index, + fileName: e.fileName, + dataStart: e.localHeaderOffset + 30, + dataLength: e.compressedSize, + } + } + this.dataRanges = out + return out + })().catch((e) => { + this.inflight.delete(k) + throw e + }) + ) + } + return this.inflight.get(k)! + } + + cleanup() { + this.inflight.clear() + this.cache = new ByteLRU(this.opts.lruBytes) + this.limiter = new ConcurrencyLimiter(this.opts.maxConcurrentRequests) + this.rangeHelper.setCache(this.cache) + this.rangeHelper.setLimiter(this.limiter) + this.overview = undefined + this.dataRanges = undefined + this.pathToIndex.clear() + return this + } + + setUrl(url: string) { + if (this.url !== url) { + this.url = url + this.rangeHelper.setUrl(url) + this.cleanup() + } + return this + } + + async getDataRanges(signal?: AbortSignal) { + return this._ensureDataRanges(signal) + } + + async streamingDownload(params: { + onFileComplete?: ( + entry: ZipEntryWithData, + info: { + downloadTime: number + method: number + isDecompressed: boolean + mimeType: string + physicalIndex: number + } + ) => void + onProgress?: (downloaded: number, total: number) => void + chunkSize?: number + signal?: AbortSignal + }): Promise<{ + totalFiles: number + completedFiles: number + entries: ZipEntryWithData[] + }> { + const { + onFileComplete, + onProgress, + chunkSize = this.opts.chunkSize, + signal, + } = params + const t0 = performance.now() + const ov = await this.getCentralDirectory(signal) + + const sorted = ov.entries + .filter((e) => e.compressedSize > 0) + .sort((a, b) => a.localHeaderOffset - b.localHeaderOffset) + if (sorted.length === 0) + return { totalFiles: 0, completedFiles: 0, entries: [] } + + const chunks: { start: number; end: number; data: Uint8Array }[] = [] + const extractRange = (start: number, length: number) => { + const out = new Uint8Array(length) + let written = 0, + cursor = start + for (const c of chunks) { + if (c.end < cursor) continue + if (c.start > start + length - 1) break + const s = Math.max(c.start, cursor) + const e = Math.min(c.end, start + length - 1) + const off = s - c.start + const len = e - s + 1 + out.set(c.data.subarray(off, off + len), written) + written += len + cursor += len + if (written >= length) break + } + return out + } + + const parseLocalHeader = (data: Uint8Array, offset: number) => { + const dv = new DataView(data.buffer, data.byteOffset + offset) + if (dv.getUint32(0, true) !== SIG.LOCAL_FILE_HEADER) return null + const fn = dv.getUint16(26, true), + ex = dv.getUint16(28, true) + return { headerSize: 30 + fn + ex } + } + + let downloaded = 0 + const complete: ZipEntryWithData[] = [] + const done = new Set() + + while (downloaded < ov.contentLength) { + if (signal?.aborted) throw new Error('Aborted') + const start = downloaded + const end = Math.min(start + chunkSize - 1, ov.contentLength - 1) + const buf = await this.rangeHelper.range(start, end, signal) + chunks.push({ start, end, data: buf }) + downloaded = end + 1 + onProgress?.(downloaded, ov.contentLength) + + for (const entry of sorted) { + if (done.has(entry.index)) continue + const localHeaderMin = entry.localHeaderOffset + 30 + if (downloaded < localHeaderMin) continue + const headerData = extractRange( + entry.localHeaderOffset, + Math.min(30 + 1024, downloaded - entry.localHeaderOffset) + ) + const header = parseLocalHeader(headerData, 0) + if (!header) continue + const dataStart = entry.localHeaderOffset + header.headerSize + const dataEnd = dataStart + entry.compressedSize + if (downloaded < dataEnd) continue + + const comp = extractRange(dataStart, entry.compressedSize) + const { bytes, isDecompressed, method } = await maybeDecompress( + entry.compressionMethod, + comp, + this.opts.tryDecompress + ) + const mimeType = getMimeType(entry.fileName, bytes) + const item: ZipEntryWithData = { ...entry, data: bytes } + onFileComplete?.(item, { + downloadTime: performance.now() - t0, + method, + isDecompressed, + mimeType, + physicalIndex: entry.index, + }) + done.add(entry.index) + complete.push(item) + } + } + + return { + totalFiles: sorted.length, + completedFiles: complete.length, + entries: complete, + } + } +} diff --git a/src/utils/ajax.ts b/src/utils/ajax.ts new file mode 100644 index 0000000..12ba3ac --- /dev/null +++ b/src/utils/ajax.ts @@ -0,0 +1,41 @@ +import { AxiosRequestConfig } from 'axios' +import nprogress from 'nprogress' + +export const ajax = axios.create({ + timeout: 15 * 1000, + headers: { + 'Content-Type': 'application/json', + }, +}) +ajax.interceptors.request.use((config) => { + nprogress.start() + return config +}) +ajax.interceptors.response.use( + (res) => { + nprogress.done() + return res + }, + (err) => { + nprogress.done() + return Promise.reject(err) + } +) + +export const ajaxPostWithFormData = ( + url: string, + data: + | string + | string[][] + | Record + | URLSearchParams + | undefined, + config?: AxiosRequestConfig +) => + ajax.post(url, new URLSearchParams(data).toString(), { + ...config, + headers: { + ...config?.headers, + 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', + }, + }) diff --git a/src/utils/artworkActions.ts b/src/utils/artworkActions.ts new file mode 100644 index 0000000..f0bdcf1 --- /dev/null +++ b/src/utils/artworkActions.ts @@ -0,0 +1,35 @@ +import { ajax, ajaxPostWithFormData } from '@/utils/ajax' +import { ArtworkInfo, ArtworkInfoOrAd } from '@/types' + +export function sortArtList( + obj: Record +): T[] { + return Object.values(obj).sort((a, b) => +b.id - +a.id) +} + +export function isArtwork(item: ArtworkInfoOrAd): item is ArtworkInfo { + return Object.keys(item).includes('id') +} + +export async function addBookmark( + illust_id: number | `${number}` +): Promise { + return ( + await ajax.post('/ajax/illusts/bookmarks/add', { + illust_id, + restrict: 0, + comment: '', + tags: [], + }) + ).data +} + +export async function removeBookmark( + bookmark_id: number | `${number}` +): Promise { + return ( + await ajaxPostWithFormData('/ajax/illusts/bookmarks/delete', { + bookmark_id: '' + bookmark_id, + }) + ).data +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..f1db360 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,34 @@ +import { ArtworkInfo } from '@/types' + +export * from './artworkActions' +export * from './userActions' + +export const defaultArtwork: ArtworkInfo = { + id: '0', + title: '', + description: '', + createDate: '', + updateDate: '', + illustType: 0, + restrict: 0, + xRestrict: 0, + sl: 0, + userId: '0', + userName: '', + alt: '', + width: 0, + height: 0, + pageCount: 0, + isBookmarkable: false, + bookmarkData: null, + titleCaptionTranslation: { + workTitle: null, + workCaption: null, + }, + isUnlisted: false, + url: '', + tags: [], + profileImageUrl: '', + type: 'illust', + aiType: 1, +} diff --git a/src/utils/setTitle.ts b/src/utils/setTitle.ts new file mode 100644 index 0000000..4e9f1f1 --- /dev/null +++ b/src/utils/setTitle.ts @@ -0,0 +1,8 @@ +import { PROJECT_NAME, PROJECT_TAGLINE } from '@/config' + +export function setTitle(...args: (string | number | null | undefined)[]) { + return (document.title = [ + ...args.filter((i) => i !== null && typeof i !== 'undefined'), + `${PROJECT_NAME} - ${PROJECT_TAGLINE}`, + ].join(' | ')) +} diff --git a/src/utils/userActions.ts b/src/utils/userActions.ts new file mode 100644 index 0000000..e3cc58a --- /dev/null +++ b/src/utils/userActions.ts @@ -0,0 +1,28 @@ +import { ajaxPostWithFormData } from '@/utils/ajax' + +export async function addUserFollow( + user_id: number | `${number}` +): Promise { + return ( + await ajaxPostWithFormData(`/bookmark_add.php`, { + mode: 'add', + type: 'user', + user_id: '' + user_id, + tag: '', + restrict: '0', + format: 'json', + }) + ).data +} + +export async function removeUserFollow( + user_id: number | `${number}` +): Promise { + return ( + await ajaxPostWithFormData(`/rpc_group_setting.php`, { + mode: 'del', + type: 'bookuser', + id: '' + user_id, + }) + ).data +} diff --git a/src/view/404.vue b/src/view/404.vue new file mode 100644 index 0000000..0f05116 --- /dev/null +++ b/src/view/404.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/view/_debug/zip.vue b/src/view/_debug/zip.vue new file mode 100644 index 0000000..77e2d4f --- /dev/null +++ b/src/view/_debug/zip.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/view/about.vue b/src/view/about.vue new file mode 100644 index 0000000..5bd40b8 --- /dev/null +++ b/src/view/about.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/view/artworks.vue b/src/view/artworks.vue new file mode 100644 index 0000000..5e09d67 --- /dev/null +++ b/src/view/artworks.vue @@ -0,0 +1,462 @@ + + + + + diff --git a/src/view/discovery.vue b/src/view/discovery.vue new file mode 100644 index 0000000..d225b0e --- /dev/null +++ b/src/view/discovery.vue @@ -0,0 +1,212 @@ + + + + + \ No newline at end of file diff --git a/src/view/following-latest.vue b/src/view/following-latest.vue new file mode 100644 index 0000000..bb72d2c --- /dev/null +++ b/src/view/following-latest.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/view/following.vue b/src/view/following.vue new file mode 100644 index 0000000..4452844 --- /dev/null +++ b/src/view/following.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/view/index.vue b/src/view/index.vue new file mode 100644 index 0000000..feed422 --- /dev/null +++ b/src/view/index.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/src/view/login.vue b/src/view/login.vue new file mode 100644 index 0000000..ad35d95 --- /dev/null +++ b/src/view/login.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/src/view/notifications/2024-04-26.vue b/src/view/notifications/2024-04-26.vue new file mode 100644 index 0000000..a09478b --- /dev/null +++ b/src/view/notifications/2024-04-26.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/view/ranking.vue b/src/view/ranking.vue new file mode 100644 index 0000000..1754c4d --- /dev/null +++ b/src/view/ranking.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/view/search.vue b/src/view/search.vue new file mode 100644 index 0000000..e27b831 --- /dev/null +++ b/src/view/search.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/view/siteCache.ts b/src/view/siteCache.ts new file mode 100644 index 0000000..af7fdae --- /dev/null +++ b/src/view/siteCache.ts @@ -0,0 +1,10 @@ +const _siteCacheData = new Map() +export function setCache(key: string | number, val: any) { + console.log('setCache', key, val) + _siteCacheData.set(key, val) +} +export function getCache(key: string | number) { + const val = _siteCacheData.get(key) + console.log('getCache', key, val) + return val +} diff --git a/src/view/users.vue b/src/view/users.vue new file mode 100644 index 0000000..69f082a --- /dev/null +++ b/src/view/users.vue @@ -0,0 +1,518 @@ + + + + + diff --git a/test/illustRecommend.json b/test/illustRecommend.json new file mode 100644 index 0000000..7ee12cb --- /dev/null +++ b/test/illustRecommend.json @@ -0,0 +1,1799 @@ +{ + "illusts": [ + { + "isAdContainer": true + }, + { + "id": "90222722", + "title": "Sada Mita!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/custom-thumb/img/2021/05/31/13/43/49/90222722_p0_custom1200.jpg", + "description": "", + "tags": [ + "ロリ", + "原神", + "genshinimpact", + "七七", + "qiqi", + "七七(原神)", + "足裏", + "女の子", + "空七", + "原神1000users入り" + ], + "userId": "51238383", + "userName": "Luxuriou S", + "width": 2480, + "height": 2200, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#ロリ Sada Mita! - Luxuriou S的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-31T13:43:49+09:00", + "updateDate": "2021-05-31T13:43:49+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/06/21/22/45/18/18864399_aed5908e8db5d0cc4ec161329ef77619_50.png", + "type": "illust" + }, + { + "id": "91111312", + "title": "ニャー桃", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/custom-thumb/img/2021/07/09/01/49/51/91111312_p0_custom1200.jpg", + "description": "", + "tags": [ + "原神", + "GenshinImpact", + "Genshin", + "胡桃", + "ニャー", + "猫娘", + "猫耳" + ], + "userId": "8584175", + "userName": "meow", + "width": 1861, + "height": 2632, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 ニャー桃 - meow的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-07-09T01:49:51+09:00", + "updateDate": "2021-07-09T01:49:51+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2021/05/28/20/25/29/20779289_88536011afc2bb6320dabe42cf5799f5_50.png", + "type": "illust" + }, + { + "id": "89864101", + "title": "小小米游姬", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/img-master/img/2021/05/15/23/48/35/89864101_p0_square1200.jpg", + "description": "", + "tags": [ + "同人", + "萝莉", + "ロリ" + ], + "userId": "26892987", + "userName": "咸鱼翻身前", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#同人 小小米游姬 - 咸鱼翻身前的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-05-15T23:48:35+09:00", + "updateDate": "2021-05-15T23:48:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/05/18/23/57/02/18648985_19f98b37cc31ed02c3bcc526db9dd0cd_50.jpg", + "type": "illust" + }, + { + "id": "85142203", + "title": "クレーちゃん", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/img-master/img/2020/10/21/02/46/01/85142203_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー", + "R-18" + ], + "userId": "44168658", + "userName": "島でドンパチするメイ", + "width": 626, + "height": 884, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 クレーちゃん - 島でドンパチするメイ的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-21T02:46:01+09:00", + "updateDate": "2020-10-21T02:46:01+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/10/10/13/41/14/19488028_ddde5a960b7ac5fbced14d127e95c8dc_50.jpg", + "type": "illust" + }, + { + "id": "88108178", + "title": "Hu Tao", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/360x360_70/img-master/img/2021/02/28/13/07/35/88108178_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "胡桃", + "女の子", + "호두", + "hutao", + "Genshinimpact", + "胡桃(原神)", + "원신", + "めぐみん", + "megumin" + ], + "userId": "51238383", + "userName": "Luxuriou S", + "width": 741, + "height": 536, + "pageCount": 2, + "isBookmarkable": true, + "bookmarkData": null, + "alt": "#原神 Hu Tao - Luxuriou S的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2021-02-28T13:07:35+09:00", + "updateDate": "2021-02-28T13:07:35+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/06/21/22/45/18/18864399_aed5908e8db5d0cc4ec161329ef77619_50.png", + "type": "illust" + } + ], + "nextIds": [ + "82981851", + "91001811", + "88188740", + "90402540", + "90021234", + "85562211", + "80811450", + "87926480", + "89700388", + "89933927", + "87608108", + "85619181", + "88509529", + "89471128", + "88344739", + "88619528", + "90882894", + "69908580", + "90044315", + "89468233", + "88431341", + "89438214", + "89691599", + "89604516", + "85696833", + "88462787", + "86049937", + "89729068", + "86174898", + "90670443", + "89698146", + "88774011", + "90495846", + "89439640", + "85599270", + "85539133", + "89253041", + "90405138", + "87964863", + "89419176", + "87436008", + "90486350", + "89402572", + "88337935", + "84683631", + "90465998", + "90391398", + "90183841", + "90376356", + "85151730", + "89458738", + "90498724", + "89765412", + "90217294", + "86112716", + "85074438", + "89780027", + "85130128", + "89503621", + "89466318", + "88373034", + "89873780", + "84821914", + "89195370", + "89361322", + "89129455", + "89540900", + "89428926", + "88645784", + "89672080", + "89270362", + "87821825", + "89887325", + "89741655", + "86162769", + "89758295", + "89750477", + "84905571", + "89196238", + "89584212", + "84906603", + "89749357", + "87167442", + "89715511", + "87350945", + "89386879", + "89340592", + "88211722", + "89419983", + "89583903", + "90023613", + "86825708", + "89220489", + "89276542", + "90159808", + "89279132", + "89656495", + "85556449", + "89580092", + "89802512", + "88284030", + "89634751", + "89776356", + "87698055", + "89389661", + "89372167", + "90151062", + "85226123", + "85217467", + "86262593", + "89929855", + "87012463", + "85852592", + "89368989", + "85979718", + "85211432", + "90069358", + "89397725", + "87159813", + "88213175", + "88648317", + "86181738", + "85885378", + "86022368", + "88293439", + "84949988", + "85193172", + "91094336" + ], + "details": { + "69908580": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.03448275849223137, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "80811450": { + "methods": [ + "illust_by_illust_table_manga_recommendation_original", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "82981851": { + "methods": [ + "illust_by_illust_table_manga_recommendation_original" + ], + "score": 0.04961258918046951, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84683631": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01149425283074379, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84821914": { + "methods": [ + "similar_illust" + ], + "score": 827.875244140625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84905571": { + "methods": [ + "similar_illust" + ], + "score": 880.9090576171875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84906603": { + "methods": [ + "similar_illust" + ], + "score": 887.1856689453125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "84949988": { + "methods": [ + "similar_illust" + ], + "score": 969.4739990234375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85074438": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.218547061085701, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85130128": { + "methods": [ + "similar_illust" + ], + "score": 788.7730102539062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85142203": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.3333333432674408, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85151730": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.008474576286971569, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85193172": { + "methods": [ + "similar_illust" + ], + "score": 971.5712280273438, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85211432": { + "methods": [ + "similar_illust" + ], + "score": 902.3040771484375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85217467": { + "methods": [ + "similar_illust" + ], + "score": 822.1856689453125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85226123": { + "methods": [ + "similar_illust" + ], + "score": 809.277587890625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85539133": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.014084506779909134, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85556449": { + "methods": [ + "similar_illust" + ], + "score": 967.9400634765625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85562211": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.07692307978868484, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85599270": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01587301678955555, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85619181": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.05000000074505806, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85696833": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.21501126885414124, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85852592": { + "methods": [ + "similar_illust" + ], + "score": 866.1652221679688, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85885378": { + "methods": [ + "similar_illust" + ], + "score": 949.583984375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "85979718": { + "methods": [ + "similar_illust" + ], + "score": 884.6273193359375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86022368": { + "methods": [ + "similar_illust" + ], + "score": 966.340087890625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86049937": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.021739130839705467, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86112716": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.22969795763492584, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86162769": { + "methods": [ + "similar_illust" + ], + "score": 869.3804321289062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86174898": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.020408162847161293, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86181738": { + "methods": [ + "similar_illust" + ], + "score": 941.8705444335938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86262593": { + "methods": [ + "similar_illust" + ], + "score": 837.628173828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "86825708": { + "methods": [ + "similar_illust" + ], + "score": 955.2465209960938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87012463": { + "methods": [ + "similar_illust" + ], + "score": 855.48681640625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87159813": { + "methods": [ + "similar_illust" + ], + "score": 924.9519653320312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87167442": { + "methods": [ + "similar_illust" + ], + "score": 890.41650390625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87350945": { + "methods": [ + "similar_illust" + ], + "score": 894.514892578125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87436008": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.012048192322254181, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87608108": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.05882352963089943, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87698055": { + "methods": [ + "similar_illust" + ], + "score": 786.9461669921875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87821825": { + "methods": [ + "similar_illust" + ], + "score": 865.9222412109375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87926480": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.0714285746216774, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "87964863": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88108178": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.20000000298023224, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88188740": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.125, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88211722": { + "methods": [ + "similar_illust" + ], + "score": 926.828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88213175": { + "methods": [ + "similar_illust" + ], + "score": 926.828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88284030": { + "methods": [ + "similar_illust" + ], + "score": 751.4913330078125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88293439": { + "methods": [ + "similar_illust" + ], + "score": 967.3370361328125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88337935": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.011627906933426857, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88344739": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.03999999910593033, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88373034": { + "methods": [ + "similar_illust" + ], + "score": 827.1292724609375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88431341": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.029411764815449715, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88462787": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.02380952425301075, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88509529": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88619528": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88645784": { + "methods": [ + "similar_illust" + ], + "score": 862.1170043945312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88648317": { + "methods": [ + "similar_illust" + ], + "score": 926.828125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "88774011": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.017241379246115685, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89129455": { + "methods": [ + "similar_illust" + ], + "score": 859.9510498046875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89195370": { + "methods": [ + "similar_illust" + ], + "score": 852.62109375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89196238": { + "methods": [ + "similar_illust" + ], + "score": 921.5467529296875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89220489": { + "methods": [ + "similar_illust" + ], + "score": 978.796142578125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89253041": { + "methods": [ + "similar_illust" + ], + "score": 931.2987060546875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89270362": { + "methods": [ + "similar_illust" + ], + "score": 893.451904296875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89276542": { + "methods": [ + "similar_illust" + ], + "score": 775.8428955078125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89279132": { + "methods": [ + "similar_illust" + ], + "score": 787.9986572265625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89340592": { + "methods": [ + "similar_illust" + ], + "score": 947.899658203125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89361322": { + "methods": [ + "similar_illust" + ], + "score": 860.4429321289062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89368989": { + "methods": [ + "similar_illust" + ], + "score": 882.6597290039062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89372167": { + "methods": [ + "similar_illust" + ], + "score": 978.0029907226562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89386879": { + "methods": [ + "similar_illust" + ], + "score": 934.7672119140625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89389661": { + "methods": [ + "similar_illust" + ], + "score": 976.97705078125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89397725": { + "methods": [ + "similar_illust" + ], + "score": 914.841796875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89402572": { + "methods": [ + "similar_illust" + ], + "score": 974.0825805664062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89419176": { + "methods": [ + "similar_illust" + ], + "score": 969.0189819335938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89419983": { + "methods": [ + "similar_illust" + ], + "score": 960.3139038085938, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89428926": { + "methods": [ + "similar_illust" + ], + "score": 883.1651611328125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89438214": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5187750458717346, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89439640": { + "methods": [ + "similar_illust" + ], + "score": 923.7874145507812, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89458738": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.6225411891937256, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89466318": { + "methods": [ + "similar_illust" + ], + "score": 841.0235595703125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89468233": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.03030303120613098, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89471128": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.043478261679410934, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89503621": { + "methods": [ + "similar_illust" + ], + "score": 820.26416015625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89540900": { + "methods": [ + "similar_illust" + ], + "score": 879.1253662109375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89580092": { + "methods": [ + "similar_illust" + ], + "score": 885.7822265625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89583903": { + "methods": [ + "similar_illust" + ], + "score": 960.5686645507812, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89584212": { + "methods": [ + "similar_illust" + ], + "score": 922.0889282226562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89604516": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89634751": { + "methods": [ + "similar_illust" + ], + "score": 974.02490234375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89656495": { + "methods": [ + "similar_illust" + ], + "score": 0, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89672080": { + "methods": [ + "similar_illust" + ], + "score": 888.6375732421875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89691599": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89698146": { + "methods": [ + "similar_illust" + ], + "score": 849.0047607421875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89700388": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.06666667014360428, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89715511": { + "methods": [ + "similar_illust" + ], + "score": 930.5669555664062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89729068": { + "methods": [ + "similar_illust" + ], + "score": 795.6148681640625, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89741655": { + "methods": [ + "similar_illust" + ], + "score": 901.8181762695312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89749357": { + "methods": [ + "similar_illust" + ], + "score": 927.851318359375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89750477": { + "methods": [ + "similar_illust" + ], + "score": 909.9531860351562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89758295": { + "methods": [ + "similar_illust" + ], + "score": 903.92333984375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89765412": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5574560761451721, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89776356": { + "methods": [ + "similar_illust" + ], + "score": 976.7224731445312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89780027": { + "methods": [ + "similar_illust" + ], + "score": 796.0253295898438, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89802512": { + "methods": [ + "similar_illust" + ], + "score": 961.6516723632812, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89864101": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.5, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89873780": { + "methods": [ + "similar_illust" + ], + "score": 842.2225341796875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89887325": { + "methods": [ + "similar_illust" + ], + "score": 896.7012329101562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89929855": { + "methods": [ + "similar_illust" + ], + "score": 839.8473510742188, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "89933927": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_incremental_mf_go", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90021234": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90023613": { + "methods": [ + "similar_illust" + ], + "score": 952.7861938476562, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90044315": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5731908082962036, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90069358": { + "methods": [ + "similar_illust" + ], + "score": 910.192626953125, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90151062": { + "methods": [ + "similar_illust" + ], + "score": 803.6258544921875, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90159808": { + "methods": [ + "similar_illust" + ], + "score": 964.2593383789062, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90183841": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.009999999776482582, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90217294": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c" + ], + "score": 0.25171229243278503, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90222722": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_incremental_mf_go", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90376356": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.009009009227156639, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90391398": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_incremental_mf_go", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90402540": { + "methods": [ + "illust_by_illust_table_bq_recommendation_c", + "illust_by_illust_table_mf_tda" + ], + "score": 0, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90405138": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.013888888992369175, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90465998": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.011363636702299118, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90486350": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.011904762126505375, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90495846": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01666666753590107, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90498724": { + "methods": [ + "illust_by_illust_table_incremental_mf_go" + ], + "score": 0.5890136957168579, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90670443": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.01886792480945587, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "90882894": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.0357142873108387, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "91001811": { + "methods": [ + "similar_illust_fresh" + ], + "score": 874.2181396484375, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "91094336": { + "methods": [ + "illust_by_illust_table_mf_tda" + ], + "score": 0.008620689623057842, + "seedIllustIds": [ + "89903546" + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + }, + "91111312": { + "methods": [ + "similar_illust_fresh" + ], + "score": 857.9734497070312, + "seedIllustIds": [ + 89903546 + ], + "banditInfo": "", + "recommendListId": "60ea5d0855b1c5.48568052" + } + } +} \ No newline at end of file diff --git a/test/userBookmarks.json b/test/userBookmarks.json new file mode 100644 index 0000000..5bddcad --- /dev/null +++ b/test/userBookmarks.json @@ -0,0 +1,321 @@ +{ + "works": [ + { + "id": "85596117", + "title": "Cocogoat!", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/11/11/05/25/32/85596117_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー", + "Klee", + "GenshinImpact", + "Qiqi", + "七七", + "ココナッツヒツジ" + ], + "userId": "13387921", + "userName": "Sketchien", + "width": 3071, + "height": 2536, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11862002032", + "private": false + }, + "alt": "#原神 Cocogoat! - Sketchien的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-11T05:25:32+09:00", + "updateDate": "2020-11-11T05:25:32+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/12/29/08/12/30/19902583_8c1babd26c2490e878c9d1807dff5012_50.png" + }, + { + "id": "85349943", + "title": "森林冰火人", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/10/31/11/55/22/85349943_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "七七(原神)", + "クレー(原神)", + "原神1000users入り" + ], + "userId": "30716447", + "userName": "ginklaga", + "width": 900, + "height": 1282, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "11568152040", + "private": false + }, + "alt": "#原神 森林冰火人 - ginklaga的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-10-31T11:55:22+09:00", + "updateDate": "2020-10-31T11:55:22+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2018/10/02/08/29/58/14846443_38890f901917803f5dd96f1f90e31b41_50.jpg" + }, + { + "id": "85540784", + "title": "七七和可莉", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/11/08/17/03/33/85540784_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "可莉", + "七七", + "女孩子", + "哈哈", + "同人", + "赤と青" + ], + "userId": "18478848", + "userName": "鱼鹅BABA", + "width": 3508, + "height": 2480, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190905925", + "private": false + }, + "alt": "#原神 七七和可莉 - 鱼鹅BABA的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-08T17:03:33+09:00", + "updateDate": "2020-11-08T17:03:33+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2021/02/01/11/52/17/20109114_05696c9cb2dc2de939049915ff704e9a_50.jpg" + }, + { + "id": "86465064", + "title": "肉蛋冲鸡", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "/-/c/250x250_80_a2/custom-thumb/img/2020/12/23/00/13/25/86465064_p0_custom1200.jpg", + "description": "", + "tags": [ + "R-18", + "女の子", + "loli", + "原神", + "幼女", + "七七(原神)", + "七七" + ], + "userId": "7270720", + "userName": "提比爷爷", + "width": 2480, + "height": 3508, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190813445", + "private": false + }, + "alt": "#女の子 肉蛋冲鸡 - 提比爷爷的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-12-23T00:13:25+09:00", + "updateDate": "2020-12-23T00:13:25+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2017/12/10/00/50/09/13545222_e4be8a9c803ec0a57c2cd364bc5fd603_50.png" + }, + { + "id": "84378134", + "title": "原神の奇妙な冒険", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/09/14/23/10/50/84378134_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "Genshin", + "迪卢克", + "琴", + "温迪", + "ジョジョ立ち", + "可莉", + "西風騎士団", + "だいたいあってる" + ], + "userId": "2046536", + "userName": "Grover.Y", + "width": 3292, + "height": 2059, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190785843", + "private": false + }, + "alt": "#原神 原神の奇妙な冒険 - Grover.Y的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-09-14T23:10:50+09:00", + "updateDate": "2020-09-14T23:10:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2018/06/09/04/14/10/14335625_52a126f7a4d0b28424aa61595a2fb2f5_50.png" + }, + { + "id": "85653642", + "title": "背くらべ", + "illustType": 0, + "xRestrict": 0, + "restrict": 0, + "sl": 2, + "url": "/-/c/250x250_80_a2/img-master/img/2020/11/14/02/46/50/85653642_p0_square1200.jpg", + "description": "", + "tags": [ + "原神", + "クレー(原神)", + "七七(原神)", + "ディオナ(原神)", + "背伸び", + "GenshinImpact", + "ブーツ", + "原神10000users入り" + ], + "userId": "29942", + "userName": "日下氏", + "width": 1382, + "height": 1500, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "10190765784", + "private": false + }, + "alt": "#原神 背くらべ - 日下氏的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2020-11-14T02:46:50+09:00", + "updateDate": "2020-11-14T02:46:50+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/-/user-profile/img/2020/07/03/01/17/53/18924189_3cb75518e84612ae48bf43bfd9ec152d_50.png" + }, + { + "id": "71553807", + "title": "paff女神", + "illustType": 0, + "xRestrict": 1, + "restrict": 0, + "sl": 6, + "url": "/-/c/250x250_80_a2/img-master/img/2018/11/08/01/33/27/71553807_p0_square1200.jpg", + "description": "", + "tags": [ + "R-18", + "paff", + "cytus" + ], + "userId": "13046221", + "userName": "teslamax", + "width": 2732, + "height": 2048, + "pageCount": 1, + "isBookmarkable": true, + "bookmarkData": { + "id": "5092259170", + "private": false + }, + "alt": "#paff paff女神 - teslamax的插画", + "titleCaptionTranslation": { + "workTitle": "", + "workCaption": "" + }, + "createDate": "2018-11-08T01:33:27+09:00", + "updateDate": "2018-11-08T01:33:27+09:00", + "isUnlisted": false, + "isMasked": false, + "profileImageUrl": "/~/common/images/no_profile_s.png" + } + ], + "total": 7, + "zoneConfig": { + "header": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=header&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq1znlyhhh8&num=60ea5d9f936" + }, + "footer": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=footer&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq2344lal1d&num=60ea5d9f657" + }, + "logo": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=logo_side&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq24z4nikpv&num=60ea5d9f320" + }, + "500x500": { + "url": "https://pixon.ads-pixiv.net/show?zone_id=bigbanner&format=js&s=1&up=1&a=20&ng=g&l=zh&uri=%2Fajax%2Fuser%2F_PARAM_%2Fillusts%2Fbookmarks&is_spa=1&K=467de35c853a8&ab_test_digits_first=75&uab=69&yuid=FjJkCJU&suid=Pgsctoaq26tu57oyq&num=60ea5d9f378" + } + }, + "extraData": { + "meta": { + "title": "机智的小鱼君的收藏 - pixiv", + "description": "pixiv", + "canonical": "https://www.pixiv.net/users/32338232", + "ogp": { + "description": "Chinese college student.\r\nLove in web develop and Japanese ACGN culture.\r\nI sometimes drawing manga especially LOLI (LOL).", + "image": "/-/c/200x200/user-profile/img/2021/06/14/07/02/52/20871141_0084bf736ca61f648eda83aa522659d7_170.png", + "title": "机智的小鱼君的收藏", + "type": "article" + }, + "twitter": { + "description": "Chinese college student.\r\nLove in web develop and Japanese ACGN culture.\r\nI sometimes drawing manga especially LOLI (LOL).", + "image": "/-/c/200x200/user-profile/img/2021/06/14/07/02/52/20871141_0084bf736ca61f648eda83aa522659d7_170.png", + "title": "机智的小鱼君的收藏", + "card": "summary" + }, + "alternateLanguages": { + "ja": "https://www.pixiv.net/users/32338232", + "en": "https://www.pixiv.net/en/users/32338232" + }, + "descriptionHeader": "" + } + }, + "bookmarkTags": { + "5092259170": [], + "10190765784": [], + "10190785843": [], + "10190813445": [], + "10190905925": [], + "11568152040": [], + "11862002032": [] + } +} \ No newline at end of file diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..35e472c --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "include": ["src"], + "compilerOptions": { + "baseUrl": ".", + "target": "esnext", + "module": "esnext", + "moduleResolution": "bundler", + "strict": true, + "skipLibCheck": true, + "jsx": "preserve", + "sourceMap": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "importHelpers": true, + "paths": { + "@/*": ["src/*"] + }, + "types": ["unplugin-icons/types/vue"] + }, + "vueCompilerOptions": { + "plugins": ["@vue/language-plugin-pug"] + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..de603d5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,15 @@ +{ + "include": ["api", "script", "*.config.*"], + "compilerOptions": { + "moduleResolution": "nodenext", + "module": "nodenext", + "types": ["node"], + "lib": ["ESNext"], + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "importHelpers": true + } +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..b975f2c --- /dev/null +++ b/vercel.json @@ -0,0 +1,19 @@ +{ + "devCommand": "vite --port $PORT", + "framework": "vue", + "rewrites": [ + { + "source": "/:__PREFIX(~|-)/:__PATH(.+)", + "destination": "/api/image" + }, + { + "source": "/:__PREFIX(ajax|rpc|.+\\.php)/:__PATH*", + "destination": "/api/http" + }, + { + "source": "/api/illust/random", + "destination": "/api/random" + } + ], + "headers": [] +} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..30e3952 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,50 @@ +import { fileURLToPath } from 'node:url' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import AutoImport from 'unplugin-auto-import/vite' +import Icons from 'unplugin-icons/vite' +import IconResolver from 'unplugin-icons/resolver' +import Components from 'unplugin-vue-components/vite' +import { NaiveUiResolver } from 'unplugin-vue-components/resolvers' + +const PROD = process.env.NODE_ENV === 'production' + +export default defineConfig({ + plugins: [ + vue(), + AutoImport({ + dts: 'src/auto-imports.d.ts', + imports: [ + 'vue', + 'vue-router', + 'vue-i18n', + '@vueuse/core', + { axios: [['default', 'axios']] }, + ], + resolvers: [ + IconResolver({ + alias: { + fas: 'fa-solid', + }, + }), + ], + dirs: ['src/components/**', 'src/composables', 'src/utils', 'src/types'], + }), + Components({ dts: 'src/components.d.ts', resolvers: [NaiveUiResolver()] }), + Icons({ + scale: 1, + defaultClass: 'svg--inline', + }), + ], + build: {}, + esbuild: { + drop: PROD ? ['console'] : [], + }, + server: { host: true }, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue', '.json'], + }, +})