diff --git a/.github/workflows/github-actions-builder.yml b/.github/workflows/github-actions-builder.yml new file mode 100644 index 00000000..70f1ede7 --- /dev/null +++ b/.github/workflows/github-actions-builder.yml @@ -0,0 +1,72 @@ +name: 'publish' +on: + push: + branches: + - release + +jobs: + publish-tauri: + permissions: + contents: write + strategy: + fail-fast: false + matrix: + platform: [ubuntu-20.04] + + runs-on: ${{ matrix.platform }} + steps: + - uses: actions/checkout@v3 + - name: setup node + uses: actions/setup-node@v3 + with: + node-version: 18 + - name: install pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + - name: install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - name: install dependencies (ubuntu only) + if: matrix.platform == 'ubuntu-20.04' + run: | + sudo apt-get update + sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf + - name: install frontend dependencies + run: pnpm install --no-frozen-lockfile # change this to npm or pnpm depending on which one you use + - if: matrix.platform == 'ubuntu-20.04' + run: pnpm tauri build --target x86_64-unknown-linux-gnu + - if: matrix.platform == 'ubuntu-20.04' + uses: "softprops/action-gh-release@v1" + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "latest" + tag_name: "${{ github.event.head_commit.message }}" + name: "${{ github.event.head_commit.message }}" + files: | + src-tauri/target/x86_64-unknown-linux-gnu/release/**/*.deb + src-tauri/target/x86_64-unknown-linux-gnu/release/**/*.AppImage + - if: matrix.platform == 'macos-latest' + run: pnpm tauri build --target x86_64-apple-darwin + - if: matrix.platform == 'macos-latest' + uses: "softprops/action-gh-release@v1" + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "latest" + tag_name: "${{ github.event.head_commit.message }}" + name: "${{ github.event.head_commit.message }}" + files: | + src-tauri/target/x86_64-apple-darwin/release/bundle/macos/*.app + src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/*.dmg + - if: matrix.platform == 'windows-latest' + run: pnpm tauri build + - if: matrix.platform == 'windows-latest' + uses: "softprops/action-gh-release@v1" + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "latest" + tag_name: "${{ github.event.head_commit.message }}" + name: "${{ github.event.head_commit.message }}" + files: | + src-tauri/target/x86_64-pc-windows-msvc/release/**/*.msi \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..606239d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist/ +dist-web/ +dist-ssr +*.local +xplugin/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +/src-taurl/target/ +/src-taurl/gen/ +/build/ \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..61343e9b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "svelte.svelte-vscode", + "tauri-apps.tauri-vscode", + "rust-lang.rust-analyzer" + ] +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d536004e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Kwaroran + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/app-icon.png b/app-icon.png new file mode 100644 index 00000000..c38ac474 Binary files /dev/null and b/app-icon.png differ diff --git a/functions/drive.js b/functions/drive.js new file mode 100644 index 00000000..90a38030 --- /dev/null +++ b/functions/drive.js @@ -0,0 +1,49 @@ +export function onRequest(context) { + const request = context.request + return drive(request, context.env); +} + +const encodedRedirectUri = encodeURIComponent("https://risu.pages.dev/") + +async function drive(request, env){ + + const url = new URL(request.url); + + const headerE = { + "Access-Control-Allow-Origin": "https://risu.pages.dev", + "Access-Control-Allow-Headers": "*" + } + + const params = url.searchParams + const code = params.get('code') + if(!code){ + return new Response("No code provided", { + status: 400, + headers: headerE + }) + } + const resp = await fetch("https://oauth2.googleapis.com/token", { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + body: `code=${code}&client_id=${env.CLIENT_ID}&client_secret=${env.CLIENT_SECRET}&redirect_uri=${encodedRedirectUri}&grant_type=authorization_code` + }) + + + const json = await resp.json() + + if(json.access_token && json.expires_in){ + return new Response(JSON.stringify({ + access_token: json.access_token, + expires_in: json.expires_in + }), { + status: 200, + headers: headerE + }) + } + else{ + return new Response("Response Failed", { + status: 400, + headers: headerE + }) + } +} \ No newline at end of file diff --git a/functions/proxy.js b/functions/proxy.js new file mode 100644 index 00000000..6fe72cb9 --- /dev/null +++ b/functions/proxy.js @@ -0,0 +1,55 @@ +export function onRequest(context) { + const request = context.request + return fetchProxy(request); +} + +const blocked_region = [] + +async function fetchProxy(request) { + + const region = (request.headers.get('cf-ipcountry') ?? '').toUpperCase(); + + let response = null; + let rurl = new URL(request.url); + + const urlParam = rurl.searchParams.get('url') + + if(!urlParam){ + return new Response('Access denied', { + status: 403 + }); + } + + if (blocked_region.includes(region)) { + response = new Response('Access denied', { + status: 403 + }); + } else { + let method = request.method; + let requestHeaders = new Headers(request.headers); + + let originalResponse = await fetch(urlParam, { + method: method, + headers: requestHeaders, + body: request.body + }) + + const responseHeaders = originalResponse.headers; + const status = originalResponse.status; + let newResponseHeaders = new Headers(responseHeaders); + + newResponseHeaders.set('access-control-allow-origin', 'https://risu.pages.dev/'); + newResponseHeaders.set('access-control-allow-credentials', "true"); + newResponseHeaders.delete('content-security-policy'); + newResponseHeaders.delete('content-security-policy-report-only'); + newResponseHeaders.delete('clear-site-data'); + + const originalBody = originalResponse.body + + response = new Response(originalBody, { + status, + headers: newResponseHeaders + }) + } + return response; +} diff --git a/index.html b/index.html new file mode 100644 index 00000000..09f3e690 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + RisuAI + + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 00000000..682358c7 --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "name": "risuai", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json", + "tauri": "tauri", + "buildsite": "vite build --outDir dist", + "updatePlugin": "tsc public/pluginApi.ts" + }, + "dependencies": { + "@dqbd/tiktoken": "^1.0.4", + "@msgpack/msgpack": "3.0.0-beta2", + "@tauri-apps/api": "1.2.0", + "buffer": "^6.0.3", + "dompurify": "^3.0.1", + "exifr": "^7.1.3", + "gpt-3-encoder": "^1.1.4", + "gpt3-tokenizer": "^1.1.5", + "isomorphic-dompurify": "^1.2.0", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "lucide-svelte": "^0.130.0", + "pako": "^2.1.0", + "png-chunk-text": "^1.0.0", + "png-chunks-encode": "^1.0.0", + "png-chunks-extract": "^1.0.0", + "pngjs": "^7.0.0", + "rollup": "^3.21.3", + "showdown": "^2.1.0", + "sweetalert2": "^11.7.3", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.0.0", + "@tailwindcss/typography": "^0.5.9", + "@tauri-apps/cli": "1.2.3", + "@tsconfig/svelte": "^3.0.0", + "@types/dompurify": "^3.0.1", + "@types/lodash": "^4.14.194", + "@types/lodash.clonedeep": "^4.5.7", + "@types/lodash.isequal": "^4.5.6", + "@types/node": "^18.7.10", + "@types/pako": "^2.0.0", + "@types/pngjs": "^6.0.1", + "@types/showdown": "^2.0.0", + "@types/uuid": "^9.0.1", + "@types/wicg-file-system-access": "^2020.9.6", + "autoprefixer": "^10.4.14", + "internal-ip": "^7.0.0", + "postcss": "^8.4.23", + "svelte": "^3.54.0", + "svelte-check": "^3.0.0", + "svelte-preprocess": "^5.0.0", + "tailwindcss": "^3.3.1", + "tslib": "^2.4.1", + "typescript": "^4.9.5", + "vite": "^4.2.1", + "vite-plugin-top-level-await": "^1.3.0", + "vite-plugin-wasm": "^3.2.2" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..8ac62480 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2345 @@ +lockfileVersion: 5.4 + +specifiers: + '@dqbd/tiktoken': ^1.0.4 + '@msgpack/msgpack': 3.0.0-beta2 + '@sveltejs/vite-plugin-svelte': ^2.0.0 + '@tailwindcss/typography': ^0.5.9 + '@tauri-apps/api': 1.2.0 + '@tauri-apps/cli': 1.2.3 + '@tsconfig/svelte': ^3.0.0 + '@types/dompurify': ^3.0.1 + '@types/lodash': ^4.14.194 + '@types/lodash.clonedeep': ^4.5.7 + '@types/lodash.isequal': ^4.5.6 + '@types/node': ^18.7.10 + '@types/pako': ^2.0.0 + '@types/pngjs': ^6.0.1 + '@types/showdown': ^2.0.0 + '@types/uuid': ^9.0.1 + '@types/wicg-file-system-access': ^2020.9.6 + autoprefixer: ^10.4.14 + buffer: ^6.0.3 + dompurify: ^3.0.1 + exifr: ^7.1.3 + gpt-3-encoder: ^1.1.4 + gpt3-tokenizer: ^1.1.5 + internal-ip: ^7.0.0 + isomorphic-dompurify: ^1.2.0 + localforage: ^1.10.0 + lodash: ^4.17.21 + lucide-svelte: ^0.130.0 + pako: ^2.1.0 + png-chunk-text: ^1.0.0 + png-chunks-encode: ^1.0.0 + png-chunks-extract: ^1.0.0 + pngjs: ^7.0.0 + postcss: ^8.4.23 + rollup: ^3.21.3 + showdown: ^2.1.0 + svelte: ^3.54.0 + svelte-check: ^3.0.0 + svelte-preprocess: ^5.0.0 + sweetalert2: ^11.7.3 + tailwindcss: ^3.3.1 + tslib: ^2.4.1 + typescript: ^4.9.5 + uuid: ^9.0.0 + vite: ^4.2.1 + vite-plugin-top-level-await: ^1.3.0 + vite-plugin-wasm: ^3.2.2 + +dependencies: + '@dqbd/tiktoken': 1.0.4 + '@msgpack/msgpack': 3.0.0-beta2 + '@tauri-apps/api': 1.2.0 + buffer: 6.0.3 + dompurify: 3.0.1 + exifr: 7.1.3 + gpt-3-encoder: 1.1.4 + gpt3-tokenizer: 1.1.5 + isomorphic-dompurify: 1.2.0 + localforage: 1.10.0 + lodash: 4.17.21 + lucide-svelte: 0.130.0_svelte@3.58.0 + pako: 2.1.0 + png-chunk-text: 1.0.0 + png-chunks-encode: 1.0.0 + png-chunks-extract: 1.0.0 + pngjs: 7.0.0 + rollup: 3.21.3 + showdown: 2.1.0 + sweetalert2: 11.7.3 + uuid: 9.0.0 + +devDependencies: + '@sveltejs/vite-plugin-svelte': 2.0.4_svelte@3.58.0+vite@4.2.1 + '@tailwindcss/typography': 0.5.9_tailwindcss@3.3.1 + '@tauri-apps/cli': 1.2.3 + '@tsconfig/svelte': 3.0.0 + '@types/dompurify': 3.0.1 + '@types/lodash': 4.14.194 + '@types/lodash.clonedeep': 4.5.7 + '@types/lodash.isequal': 4.5.6 + '@types/node': 18.15.11 + '@types/pako': 2.0.0 + '@types/pngjs': 6.0.1 + '@types/showdown': 2.0.0 + '@types/uuid': 9.0.1 + '@types/wicg-file-system-access': 2020.9.6 + autoprefixer: 10.4.14_postcss@8.4.23 + internal-ip: 7.0.0 + postcss: 8.4.23 + svelte: 3.58.0 + svelte-check: 3.2.0_3jsjda4jx6j2l7qclqlom22jie + svelte-preprocess: 5.0.3_upgekrjecfan2fawgwdcehldna + tailwindcss: 3.3.1_postcss@8.4.23 + tslib: 2.5.0 + typescript: 4.9.5 + vite: 4.2.1_@types+node@18.15.11 + vite-plugin-top-level-await: 1.3.0_rollup@3.21.3+vite@4.2.1 + vite-plugin-wasm: 3.2.2_vite@4.2.1 + +packages: + + /@dqbd/tiktoken/1.0.4: + resolution: {integrity: sha512-C0HrJj2RNlsB3wslfNHGNH8xN7QQMki+y4JkUor/GE+oIfPvH7yVep9l1/2powam8AAH6+gdv5MggA5gsszweg==} + dev: false + + /@esbuild/android-arm/0.17.15: + resolution: {integrity: sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.17.15: + resolution: {integrity: sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.17.15: + resolution: {integrity: sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.17.15: + resolution: {integrity: sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.17.15: + resolution: {integrity: sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.17.15: + resolution: {integrity: sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.17.15: + resolution: {integrity: sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.17.15: + resolution: {integrity: sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.17.15: + resolution: {integrity: sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.17.15: + resolution: {integrity: sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.17.15: + resolution: {integrity: sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.17.15: + resolution: {integrity: sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.17.15: + resolution: {integrity: sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.17.15: + resolution: {integrity: sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.17.15: + resolution: {integrity: sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.17.15: + resolution: {integrity: sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.17.15: + resolution: {integrity: sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.17.15: + resolution: {integrity: sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.17.15: + resolution: {integrity: sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.17.15: + resolution: {integrity: sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.17.15: + resolution: {integrity: sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.17.15: + resolution: {integrity: sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@msgpack/msgpack/3.0.0-beta2: + resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==} + engines: {node: '>= 14'} + dev: false + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@rollup/plugin-virtual/3.0.1_rollup@3.21.3: + resolution: {integrity: sha512-fK8O0IL5+q+GrsMLuACVNk2x21g3yaw+sG2qn16SnUd3IlBsQyvWxLMGHmCmXRMecPjGRSZ/1LmZB4rjQm68og==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.21.3 + dev: true + + /@sveltejs/vite-plugin-svelte/2.0.4_svelte@3.58.0+vite@4.2.1: + resolution: {integrity: sha512-pjqhW00KwK2uzDGEr+yJBwut+D+4XfJO/+bHHdHzPRXn9+1Jeq5JcFHyrUiYaXgHtyhX0RsllCTm4ssAx4ZY7Q==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + svelte: ^3.54.0 + vite: ^4.0.0 + dependencies: + debug: 4.3.4 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.0 + svelte: 3.58.0 + svelte-hmr: 0.15.1_svelte@3.58.0 + vite: 4.2.1_@types+node@18.15.11 + vitefu: 0.2.4_vite@4.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@swc/core-darwin-arm64/1.3.49: + resolution: {integrity: sha512-g7aIfXh6uPHmhLXdjXQq5t3HAyS/EdvujasW1DIS5k8UqOBaSoCcSGtLIjzcLv3KujqNfYcm118E+12H0nY6fQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64/1.3.49: + resolution: {integrity: sha512-eSIxVX0YDw40Bre5sAx2BV3DzdIGzmQvCf2yiBvLqiiL6GC0mmuDeWbUCAzdUX6fJ6FUVEBMUVqNOc9oJ2/d5w==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf/1.3.49: + resolution: {integrity: sha512-8mj3IcRVr/OJY0mVITz6Z5osNAMJK5GiKDaZ+3QejPLbl6aiu4sH4GmTHDRN14RnaVXOpecsGcUoQmNoNa3u3w==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu/1.3.49: + resolution: {integrity: sha512-Rmg9xw6tmpOpf6GKKjpHQGmjfHzqSths5ebI2ahrHlhekzZF2HYmPkVw4bHda8Bja6mbaw8FVBgBHjPU8mMeDA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl/1.3.49: + resolution: {integrity: sha512-nlKPYMogAI3Aak6Mlkag8/2AlHAZ/DpH7RjhfMazsaGhD/sQOmYdyY9Al69ejpa419YJuREeeeLoojFlSsd30g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu/1.3.49: + resolution: {integrity: sha512-QOyeJQ6NVi73SJcizbwvIZTiGA/N+BxX9liRrvibumaQmRh8fWjJiLNsv3ODSHeuonak7E8Bf7a7NnSTyu48Mw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl/1.3.49: + resolution: {integrity: sha512-WlDMz+SOpYC9O/ZBUw1oiyWI7HyUCMlf/HS8Fy/kRI3eGoGCUxVTCJ1mP57GdQr4Wg32Y/ZpO2KSNQFWnT8mAw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc/1.3.49: + resolution: {integrity: sha512-41LZOeI94Za3twib8KOIjnHYAZ+nkBFmboaREsFR1760S7jiMVywqWX8nFZvn/CXj15Fjjgdgyuig+zMREwXwQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc/1.3.49: + resolution: {integrity: sha512-IdqLPoMKssyAoOCZdNXmnAd6/uyx+Hb9KSfZUHepZaNfwMy6J5XXrOsbYs3v53FH8MtekUUdV+mMX4me9bcv9w==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc/1.3.49: + resolution: {integrity: sha512-7Fqjo5pS3uIohhSbYSaR0+e/bJdxmQb4oG97FIh5qvlCCGQaQ9UiaEeYy4uK0Ad+Menum1IXCAEiG7RHcl6Eyw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core/1.3.49: + resolution: {integrity: sha512-br44ZHOfE9YyRGcORSLkHFQHTvhwRcaithBJ1Q5y5iMGpLbH0Wai3GN49L60RvmGwxNJfWzT+E7+rNNR7ewKgA==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.49 + '@swc/core-darwin-x64': 1.3.49 + '@swc/core-linux-arm-gnueabihf': 1.3.49 + '@swc/core-linux-arm64-gnu': 1.3.49 + '@swc/core-linux-arm64-musl': 1.3.49 + '@swc/core-linux-x64-gnu': 1.3.49 + '@swc/core-linux-x64-musl': 1.3.49 + '@swc/core-win32-arm64-msvc': 1.3.49 + '@swc/core-win32-ia32-msvc': 1.3.49 + '@swc/core-win32-x64-msvc': 1.3.49 + dev: true + + /@tailwindcss/typography/0.5.9_tailwindcss@3.3.1: + resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.3.1_postcss@8.4.23 + dev: true + + /@tauri-apps/api/1.2.0: + resolution: {integrity: sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw==} + engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + dev: false + + /@tauri-apps/cli-darwin-arm64/1.2.3: + resolution: {integrity: sha512-phJN3fN8FtZZwqXg08bcxfq1+X1JSDglLvRxOxB7VWPq+O5SuB8uLyssjJsu+PIhyZZnIhTGdjhzLSFhSXfLsw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-darwin-x64/1.2.3: + resolution: {integrity: sha512-jFZ/y6z8z6v4yliIbXKBXA7BJgtZVMsITmEXSuD6s5+eCOpDhQxbRkr6CA+FFfr+/r96rWSDSgDenDQuSvPAKw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm-gnueabihf/1.2.3: + resolution: {integrity: sha512-C7h5vqAwXzY0kRGSU00Fj8PudiDWFCiQqqUNI1N+fhCILrzWZB9TPBwdx33ZfXKt/U4+emdIoo/N34v3TiAOmQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm64-gnu/1.2.3: + resolution: {integrity: sha512-buf1c8sdkuUzVDkGPQpyUdAIIdn5r0UgXU6+H5fGPq/Xzt5K69JzXaeo6fHsZEZghbV0hOK+taKV4J0m30UUMQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-arm64-musl/1.2.3: + resolution: {integrity: sha512-x88wPS9W5xAyk392vc4uNHcKBBvCp0wf4H9JFMF9OBwB7vfd59LbQCFcPSu8f0BI7bPrOsyHqspWHuFL8ojQEA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-x64-gnu/1.2.3: + resolution: {integrity: sha512-ZMz1jxEVe0B4/7NJnlPHmwmSIuwiD6ViXKs8F+OWWz2Y4jn5TGxWKFg7DLx5OwQTRvEIZxxT7lXHi5CuTNAxKg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-linux-x64-musl/1.2.3: + resolution: {integrity: sha512-B/az59EjJhdbZDzawEVox0LQu2ZHCZlk8rJf85AMIktIUoAZPFbwyiUv7/zjzA/sY6Nb58OSJgaPL2/IBy7E0A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-ia32-msvc/1.2.3: + resolution: {integrity: sha512-ypdO1OdC5ugNJAKO2m3sb1nsd+0TSvMS9Tr5qN/ZSMvtSduaNwrcZ3D7G/iOIanrqu/Nl8t3LYlgPZGBKlw7Ng==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-x64-msvc/1.2.3: + resolution: {integrity: sha512-CsbHQ+XhnV/2csOBBDVfH16cdK00gNyNYUW68isedmqcn8j+s0e9cQ1xXIqi+Hue3awp8g3ImYN5KPepf3UExw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli/1.2.3: + resolution: {integrity: sha512-erxtXuPhMEGJPBtnhPILD4AjuT81GZsraqpFvXAmEJZ2p8P6t7MVBifCL8LznRknznM3jn90D3M8RNBP3wcXTw==} + engines: {node: '>= 10'} + hasBin: true + optionalDependencies: + '@tauri-apps/cli-darwin-arm64': 1.2.3 + '@tauri-apps/cli-darwin-x64': 1.2.3 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.2.3 + '@tauri-apps/cli-linux-arm64-gnu': 1.2.3 + '@tauri-apps/cli-linux-arm64-musl': 1.2.3 + '@tauri-apps/cli-linux-x64-gnu': 1.2.3 + '@tauri-apps/cli-linux-x64-musl': 1.2.3 + '@tauri-apps/cli-win32-ia32-msvc': 1.2.3 + '@tauri-apps/cli-win32-x64-msvc': 1.2.3 + dev: true + + /@tootallnate/once/2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: false + + /@tsconfig/svelte/3.0.0: + resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==} + dev: true + + /@types/dompurify/3.0.1: + resolution: {integrity: sha512-ubq8VKmf8W+U48jUOiZO4BoSGS7NnbITPMvrF+7HgMN4L+eezCKv8QBPB8p3o4YPicLMmNeTyDkE5X4c2ViHJQ==} + dependencies: + '@types/jsdom': 21.1.1 + '@types/trusted-types': 2.0.3 + + /@types/jsdom/21.1.1: + resolution: {integrity: sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==} + dependencies: + '@types/node': 18.15.11 + '@types/tough-cookie': 4.0.2 + parse5: 7.1.2 + + /@types/lodash.clonedeep/4.5.7: + resolution: {integrity: sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==} + dependencies: + '@types/lodash': 4.14.194 + dev: true + + /@types/lodash.isequal/4.5.6: + resolution: {integrity: sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==} + dependencies: + '@types/lodash': 4.14.194 + dev: true + + /@types/lodash/4.14.194: + resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==} + dev: true + + /@types/node/18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + + /@types/pako/2.0.0: + resolution: {integrity: sha512-10+iaz93qR5WYxTo+PMifD5TSxiOtdRaxBf7INGGXMQgTCu8Z/7GYWYFUOS3q/G0nE5boj1r4FEB+WSy7s5gbA==} + dev: true + + /@types/pngjs/6.0.1: + resolution: {integrity: sha512-J39njbdW1U/6YyVXvC9+1iflZghP8jgRf2ndYghdJb5xL49LYDB+1EuAxfbuJ2IBbWIL3AjHPQhgaTxT3YaYeg==} + dependencies: + '@types/node': 18.15.11 + dev: true + + /@types/pug/2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /@types/showdown/2.0.0: + resolution: {integrity: sha512-70xBJoLv+oXjB5PhtA8vo7erjLDp9/qqI63SRHm4REKrwuPOLs8HhXwlZJBJaB4kC18cCZ1UUZ6Fb/PLFW4TCA==} + dev: true + + /@types/tough-cookie/4.0.2: + resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} + + /@types/trusted-types/2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + + /@types/uuid/9.0.1: + resolution: {integrity: sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==} + dev: true + + /@types/wicg-file-system-access/2020.9.6: + resolution: {integrity: sha512-6hogE75Hl2Ov/jgp8ZhDaGmIF/q3J07GtXf8nCJCwKTHq7971po5+DId7grft09zG7plBwpF6ZU0yx9Du4/e1A==} + dev: true + + /abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: false + + /acorn-globals/7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + dependencies: + acorn: 8.8.2 + acorn-walk: 8.2.0 + dev: false + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /any-promise/1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /array-keyed-map/2.1.3: + resolution: {integrity: sha512-JIUwuFakO+jHjxyp4YgSiKXSZeC0U+R1jR94bXWBcVlFRBycqXlb+kH9JHxBGcxnVuSqx5bnn0Qz9xtSeKOjiA==} + dev: false + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /autoprefixer/10.4.14_postcss@8.4.23: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001482 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.23 + postcss-value-parser: 4.2.0 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001482 + electron-to-chromium: 1.4.379 + node-releases: 2.0.10 + update-browserslist-db: 1.0.11_browserslist@4.21.5 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite/1.0.30001482: + resolution: {integrity: sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ==} + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + 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.2 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander/4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander/9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: false + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /crc-32/0.3.0: + resolution: {integrity: sha512-kucVIjOmMc1f0tv53BJ/5WIX+MGLcKuoBhnGqQrgKJNqLByb/sVMWfW/Aw6hw0jgcqjJ2pi9E5y32zOIpaUlsA==} + engines: {node: '>=0.8'} + dev: false + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /cssstyle/3.0.0: + resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} + engines: {node: '>=14'} + dependencies: + rrweb-cssom: 0.6.0 + dev: false + + /data-urls/4.0.0: + resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} + engines: {node: '>=14'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + dev: false + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decimal.js/10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: false + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: false + + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /default-gateway/6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /domexception/4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + dependencies: + webidl-conversions: 7.0.0 + dev: false + + /dompurify/3.0.1: + resolution: {integrity: sha512-60tsgvPKwItxZZdfLmamp0MTcecCta3avOhsLgPZ0qcWt96OasFfhkeIRbJ6br5i0fQawT1/RBGB5L58/Jpwuw==} + dev: false + + /electron-to-chromium/1.4.379: + resolution: {integrity: sha512-eRMq6Cf4PhjB14R9U6QcXM/VRQ54Gc3OL9LKnFugUIh2AXm3KJlOizlSfVIgjH76bII4zHGK4t0PVTE5qq8dZg==} + dev: true + + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + + /es6-promise/3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + + /esbuild/0.17.15: + resolution: {integrity: sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.15 + '@esbuild/android-arm64': 0.17.15 + '@esbuild/android-x64': 0.17.15 + '@esbuild/darwin-arm64': 0.17.15 + '@esbuild/darwin-x64': 0.17.15 + '@esbuild/freebsd-arm64': 0.17.15 + '@esbuild/freebsd-x64': 0.17.15 + '@esbuild/linux-arm': 0.17.15 + '@esbuild/linux-arm64': 0.17.15 + '@esbuild/linux-ia32': 0.17.15 + '@esbuild/linux-loong64': 0.17.15 + '@esbuild/linux-mips64el': 0.17.15 + '@esbuild/linux-ppc64': 0.17.15 + '@esbuild/linux-riscv64': 0.17.15 + '@esbuild/linux-s390x': 0.17.15 + '@esbuild/linux-x64': 0.17.15 + '@esbuild/netbsd-x64': 0.17.15 + '@esbuild/openbsd-x64': 0.17.15 + '@esbuild/sunos-x64': 0.17.15 + '@esbuild/win32-arm64': 0.17.15 + '@esbuild/win32-ia32': 0.17.15 + '@esbuild/win32-x64': 0.17.15 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escodegen/2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: false + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: false + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exifr/7.1.3: + resolution: {integrity: sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==} + dev: false + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + 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.5 + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: false + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /gpt-3-encoder/1.1.4: + resolution: {integrity: sha512-fSQRePV+HUAhCn7+7HL7lNIXNm6eaFWFbNLOOGtmSJ0qJycyQvj60OvRlH7mee8xAMjBDNRdMXlMwjAbMTDjkg==} + dev: false + + /gpt3-tokenizer/1.1.5: + resolution: {integrity: sha512-O9iCL8MqGR0Oe9wTh0YftzIbysypNQmS5a5JG3cB3M4LMYjlAVvNnf8LUzVY9MrI7tj+YLY356uHtO2lLX2HpA==} + engines: {node: '>=12'} + dependencies: + array-keyed-map: 2.1.3 + dev: false + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-encoding-sniffer/3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: false + + /http-proxy-agent/5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /immediate/3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /import-fresh/3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /internal-ip/7.0.0: + resolution: {integrity: sha512-qE4TeD4brqC45Vq/+VASeMiS1KRyfBkR6HT2sh9pZVVCzSjPkaCEfKFU+dL0PRv7NHJtvoKN2r82G6wTfzorkw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + default-gateway: 6.0.3 + ipaddr.js: 2.0.1 + is-ip: 3.1.0 + p-event: 4.2.0 + dev: true + + /ip-regex/4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: true + + /ipaddr.js/2.0.1: + resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} + engines: {node: '>= 10'} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-ip/3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + dependencies: + ip-regex: 4.3.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: false + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isomorphic-dompurify/1.2.0: + resolution: {integrity: sha512-WAQMvW1ZGLFz3nF8byWLiuBjAakUcMYq9rs2uCDmriVEDaQ69wTZt0q0DfBIVbZtSgC/WTRHxd0A/E10Uv1JaA==} + dependencies: + '@types/dompurify': 3.0.1 + dompurify: 3.0.1 + jsdom: 21.1.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + + /jiti/1.18.2: + resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + hasBin: true + dev: true + + /jsdom/21.1.1: + resolution: {integrity: sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.8.2 + acorn-globals: 7.0.1 + cssstyle: 3.0.0 + data-urls: 4.0.0 + decimal.js: 10.4.3 + domexception: 4.0.0 + escodegen: 2.0.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.2 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.2 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + ws: 8.13.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /levn/0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: false + + /lie/3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /lilconfig/2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /localforage/1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /lodash.castarray/4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: true + + /lodash.isplainobject/4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /lucide-svelte/0.130.0_svelte@3.58.0: + resolution: {integrity: sha512-KDxJsWucA8p6XnNR5JDLvy3opMyQHWBZd+0mUO+1NI573UHmt7GDETWBynmbAjqavLH/SLT2r6P587aM4IAmPw==} + peerDependencies: + svelte: ^3.49.0 + dependencies: + svelte: 3.58.0 + dev: false + + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /magic-string/0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mri/1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases/2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nwsapi/2.2.2: + resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} + dev: false + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash/3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: false + + /p-event/4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + dependencies: + p-timeout: 3.2.0 + dev: true + + /p-finally/1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-timeout/3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /pako/2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: false + + /parent-module/1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse5/7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.4.0 + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /png-chunk-text/1.0.0: + resolution: {integrity: sha512-DEROKU3SkkLGWNMzru3xPVgxyd48UGuMSZvioErCure6yhOc/pRH2ZV+SEn7nmaf7WNf3NdIpH+UTrRdKyq9Lw==} + dev: false + + /png-chunks-encode/1.0.0: + resolution: {integrity: sha512-J1jcHgbQRsIIgx5wxW9UmCymV3wwn4qCCJl6KYgEU/yHCh/L2Mwq/nMOkRPtmV79TLxRZj5w3tH69pvygFkDqA==} + dependencies: + crc-32: 0.3.0 + sliced: 1.0.1 + dev: false + + /png-chunks-extract/1.0.0: + resolution: {integrity: sha512-ZiVwF5EJ0DNZyzAqld8BP1qyJBaGOFaq9zl579qfbkcmOwWLLO4I9L8i2O4j3HkI6/35i0nKG2n+dZplxiT89Q==} + dependencies: + crc-32: 0.3.0 + dev: false + + /pngjs/7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + dev: false + + /postcss-import/14.1.0_postcss@8.4.23: + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.23 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.1 + dev: true + + /postcss-js/4.0.1_postcss@8.4.23: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.23 + dev: true + + /postcss-load-config/3.1.4_postcss@8.4.23: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.23 + yaml: 1.10.2 + dev: true + + /postcss-nested/6.0.0_postcss@8.4.23: + resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.23 + postcss-selector-parser: 6.0.11 + dev: true + + /postcss-selector-parser/6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-selector-parser/6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss/8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls/1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: false + + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: false + + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /read-cache/1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup/3.21.3: + resolution: {integrity: sha512-VnPfEG51nIv2xPLnZaekkuN06q9ZbnyDcLkaBdJa/W7UddyhOfMP2yOPziYQfeY7k++fZM8FdQIummFN5y14kA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + + /rrweb-cssom/0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + dev: false + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sade/1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /sander/0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.11 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /saxes/6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: 2.2.0 + dev: false + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /showdown/2.1.0: + resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} + hasBin: true + dependencies: + commander: 9.5.0 + dev: false + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sliced/1.0.1: + resolution: {integrity: sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==} + dev: false + + /sorcery/0.11.0: + resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + hasBin: true + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + buffer-crc32: 0.2.13 + minimist: 1.2.8 + sander: 0.5.1 + dev: true + + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /sucrase/3.31.0: + resolution: {integrity: sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==} + engines: {node: '>=8'} + hasBin: true + dependencies: + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.5 + ts-interface-checker: 0.1.13 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svelte-check/3.2.0_3jsjda4jx6j2l7qclqlom22jie: + resolution: {integrity: sha512-6ZnscN8dHEN5Eq5LgIzjj07W9nc9myyBH+diXsUAuiY/3rt0l65/LCIQYlIuoFEjp2F1NhXqZiJwV9omPj9tMw==} + hasBin: true + peerDependencies: + svelte: ^3.55.0 + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + chokidar: 3.5.3 + fast-glob: 3.2.12 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 3.58.0 + svelte-preprocess: 5.0.3_p2ftialrpfcbzrswmue3kdc77i + typescript: 5.0.3 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + dev: true + + /svelte-hmr/0.15.1_svelte@3.58.0: + resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: '>=3.19.0' + dependencies: + svelte: 3.58.0 + dev: true + + /svelte-preprocess/5.0.3_p2ftialrpfcbzrswmue3kdc77i: + resolution: {integrity: sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==} + engines: {node: '>= 14.10.0'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + detect-indent: 6.1.0 + magic-string: 0.27.0 + postcss: 8.4.23 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 3.58.0 + typescript: 5.0.3 + dev: true + + /svelte-preprocess/5.0.3_upgekrjecfan2fawgwdcehldna: + resolution: {integrity: sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==} + engines: {node: '>= 14.10.0'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + detect-indent: 6.1.0 + magic-string: 0.27.0 + postcss: 8.4.23 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 3.58.0 + typescript: 4.9.5 + dev: true + + /svelte/3.58.0: + resolution: {integrity: sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==} + engines: {node: '>= 8'} + + /sweetalert2/11.7.3: + resolution: {integrity: sha512-fUN/fyVSBZNtY4Rr/Qtxn7tNNnlRAbUhQxTQ9uOo0xVMIHBmqq4/9pau5N9dB2pvkB353XL/ywRAycscLoYU3w==} + dev: false + + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: false + + /tailwindcss/3.3.1_postcss@8.4.23: + resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} + engines: {node: '>=12.13.0'} + hasBin: true + peerDependencies: + postcss: ^8.0.9 + dependencies: + arg: 5.0.2 + chokidar: 3.5.3 + color-name: 1.1.4 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.12 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.18.2 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.23 + postcss-import: 14.1.0_postcss@8.4.23 + postcss-js: 4.0.1_postcss@8.4.23 + postcss-load-config: 3.1.4_postcss@8.4.23 + postcss-nested: 6.0.0_postcss@8.4.23 + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.1 + sucrase: 3.31.0 + transitivePeerDependencies: + - ts-node + dev: true + + /thenify-all/1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tough-cookie/4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46/4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + dependencies: + punycode: 2.3.0 + dev: false + + /ts-interface-checker/0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + + /type-check/0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: false + + /typescript/4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript/5.0.3: + resolution: {integrity: sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /universalify/0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /update-browserslist-db/1.0.11_browserslist@4.21.5: + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /uuid/9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + + /vite-plugin-top-level-await/1.3.0_rollup@3.21.3+vite@4.2.1: + resolution: {integrity: sha512-owIfsgWudMlQODWJSwp0sQB3AZZu3qsMygeBjZy8CyjEk6OB9AGd8lHqmgwrcEqgvy9N58lYxSBLVk3/4ejEiA==} + peerDependencies: + vite: '>=2.8' + dependencies: + '@rollup/plugin-virtual': 3.0.1_rollup@3.21.3 + '@swc/core': 1.3.49 + uuid: 9.0.0 + vite: 4.2.1_@types+node@18.15.11 + transitivePeerDependencies: + - '@swc/helpers' + - rollup + dev: true + + /vite-plugin-wasm/3.2.2_vite@4.2.1: + resolution: {integrity: sha512-cdbBUNR850AEoMd5nvLmnyeq63CSfoP1ctD/L2vLk/5+wsgAPlAVAzUK5nGKWO/jtehNlrSSHLteN+gFQw7VOA==} + peerDependencies: + vite: ^2 || ^3 || ^4 + dependencies: + vite: 4.2.1_@types+node@18.15.11 + dev: true + + /vite/4.2.1_@types+node@18.15.11: + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.15 + postcss: 8.4.23 + resolve: 1.22.1 + rollup: 3.21.3 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitefu/0.2.4_vite@4.2.1: + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 4.2.1_@types+node@18.15.11 + dev: true + + /w3c-xmlserializer/4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + dependencies: + xml-name-validator: 4.0.0 + dev: false + + /webidl-conversions/7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: false + + /whatwg-encoding/2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: false + + /whatwg-mimetype/3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: false + + /whatwg-url/12.0.1: + resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} + engines: {node: '>=14'} + dependencies: + tr46: 4.1.1 + webidl-conversions: 7.0.0 + dev: false + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: false + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xml-name-validator/4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: false + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: false + + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000..e2dc4780 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +} \ No newline at end of file diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 00000000..3e17939f Binary files /dev/null and b/public/logo.png differ diff --git a/public/pluginApi.js b/public/pluginApi.js new file mode 100644 index 00000000..ba34eaec --- /dev/null +++ b/public/pluginApi.js @@ -0,0 +1,196 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __risuPlugin__ = { + providers: [], + fetchResponseQueue: [] +}; +var sleep = function (ms) { return new Promise(function (r) { return setTimeout(r, ms); }); }; +function risuFetch(url, arg) { + return __awaiter(this, void 0, void 0, function () { + var id, i, q; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + id = "".concat(Date.now(), "_").concat(Math.random()); + postMessage({ + type: 'fetch', + body: { + id: id, + url: url, + arg: arg + } + }); + _a.label = 1; + case 1: + if (!true) return [3 /*break*/, 3]; + return [4 /*yield*/, sleep(50)]; + case 2: + _a.sent(); + for (i = 0; i < __risuPlugin__.fetchResponseQueue.length; i++) { + q = __risuPlugin__.fetchResponseQueue[i]; + if (q.id === id) { + __risuPlugin__.fetchResponseQueue.splice(i, 1); + return [2 /*return*/, q.data]; + } + } + return [3 /*break*/, 1]; + case 3: return [2 /*return*/]; + } + }); + }); +} +function getArg(arg) { + return __awaiter(this, void 0, void 0, function () { + var id, i, q; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + id = "".concat(Date.now(), "_").concat(Math.random()); + postMessage({ + type: 'getArg', + body: { + id: id, + arg: arg + } + }); + _a.label = 1; + case 1: + if (!true) return [3 /*break*/, 3]; + return [4 /*yield*/, sleep(50)]; + case 2: + _a.sent(); + for (i = 0; i < __risuPlugin__.fetchResponseQueue.length; i++) { + q = __risuPlugin__.fetchResponseQueue[i]; + if (q.id === id) { + __risuPlugin__.fetchResponseQueue.splice(i, 1); + return [2 /*return*/, q.data]; + } + } + return [3 /*break*/, 1]; + case 3: return [2 /*return*/]; + } + }); + }); +} +function addProvider(name, func) { + postMessage({ + type: 'addProvider', + body: name + }); + __risuPlugin__.providers.push({ + name: name, + func: func + }); +} +function printLog(data) { + postMessage({ + type: 'log', + body: data + }); +} +function handleOnmessage(data) { + return __awaiter(this, void 0, void 0, function () { + var _a, body, providers, providerfunc, _i, providers_1, provider, _b, error_1; + var _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + if (!data.type) { + return [2 /*return*/]; + } + _a = data.type; + switch (_a) { + case "requestProvider": return [3 /*break*/, 1]; + case "fetchData": return [3 /*break*/, 6]; + } + return [3 /*break*/, 7]; + case 1: + body = data.body; + providers = __risuPlugin__.providers; + providerfunc = null; + for (_i = 0, providers_1 = providers; _i < providers_1.length; _i++) { + provider = providers_1[_i]; + if (provider.name === body.key) { + providerfunc = provider.func; + } + } + if (!!providerfunc) return [3 /*break*/, 2]; + postMessage({ + type: 'resProvider', + body: { + 'success': false, + 'content': 'unknown provider' + } + }); + return [3 /*break*/, 5]; + case 2: + _d.trys.push([2, 4, , 5]); + _b = postMessage; + _c = { + type: 'resProvider' + }; + return [4 /*yield*/, providerfunc(body.arg)]; + case 3: + _b.apply(void 0, [(_c.body = _d.sent(), + _c)]); + return [3 /*break*/, 5]; + case 4: + error_1 = _d.sent(); + postMessage({ + type: 'resProvider', + body: { + 'success': false, + 'content': "providerError: ".concat(error_1) + } + }); + return [3 /*break*/, 5]; + case 5: return [3 /*break*/, 7]; + case 6: + { + __risuPlugin__.fetchResponseQueue.push(data.body); + return [3 /*break*/, 7]; + } + _d.label = 7; + case 7: return [2 /*return*/]; + } + }); + }); +} +onmessage = function (ev) { + handleOnmessage(ev.data); + var data = ev.data; +}; diff --git a/public/pluginApi.ts b/public/pluginApi.ts new file mode 100644 index 00000000..fb65827e --- /dev/null +++ b/public/pluginApi.ts @@ -0,0 +1,143 @@ +interface risuPlugin{ + providers: {name:string, func:(arg:providerArgument) => Promise<{success:boolean,content:string}>}[] + fetchResponseQueue:{id:string,data:any}[] +} + +let __risuPlugin__:risuPlugin = { + providers: [], + fetchResponseQueue: [] +} + +const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +interface OpenAIChat{ + role: 'system'|'user'|'assistant' + content: string +} + +interface providerArgument{ + prompt_chat?: OpenAIChat, + temperature?: number, + max_tokens?: number, + presence_penalty?: number + frequency_penalty?: number + bias?: {[key:string]:string} +} + +async function risuFetch(url:string, arg:{body:any,headers?:{[key:string]:string}}){ + const id = `${Date.now()}_${Math.random()}` + postMessage({ + type: 'fetch', + body: { + id: id, + url: url, + arg: arg + } + }) + while(true){ + await sleep(50) + for(let i=0;i<__risuPlugin__.fetchResponseQueue.length;i++){ + const q = __risuPlugin__.fetchResponseQueue[i] + if(q.id === id){ + + __risuPlugin__.fetchResponseQueue.splice(i, 1) + return q.data as { + ok: boolean; + data: any; + } + } + } + } +} + +async function getArg(arg:string){ + const id = `${Date.now()}_${Math.random()}` + postMessage({ + type: 'getArg', + body: { + id: id, + arg: arg + } + }) + while(true){ + await sleep(50) + for(let i=0;i<__risuPlugin__.fetchResponseQueue.length;i++){ + const q = __risuPlugin__.fetchResponseQueue[i] + if(q.id === id){ + __risuPlugin__.fetchResponseQueue.splice(i, 1) + return q.data as (string|number|null) + } + } + } +} + +function addProvider(name:string, func:(arg:providerArgument) => Promise<{success:boolean,content:string}>){ + postMessage({ + type: 'addProvider', + body: name + }) + __risuPlugin__.providers.push({ + name: name, + func: func + }) +} + +function printLog(data:any){ + postMessage({ + type: 'log', + body: data + }) +} + +async function handleOnmessage(data:{type:string,body:any}) { + if(!data.type){ + return + } + switch(data.type){ + case "requestProvider":{ + const body:{key:string,arg:providerArgument} = data.body + const providers = __risuPlugin__.providers + let providerfunc:((arg:providerArgument) => Promise<{success:boolean,content:string}>)|null= null + for(const provider of providers){ + if(provider.name === body.key){ + providerfunc = provider.func + } + } + if(!providerfunc){ + postMessage({ + type: 'resProvider', + body: { + 'success': false, + 'content': 'unknown provider' + } + }) + } + else{ + try { + postMessage({ + type: 'resProvider', + body: await providerfunc(body.arg) + }) + } catch (error) { + postMessage({ + type: 'resProvider', + body: { + 'success': false, + 'content': `providerError: ${error}` + } + }) + } + } + break + } + case "fetchData":{ + __risuPlugin__.fetchResponseQueue.push(data.body) + break + } + } +} + +onmessage = (ev) => { + handleOnmessage(ev.data) + const data:{type:string,body:any} = ev.data +} \ No newline at end of file diff --git a/public/sample/rika.png b/public/sample/rika.png new file mode 100644 index 00000000..2895cd3f Binary files /dev/null and b/public/sample/rika.png differ diff --git a/public/sample/yuzu.png b/public/sample/yuzu.png new file mode 100644 index 00000000..b6ef076c Binary files /dev/null and b/public/sample/yuzu.png differ diff --git a/public/ss2.webp b/public/ss2.webp new file mode 100644 index 00000000..93f75a9a Binary files /dev/null and b/public/ss2.webp differ diff --git a/public/ss3.webp b/public/ss3.webp new file mode 100644 index 00000000..4745635c Binary files /dev/null and b/public/ss3.webp differ diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 00000000..46549d4c --- /dev/null +++ b/public/sw.js @@ -0,0 +1,70 @@ +// @ts-nocheck + +self.addEventListener('fetch', (event) => { + const url = new URL(event.request.url) + const path = url.pathname.split('/') + if(path[1] === 'sw'){ + try { + switch (path[2]){ + case "check":{ + event.respondWith(checkCache(url)) + break + } + case "img": { + event.respondWith(getImg(url)) + break + } + case "register": { + event.respondWith(registerCache(url, event.request.arrayBuffer())) + break + } + case "init":{ + event.respondWith(new Response("true")) + } + default: { + event.respondWith(new Response( + path[2] + )) + } + } + } catch (error) { + event.respondWith(new Response(`${error}`)) + } + } +}) + + +async function checkCache(url){ + const cache = await caches.open('risuCache') + + return new Response(JSON.stringify({ + "able": !!(await cache.match(url)) + })) +} + +async function getImg(url){ + const cache = await caches.open('risuCache') + return await cache.match(url) +} + +async function check(){ + +} + +async function registerCache(urlr, buffer){ + const cache = await caches.open('risuCache') + const url = new URL(urlr) + let path = url.pathname.split('/') + path[2] = 'img' + url.pathname = path.join('/') + const buf = new Uint8Array(await buffer) + await cache.put(url, new Response(buf, { + headers: { + "cache-control": "max-age=604800", + "content-type": "image/png" + } + })) + return new Response(JSON.stringify({ + "done": true + })) +} \ No newline at end of file diff --git a/src-tauri/.cargo/config.toml b/src-tauri/.cargo/config.toml new file mode 100644 index 00000000..3755911f --- /dev/null +++ b/src-tauri/.cargo/config.toml @@ -0,0 +1,4 @@ +[build] +target = 'x86_64-pc-windows-msvc' + +[target] diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 00000000..62a7761f --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,3 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ \ No newline at end of file diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 00000000..c3e9400c --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,3889 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "anyhow" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.4", +] + +[[package]] +name = "attohttpc" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fcf00bc6d5abb29b5f97e3c61a90b6d3caa12f3faf897d4a3e3607c050a35a7" +dependencies = [ + "flate2", + "http", + "log", + "native-tls", + "serde", + "serde_json", + "serde_urlencoded", + "url", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +dependencies = [ + "memchr", + "once_cell", + "regex-automata", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.0.4", +] + +[[package]] +name = "cargo_toml" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497049e9477329f8f6a559972ee42e117487d01d1e8c2cc9f836ea6fa23a9e1a" +dependencies = [ + "serde", + "toml 0.5.11", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" +dependencies = [ + "byteorder", + "uuid 0.8.2", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a35b255461940a32985c627ce82900867c61db1659764d3675ea81963f72a4c6" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation", + "foreign-types", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ctor" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "errno" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.45.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fancy-regex" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" +dependencies = [ + "bit-set", + "regex", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "field-offset" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.45.0", +] + +[[package]] +name = "flate2" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.4", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.0.4", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.0.4", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a20a288a94683f5f4da0adecdbe095c94a77c295e514cc6484e9394dd8376e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.44.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.4", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.0.4", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.0.4", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.0.4", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "h2" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "html5ever" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.6", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.6", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "ico" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031530fe562d8c8d71c0635013d6d155bbfe8ba0aa4b4d2d24ce8af6b71047bd" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +dependencies = [ + "crossbeam-utils", + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-rational", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "infer" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce" +dependencies = [ + "serde", + "serde_json", + "treediff", +] + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.45.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "open" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" +dependencies = [ + "pathdiff", + "windows-sys 0.42.0", +] + +[[package]] +name = "openssl" +version = "0.10.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e30d8bc91859781f0a943411186324d580f2bbeb71b452fe91ae344806af3f1" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d3d193fb1488ad46ffe3aaabc912cc931d02ee8518fe2959aea8ef52718b0c0" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "os_info" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +dependencies = [ + "log", + "serde", + "winapi", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.0.4", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "plist" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" +dependencies = [ + "base64 0.21.0", + "indexmap", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" +dependencies = [ + "bitflags", + "crc32fast", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.8", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "reqwest" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +dependencies = [ + "base64 0.21.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rfd" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "lazy_static", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.37.0", +] + +[[package]] +name = "risuai" +version = "0.0.0" +dependencies = [ + "base64 0.21.0", + "reqwest", + "serde_json", + "tauri", + "tauri-build", + "tiktoken-rs", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aae838e49b3d63e9274e1c01833cc8139d3fec468c3b84688c628f44b1ae11d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c04e8343c3daeec41f58990b9d77068df31209f2af111e059e9fe9646693065" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c614d17805b093df4b147b51339e7e44bf05ef59fba1e45d83500bcfb4d8585" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "serde_json" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +dependencies = [ + "itoa 1.0.6", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "serde_spanned" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.6", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555fc8147af6256f3931a36bb83ad0023240ce9cf2b319dec8236fd1f220b05f" +dependencies = [ + "cfg-expr 0.14.0", + "heck 0.4.1", + "pkg-config", + "toml 0.7.3", + "version-compare 0.1.1", +] + +[[package]] +name = "tao" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac8e6399427c8494f9849b58694754d7cc741293348a6836b6c8d2c5aa82d8e6" +dependencies = [ + "bitflags", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "paste", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "unicode-segmentation", + "uuid 1.3.0", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tauri" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7e0f1d535e7cbbbab43c82be4fc992b84f9156c16c160955617e0260ebc449" +dependencies = [ + "anyhow", + "attohttpc", + "cocoa", + "dirs-next", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.4.1", + "http", + "ignore", + "objc", + "once_cell", + "open", + "os_info", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "regex", + "rfd", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid 1.3.0", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8807c85d656b2b93927c19fe5a5f1f1f348f96c2de8b90763b3c2d561511f9b4" +dependencies = [ + "anyhow", + "cargo_toml", + "heck 0.4.1", + "json-patch", + "semver", + "serde_json", + "tauri-utils", + "winres", +] + +[[package]] +name = "tauri-codegen" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14388d484b6b1b5dc0f6a7d6cc6433b3b230bec85eaa576adcdf3f9fafa49251" +dependencies = [ + "base64 0.13.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "regex", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid 1.3.0", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069319e5ecbe653a799b94b0690d9f9bf5d00f7b1d3989aa331c524d4e354075" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c507d954d08ac8705d235bc70ec6975b9054fb95ff7823af72dbb04186596f3b" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "uuid 1.3.0", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36b1c5764a41a13176a4599b5b7bd0881bea7d94dfe45e1e755f789b98317e30" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid 1.3.0", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5abbc109a6eb45127956ffcc26ef0e875d160150ac16cfa45d26a6b2871686f1" +dependencies = [ + "brotli", + "ctor", + "glob", + "heck 0.4.1", + "html5ever", + "infer", + "json-patch", + "kuchiki", + "memchr", + "phf 0.10.1", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows 0.39.0", +] + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.13", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tiktoken-rs" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff100c3f9f45f134fe9e14ac88691004d54eb91391a40c528cfd613e7ab374" +dependencies = [ + "anyhow", + "base64 0.21.0", + "bstr", + "fancy-regex", + "lazy_static", + "parking_lot", + "rustc-hash", +] + +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa 1.0.6", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2", + "windows-sys 0.45.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" +dependencies = [ + "serde_json", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" + +[[package]] +name = "uuid" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.0.4", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml 0.5.11", +] + +[[package]] +name = "wry" +version = "0.23.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c1ad8e2424f554cc5bdebe8aa374ef5b433feff817aebabca0389961fc7ef98" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 00000000..dbf22a47 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "risuai" +version = "0.0.0" +description = "A Tauri App" +authors = ["you"] +license = "" +repository = "" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.2.1", features = [] } + +[dependencies] +tauri = { version = "1.2.4", features = ["app-all", "dialog-all", "fs-all", "http-all", "os-all", "path-all", "process-relaunch", "protocol-all", "shell-open", "window-maximize", "window-set-fullscreen"] } +serde_json = "1.0" +tiktoken-rs = "0.4.0" +base64 = "0.21.0" +reqwest = { version = "0.11.16", features = ["json"] } + +[features] +# this feature is used for production builds or when `devPath` points to the filesystem +# DO NOT REMOVE!! +custom-protocol = ["tauri/custom-protocol"] + +# [lib] +# crate-type = ["staticlib", "cdylib", "rlib"] diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 00000000..795b9b7c --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 00000000..a868c666 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 00000000..7e6468f3 Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 00000000..6fb79108 Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 00000000..b78ec249 Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 00000000..e69de29b diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 00000000..25490539 Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 00000000..6311205a Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 00000000..a21b25ea Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 00000000..3e17939f Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 00000000..794e3412 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 00000000..a32a43d0 Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 00000000..b2360689 Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 00000000..9d7f64fc Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 00000000..1a9bfd9a Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 00000000..bf5658ff Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 00000000..d410b324 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 00000000..e74c7145 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,81 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + + +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! You've been greeted from Rust!", name) +} + +use serde_json::Value; +use reqwest::header::{HeaderMap, HeaderName, HeaderValue}; +use base64::{engine::general_purpose, Engine as _}; +use std::time::Duration; + + +#[tauri::command] +async fn native_request(url: String, body: String, header: String, method:String) -> String { + let headers_json: Value = match serde_json::from_str(&header) { + Ok(h) => h, + Err(e) => return format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()), + }; + + let mut headers = HeaderMap::new(); + let method = method.to_string(); + if let Some(obj) = headers_json.as_object() { + for (key, value) in obj { + let header_name = match HeaderName::from_bytes(key.as_bytes()) { + Ok(name) => name, + Err(e) => return format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()), + }; + let header_value = match HeaderValue::from_str(value.as_str().unwrap_or("")) { + Ok(value) => value, + Err(e) => return format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()), + }; + headers.insert(header_name, header_value); + } + } else { + return format!(r#"{{"success":false,"body":"Invalid header JSON"}}"#); + } + + let client = reqwest::Client::new(); + let response:Result; + + if method == "POST" { + response = client + .post(&url) + .headers(headers) + .timeout(Duration::from_secs(120)) + .body(body) + .send() + .await; + } + else{ + response = client + .get(&url) + .headers(headers) + .timeout(Duration::from_secs(120)) + .send() + .await; + } + + match response { + Ok(resp) => { + let bytes = match resp.bytes().await { + Ok(b) => b, + Err(e) => return format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()), + }; + let encoded = general_purpose::STANDARD.encode(&bytes); + + format!(r#"{{"success":true,"body":"{}"}}"#, encoded) + } + Err(e) => format!(r#"{{"success":false,"body":"{}"}}"#, e.to_string()), + } +} + +fn main() { + tauri::Builder::default() + .invoke_handler(tauri::generate_handler![greet, native_request]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 00000000..2d54d9c5 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,110 @@ +{ + "build": { + "beforeDevCommand": "pnpm dev", + "beforeBuildCommand": "pnpm build", + "devPath": "http://localhost:5174", + "distDir": "../dist", + "withGlobalTauri": false + }, + "package": { + "productName": "RisuAI", + "version": "0.6.2" + }, + "tauri": { + "allowlist": { + "app": { + "all": true + }, + "process": { + "relaunch": true + }, + "protocol": { + "all": true, + "assetScope": ["asset","$APPDATA","$APPDATA/*","$APPDATA/**/*", "/data/**/*"] + }, + "all": false, + "shell": { + "all": false, + "open": true + }, + "fs":{ + "all": true, + "scope": ["$APPDATA","$APPDATA/*","$APPDATA/**/*", "$DOWNLOAD/*", "/data/**/*"] + }, + "path":{ + "all": true + }, + "http": { + "all": true, + "request": true, + "scope": ["https://*/*", "https://*/**/*","http://*/*", "http://*/**/*"] + }, + "window": { + "center": false, + "close": false, + "create": false, + "hide": false, + "maximize": true, + "minimize": false, + "print": false, + "requestUserAttention": false, + "setAlwaysOnTop": false, + "setCursorGrab": false, + "setCursorIcon": false, + "setCursorPosition": false, + "setCursorVisible": false, + "setDecorations": false, + "setFocus": false, + "setFullscreen": true, + "setIcon": false, + "setIgnoreCursorEvents": false, + "setMaxSize": false, + "setMinSize": false, + "setPosition": false, + "setResizable": false, + "setSize": false, + "setSkipTaskbar": false, + "setTitle": false, + "show": false, + "startDragging": false, + "unmaximize": false, + "unminimize": false + }, + "dialog": { + "all": true + }, + "os": { + "all": true + } + }, + "bundle": { + "active": true, + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "identifier": "co.aiclient.risu", + "targets": "all" + }, + "security": { + "csp": null + }, + "updater": { + "active": false + }, + "windows": [ + { + "fullscreen": false, + "resizable": true, + "title": "RisuAI", + "width": 1024, + "height": 768, + "minWidth": 300, + "minHeight": 500 + } + ] + } +} diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 00000000..694fb1e0 --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,49 @@ + + +
+ {#if !$loadedStore} +
+ Loading... +
+ {:else if !didFirstSetup} + + {:else} + {#if gridOpen} + {gridOpen = false}} /> + {:else} + {#if $sideBarStore} + {gridOpen = true}} /> + {:else} + + {/if} + {#if (($SizeStore.w > 1028) || (!$sideBarStore))} + + {/if} + {/if} + {/if} + {#if $alertStore.type !== 'none'} + + {/if} +
\ No newline at end of file diff --git a/src/etc/bg.jpg b/src/etc/bg.jpg new file mode 100644 index 00000000..526cdec0 Binary files /dev/null and b/src/etc/bg.jpg differ diff --git a/src/etc/send.mp3 b/src/etc/send.mp3 new file mode 100644 index 00000000..5e3fdabb Binary files /dev/null and b/src/etc/send.mp3 differ diff --git a/src/lang/en.ts b/src/lang/en.ts new file mode 100644 index 00000000..b9bcbc08 --- /dev/null +++ b/src/lang/en.ts @@ -0,0 +1,204 @@ + + +export const languageEnglish = { + formating:{ + 'main': "Main Prompt", + 'jailbreak': "Jailbreak Prompt", + 'chats': "Past Chats", + 'lorebook': "Lorebook", + 'globalNote': "Global Note", + 'authorNote': "Author's Note", + 'lastChat': "Last Chat", + "description": "Character Description" + }, + errors:{ + toomuchtoken: 'Error: The minimum required token is greater than the Max Context Size.', + unknownModel: 'Error: Unknown model selected', + httpError: 'Error: error in request:', + noData: 'There is no data in file, or the file is corrupted', + onlyOneChat: 'There must be least one chat', + alreadyCharInGroup: "There is already a character with the same name in the group." + }, + help:{ + model: "Model option is a main model used in chat.", + submodel: "Auxiliary Model is a model that used in analizing emotion images and etc. gpt3.5 is recommended.", + oaiapikey: 'Api key for OpenAI. you can get it in https://platform.openai.com/account/api-keys', + mainprompt: 'The main prompt option sets the default model behavior.', + jailbreak: 'The NSFW/jailbreak prompt option activates when NSFW/jailbreak toggle is on in character.', + globalNote: 'a note that strongly effects model behavior, also known as UJB. works in all characters.', + formatOrder: "formating order of prompt. lower blocks does more effect to the model.", + forceUrl: "if it is not blank, the request will go to the url that you had inputed.", + tempature:"lower values make character follow prompts closely, but it will more likely to response like a machine.\nHigher values will result in creative behavior, but the character's response can break down more easily.", + frequencyPenalty: "Higher values prevent the use of duplicate words in response, but character's response can break down more easily.", + presensePenalty: "Higher values prevent the use of duplicate words in all context, but character's response can break down more easily.", + sdProvider: "provider for image generation.", + msgSound: "Plays *ding* sound when character responses", + charDesc: "Brief description of the character. this effects characters response.", + charFirstMessage: "First message of the character. this highly effects characters response.", + charNote: "a note that strongly effects model behavior. works in current chat. also known as memory.", + toggleNsfw: "toggles NSFW/jailbreak prompt on and off.", + lorebook: "Lorebook is a user-made dictionary for AI. AI only sees it when where is an activation keys in the context.", + loreName: "name of the lore. it dosen't effects the Ai.", + loreActivationKey: "If one of the activation key exists in context, the lore will be activated and prompt will go in. seperated by commas.", + loreorder: "If insert Order is higher, it will effect the model more, and it will more lessly cuted when activated lore are many.", + bias:"bias is a key-value data which modifies the likelihood of string appearing.\nit can be -100 to 100, higher values will be more likely to appear, and lower values will be more unlikely to appear \nWarning: if the tokenizer is wrong, it not work properly.", + emotion: "Emotion Images option shows image depending at character's emotion which is analized by character's response. you must input emotion name as words *(like joy, happy, fear and etc.)* .emotion named **netural** will be default emotion if it exists. must be more then 3 images to work properly.", + imggen: "Image Generation option generates and shows image from external program. the image is generated by image prompt, which is made by analizing current chat. \n\n image generation is analized based on key-value arguments, which are configarable in below." + + "\n\n**'always'** key applys always, and dosen't changes. **'negative'** key applys always in negative value for image generation." + + "\n\nobjects with other key's value will change according to the key's name as the chat progresses." + + "\n\nIf a key has a special character in front of its name, it has a special effect." + + "\n- if the key starts with **|**, the key's value will not change." + + "\n- if the key starts with **$**, the key's value will more likely to change." + + "\n\nwhen the image is first generated, you can only change it by modifying 'Current Image Generation Data' in below.", + experimental: "This is a experimental setting. it might be unstable." + }, + setup: { + chooseProvider: "Choose AI Provider", + openaikey: "OpenAI with API Key (Recommended)", + openaiProxy: "OpenAI Reverse proxy", + setupmodelself: "Others / I will setup myself", + inputApiKey: "Input API Key Here", + apiKeyhelp: "You can get api key from: ", + setupSelfHelp: "Setup yourself in settings, after Welcome screen ends.", + theme: "Select your theme", + texttheme: "Select your text color", + inputName: "Lastly, Input your Nickname." + }, + confirm: "Confirm", + goback: "Go Back", + botSettings:'Bot Settings', + model: "Model", + apiKey: 'API Key', + providerURL: 'Request URL', + providerJSON: 'Request Body JSON', + mainPrompt: "Main Prompt", + jailbreakPrompt: "NSFW/Jailbreak Prompt", + globalNote: "Global Note", + tokens: 'Tokens', + maxContextSize: 'Max Context Size', + maxResponseSize: 'Max Response Size', + temperature: 'Temperature', + frequencyPenalty: 'Frequency Penalty', + presensePenalty: 'Presense Penalty', + advancedSettings: 'Advanced Settings', + advancedSettingsWarn: "Warn: If you don't know what the option does, don't change it!", + formatingOrder: "Formating Order", + authorNote: "Author's Note", + firstMessage: 'First Message', + description: 'Description', + jailbreakToggle: 'Toggle NSFW/Jailbreak', + charIcon: "Character Icon", + characterDisplay: "Character Display", + viewScreen: 'Additional Character Screen', + none: "None", + emotionImage: "Emotion Images", + noImages: "No Images", + noBias: "No Bias", + image: 'Image', + name: 'Name', + emotion: "Emotion Name", + value: "Value", + reroll: 'Regenerate', + chatList: 'Chat List', + removeChat: "Remove this message?", + loreBook: 'Lorebook', + character: "Character", + Chat: "Chat", + globalLoreInfo: "Character Lorebook applys to all chats in the character.", + group: "Group", + groupLoreInfo: "Group Lorebook applys to all chats in the group.", + localLoreInfo: "Chat Lorebook only applies to the current chat.", + removeConfirm: "Do you really want to remove: ", + removeConfirm2: "Do you REALLY want to remove: ", + exportConfirm: "Do you want to export this?", + insertOrder: 'Insertion Order', + activationKeys: 'Activation keys', + activationKeysInfo: 'Comma seperated', + prompt: 'Prompt', + loreBookDepth: "Lorebook Search Depth", + loreBookToken: "Lorebook Max Tokens", + removeCharacter: "Remove Character", + removeGroup: "Remove Group", + exportCharacter: "Export Character", + userSetting: "User Settings", + username:'Your Name', + userIcon: "Your Icon", + successExport: "Successfuly exported and downloaded to your download directory", + successImport: "Successfuly imported", + importedCharacter: 'Imported Character', + alwaysActive: "Always Active", + additionalPrompt: "Additional Prompt", + descriptionPrefix: "Description Prefix", + forceReplaceUrl: "Reverse Proxy", + emotionWarn: "Auxiliary model is used.", + plugin: "Plugin", + language: "Language", + UiLanguage: "UI Language", + createfromScratch: "Create from Scratch", + importCharacter: 'Import Character', + translator: "Translator", + disabled: "Disabled", + noPluginSelected: "Model selected as plugin, but no plugin selected.", + text: "Text", + UISize: "Chat Text Size", + newVersion: "Update found, do you want to install?", + display: "Display & Audio", + useCustomBackground: "Custom Background", + translateInput: "Translate Input", + autoTranslation: "Auto Translation", + fullscreen: "Fullscreen", + playMessage:"Play Message Audio", + iconSize: "Icon Size", + createGroup: "Create Group Chat", + groupIcon: "Group Icon", + single: "Single", + multiple: "Multiple", + useCharLorebook: "Use Lores in Characters", + selectChar: "Select Character", + askLoadFirstMsg: "Shall we load the first message?", + theme: "Theme", + editOrder: "Edit Order", + autoMode: "Auto Mode", + submodel: "Auxiliary Model", + timeOutinSec: "Timeout (in seconds)", + emotionPrompt: "Emotion Prompt", + singleView: "Single View", + SpacedView: "Multiple Character View", + emphasizedView: "Double Character View", + pluginWarn: "Plugins run in an isolated environment, but installing malicious plugins can cause problems.", + createGroupImg: "Generate group icon", + waifuWidth: "Waifu Chat Width", + savebackup: "Save Backup to google", + loadbackup: "Load Backup from google", + files: "Files", + backupConfirm: "Do you really want to save backup?", + backupLoadConfirm: "Do you really want to load backup? All datas will be lost!", + backupLoadConfirm2: "Do you really, really want to load backup? All datas will be lost!", + pasteAuthCode: "Please copy the auth code from popup and paste it in here:", + others: "Others", + presets: "Presets", + imageGeneration: "Image Generation", + provider: "Provider", + key: "key", + noData: "No Data", + currentImageGeneration: "Current Image Generation Data", + promptPreprocess: "Use Prompt Preprocess", + SwipeRegenerate: "Use Swipe for Regeneration", + instantRemove: "Remove subsequent when message remove", + instantRemoveConfirm: "Do you want to remove just one message? If you select No, then the message after it will also be remove.", + textColor: "Text Color", + classicRisu: "Classic Risu", + highcontrast: "High-Contrast", + quickPreset: "You can quickly change preset by Ctrl + (Index of Preset)", + requestretrys:"Request Retrys when Fail", + utilityBot: "Utility Bot", + ShowLog: "Show Request Logs", + waifuWidth2: "Waifu Character Size", + sayNothing:"Input 'say nothing' when no string inputed", + regexScript: "Regex Script", + type: "Type", + editInput: "Modfiy Input", + editOutput: "Modfiy Output", + editProcess: "Modfiy Request Data" + +} diff --git a/src/lang/index.ts b/src/lang/index.ts new file mode 100644 index 00000000..b0d5dc8f --- /dev/null +++ b/src/lang/index.ts @@ -0,0 +1,15 @@ +import { cloneDeep, merge } from "lodash"; +import { languageEnglish } from "./en"; +import { languageKorean } from "./ko"; + +export let language:typeof languageEnglish = languageEnglish + + +export function changeLanguage(lang:string){ + if(lang === 'ko'){ + language = merge(cloneDeep(languageEnglish), languageKorean) + } + else{ + language = languageEnglish + } +} \ No newline at end of file diff --git a/src/lang/ko.ts b/src/lang/ko.ts new file mode 100644 index 00000000..d930b596 --- /dev/null +++ b/src/lang/ko.ts @@ -0,0 +1,203 @@ +export const languageKorean = { + formating:{ + 'main': "메인 프롬프트", + 'jailbreak': "탈옥 프롬프트", + 'chats': "과거 채팅", + 'lorebook': "로어북", + 'globalNote': "글로벌 노트", + 'authorNote': "작가의 노트", + 'lastChat': "마지막 채팅", + "description": "캐릭터 설명" + }, + errors:{ + toomuchtoken: '에러: 요청에 필요한 최소 토큰이 최대 토큰보다 큽니다.', + unknownModel: '에러: 알수없는 모델 선택됨', + httpError: '요청 에러:', + noData: '파일에 데이터가 없거나 데이터가 손상됨', + onlyOneChat: '채팅이 하나 이상 필요합니다', + alreadyCharInGroup: "이미 같은 캐릭터가 그룹에 존재합니다." + + }, + + botSettings:'봇 설정', + model: "모델", + apiKey: 'API 키', + providerURL: '요청 URL', + providerJSON: '요청 JSON', + mainPrompt: "메인 프롬프트", + jailbreakPrompt: "탈옥 프롬프트", + globalNote: "글로벌 노트", + tokens: '토큰', + maxContextSize: '최대 콘텍스트 크기', + maxResponseSize: '최대 응답 크기', + temperature: '온도', + frequencyPenalty: '빈도 패널티', + presensePenalty: '프리센스 패널티', + advancedSettings: '고급 설정', + advancedSettingsWarn: "어떤 설정인지 모르겠으면, 만지지 마세요!", + formatingOrder: "포맷 순서", + authorNote: "작가의 노트", + firstMessage: '첫 메시지', + description: '설명', + jailbreakToggle: 'NSFW/탈옥 토글', + charIcon: "캐릭터 아이콘", + characterDisplay: "캐릭터 디스플레이", + viewScreen: '추가적 캐릭터 스크린', + none: "없음", + emotionImage: "감정 이미지", + noImages: "이미지 없음", + noBias: "Bias 없음", + image: '이미지', + name: '이름', + emotion: "감정 이름", + value: "값", + reroll: '재생성', + chatList: '채팅 리스트', + removeChat: "이 메시지를 삭제하시겠습니까?", + loreBook: '로어북', + character: "캐릭터", + Chat: "챗", + globalLoreInfo: "캐릭터 로어북은 이 캐릭터의 모든 채팅에 적용됩니다.", + localLoreInfo: "챗 로어북은 이 채팅에만 적용됩니다.", + group: "그룹", + groupLoreInfo: "그룹 로어북은 이 그룹의 모든 채팅에 적용됩니다.", + removeConfirm: "정말로 삭제하시겠습니까: ", + removeConfirm2: "정말로, 정말로 삭제하시겠습니까: ", + exportConfirm: "추출하시겠습니까?", + insertOrder: '배치 순서', + activationKeys: '활성화 키', + activationKeysInfo: '","로 나눠주세요', + prompt: '프롬프트', + loreBookDepth: "로어북 검색 깊이", + loreBookToken: "로어북 최대 토큰", + removeCharacter: "캐릭터 삭제", + exportCharacter: "캐릭터 추출", + userSetting: "유저 설정", + username:'유저 이름', + userIcon: "유저 아이콘", + successExport: "성공적으로 추출하여 다운로드 경로에 다운로드했습니다.", + successImport: "성공적으로 임포트했습니다.", + importedCharacter: '성공적으로 임포트 됨.', + alwaysActive: "언제나 활성화", + additionalPrompt: "추가 프롬프트", + descriptionPrefix: "캐릭터 설명 Prefix", + forceReplaceUrl: "리버스 프록시", + emotionWarn: "채팅 분석에는 보조 모델을 사용합니다.", + plugin: "플러그인", + language: "언어", + UiLanguage: "UI Language", + createfromScratch: "새 캐릭터 생성", + importCharacter: '캐릭터 임포트', + translator: "번역기", + disabled: "비활성화됨", + noPluginSelected: "Model selected as plugin, but no plugin selected.", + text: "텍스트", + UISize: "채팅 텍스트 크기", + newVersion: "업데이트가 발견되었습니다. 설치하시겠습니까?", + display: "소리 및 디스플레이", + useCustomBackground: "커스텀 배경", + translateInput: "입력창 번역하기", + autoTranslation: "자동 번역", + fullscreen: "전체 화면", + playMessage:"메시지 소리 출력", + iconSize: "아이콘 크기", + createGroup: "그룹 챗 만들기", + removeGroup: "그룹 삭제", + groupIcon: "그룹 아이콘", + single: "싱글", + multiple: "멀티플", + useCharLorebook: "캐릭터에 있는 로어 사용", + selectChar: "캐릭터 선택", + askLoadFirstMsg: "첫 메세지를 불러올까요?", + theme: "테마", + editOrder: "캐릭터 순서 변경", + autoMode: "오토 모드", + submodel: "보조 모델", + timeOutinSec: "타임아웃 (초)", + emotionPrompt: "감정 프롬프트", + singleView: "싱글", + SpacedView: "멀티플", + emphasizedView: "더블", + pluginWarn: "플러그인은 기본적으로 분리된 환경에서 실행되지만, 악성 플러그인 설치 시 문제가 생길 수 있습니다.", + createGroupImg: "그룹 아이콘 자동생성", + waifuWidth: "Waifu 채팅창 넓이", + savebackup: "구글 백업 저장", + loadbackup: "구글 백업 불러오기", + files: "파일", + backupConfirm: "정말로 백업을 저장하시겠습니까?", + backupLoadConfirm: "정말로 백업을 불러오시겠습니까? 현재 데이터가 모두 사라집니다!", + backupLoadConfirm2: "정말로, 정말로 백업을 불러오시겠습니까? 현재 데이터가 모두 사라집니다!", + pasteAuthCode: "팝업에서 Auth Code를 복사하여 붙여넣기 해 주세요:", + others: "기타", + presets: "프리셋", + imageGeneration: "이미지 생성", + provider: "공급자", + key: "키", + noData: "데이터 없음", + currentImageGeneration: "현재 이미지 생성 데이터", + promptPreprocess: "프롬프트 선보정 사용", + SwipeRegenerate: "스와이프 리롤 사용", + instantRemove: "삭제 시 그 이후 채팅 삭제", + instantRemoveConfirm: "메시지 한개만 삭제하시겠습니까? No를 선택할 시, 그 이후 메시지또한 삭제됩니다.", + textColor: "텍스트 색상", + classicRisu: "클래식 Risu", + highcontrast: "고대비", + quickPreset: "Ctrl + (프리셋 번호)로 프리셋을 빠르게 변경할 수 있습니다", + requestretrys:"실패 시 재요청 횟수", + utilityBot: "유틸리티 봇", + ShowLog: "리퀘스트 로그 보기", + waifuWidth2: "Waifu 캐릭터 크기", + sayNothing:"어떤 문자열도 입력되지 않을 시 'say nothing' 입력", + help:{ + model: "채팅에서 사용되는 모델입니다.", + submodel: "보조 모델은 감정 이미지등을 분석하는 데 사용되는 모델입니다. gpt3.5가 권장됩니다.", + oaiapikey: 'OpenAI용 API 키입니다. https://platform.openai.com/account/api-keys에서 구하실 수 있습니다.', + mainprompt: '모델의 기본적인 방향성을 정하는 프롬프트입니다.', + jailbreak: 'NSFW/jailbreak 프롬프트는 NSFW/jailbreak 토글이 켜져있을 때 작동되는 프롬프트입니다.', + globalNote: '모델에 강력한 영향을 주는 프롬프트입니다. UJB라고도 합니다.', + formatOrder: "프롬프트의 배치 순서입니다. 아래쪽에 있을 수록 더 큰 영향을 줍니다.", + forceUrl: "공백이 아닐 경우. 리퀘스트가 다음 URL로 갑니다.", + tempature:"값이 낮을수록 캐릭터가 프롬프트를 잘 따르지만 기계처럼 반응할 가능성이 높아집니다.\n값이 높을수록 창의적인 동작이 가능하지만 캐릭터의 반응이 이상해질 수 있습니다.", + frequencyPenalty: "값이 높을수록 응답 내에서 대사가 반복되는 걸 줄여주지만, 값이 높으면 캐릭터의 반응이 이상해질 수 있습니다.", + presensePenalty: "값이 높을수록 전체 콘텍스트 내에서 대사가 반복되는 걸 줄여주지만, 값이 높으면 캐릭터의 반응이 이상해질 수 있습니다.", + sdProvider: "이미지 생성의 제공자 옵션입니다.", + msgSound: "메세지를 받았을때 *띵* 소리가 납니다.", + charDesc: "캐릭터의 설명입니다.", + charFirstMessage: "캐릭터의 첫 대사입니다.", + charNote: "모델에 강력한 영향을 주는 프롬프트입니다. 이 채팅에서만 적용되며, 메모리라고도 알려져 있습니다.", + toggleNsfw: "NSFW/jailbreak 프롬프트를 끄거나 켭니다.", + lorebook: " AI를 위해 사용자가 만든 사전입니다. AI는 컨텍스트에서 활성화 키가 어디에 있을 때만 이를 인식합니다.", + loreName: "로어의 이름입니다. AI에 영향을 주지 않습니다.", + loreActivationKey: "활성화 키 중 하나가 컨텍스트에 존재하면 해당 로어가 활성화됩니다. 쉼표로 구분된 활성화를 구분하세요.", + loreorder: "순서가 높을수록 모델에 더 많은 영향을 미치며, 활성화된 로어가 많을 때 잘리지 않습니다.", + bias:"바이어스는 문자열이 나타날 가능성을 수정하는 키-값 데이터로, -100에서 100까지 가능하며 값이 클수록 나타날 가능성이 높고, 값이 작을수록 나타날 가능성이 낮습니다 \n경고: 토큰라이저가 잘못되면 제대로 작동하지 않습니다.", + emotion: "감정 이미지 옵션은 캐릭터의 반응으로 분석된 캐릭터의 감정에 따라 이미지를 표시합니다. 감정 이름은 단어 *(예시: joy, happy, fear 등)* 로 입력해야 하며, **netural** 이라는 이름의 감정이 존재하면 기본 감정이 됩니다. 제대로 작동하려면 이미지가 3개 이상이어야 합니다.", + imggen: "이미지 생성 옵션은 외부 프로그램에서 이미지를 생성하고 생성한 이미지를 표시합니다. 이미지는 현재 채팅을 분석하여 만든 이미지 프롬프트에 의해 생성됩니다. \n이미지 생성은 아래에서 구성할 수 있는 키-값 인수를 기반으로 분석됩니다." + + "\n\n**'always'** 키는 언제나 들어가며, 바뀌지 않습니다. **'negative'** 키는 항상 이미지 생성의 네거티브 값으로 들어갑니다." + + "\n\n채팅이 진행됨에 따라 키의 이름에 따라 값이 변경됩니다." + + "\n\n키의 이름에 다음과 같은 문자가 있다면 특수효과가 있습니다." + + "\n- 키의 이름이 **|** 로 시작할 시, 값은 고정됩니다." + + "\n- 키의 이름이 **$** 로 시작할 시, 값은 더 자주 변합니다." + + "\n\n이미지가 처음 생성된 이후부터는 '현재 이미지 생성 데이터'를 수정하여 변경할 수 있습니다.", + experimental: "실험적 기능입니다. 불안정할 수 있습니다." + }, + setup: { + chooseProvider: "AI 제공자를 선택해 주세요", + openaikey: "OpenAI & API Key (권장)", + openaiProxy: "OpenAI 리버스 프록시", + setupmodelself: "그외 / 직접 설정", + inputApiKey: "여기에 API 키를 입력해주세요", + apiKeyhelp: "이곳에서 API키를 얻을 수 있습니다: ", + setupSelfHelp: "첫 셋업 화면이 끝난 뒤, 설정에서 직접 수정해 주세요", + theme: "테마를 입력해 주세요", + texttheme: "텍스트 색상을 선택해주세요", + inputName: "마지막으로, 닉네임을 입력해 주세요" + }, + confirm: "확인", + goback: "뒤로", + regexScript: "정규식 스크립트", + type: "타입", + editInput: "입력문 수정", + editOutput: "출력문 수정", + editProcess: "리퀘스트 데이터 수정" +} \ No newline at end of file diff --git a/src/lib/ChatScreens/AutoresizeArea.svelte b/src/lib/ChatScreens/AutoresizeArea.svelte new file mode 100644 index 00000000..863d086d --- /dev/null +++ b/src/lib/ChatScreens/AutoresizeArea.svelte @@ -0,0 +1,39 @@ + + + + + + {tokens.desc} {language.tokens} + {language.firstMessage} + + {tokens.firstMsg} {language.tokens} + {:else} + + {language.character} +
+ {#if currentChar.data.characters.length === 0} + No Character + {:else} + {#each currentChar.data.characters as char, i} + {#await getCharImage(findCharacterbyId(char).image, 'css')} + { + rmCharFromGroup(i) + }}> + + + {:then im} + { + rmCharFromGroup(i) + }} additionalStyle={im} /> + {/await} + {/each} + {/if} +
+
+ +
+ + {/if} + {language.authorNote} + + {tokens.localNote} {language.tokens} + +
+ + {language.jailbreakToggle} +
+{:else if subMenu === 1} +

{language.characterDisplay}

+ {currentChar.type !== 'group' ? language.charIcon : language.groupIcon} + + + {#if currentChar.type === 'group'} + + {/if} + + + {language.viewScreen} + + + {#if currentChar.type !== 'group'} + + {:else} + + {/if} + + {#if currentChar.data.viewScreen === 'emotion'} + {language.emotionImage} + {language.emotionWarn} + + + + + + + + {#if currentChar.data.emotionImages.length === 0} + +
{language.noImages}
+ + {/if} + {#each currentChar.data.emotionImages as emo, i} + + {#await getCharImage(emo[1], 'plain')} + + {:then im} + + {/await} + + + + {/each} +
{language.image}{language.emotion}
img + +
+ +
+ {#if !$addingEmotion} + + {:else} + Loading... + {/if} +
+ {/if} + {#if currentChar.data.viewScreen === 'imggen'} + {language.imageGeneration} + {language.emotionWarn} + + + + + + + + + {#if currentChar.data.sdData.length === 0} + +
{language.noData}
+ + {/if} + {#each currentChar.data.sdData as emo, i} + + + + {#if (!['always','negative'].includes(currentChar.data.sdData[i][0]))} + + {:else} + + {/if} + + {/each} + +
{language.key}{language.value}
+ + + +
+
+ {#if !$addingEmotion} + + {:else} + Loading... + {/if} +
+ {language.currentImageGeneration} + {#if currentChar.data.chats[currentChar.data.chatPage].sdData} + + {:else} +
{language.noData}
+ {/if} + {/if} +{:else if subMenu === 3} +

{language.loreBook}

+ +{:else if subMenu === 2} +

{language.advancedSettings}

+ {#if currentChar.type !== 'group'} + Bias + + + + + + + {#if currentChar.data.bias.length === 0} + +
{language.noBias}
+ + {/if} + {#each currentChar.data.bias as bias, i} + + + + + + {/each} +
Bias{language.value} { + if(currentChar.type === 'character'){ + let bia = currentChar.data.bias + bia.push(['', 0]) + currentChar.data.bias = bia + } + }}>
+ + + +
+ {language.regexScript} + + {#if currentChar.data.customscript.length === 0} +
No Scripts
+ {/if} + {#each currentChar.data.customscript as customscript, i} + { + if(currentChar.type === 'character'){ + let customscript = currentChar.data.customscript + customscript.splice(i, 1) + currentChar.data.customscript = customscript + } + }}/> + {/each} +
+ { + if(currentChar.type === 'character'){ + let script = currentChar.data.customscript + script.push({ + comment: "", + in: "", + out: "", + type: "editinput" + }) + currentChar.data.customscript = script + } + }}> +
+ + {language.utilityBot} +
+ + + {:else} + +
+ + {language.useCharLorebook} +
+ + {/if} + +{/if} + + + \ No newline at end of file diff --git a/src/lib/SideBars/DropList.svelte b/src/lib/SideBars/DropList.svelte new file mode 100644 index 00000000..6dc87060 --- /dev/null +++ b/src/lib/SideBars/DropList.svelte @@ -0,0 +1,58 @@ + + +
+ {#each list as n, i} +
+ {language.formating[n]} + + +
+ {#if i !== (list.length - 1)} +
+ {/if} + {/each} +
+ + \ No newline at end of file diff --git a/src/lib/SideBars/LoreBookData.svelte b/src/lib/SideBars/LoreBookData.svelte new file mode 100644 index 00000000..fcd6c5aa --- /dev/null +++ b/src/lib/SideBars/LoreBookData.svelte @@ -0,0 +1,75 @@ + + +
+
+ + +
+ {#if open} +
+ {language.name} + + {#if !value.alwaysActive} + {language.activationKeys} + {language.activationKeysInfo} + + {/if} + {language.insertOrder} + + {language.prompt} + +
+ + {language.alwaysActive} +
+
+ {/if} +
+ + + + \ No newline at end of file diff --git a/src/lib/SideBars/LoreBookSetting.svelte b/src/lib/SideBars/LoreBookSetting.svelte new file mode 100644 index 00000000..dc63536f --- /dev/null +++ b/src/lib/SideBars/LoreBookSetting.svelte @@ -0,0 +1,82 @@ + + +
+ + +
+{submenu === 0 ? $DataBase.characters[$selectedCharID].type === 'group' ? language.groupLoreInfo : language.globalLoreInfo : language.localLoreInfo} + +
+ {#if submenu === 0} + {#if $DataBase.characters[$selectedCharID].globalLore.length === 0} + No Lorebook + {:else} + {#each $DataBase.characters[$selectedCharID].globalLore as book, i} + {#if i !== 0} +
+ {/if} + { + let lore = $DataBase.characters[$selectedCharID].globalLore + lore.splice(i, 1) + $DataBase.characters[$selectedCharID].globalLore = lore + }}/> + {/each} + {/if} + {:else} + {#if $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].localLore.length === 0} + No Lorebook + {:else} + {#each $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].localLore as book, i} + {#if i !== 0} +
+ {/if} + { + let lore = $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].localLore + lore.splice(i, 1) + $DataBase.characters[$selectedCharID].chats[$DataBase.characters[$selectedCharID].chatPage].localLore = lore + }}/> + {/each} + {/if} + {/if} + +
+ +
+ + + +
+ + \ No newline at end of file diff --git a/src/lib/SideBars/RegexData.svelte b/src/lib/SideBars/RegexData.svelte new file mode 100644 index 00000000..de56752a --- /dev/null +++ b/src/lib/SideBars/RegexData.svelte @@ -0,0 +1,69 @@ + + +
+
+ + +
+ {#if open} +
+ {language.name} + + Type + + IN: + + OUT: + +
+ {/if} +
+ + \ No newline at end of file diff --git a/src/lib/SideBars/Settings.svelte b/src/lib/SideBars/Settings.svelte new file mode 100644 index 00000000..b65e21ad --- /dev/null +++ b/src/lib/SideBars/Settings.svelte @@ -0,0 +1,539 @@ + + +
+ + + + + + +
+ +{#if subMenu === -1} +

{language.userSetting}

+ {language.userIcon} + + {language.username} + + +{:else if subMenu === 0 && subSubMenu === 0} +

{language.botSettings}

+
+ + +
+ {language.model} + + + {language.submodel} + + + {#if $DataBase.aiModel === 'gpt35' || $DataBase.aiModel === 'gpt4' || $DataBase.subModel === 'gpt4' || $DataBase.subModel === 'gpt35'} + OpenAI {language.apiKey} + + {/if} + {#if $DataBase.aiModel === 'custom'} + {language.plugin} + + {/if} + {#if $DataBase.aiModel === 'textgen_webui' || $DataBase.subModel === 'textgen_webui'} + TextGen {language.providerURL} + + You must use WebUI without agpl license or use unmodified version with agpl license to observe the contents of the agpl license. + You must use textgen webui with --no-stream and without --cai-chat or --chat + {/if} + {language.mainPrompt} + + {tokens.mainPrompt} {language.tokens} + {language.jailbreakPrompt} + + {tokens.jailbreak} {language.tokens} + {language.globalNote} + + {tokens.globalNote} {language.tokens} + {language.maxContextSize} + {#if $DataBase.aiModel === 'gpt35'} + + {:else if $DataBase.aiModel === 'gpt4' || $DataBase.aiModel === 'textgen_webui'} + + {:else if $DataBase.aiModel === 'custom'} + + {/if} + {language.maxResponseSize} + + {language.temperature} + + {($DataBase.temperature / 100).toFixed(2)} + {language.frequencyPenalty} + + {($DataBase.frequencyPenalty / 100).toFixed(2)} + {language.presensePenalty} + + {($DataBase.PresensePenalty / 100).toFixed(2)} + + {language.forceReplaceUrl} + + {language.submodel} {language.forceReplaceUrl} + + + + +
+ {language.advancedSettings} + {language.formatingOrder} + + Bias + + + + + + + {#if $DataBase.bias.length === 0} + +
{language.noBias}
+ + {/if} + {#each $DataBase.bias as bias, i} + + + + + + {/each} +
Bias{language.value} { + let bia = $DataBase.bias + bia.push(['', 0]) + $DataBase.bias = bia + }}>
+ + + +
+ +
+ + {language.promptPreprocess} +
+
+ + + + +{:else if subMenu === 0 && subSubMenu === 1} +

{language.botSettings}

+
+ + +
+ {language.imageGeneration} + + {language.provider} + + + {#if $DataBase.sdProvider === 'webui'} + You must use WebUI with --api flag + You must use WebUI without agpl license or use unmodified version with agpl license to observe the contents of the agpl license. + {#if !isTauri} + You are using web version. you must use ngrok or other tunnels to use your local webui. + {/if} + WebUI {language.providerURL} + + {/if} + + + Steps + + + CFG Scale + + + Width + + Height + + Sampler + + +{:else if subMenu === 3} +

{language.display}

+ {language.UiLanguage} + + + {language.theme} + + + + {#if $DataBase.theme === "waifu"} + {language.waifuWidth} + + {($DataBase.waifuWidth)}% + + {language.waifuWidth2} + + {($DataBase.waifuWidth2)}% + {/if} + + {language.textColor} + + + {#if $DataBase.textTheme === "custom"} +
+ + Normal Text +
+
+ + Italic Text +
+
+ + Bold Text +
+
+ + Italic Bold Text +
+ {/if} + + + {#if isTauri} + {language.translator} + + {/if} + {language.UISize} + + {($DataBase.zoomsize)}% + + {language.iconSize} + + {($DataBase.iconsize)}% + + {#if isTauri} +
+ + {language.autoTranslation} +
+ {/if} +
+ + {language.fullscreen} +
+ +
+ { + if(check){ + $DataBase.customBackground = '-' + const d = await selectSingleFile(['png', 'webp', 'gif']) + if(!d){ + $DataBase.customBackground = '' + return + } + const img = await saveImage(d.data) + $DataBase.customBackground = img + } + else{ + $DataBase.customBackground = '' + } + }}> + {language.useCustomBackground} +
+ +
+ + {language.playMessage} +
+ +
+ + {language.SwipeRegenerate} +
+ +
+ + {language.instantRemove} +
+ +{:else if subMenu === 2} +

{language.plugin}

+ {language.pluginWarn} + + +
+ {#if $DataBase.plugins.length === 0} + No Plugins + {:else} + {#each $DataBase.plugins as plugin, i} + {#if i !== 0} +
+ {/if} +
+ {plugin.displayName ?? plugin.name} + +
+ {#if Object.keys(plugin.arguments).length > 0} +
+ {#each Object.keys(plugin.arguments) as arg} + {arg} + {#if Array.isArray(plugin.arguments[arg])} + + {:else if plugin.arguments[arg] === 'string'} + + {:else if plugin.arguments[arg] === 'int'} + + {/if} + {/each} +
+ {/if} + {/each} + {/if} +
+
+ +
+{:else if subMenu === 1} +

{language.advancedSettings}

+ {language.advancedSettingsWarn} + {language.loreBookDepth} + + {language.loreBookToken} + + + {language.additionalPrompt} + + + {language.descriptionPrefix} + + + {language.emotionPrompt} + + + {language.requestretrys} + + + + {#if isTauri} + Request Lib + + {/if} + +
+ + {language.sayNothing} +
+ + + +{:else if subMenu === 4} +

{language.files}

+ + + + + +{/if} + + \ No newline at end of file diff --git a/src/lib/SideBars/Sidebar.svelte b/src/lib/SideBars/Sidebar.svelte new file mode 100644 index 00000000..d784e27c --- /dev/null +++ b/src/lib/SideBars/Sidebar.svelte @@ -0,0 +1,190 @@ + +
+ +
+ {#if menuMode === 0} + {#each charImages as charimg, i} +
+ {#if charimg !== ''} + {changeChar(i)}} additionalStyle={getCharImage($DataBase.characters[i].image, 'css')}> + + {:else} + {changeChar(i)}} additionalStyle={i === $selectedCharID ? 'background:#44475a' : ''}> + + + {/if} + {#if editMode} +
+ + +
+ {/if} +
+ {/each} + { + if(sideBarMode === 1){ + reseter(); + sideBarMode = 0 + } + else{ + reseter(); + sideBarMode = 1 + } + }}> + {:else} + { + if($settingsOpen){ + reseter(); + settingsOpen.set(false) + } + else{ + reseter(); + settingsOpen.set(true) + } + }}> + { + reseter(); + openGrid() + }}> + {/if} +
+
1000)}> + + + {#if sideBarMode === 0} + {#if $selectedCharID < 0 || $settingsOpen} + + {:else} + + {/if} + {:else if sideBarMode === 1} +

Create

+ + + +

Edit

+ + {/if} +
+ + + +{#if openPresetList} + {openPresetList = false}}/> +{/if} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 00000000..02ce43c0 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,17 @@ +import "./styles.css"; +import App from "./App.svelte"; +import { loadData } from "./ts/globalApi"; + +import { Buffer as BufferPolyfill } from 'buffer' +import { initHotkey } from "./ts/hotkey"; +declare var Buffer: typeof BufferPolyfill; +globalThis.Buffer = BufferPolyfill + + +const app = new App({ + target: document.getElementById("app"), +}); + +loadData() +initHotkey() +export default app; \ No newline at end of file diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 00000000..aef65e9e --- /dev/null +++ b/src/styles.css @@ -0,0 +1,109 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body{ + margin: 0; + padding: 0; + margin-top: 0px; + background-color: #282a36; + overflow-y: hidden; + overflow-x: hidden; +} + +:root{ + --FontColorStandard: #fafafa; + --FontColorBold : #fafafa; + --FontColorItalic : #8C8D93; + --FontColorItalicBold : #8C8D93; + +} + +html, body{ + height: 100% +} + +.chattext p{ + color: var(--FontColorStandard); +} + +.chattext2 pre{ + background-color: #282a36; + padding: 0.5rem; + overflow-x: auto; +} + +.chattext em{ + color: var(--FontColorItalic); +} + +.chattext strong{ + color: var(--FontColorBold); +} + +.chattext strong em{ + color: var(--FontColorItalicBold); +} + +::-webkit-scrollbar { + width: 5px; +} + +/* Track */ +::-webkit-scrollbar-track { + background: transparent; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + background: #888; +} + +/* Handle on hover */ +::-webkit-scrollbar-thumb:hover { + background: #555; +} + +*{ + font-family: Arial, Helvetica, sans-serif; +} + +.setting-area textarea{ + height: 10rem; + min-height: 10rem; +} + +.chattext p:first-child{ + margin-top: 0.3rem; +} + +.items-start { + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; +} +.items-start { + -webkit-box-align: start; + -ms-flex-align: start; + -webkit-align-items: flex-start; + align-items: flex-start; +} + +.items-center { + -webkit-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; +} + +#app{ + width: 100%; + height: 100%; +} + +.input-text{ + border: none; + outline: 0; + border-bottom: 1px solid #6272a4; +} \ No newline at end of file diff --git a/src/ts/alert.ts b/src/ts/alert.ts new file mode 100644 index 00000000..d29e3427 --- /dev/null +++ b/src/ts/alert.ts @@ -0,0 +1,114 @@ +import { get, writable } from "svelte/store" +import { sleep } from "./util" +import { language } from "../lang" + +interface alertData{ + type: 'error'| 'normal'|'none'|'ask'|'wait'|'selectChar'|'input'|'toast'|'wait2'|'markdown'|'select' + msg: string +} + + +export const alertStore = writable({ + type: 'none', + msg: 'n' +} as alertData) + +export function alertError(msg:string){ + console.error(msg) + + alertStore.set({ + 'type': 'error', + 'msg': msg + }) +} + +export function alertNormal(msg:string){ + alertStore.set({ + 'type': 'normal', + 'msg': msg + }) +} + +export async function alertSelect(msg:string[]){ + alertStore.set({ + 'type': 'select', + 'msg': msg.join('||') + }) + + while(true){ + if (get(alertStore).type === 'none'){ + break + } + await sleep(10) + } + + return get(alertStore).msg +} + +export function alertMd(msg:string){ + alertStore.set({ + 'type': 'markdown', + 'msg': msg + }) +} + +export function doingAlert(){ + return get(alertStore).type !== 'none' && get(alertStore).type !== 'toast' +} + +export function alertToast(msg:string){ + alertStore.set({ + 'type': 'toast', + 'msg': msg + }) +} + +export async function alertSelectChar(){ + alertStore.set({ + 'type': 'selectChar', + 'msg': '' + }) + + while(true){ + if (get(alertStore).type === 'none'){ + break + } + await sleep(10) + } + + return get(alertStore).msg +} + +export async function alertConfirm(msg:string){ + + alertStore.set({ + 'type': 'ask', + 'msg': msg + }) + + while(true){ + if (get(alertStore).type === 'none'){ + break + } + await sleep(10) + } + + return get(alertStore).msg === 'yes' +} + +export async function alertInput(msg:string){ + + alertStore.set({ + 'type': 'input', + 'msg': msg + }) + + while(true){ + if (get(alertStore).type === 'none'){ + break + } + await sleep(10) + } + + return get(alertStore).msg +} \ No newline at end of file diff --git a/src/ts/characters.ts b/src/ts/characters.ts new file mode 100644 index 00000000..92bc5dcd --- /dev/null +++ b/src/ts/characters.ts @@ -0,0 +1,686 @@ +import { get, writable } from "svelte/store"; +import { DataBase, saveImage, setDatabase, type character, type Chat, defaultSdDataFunc } from "./database"; +import exifr from 'exifr' +import { alertConfirm, alertError, alertNormal, alertSelect, alertStore } from "./alert"; +import { language } from "../lang"; +import { PngMetadata } from "./exif"; +import { encode as encodeMsgpack, decode as decodeMsgpack } from "@msgpack/msgpack"; +import { checkNullish, findCharacterbyId, selectMultipleFile, selectSingleFile, sleep } from "./util"; +import { v4 as uuidv4 } from 'uuid'; +import { selectedCharID } from "./stores"; +import { downloadFile, getFileSrc, readImage } from "./globalApi"; + +export function createNewCharacter() { + let db = get(DataBase) + db.characters.push(createBlankChar()) + setDatabase(db) + return db.characters.length - 1 +} + +export function createNewGroup(){ + let db = get(DataBase) + db.characters.push({ + type: 'group', + name: "", + firstMessage: "", + chats: [{ + message: [], + note: '', + name: 'Chat 1', + localLore: [] + }], chatPage: 0, + viewScreen: 'none', + globalLore: [], + characters: [], + autoMode: false, + useCharacterLore: true, + emotionImages: [], + customscript: [], + chaId: uuidv4(), + }) + setDatabase(db) + return db.characters.length - 1 +} + +export async function importCharacter() { + try { + const f = await selectSingleFile(['png', 'json']) + if(!f){ + return + } + if(f.name.endsWith('json')){ + const da = JSON.parse(Buffer.from(f.data).toString('utf-8')) + if((da.char_name || da.name) && (da.char_persona || da.description) && (da.char_greeting || da.first_mes)){ + let db = get(DataBase) + db.characters.push({ + name: da.char_name ?? da.name, + firstMessage: da.char_greeting ?? da.first_mes, + desc: da.char_persona ?? da.description, + notes: '', + chats: [{ + message: [], + note: '', + name: 'Chat 1', + localLore: [] + }], + chatPage: 0, + image: '', + emotionImages: [], + bias: [], + globalLore: [], + viewScreen: 'none', + chaId: uuidv4(), + sdData: defaultSdDataFunc(), + utilityBot: false, + customscript: [], + exampleMessage: '' + }) + DataBase.set(db) + alertNormal(language.importedCharacter) + return + } + else{ + alertError(language.errors.noData) + return + } + } + alertStore.set({ + type: 'wait', + msg: 'Loading... (Reading)' + }) + await sleep(10) + const img = f.data + const readed = (await exifr.parse(img, true)) + + console.log(readed) + if(readed.risuai){ + await sleep(10) + const va = decodeMsgpack(Buffer.from(readed.risuai, 'base64')) as any + if(va.type !== 101){ + alertError(language.errors.noData) + return + } + + + let char:character = va.data + let db = get(DataBase) + if(char.emotionImages && char.emotionImages.length > 0){ + for(let i=0;i" + name: string + personality: "" + scenario: "" + talkativeness: "0.5" +} + +export async function selectCharImg(charId:number) { + const selected = await selectSingleFile(['png']) + if(!selected){ + return + } + const img = selected.data + let db = get(DataBase) + const imgp = await saveImage(img) + db.characters[charId].image = imgp + setDatabase(db) +} + +export async function selectUserImg() { + const selected = await selectSingleFile(['png']) + if(!selected){ + return + } + const img = selected.data + let db = get(DataBase) + const imgp = await saveImage(img) + db.userIcon = imgp + setDatabase(db) +} + +export const addingEmotion = writable(false) + +export async function addCharEmotion(charId:number) { + addingEmotion.set(true) + const selected = await selectMultipleFile(['png', 'webp', 'gif']) + if(!selected){ + addingEmotion.set(false) + return + } + let db = get(DataBase) + for(const f of selected){ + console.log(f) + const img = f.data + const imgp = await saveImage(img) + const name = f.name.replace('.png','').replace('.webp','') + let dbChar = db.characters[charId] + if(dbChar.type !== 'group'){ + dbChar.emotionImages.push([name,imgp]) + db.characters[charId] = dbChar + } + setDatabase(db) + } + addingEmotion.set(false) +} + +export async function rmCharEmotion(charId:number, emotionId:number) { + let db = get(DataBase) + let dbChar = db.characters[charId] + if(dbChar.type !== 'group'){ + dbChar.emotionImages.splice(emotionId, 1) + db.characters[charId] = dbChar + } + setDatabase(db) +} + +export async function exportChar(charaID:number) { + const db = get(DataBase) + let char:character = JSON.parse(JSON.stringify(db.characters[charaID])) + + if(!char.image){ + alertError('Image Required') + return + } + const conf = await alertConfirm(language.exportConfirm) + if(!conf){ + return + } + + alertStore.set({ + type: 'wait', + msg: 'Loading...' + }) + + let img = await readImage(char.image) + + try{ + if(char.emotionImages && char.emotionImages.length > 0){ + for(let i=0;i", + name: char.name, + personality: "", + scenario: "", + talkativeness: "0.5" + } + + await sleep(10) + img = PngMetadata.write(img, { + 'chara': Buffer.from(JSON.stringify(tavernData)).toString('base64'), + 'risuai': data + }) + + alertStore.set({ + type: 'wait', + msg: 'Loading... (Writing)' + }) + + char.image = '' + await sleep(10) + await downloadFile(`${char.name.replace(/[<>:"/\\|?*\.\,]/g, "")}_export.png`, img) + + alertNormal(language.successExport) + + } + catch(e){ + alertError(`${e}`) + } + +} + + +export async function exportChat(page:number){ + try { + + const mode = await alertSelect(['Export as JSON', "Export as TXT"]) + const selectedID = get(selectedCharID) + const db = get(DataBase) + const chat = db.characters[selectedID].chats[page] + const char = db.characters[selectedID] + const date = new Date().toJSON(); + console.log(mode) + if(mode === '0'){ + const stringl = Buffer.from(JSON.stringify({ + type: 'risuChat', + ver: 1, + data: chat + }), 'utf-8') + + await downloadFile(`${char.name}_${date}_chat`.replace(/[<>:"/\\|?*\.\,]/g, "") + '.json', stringl) + + } + else{ + + let stringl = chat.message.map((v) => { + if(v.saying){ + return `${findCharacterbyId(v.saying).name}\n${v.data}` + } + else{ + return `${v.role === 'char' ? char.name : db.username}\n${v.data}` + } + }).join('\n\n') + + if(char.type !== 'group'){ + stringl = `${char.name}\n${char.firstMessage}\n\n` + stringl + } + + await downloadFile(`${char.name}_${date}_chat`.replace(/[<>:"/\\|?*\.\,]/g, "") + '.txt', Buffer.from(stringl, 'utf-8')) + + } + alertNormal(language.successExport) + } catch (error) { + alertError(`${error}`) + } +} + +export async function importChat(){ + const dat =await selectSingleFile(['json','jsonl']) + if(!dat){ + return + } + try { + const selectedID = get(selectedCharID) + let db = get(DataBase) + + if(dat.name.endsWith('jsonl')){ + const lines = Buffer.from(dat.data).toString('utf-8').split('\n') + let newChat:Chat = { + message: [], + note: "", + name: "Imported Chat", + localLore: [] + } + + let isFirst = true + for(const line of lines){ + + const presedLine = JSON.parse(line) + if(presedLine.name && presedLine.is_user, presedLine.mes){ + if(!isFirst){ + newChat.message.push({ + role: presedLine.is_user ? "user" : 'char', + data: formatTavernChat(presedLine.mes, db.characters[selectedID].name) + }) + } + } + + isFirst = false + } + + if(newChat.message.length === 0){ + alertError(language.errors.noData) + return + } + + db.characters[selectedID].chats.push(newChat) + setDatabase(db) + alertNormal(language.successImport) + } + else{ + const json = JSON.parse(Buffer.from(dat.data).toString('utf-8')) + if(json.type === 'risuChat' && json.ver === 1){ + const das:Chat = json.data + if(!(checkNullish(das.message) || checkNullish(das.note) || checkNullish(das.name) || checkNullish(das.localLore))){ + db.characters[selectedID].chats.push(das) + setDatabase(db) + alertNormal(language.successImport) + return + } + else{ + alertError(language.errors.noData) + return + } + } + else{ + alertError(language.errors.noData) + return + } + } + + } catch (error) { + alertError(`${error}`) + } +} + +function formatTavernChat(chat:string, charName:string){ + const db = get(DataBase) + return chat.replace(/<([Uu]ser)>|\{\{([Uu]ser)\}\}/g, db.username).replace(/((\{\{)|<)([Cc]har)(=.+)?((\}\})|>)/g, charName) +} + +export function characterFormatUpdate(index:number|character){ + let db = get(DataBase) + let cha = typeof(index) === 'number' ? db.characters[index] : index + if(cha.chats.length === 0){ + cha.chats = [{ + message: [], + note: '', + name: 'Chat 1', + localLore: [] + }] + } + if(!cha.chats[cha.chatPage]){ + cha.chatPage = 0 + } + if(!cha.chats[cha.chatPage].message){ + cha.chats[cha.chatPage].message = [] + } + if(!cha.type){ + cha.type = 'character' + } + if(!cha.chaId){ + cha.chaId = uuidv4() + } + if(cha.type !== 'group'){ + if(checkNullish(cha.sdData)){ + cha.sdData = defaultSdDataFunc() + } + if(checkNullish(cha.utilityBot)){ + cha.utilityBot = false + } + } + if(checkNullish(cha.customscript)){ + cha.customscript = [] + } + if(typeof(index) === 'number'){ + db.characters[index] = cha + setDatabase(db) + } + return cha +} + + +export function createBlankChar():character{ + return { + name: '', + firstMessage: '', + desc: '', + notes: '', + chats: [{ + message: [], + note: '', + name: 'Chat 1', + localLore: [] + }], + chatPage: 0, + emotionImages: [], + bias: [], + viewScreen: 'none', + globalLore: [], + chaId: uuidv4(), + type: 'character', + sdData: defaultSdDataFunc(), + utilityBot: false, + customscript: [], + exampleMessage: '' + } +} + + +export async function makeGroupImage() { + try { + alertStore.set({ + type: 'wait', + msg: `Loading..` + }) + const db = get(DataBase) + const charID = get(selectedCharID) + const group = db.characters[charID] + if(group.type !== 'group'){ + return + } + + const imageUrls = await Promise.all(group.characters.map((v) => { + return getCharImage(findCharacterbyId(v).image, 'plain') + })) + + + + const canvas = document.createElement("canvas"); + canvas.width = 256 + canvas.height = 256 + const ctx = canvas.getContext("2d"); + + // Load the images + const images = []; + let loadedImages = 0; + + await Promise.all( + imageUrls.map( + (url) => + new Promise((resolve) => { + const img = new Image(); + img.crossOrigin="anonymous" + img.onload = () => { + images.push(img); + resolve(); + }; + img.src = url; + }) + ) + ); + + // Calculate dimensions and draw the grid + const numImages = images.length; + const numCols = Math.ceil(Math.sqrt(images.length)); + const numRows = Math.ceil(images.length / numCols); + const cellWidth = canvas.width / numCols; + const cellHeight = canvas.height / numRows; + + for (let row = 0; row < numRows; row++) { + for (let col = 0; col < numCols; col++) { + const index = row * numCols + col; + if (index >= numImages) break; + ctx.drawImage( + images[index], + col * cellWidth, + row * cellHeight, + cellWidth, + cellHeight + ); + } + } + + // Return the image URI + + const uri = canvas.toDataURL() + console.log(uri) + canvas.remove() + db.characters[charID].image = await saveImage(dataURLtoBuffer(uri)); + setDatabase(db) + alertStore.set({ + type: 'none', + msg: '' + }) + } catch (error) { + alertError(`${error}`) + } +} + +function dataURLtoBuffer(string:string){ + const regex = /^data:.+\/(.+);base64,(.*)$/; + + const matches = string.match(regex); + const ext = matches[1]; + const data = matches[2]; + return Buffer.from(data, 'base64'); +} + +export async function addDefaultCharacters() { + const imgs = [fetch('/sample/rika.png'),fetch('/sample/yuzu.png')] + + alertStore.set({ + type: 'wait', + msg: `Loading Sample bots...` + }) + + for(const img of imgs){ + const imgBuffer = await (await img).arrayBuffer() + const readed = (await exifr.parse(imgBuffer, true)) + await sleep(10) + const va = decodeMsgpack(Buffer.from(readed.risuai, 'base64')) as any + if(va.type !== 101){ + alertError(language.errors.noData) + return + } + let char:character = va.data + let db = get(DataBase) + if(char.emotionImages && char.emotionImages.length > 0){ + for(let i=0;i{ + return JSON.parse(JSON.stringify(defaultSdData)) +} + +export function updateTextTheme(){ + let db = get(DataBase) + const root = document.querySelector(':root') as HTMLElement; + if(!root){ + return + } + switch(db.textTheme){ + case "standard":{ + root.style.setProperty('--FontColorStandard', '#fafafa'); + root.style.setProperty('--FontColorItalic', '#8C8D93'); + root.style.setProperty('--FontColorBold', '#fafafa'); + root.style.setProperty('--FontColorItalicBold', '#8C8D93'); + break + } + case "highcontrast":{ + root.style.setProperty('--FontColorStandard', '#f8f8f2'); + root.style.setProperty('--FontColorItalic', '#F1FA8C'); + root.style.setProperty('--FontColorBold', '#8BE9FD'); + root.style.setProperty('--FontColorItalicBold', '#FFB86C'); + break + } + case "custom":{ + root.style.setProperty('--FontColorStandard', db.customTextTheme.FontColorStandard); + root.style.setProperty('--FontColorItalic', db.customTextTheme.FontColorItalic); + root.style.setProperty('--FontColorBold', db.customTextTheme.FontColorBold); + root.style.setProperty('--FontColorItalicBold', db.customTextTheme.FontColorItalicBold); + break + } + } +} + +export function changeToPreset(id =0){ + let db = get(DataBase) + let pres = db.botPresets + pres[db.botPresetsId] = { + name: pres[db.botPresetsId].name, + apiType: db.apiType, + openAIKey: db.openAIKey, + mainPrompt:db.mainPrompt, + jailbreak: db.jailbreak, + globalNote: db.globalNote, + temperature: db.temperature, + maxContext: db.maxContext, + maxResponse: db.maxResponse, + frequencyPenalty: db.frequencyPenalty, + PresensePenalty: db.PresensePenalty, + formatingOrder: db.formatingOrder, + aiModel: db.aiModel, + subModel: db.subModel, + currentPluginProvider: db.currentPluginProvider, + textgenWebUIURL: db.textgenWebUIURL, + forceReplaceUrl: db.forceReplaceUrl, + forceReplaceUrl2: db.forceReplaceUrl2, + promptPreprocess: db.promptPreprocess, + bias: db.bias + } + db.botPresets = pres + const newPres = pres[id] + db.botPresetsId = id + db.apiType = newPres.apiType ?? db.apiType + db.openAIKey = newPres.openAIKey ?? db.openAIKey + db.mainPrompt = newPres.mainPrompt ?? db.mainPrompt + db.jailbreak = newPres.jailbreak ?? db.jailbreak + db.globalNote = newPres.globalNote ?? db.globalNote + db.temperature = newPres.temperature ?? db.temperature + db.maxContext = newPres.maxContext ?? db.maxContext + db.maxResponse = newPres.maxResponse ?? db.maxResponse + db.frequencyPenalty = newPres.frequencyPenalty ?? db.frequencyPenalty + db.PresensePenalty = newPres.PresensePenalty ?? db.PresensePenalty + db.formatingOrder = newPres.formatingOrder ?? db.formatingOrder + db.aiModel = newPres.aiModel ?? db.aiModel + db.subModel = newPres.subModel ?? db.subModel + db.currentPluginProvider = newPres.currentPluginProvider ?? db.currentPluginProvider + db.textgenWebUIURL = newPres.textgenWebUIURL ?? db.textgenWebUIURL + db.forceReplaceUrl = newPres.forceReplaceUrl ?? db.forceReplaceUrl + db.promptPreprocess = newPres.promptPreprocess ?? db.promptPreprocess + db.forceReplaceUrl2 = newPres.forceReplaceUrl2 ?? db.forceReplaceUrl2 + db.bias = newPres.bias ?? db.bias + DataBase.set(db) +} \ No newline at end of file diff --git a/src/ts/drive/drive.ts b/src/ts/drive/drive.ts new file mode 100644 index 00000000..be2deda5 --- /dev/null +++ b/src/ts/drive/drive.ts @@ -0,0 +1,345 @@ +import { get } from "svelte/store"; +import { alertError, alertInput, alertNormal, alertStore } from "../alert"; +import { DataBase, setDatabase, type Database } from "../database"; +import { forageStorage, getUnpargeables, isTauri } from "../globalApi"; +import pako from "pako"; +import { BaseDirectory, readBinaryFile, readDir, writeBinaryFile } from "@tauri-apps/api/fs"; +import { language } from "../../lang"; +import { relaunch } from '@tauri-apps/api/process'; +import { open } from '@tauri-apps/api/shell'; + +export async function checkDriver(type:'save'|'load'|'loadtauri'|'savetauri'){ + const CLIENT_ID = '580075990041-l26k2d3c0nemmqiu3d3aag01npfrkn76.apps.googleusercontent.com'; + const REDIRECT_URI = 'https://risu.pages.dev/'; + const SCOPE = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.appdata'; + const encodedRedirectUri = encodeURIComponent(REDIRECT_URI); + const authorizationUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${CLIENT_ID}&redirect_uri=${encodedRedirectUri}&scope=${SCOPE}&response_type=code&state=${type}`; + + if(type === 'save' || type === 'load'){ + location.href = (authorizationUrl); + } + else{ + try { + open(authorizationUrl) + let code = await alertInput(language.pasteAuthCode) + if(code.includes(' ')){ + code = code.substring(code.lastIndexOf(' ')).trim() + } + if(type === 'loadtauri'){ + await loadDrive(code) + } + else{ + await backupDrive(code) + } + } catch (error) { + console.error(error) + alertError(`Backup Error: ${error}`) + } + } +} + + +export async function checkDriverInit() { + try { + const loc = new URLSearchParams(location.search) + const code = loc.get('code') + + if(code){ + const res = await fetch(`https://aichandict.xyz/api/drive/access?code=${encodeURIComponent(code)}`) + if(res.status >= 200 && res.status < 300){ + const json:{ + access_token:string, + expires_in:number + } = await res.json() + const da = loc.get('state') + if(da === 'save'){ + await backupDrive(json.access_token) + } + else if(da === 'load'){ + await loadDrive(json.access_token) + } + else if(da === 'savetauri' || da === 'loadtauri'){ + alertStore.set({ + type: 'wait2', + msg: `Copy and paste this Auth Code: ${json.access_token}` + }) + } + } + else{ + alertError(await res.text()) + } + return true + } + else{ + return false + } + } catch (error) { + console.error(error) + alertError(`Backup Error: ${error}`) + return true + } +} + + + + +async function backupDrive(ACCESS_TOKEN:string) { + alertStore.set({ + type: "wait", + msg: "Uploading Backup..." + }) + + const files:DriveFile[] = await getFilesInFolder(ACCESS_TOKEN) + + const fileNames = files.map((d) => { + return d.name + }) + + if(isTauri){ + const assets = await readDir('assets', {dir: BaseDirectory.AppData}) + let i = 0; + for(let asset of assets){ + i += 1; + alertStore.set({ + type: "wait", + msg: `Uploading Backup... (${i} / ${assets.length})` + }) + const key = asset.name + if(!key || !key.endsWith('.png')){ + continue + } + const formatedKey = formatKeys(key) + if(!fileNames.includes(formatedKey)){ + await createFileInFolder(ACCESS_TOKEN, formatedKey, await readBinaryFile(asset.path)) + } + } + } + else{ + const keys = await forageStorage.keys() + + for(let i=0;i { + return d.name + }) + + let latestDb:DriveFile = null + let latestDbDate = 0 + + for(const f of files){ + if(f.name.endsWith("-database.risudat")){ + const tm = parseInt(f.name.split('-')[0]) + if(isNaN(tm)){ + continue + } + else{ + if(tm > latestDbDate){ + latestDb = f + latestDbDate = tm + } + } + } + } + if(latestDbDate !== 0){ + const db:Database = JSON.parse(Buffer.from(pako.inflate(await getFileData(ACCESS_TOKEN, latestDb.id))).toString('utf-8')) + const requiredImages = (getUnpargeables(db)) + let ind = 0; + for(const images of requiredImages){ + ind += 1 + const formatedImage = formatKeys(images) + alertStore.set({ + type: "wait", + msg: `Loading Backup... (${ind} / ${requiredImages.length})` + }) + if(await checkImageExists(images)){ + //skip process + } + else{ + if(formatedImage.length >= 7){ + if(fileNames.includes(formatedImage)){ + for(const file of files){ + if(file.name === formatedImage){ + const fData = await getFileData(ACCESS_TOKEN, file.id) + if(isTauri){ + await writeBinaryFile(`assets/` + images, fData ,{dir: BaseDirectory.AppData}) + + } + else{ + await forageStorage.setItem('assets/' + images, fData) + } + } + } + } + else{ + throw `cannot find file in drive: ${formatedImage}` + } + } + } + } + const dbjson = JSON.stringify(db) + const dbData = pako.deflate( + Buffer.from(dbjson, 'utf-8') + ) + if(isTauri){ + await writeBinaryFile('database/database.bin', dbData, {dir: BaseDirectory.AppData}) + relaunch() + alertStore.set({ + type: "wait", + msg: "Success, Refresh your app." + }) + } + else{ + await forageStorage.setItem('database/database.bin', dbData) + location.search = '' + alertStore.set({ + type: "wait", + msg: "Success, Refresh your app." + }) + } + } +} + +function checkImageExist(image:string){ + +} + + +function formatKeys(name:string) { + return getBasename(name).replace(/\_/g, '__').replace(/\./g,'_d').replace(/\//,'_s') + '.png' +} + +async function getFilesInFolder(ACCESS_TOKEN:string, nextPageToken=''): Promise { + const url = `https://www.googleapis.com/drive/v3/files?spaces=appDataFolder&pageSize=300` + nextPageToken; + + const response = await fetch(url, { + method: 'GET', + headers: { + 'Authorization': `Bearer ${ACCESS_TOKEN}`, + 'Content-Type': 'application/json', + }, + }); + + if (response.ok) { + const data = await response.json(); + if(data.nextPageToken){ + return (data.files as DriveFile[]).concat(await getFilesInFolder(ACCESS_TOKEN, `&pageToken=${data.nextPageToken}`)) + } + return data.files as DriveFile[]; + } else { + throw(`Error: ${response.status}`); + } +} + +async function createFileInFolder(accessToken:string, fileName:string, content:Uint8Array, mimeType = 'application/octet-stream') { + const metadata = { + name: fileName, + mimeType: mimeType, + parents: ["appDataFolder"], + }; + + const body = new FormData(); + body.append( + "metadata", + new Blob([JSON.stringify(metadata)], { type: "application/json" }) + ); + body.append("file", new Blob([content], { type: mimeType })); + + const response = await fetch( + "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", + { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + }, + body: body, + } + ); + + const result = await response.json(); + + if (response.ok) { + return result; + } else { + console.error("Error creating file:", result); + throw new Error(result.error.message); + } +} + +const baseNameRegex = /\\/g +function getBasename(data:string){ + const splited = data.replace(baseNameRegex, '/').split('/') + const lasts = splited[splited.length-1] + return lasts +} + +async function getFileData(ACCESS_TOKEN:string,fileId:string) { + const url = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media`; + + const request = { + method: 'GET', + headers: { + Authorization: `Bearer ${ACCESS_TOKEN}` + } + }; + + const response = await fetch(url, request); + + if (response.ok) { + const data = new Uint8Array(await response.arrayBuffer()); + return data; + } else { + throw "Error in response when reading files in folder" + } + } \ No newline at end of file diff --git a/src/ts/exif.ts b/src/ts/exif.ts new file mode 100644 index 00000000..6d01035b --- /dev/null +++ b/src/ts/exif.ts @@ -0,0 +1,36 @@ +import extract from 'png-chunks-extract'; +import encode from 'png-chunks-encode'; +import textKey from 'png-chunk-text' + +export const PngMetadata = { + write: (pngBuffer: Uint8Array, metadata: Record): Buffer => { + let chunks:{ + name:string + data:Uint8Array + }[] = extract(Buffer.from(pngBuffer)); + + chunks = chunks.filter((v) => { + return v.name.toLocaleLowerCase() !== 'text' + }) + + for (const key in metadata) { + const value = metadata[key]; + chunks.splice(-1, 0, textKey.encode(key, value)) + } + const encoded = encode(chunks); + return encoded + }, + filter: (pngBuffer: Uint8Array) => { + let chunks:{ + name:string + data:Uint8Array + }[] = extract(Buffer.from(pngBuffer)); + + chunks = chunks.filter((v) => { + return v.name.toLocaleLowerCase() !== 'text' + }) + + const encoded = encode(chunks); + return encoded + } +} \ No newline at end of file diff --git a/src/ts/globalApi.ts b/src/ts/globalApi.ts new file mode 100644 index 00000000..73ea815a --- /dev/null +++ b/src/ts/globalApi.ts @@ -0,0 +1,557 @@ +import { writeBinaryFile,BaseDirectory, readBinaryFile, exists, createDir, readDir, removeFile } from "@tauri-apps/api/fs" +import { changeFullscreen, checkNullish, findCharacterbyId, sleep } from "./util" +import localforage from 'localforage' +import { convertFileSrc, invoke } from "@tauri-apps/api/tauri" +import { v4 as uuidv4 } from 'uuid'; +import { appDataDir, join } from "@tauri-apps/api/path"; +import { get } from "svelte/store"; +import { DataBase, loadedStore, setDatabase, type Database, updateTextTheme, defaultSdDataFunc } from "./database"; +import pako from "pako"; +import { appWindow } from "@tauri-apps/api/window"; +import { checkUpdate } from "./update"; +import { selectedCharID } from "./stores"; +import { Body, ResponseType, fetch as TauriFetch } from "@tauri-apps/api/http"; +import { loadPlugins } from "./process/plugins"; +import { alertError, alertStore } from "./alert"; +import { checkDriverInit } from "./drive/drive"; +import { hasher } from "./parser"; + +//@ts-ignore +export const isTauri = !!window.__TAURI__ +export const forageStorage = localforage.createInstance({ + name: "risuai" +}) + +interface fetchLog{ + body:string + header:string + response:string + success:boolean, + date:string + url:string +} + +let fetchLog:fetchLog[] = [] + +export async function downloadFile(name:string, data:Uint8Array) { + const downloadURL = (data:string, fileName:string) => { + const a = document.createElement('a') + a.href = data + a.download = fileName + document.body.appendChild(a) + a.style.display = 'none' + a.click() + a.remove() + } + + if(isTauri){ + await writeBinaryFile(name, data, {dir: BaseDirectory.Download}) + } + else{ + downloadURL(`data:png/image;base64,${Buffer.from(data).toString('base64')}`, name) + } +} + +let fileCache:{ + origin: string[], res:(Uint8Array|'loading'|'done')[] +} = { + origin: [], + res: [] +} + +let pathCache:{[key:string]:string} = {} +let checkedPaths:string[] = [] + +export async function getFileSrc(loc:string) { + if(isTauri){ + if(loc.startsWith('assets')){ + if(appDataDirPath === ''){ + appDataDirPath = await appDataDir(); + } + const cached = pathCache[loc] + if(cached){ + return convertFileSrc(cached) + } + else{ + const joined = await join(appDataDirPath,loc) + pathCache[loc] = joined + return convertFileSrc(joined) + } + } + return convertFileSrc(loc) + } + try { + if(usingSw){ + const encoded = Buffer.from(loc,'utf-8').toString('hex') + let ind = fileCache.origin.indexOf(loc) + if(ind === -1){ + ind = fileCache.origin.length + fileCache.origin.push(loc) + fileCache.res.push('loading') + try { + const hasCache:boolean = (await (await fetch("/sw/check/" + encoded)).json()).able + if(hasCache){ + fileCache.res[ind] = 'done' + return "/sw/img/" + encoded + } + else{ + const f:Uint8Array = await forageStorage.getItem(loc) + await fetch("/sw/register/" + encoded, { + method: "POST", + body: f + }) + fileCache.res[ind] = 'done' + await sleep(10) + } + return "/sw/img/" + encoded + } catch (error) { + location.reload() + } + } + else{ + const f = fileCache.res[ind] + if(f === 'loading'){ + while(fileCache.res[ind] === 'loading'){ + await sleep(10) + } + } + return "/sw/img/" + encoded + } + } + else{ + let ind = fileCache.origin.indexOf(loc) + if(ind === -1){ + ind = fileCache.origin.length + fileCache.origin.push(loc) + fileCache.res.push('loading') + const f:Uint8Array = await forageStorage.getItem(loc) + fileCache.res[ind] = f + return `data:image/png;base64,${Buffer.from(f).toString('base64')}` + } + else{ + const f = fileCache.res[ind] + if(f === 'loading'){ + while(fileCache.res[ind] === 'loading'){ + await sleep(10) + } + return `data:image/png;base64,${Buffer.from(fileCache.res[ind]).toString('base64')}` + } + return `data:image/png;base64,${Buffer.from(f).toString('base64')}` + } + } + } catch (error) { + console.error(error) + return '' + } +} + +let appDataDirPath = '' + +export async function readImage(data:string) { + if(isTauri){ + if(data.startsWith('assets')){ + if(appDataDirPath === ''){ + appDataDirPath = await appDataDir(); + } + return await readBinaryFile(await join(appDataDirPath,data)) + } + return await readBinaryFile(data) + } + else{ + return (await forageStorage.getItem(data) as Uint8Array) + } +} + +export async function saveImage(data:Uint8Array, customId:string = ''){ + let id = '' + if(customId !== ''){ + id = customId + } + else{ + try { + id = await hasher(data) + } catch (error) { + id = uuidv4() + } + } + if(isTauri){ + await writeBinaryFile(`assets/${id}.png`, data ,{dir: BaseDirectory.AppData}) + return `assets/${id}.png` + } + else{ + await forageStorage.setItem(`assets/${id}.png`, data) + return `assets/${id}.png` + } +} + +let lastSave = '' + +export async function saveDb(){ + lastSave =JSON.stringify(get(DataBase)) + while(true){ + const dbjson = JSON.stringify(get(DataBase)) + if(dbjson !== lastSave){ + lastSave = dbjson + const dbData = pako.deflate( + Buffer.from(dbjson, 'utf-8') + ) + if(isTauri){ + await writeBinaryFile('database/database.bin', dbData, {dir: BaseDirectory.AppData}) + } + else{ + await forageStorage.setItem('database/database.bin', dbData) + } + console.log('saved') + } + + await sleep(500) + } +} + +let usingSw = false + +export async function loadData() { + const loaded = get(loadedStore) + if(!loaded){ + try { + if(isTauri){ + appWindow.maximize() + if(!await exists('', {dir: BaseDirectory.AppData})){ + await createDir('', {dir: BaseDirectory.AppData}) + } + if(!await exists('database', {dir: BaseDirectory.AppData})){ + await createDir('database', {dir: BaseDirectory.AppData}) + } + if(!await exists('assets', {dir: BaseDirectory.AppData})){ + await createDir('assets', {dir: BaseDirectory.AppData}) + } + if(!await exists('database/database.bin', {dir: BaseDirectory.AppData})){ + await writeBinaryFile('database/database.bin', + pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8')) + ,{dir: BaseDirectory.AppData}) + } + setDatabase( + JSON.parse(Buffer.from(pako.inflate(Buffer.from(await readBinaryFile('database/database.bin',{dir: BaseDirectory.AppData})))).toString('utf-8')) + ) + await checkUpdate() + await changeFullscreen() + + } + else{ + let gotStorage:Uint8Array = await forageStorage.getItem('database/database.bin') + if(checkNullish(gotStorage)){ + gotStorage = pako.deflate(Buffer.from(JSON.stringify({}), 'utf-8')) + await forageStorage.setItem('database/database.bin', gotStorage) + } + setDatabase( + JSON.parse(Buffer.from(pako.inflate(Buffer.from(gotStorage))).toString('utf-8')) + ) + const isDriverMode = await checkDriverInit() + if(navigator.serviceWorker){ + usingSw = true + const rej = await navigator.serviceWorker.register("/sw.js", { + scope: "/" + }); + } + else{ + usingSw = false + } + + + } + try { + await pargeChunks() + } catch (error) {} + try { + await loadPlugins() + } catch (error) {} + await checkNewFormat() + updateTextTheme() + loadedStore.set(true) + selectedCharID.set(-1) + saveDb() + } catch (error) { + alertError(`${error}`) + } + } +} + +export async function globalFetch(url:string, arg:{body?:any,headers?:{[key:string]:string}, rawResponse?:boolean, method?:"POST"|"GET"}) { + const db = get(DataBase) + const method = arg.method ?? "POST" + + function addFetchLog(response:any, success:boolean){ + try{ + fetchLog.unshift({ + body: JSON.stringify(arg.body, null, 2), + header: JSON.stringify(arg.headers ?? {}, null, 2), + response: JSON.stringify(response, null, 2), + success: success, + date: (new Date()).toLocaleTimeString(), + url: url + }) + } + catch{ + fetchLog.unshift({ + body: JSON.stringify(arg.body, null, 2), + header: JSON.stringify(arg.headers ?? {}, null, 2), + response: `${response}`, + success: success, + date: (new Date()).toLocaleTimeString(), + url: url + }) + } + } + + if(isTauri){ + + if(db.requester === 'new'){ + try { + let preHeader = arg.headers ?? {} + preHeader["Content-Type"] = `application/json` + const body = JSON.stringify(arg.body) + const header = JSON.stringify(preHeader) + const res:string = await invoke('native_request', {url:url, body:body, header:header, method: method}) + const d:{ + success: boolean + body:string + } = JSON.parse(res) + + if(!d.success){ + addFetchLog(Buffer.from(d.body, 'base64').toString('utf-8'), false) + return { + ok:false, + data: Buffer.from(d.body, 'base64').toString('utf-8') + } + } + else{ + if(arg.rawResponse){ + addFetchLog("Uint8Array Response", true) + return { + ok:true, + data: new Uint8Array(Buffer.from(d.body, 'base64')) + } + } + else{ + addFetchLog(JSON.parse(Buffer.from(d.body, 'base64').toString('utf-8')), true) + return { + ok:true, + data: JSON.parse(Buffer.from(d.body, 'base64').toString('utf-8')) + } + } + } + } catch (error) { + return { + ok: false, + data: `${error}`, + } + } + } + + const body = Body.json(arg.body) + const headers = arg.headers ?? {} + const d = await TauriFetch(url, { + body: body, + method: method, + headers: headers, + timeout: { + secs: db.timeOut, + nanos: 0 + }, + responseType: arg.rawResponse ? ResponseType.Binary : ResponseType.JSON + }) + if(arg.rawResponse){ + addFetchLog("Uint8Array Response", d.ok) + return { + ok: d.ok, + data: new Uint8Array(d.data as number[]), + } + } + else{ + addFetchLog(d.data, d.ok) + return { + ok: d.ok, + data: d.data, + } + } + } + else{ + try { + let headers = arg.headers ?? {} + if(!headers["Content-Type"]){ + headers["Content-Type"] = `application/json` + } + if(arg.rawResponse){ + const furl = new URL("https://risu.pages.dev/proxy") + furl.searchParams.set("url", url) + + const da = await fetch(furl, { + body: JSON.stringify(arg.body), + headers: arg.headers, + method: method + }) + + addFetchLog("Uint8Array Response", da.ok) + return { + ok: da.ok, + data: new Uint8Array(await da.arrayBuffer()) + } + } + else{ + const furl = new URL("https://risu.pages.dev/proxy") + furl.searchParams.set("url", url) + + + const da = await fetch(furl, { + body: JSON.stringify(arg.body), + headers: arg.headers, + method: method + }) + + const dat = await da.json() + addFetchLog(dat, da.ok) + return { + ok: da.ok, + data: dat + } + } + } catch (error) { + return { + ok:false, + data: `${error}` + } + } + } +} + +const re = /\\/g +function getBasename(data:string){ + const splited = data.replace(re, '/').split('/') + const lasts = splited[splited.length-1] + return lasts +} + +export function getUnpargeables(db:Database) { + let unpargeable:string[] = [] + + function addParge(data:string){ + if(!data){ + return + } + if(data === ''){ + return + } + const bn = getBasename(data) + if(!unpargeable.includes(bn)){ + unpargeable.push(getBasename(data)) + } + } + + addParge(db.customBackground) + addParge(db.userIcon) + + for(const cha of db.characters){ + if(cha.image){ + addParge(cha.image) + } + if(cha.emotionImages){ + for(const em of cha.emotionImages){ + addParge(em[1]) + } + } + } + return unpargeable +} + +async function checkNewFormat() { + let db = get(DataBase) + + if(!db.formatversion){ + function checkParge(data:string){ + + if(data.startsWith('assets') || (data.length < 3)){ + return data + } + else{ + const d = 'assets/' + (data.replace(/\\/g, '/').split('assets/')[1]) + if(!d){ + return data + } + return d + } + } + + db.customBackground = checkParge(db.customBackground) + db.userIcon = checkParge(db.userIcon) + + for(let i=0;i= 2){ + db.characters[i].emotionImages[i2][1] = checkParge(db.characters[i].emotionImages[i2][1]) + } + } + } + } + + db.formatversion = 2 + } + if(db.formatversion < 3){ + + for(let i=0;i { + if(ev.ctrlKey){ + switch (ev.key){ + case "1":{ + changeToPreset(0) + ev.preventDefault() + ev.stopPropagation() + break + } + case "2":{ + changeToPreset(1) + ev.preventDefault() + ev.stopPropagation() + break + } + case "3":{ + changeToPreset(2) + ev.preventDefault() + ev.stopPropagation() + break + } + case "4":{ + changeToPreset(3) + ev.preventDefault() + ev.stopPropagation() + break + } + case "5":{ + changeToPreset(4) + ev.preventDefault() + ev.stopPropagation() + break + } + case "6":{ + changeToPreset(5) + ev.preventDefault() + ev.stopPropagation() + break + } + case "7":{ + changeToPreset(6) + ev.preventDefault() + ev.stopPropagation() + break + } + case "8":{ + changeToPreset(7) + ev.preventDefault() + ev.stopPropagation() + break + } + case "9":{ + changeToPreset(8) + ev.preventDefault() + ev.stopPropagation() + break + } + } + } + }) +} + +function changeToPreset(num:number){ + if(!doingAlert()){ + let db = get(DataBase) + let pres = db.botPresets + if(pres.length > num){ + alertToast(`Changed to Preset ${num+1}`) + changeToPreset2(num) + } + } +} \ No newline at end of file diff --git a/src/ts/lorebook.ts b/src/ts/lorebook.ts new file mode 100644 index 00000000..6a0a0770 --- /dev/null +++ b/src/ts/lorebook.ts @@ -0,0 +1,170 @@ +import { get } from "svelte/store"; +import {selectedCharID} from './stores' +import { DataBase, setDatabase, type loreBook } from "./database"; +import { tokenize } from "./tokenizer"; +import { selectSingleFile } from "./util"; +import { alertError, alertNormal } from "./alert"; +import { language } from "../lang"; +import { downloadFile } from "./globalApi"; + +export function addLorebook(type:number) { + let selectedID = get(selectedCharID) + let db = get(DataBase) + if(type === 0){ + db.characters[selectedID].globalLore.push({ + key: '', + comment: `New Lore ${db.characters[selectedID].globalLore.length + 1}`, + content: '', + mode: 'normal', + insertorder: 100, + alwaysActive: false + }) + } + else{ + const page = db.characters[selectedID].chatPage + db.characters[selectedID].chats[page].localLore.push({ + key: '', + comment: `New Lore ${db.characters[selectedID].chats[page].localLore.length + 1}`, + content: '', + mode: 'normal', + insertorder: 100, + alwaysActive: false + }) + } + setDatabase(db) +} + +interface formatedLore{ + keys:string[]|'always' + content: string + order: number +} + +const rmRegex = / |\n/g + +export async function loadLoreBookPrompt(){ + const selectedID = get(selectedCharID) + const db = get(DataBase) + const page = db.characters[selectedID].chatPage + const globalLore = db.characters[selectedID].globalLore + const charLore = db.characters[selectedID].chats[page].localLore + const fullLore = globalLore.concat(charLore) + const currentChat = db.characters[selectedID].chats[page].message + + let activatiedPrompt: string[] = [] + + let formatedLore:formatedLore[] = [] + + for (const lore of fullLore){ + if(lore.key.length > 1 || lore.alwaysActive){ + formatedLore.push({ + keys: lore.alwaysActive ? 'always' : lore.key.replace(rmRegex, '').toLocaleLowerCase().split(',').filter((a) => { + return a.length > 1 + }), + content: lore.content, + order: lore.insertorder + }) + } + } + + formatedLore.sort((a, b) => { + return b.order - a.order + }) + + const formatedChat = currentChat.slice(currentChat.length - db.loreBookDepth,currentChat.length).map((msg) => { + return msg.data + }).join('||').replace(rmRegex,'').toLocaleLowerCase() + + for(const lore of formatedLore){ + const totalTokens = await tokenize(activatiedPrompt.concat([lore.content]).join('\n\n')) + if(totalTokens > db.loreBookToken){ + break + } + + if(lore.keys === 'always'){ + activatiedPrompt.push(lore.content) + continue + } + + for(const key of lore.keys){ + if(formatedChat.includes(key)){ + activatiedPrompt.push(lore.content) + break + } + } + } + + return activatiedPrompt.reverse().join('\n\n') +} + + +export async function importLoreBook(mode:'global'|'local'){ + const selectedID = get(selectedCharID) + let db = get(DataBase) + const page = db.characters[selectedID].chatPage + let lore = mode === 'global' ? db.characters[selectedID].globalLore : db.characters[selectedID].chats[page].localLore + const lorebook = (await selectSingleFile(['json'])).data + if(!lorebook){ + return + } + + try { + const importedlore = JSON.parse(Buffer.from(lorebook).toString('utf-8')) + if(importedlore.type === 'risu' && importedlore.data){ + const datas:loreBook[] = importedlore.data + for(const data of datas){ + lore.push(data) + } + } + else if(importedlore.entries){ + const entries:{[key:string]:{ + key:string[] + comment:string + content:string + order:number + constant:boolean + }} = importedlore.entries + for(const key in entries){ + const currentLore = entries[key] + lore.push({ + key: currentLore.key.join(', '), + insertorder: currentLore.order, + comment: currentLore.comment.length < 1 ? 'Unnamed Imported Lore': currentLore.comment, + content: currentLore.content, + mode: "normal", + alwaysActive: currentLore.constant + }) + } + } + if(mode === 'global'){ + db.characters[selectedID].globalLore = lore + } + else{ + db.characters[selectedID].chats[page].localLore = lore + } + setDatabase(db) + } catch (error) { + alertError(`${error}`) + } +} + +export async function exportLoreBook(mode:'global'|'local'){ + try { + const selectedID = get(selectedCharID) + const db = get(DataBase) + const page = db.characters[selectedID].chatPage + const lore = mode === 'global' ? db.characters[selectedID].globalLore : db.characters[selectedID].chats[page].localLore + + const stringl = Buffer.from(JSON.stringify({ + type: 'risu', + ver: 1, + data: lore + }), 'utf-8') + + await downloadFile(`lorebook_export.json`, stringl) + + alertNormal(language.successExport) + } catch (error) { + alertError(`${error}`) + } +} \ No newline at end of file diff --git a/src/ts/parser.ts b/src/ts/parser.ts new file mode 100644 index 00000000..f8faf970 --- /dev/null +++ b/src/ts/parser.ts @@ -0,0 +1,15 @@ +import DOMPurify from 'isomorphic-dompurify'; +import showdown from 'showdown'; + +const convertor = new showdown.Converter() +convertor.setOption('simpleLineBreaks', true); + +export function ParseMarkdown(data:string) { + return DOMPurify.sanitize(convertor.makeHtml(data), { + FORBID_TAGS: ['a'] + }) +} + +export async function hasher(data:Uint8Array){ + return Buffer.from(await crypto.subtle.digest("SHA-256", data)).toString('hex'); +} \ No newline at end of file diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts new file mode 100644 index 00000000..4a1896b9 --- /dev/null +++ b/src/ts/process/index.ts @@ -0,0 +1,474 @@ +import { get, writable } from "svelte/store"; +import { DataBase, setDatabase, type character } from "../database"; +import { CharEmotion, selectedCharID } from "../stores"; +import { tokenize, tokenizeNum } from "../tokenizer"; +import { language } from "../../lang"; +import { alertError } from "../alert"; +import { loadLoreBookPrompt } from "../lorebook"; +import { findCharacterbyId, replacePlaceholders } from "../util"; +import { requestChatData } from "./request"; +import { stableDiff } from "./stableDiff"; +import { processScript } from "./scripts"; + +export interface OpenAIChat{ + role: 'system'|'user'|'assistant' + content: string +} + +export const doingChat = writable(false) + +export async function sendChat(chatProcessIndex = -1):Promise { + + let findCharCache:{[key:string]:character} = {} + function findCharacterbyIdwithCache(id:string){ + const d = findCharCache[id] + if(!!d){ + return d + } + else{ + const r = findCharacterbyId(id) + findCharCache[id] = r + return r + } + } + + function reformatContent(data:string){ + return data.trim().replace(`${currentChar.name}:`, '').trim() + } + + let isDoing = get(doingChat) + + if(isDoing){ + if(chatProcessIndex === -1){ + return false + } + } + doingChat.set(true) + + let db = get(DataBase) + let selectedChar = get(selectedCharID) + const nowChatroom = db.characters[selectedChar] + let currentChar:character + + if(nowChatroom.type === 'group'){ + if(chatProcessIndex === -1){ + for(let i=0;i 4000){ + maxContextTokens = 4000 + } + } + if(db.aiModel === 'gpt4'){ + if(maxContextTokens > 8000){ + maxContextTokens = 8000 + } + } + + let unformated = { + 'main':([] as OpenAIChat[]), + 'jailbreak':([] as OpenAIChat[]), + 'chats':([] as OpenAIChat[]), + 'lorebook':([] as OpenAIChat[]), + 'globalNote':([] as OpenAIChat[]), + 'authorNote':([] as OpenAIChat[]), + 'lastChat':([] as OpenAIChat[]), + 'description':([] as OpenAIChat[]), + } + + if(!currentChar.utilityBot){ + unformated.main.push({ + role: 'system', + content: replacePlaceholders(db.mainPrompt + ((db.additionalPrompt === '' || (!db.promptPreprocess)) ? '' : `\n${db.additionalPrompt}`), currentChar.name) + }) + + if(db.jailbreakToggle){ + unformated.jailbreak.push({ + role: 'system', + content: replacePlaceholders(db.jailbreak, currentChar.name) + }) + } + + unformated.globalNote.push({ + role: 'system', + content: replacePlaceholders(db.globalNote, currentChar.name) + }) + } + + unformated.authorNote.push({ + role: 'system', + content: replacePlaceholders(currentChat.note, currentChar.name) + }) + + unformated.description.push({ + role: 'system', + content: replacePlaceholders((db.promptPreprocess ? db.descriptionPrefix: '') + currentChar.desc, currentChar.name) + }) + + unformated.lorebook.push({ + role: 'system', + content: replacePlaceholders(await loadLoreBookPrompt(), currentChar.name) + }) + + //await tokenize currernt + let currentTokens = (await tokenize(Object.keys(unformated).map((key) => { + return (unformated[key] as OpenAIChat[]).map((d) => { + return d.content + }).join('\n\n') + }).join('\n\n')) + db.maxResponse) + 150 + + let chats:OpenAIChat[] = [] + + if(nowChatroom.type === 'group'){ + chats.push({ + role: 'system', + content: '[Start a new group chat]' + }) + } + else{ + chats.push({ + role: 'system', + content: '[Start a new chat]' + }) + } + + chats.push({ + role: 'assistant', + content: processScript(currentChar, + replacePlaceholders(nowChatroom.firstMessage, currentChar.name), + 'editprocess') + }) + currentTokens += await tokenize(processScript(currentChar, + replacePlaceholders(nowChatroom.firstMessage, currentChar.name), + 'editprocess')) + + const ms = currentChat.message + for(const msg of ms){ + let formedChat = processScript(currentChar,replacePlaceholders(msg.data, currentChar.name), 'editprocess') + if(nowChatroom.type === 'group'){ + if(msg.saying && msg.role === 'char'){ + formedChat = `${findCharacterbyIdwithCache(msg.saying).name}: ${formedChat}` + + } + else if(msg.role === 'user'){ + formedChat = `${db.username}: ${formedChat}` + } + } + + chats.push({ + role: msg.role === 'user' ? 'user' : 'assistant', + content: formedChat + }) + currentTokens += (await tokenize(formedChat) + 1) + } + + if(nowChatroom.type === 'group'){ + const systemMsg = `[Write the next reply only as ${currentChar.name}]` + chats.push({ + role: 'system', + content: systemMsg + }) + currentTokens += (await tokenize(systemMsg) + 1) + } + + console.log(currentTokens) + console.log(maxContextTokens) + + while(currentTokens > maxContextTokens){ + if(chats.length <= 1){ + alertError(language.errors.toomuchtoken) + + return false + } + + currentTokens -= (await tokenize(chats[0].content) + 1) + chats.splice(0, 1) + } + + console.log(currentTokens) + + let bias:{[key:number]:number} = {} + + for(let i=0;i 0){ + const prompt = sysPrompts.join('\n') + + if(prompt.replace(/\n/g,'').length > 3){ + formated.push({ + role: 'system', + content: prompt + }) + } + sysPrompts = [] + formated = formated.concat(cha) + } + else{ + formated = formated.concat(cha) + } + } + + if(sysPrompts.length > 0){ + const prompt = sysPrompts.join('\n') + + if(prompt.replace(/\n/g,'').length > 3){ + formated.push({ + role: 'system', + content: prompt + }) + } + sysPrompts = [] + } + + + const req = await requestChatData({ + formated: formated, + bias: bias, + currentChar: currentChar + }, 'model') + + let result = '' + + if(req.type === 'fail'){ + alertError(req.result) + return false + } + else{ + result = reformatContent(req.result) + db.characters[selectedChar].chats[selectedChat].message.push({ + role: 'char', + data: result, + saying: processScript(currentChar,currentChar.chaId, 'editoutput') + }) + setDatabase(db) + } + + + if(currentChar.viewScreen === 'emotion'){ + + let currentEmotion = currentChar.emotionImages + + function shuffleArray(array:string[]) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array + } + + let emotionList = currentEmotion.map((a) => { + return a[0] + }) + + let charemotions = get(CharEmotion) + + let tempEmotion = charemotions[currentChar.chaId] + if(!tempEmotion){ + tempEmotion = [] + } + if(tempEmotion.length > 4){ + tempEmotion.splice(0, 1) + } + + let emobias:{[key:number]:number} = {} + + for(const emo of emotionList){ + const tokens = await tokenizeNum(emo) + for(const token of tokens){ + emobias[token] = 10 + } + } + + for(let i =0;i { + return a[0] + }) + try { + const emotion:string = rq.result.replace(/ |\n/g,'').trim().toLocaleLowerCase() + let emotionSelected = false + for(const emo of currentEmotion){ + if(emo[0] === emotion){ + const emos:[string, string,number] = [emo[0], emo[1], Date.now()] + tempEmotion.push(emos) + charemotions[currentChar.chaId] = tempEmotion + CharEmotion.set(charemotions) + emotionSelected = true + break + } + } + if(!emotionSelected){ + for(const emo of currentEmotion){ + if(emotion.includes(emo[0])){ + const emos:[string, string,number] = [emo[0], emo[1], Date.now()] + tempEmotion.push(emos) + charemotions[currentChar.chaId] = tempEmotion + CharEmotion.set(charemotions) + emotionSelected = true + break + } + } + } + if(!emotionSelected && emotionList.includes('neutral')){ + const emo = currentEmotion[emotionList.indexOf('neutral')] + const emos:[string, string,number] = [emo[0], emo[1], Date.now()] + tempEmotion.push(emos) + charemotions[currentChar.chaId] = tempEmotion + CharEmotion.set(charemotions) + emotionSelected = true + } + } catch (error) { + alertError(language.errors.httpError + `${error}`) + return true + } + } + + return true + + + } + else if(currentChar.viewScreen === 'imggen'){ + if(chatProcessIndex !== -1){ + alertError("Stable diffusion in group chat is not supported") + } + + const msgs = db.characters[selectedChar].chats[selectedChat].message + let msgStr = '' + for(let i = (msgs.length - 1);i>=0;i--){ + console.log(i,msgs.length,msgs[i]) + if(msgs[i].role === 'char'){ + msgStr = `character: ${msgs[i].data.replace(/\n/, ' ')} \n` + msgStr + } + else{ + msgStr = `user: ${msgs[i].data.replace(/\n/, ' ')} \n` + msgStr + break + } + } + + + const ch = await stableDiff(currentChar, msgStr) + if(ch){ + db.characters[selectedChar].chats[selectedChat].sdData = ch + setDatabase(db) + } + } + return true +} \ No newline at end of file diff --git a/src/ts/process/plugins.ts b/src/ts/process/plugins.ts new file mode 100644 index 00000000..6679fc02 --- /dev/null +++ b/src/ts/process/plugins.ts @@ -0,0 +1,250 @@ +import { get, writable } from "svelte/store"; +import { language } from "../../lang"; +import { alertError } from "../alert"; +import { DataBase } from "../database"; +import { checkNullish, selectSingleFile, sleep } from "../util"; +import type { OpenAIChat } from "."; +import { globalFetch } from "../globalApi"; + +export const customProviderStore = writable([] as string[]) + +interface PluginRequest{ + url: string + header?:{[key:string]:string} + body: any, + res: string +} + +interface ProviderPlugin{ + name:string + displayName?:string + script:string + arguments:{[key:string]:'int'|'string'|string[]} + realArg:{[key:string]:number|string} +} + +export type RisuPlugin = ProviderPlugin + +export async function importPlugin(){ + try { + let db = get(DataBase) + const f = await selectSingleFile(['js']) + if(!f){ + return + } + const jsFile = Buffer.from(f.data).toString('utf-8').replace(/^\uFEFF/gm, ""); + const splitedJs = jsFile.split('\n') + let name = '' + let displayName:string = undefined + let arg:{[key:string]:'int'|'string'|string[]} = {} + let realArg:{[key:string]:number|string} = {} + for(const line of splitedJs){ + if(line.startsWith('//@risu-name')){ + const provied = line.slice(13) + if(provied === ''){ + alertError('plugin name must be longer than "", did you put it correctly?') + return + } + name = provied.trim() + } + if(line.startsWith('//@risu-display-name')){ + const provied = line.slice('//@risu-display-name'.length + 1) + if(provied === ''){ + alertError('plugin display name must be longer than "", did you put it correctly?') + return + } + name = provied.trim() + } + if(line.startsWith('//@risu-arg')){ + const provied = line.trim().split(' ') + if(provied.length < 3){ + alertError('plugin argument is incorrect, did you put space in argument name?') + return + } + const provKey = provied[1] + + if(provied[2] !== 'int' && provied[2] !== 'string'){ + alertError(`plugin argument type is "${provied[2]}", which is an unknown type.`) + return + } + if(provied[2] === 'int'){ + arg[provKey] = 'int' + realArg[provKey] = 0 + } + else if(provied[2] === 'string'){ + arg[provKey] = 'string' + realArg[provKey] = '' + } + } + } + + if(name.length === 0){ + alertError('plugin name not found, did you put it correctly?') + return + } + + let pluginData:RisuPlugin = { + name: name, + script: jsFile, + realArg: realArg, + arguments: arg, + displayName: displayName + } + + db.plugins.push(pluginData) + + DataBase.set(db) + loadPlugins() + } catch (error) { + console.error(error) + alertError(language.errors.noData) + } +} + +export function getCurrentPluginMax(prov:string){ + return 12000 +} + +let pluginWorker:Worker = null +let providerRes:{success:boolean, content:string} = null + +function postMsgPluginWorker(type:string, body:any){ + const bod = { + type: type, + body: body + } + pluginWorker.postMessage(bod) +} + +export async function loadPlugins() { + let db = get(DataBase) + if(pluginWorker){ + pluginWorker.terminate() + pluginWorker = null + } + if(db.plugins.length > 0){ + + const da = await fetch("/pluginApi.js") + const pluginApiString = await da.text() + let pluginjs = `${pluginApiString}\n` + + for(const plug of db.plugins){ + pluginjs += `(() => {${plug.script}})()` + } + + const blob = new Blob([pluginjs], {type: 'application/javascript'}); + pluginWorker = new Worker(URL.createObjectURL(blob)); + + pluginWorker.addEventListener('message', async (msg) => { + const data:{type:string,body:any} = msg.data + switch(data.type){ + case "addProvider":{ + let provs = get(customProviderStore) + provs.push(data.body) + customProviderStore.set(provs) + console.log(provs) + break + } + case "resProvider":{ + const provres:{success:boolean, content:string} = data.body + if(checkNullish(provres.success) || checkNullish(provres.content)){ + providerRes = { + success: false, + content :"provider didn't respond 'success' or 'content' in response object" + } + } + else if(typeof(provres.content) !== 'string'){ + providerRes = { + success: false, + content :"provider didn't respond 'content' in response object in string" + } + } + else{ + providerRes = { + success: !!provres.success, + content: provres.content + } + } + break + } + case "fetch": { + postMsgPluginWorker('fetchData',{ + id: data.body.id, + data: await globalFetch(data.body.url, data.body.arg) + }) + break + } + case "getArg":{ + try { + const db = get(DataBase) + const arg:string[] = data.body.arg.split('::') + for(const plug of db.plugins){ + if(arg[0] === plug.name){ + postMsgPluginWorker('fetchData',{ + id: data.body.id, + data: plug.realArg[arg[1]] + }) + return + } + } + postMsgPluginWorker('fetchData',{ + id: data.body.id, + data: null + }) + } catch (error) { + postMsgPluginWorker('fetchData',{ + id: data.body.id, + data: null + }) + } + break + } + case "log":{ + console.log(data.body) + break + } + } + }) + } +} + +export async function pluginProcess(arg:{ + prompt_chat: OpenAIChat, + temperature: number, + max_tokens: number, + presence_penalty: number + frequency_penalty: number + bias: {[key:string]:string} +}|{}){ + try { + let db = get(DataBase) + if(!pluginWorker){ + return { + success: false, + content: "plugin worker not found error" + } + } + postMsgPluginWorker("requestProvider", { + key: db.currentPluginProvider, + arg: arg + }) + providerRes = null + while(true){ + await sleep(50) + if(providerRes){ + break + } + } + return { + success: providerRes.success, + content: providerRes.content + } + } catch (error) { + return { + success: false, + content: "unknownError" + } + } +} + + diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts new file mode 100644 index 00000000..a9fbba10 --- /dev/null +++ b/src/ts/process/request.ts @@ -0,0 +1,215 @@ +import { get } from "svelte/store"; +import type { OpenAIChat } from "."; +import { DataBase, setDatabase, type character } from "../database"; +import { pluginProcess } from "./plugins"; +import { language } from "../../lang"; +import { stringlizeChat } from "./stringlize"; +import { globalFetch } from "../globalApi"; + +interface requestDataArgument{ + formated: OpenAIChat[] + bias: {[key:number]:number} + currentChar: character + temperature?: number + maxTokens?:number + PresensePenalty?: number + frequencyPenalty?: number +} + +type requestDataResponse = { + type: 'success'|'fail' + result: string +} + +export async function requestChatData(arg:requestDataArgument, model:'model'|'submodel'):Promise { + const db = get(DataBase) + let trys = 0 + while(true){ + const da = await requestChatDataMain(arg, model) + if(da.type === 'success'){ + return da + } + trys += 1 + if(trys > db.requestRetrys){ + return da + } + } +} + +export async function requestChatDataMain(arg:requestDataArgument, model:'model'|'submodel'):Promise { + const db = get(DataBase) + let result = '' + let formated = arg.formated + let maxTokens = db.maxResponse + let bias = arg.bias + let currentChar = arg.currentChar + const replacer = model === 'model' ? db.forceReplaceUrl : db.forceReplaceUrl2 + const aiModel = model === 'model' ? db.aiModel : db.subModel + + switch(aiModel){ + case 'gpt35': + case 'gpt4':{ + const body = ({ + model: aiModel === 'gpt35' ? 'gpt-3.5-turbo' : 'gpt-4', + messages: formated, + temperature: arg.temperature ?? (db.temperature / 100), + max_tokens: arg.maxTokens ?? maxTokens, + presence_penalty: arg.PresensePenalty ?? (db.PresensePenalty / 100), + frequency_penalty: arg.frequencyPenalty ?? (db.frequencyPenalty / 100), + logit_bias: bias, + }) + + let replacerURL = replacer === '' ? 'https://api.openai.com/v1/chat/completions' : replacer + + if(replacerURL.endsWith('v1')){ + replacerURL += '/chat/completions' + } + if(replacerURL.endsWith('v1/')){ + replacerURL += 'chat/completions' + } + + const res = await globalFetch(replacerURL, { + body: body, + headers: { + "Authorization": "Bearer " + db.openAIKey + }, + }) + + const dat = res.data as any + if(res.ok){ + try { + const msg:OpenAIChat = (dat.choices[0].message) + return { + type: 'success', + result: msg.content + } + } catch (error) { + return { + type: 'fail', + result: (language.errors.httpError + `${JSON.stringify(dat)}`) + } + } + } + else{ + if(dat.error && dat.error.message){ + return { + type: 'fail', + result: (language.errors.httpError + `${dat.error.message}`) + } + } + else{ + return { + type: 'fail', + result: (language.errors.httpError + `${JSON.stringify(res.data)}`) + } + } + } + + break + } + case "textgen_webui":{ + let DURL = db.textgenWebUIURL + if((!DURL.endsWith('textgen')) && (!DURL.endsWith('textgen/'))){ + if(DURL.endsWith('/')){ + DURL += 'run/textgen' + } + else{ + DURL += '/run/textgen' + } + } + + const proompt = stringlizeChat(formated, currentChar.name) + + const payload = [ + proompt, + { + 'max_new_tokens': 80, + 'do_sample': true, + 'temperature': (db.temperature / 100), + 'top_p': 0.9, + 'typical_p': 1, + 'repetition_penalty': (db.PresensePenalty / 100), + 'encoder_repetition_penalty': 1, + 'top_k': 100, + 'min_length': 0, + 'no_repeat_ngram_size': 0, + 'num_beams': 1, + 'penalty_alpha': 0, + 'length_penalty': 1, + 'early_stopping': false, + 'truncation_length': maxTokens, + 'ban_eos_token': false, + 'custom_stopping_strings': [`\nUser:`], + 'seed': -1, + add_bos_token: true, + } + ]; + + const bodyTemplate = { "data": [JSON.stringify(payload)] }; + + const res = await globalFetch(DURL, { + body: bodyTemplate, + headers: {} + }) + + const dat = res.data as any + console.log(DURL) + console.log(res.data) + if(res.ok){ + try { + return { + type: 'success', + result: dat.data[0].substring(proompt.length) + } + } catch (error) { + return { + type: 'fail', + result: (language.errors.httpError + `${error}`) + } + } + } + else{ + return { + type: 'fail', + result: (language.errors.httpError + `${JSON.stringify(res.data)}`) + } + } + } + + case 'custom':{ + const d = await pluginProcess({ + bias: bias, + prompt_chat: formated, + temperature: (db.temperature / 100), + max_tokens: maxTokens, + presence_penalty: (db.PresensePenalty / 100), + frequency_penalty: (db.frequencyPenalty / 100) + }) + if(!d){ + return { + type: 'fail', + result: (language.errors.unknownModel) + } + } + else if(!d.success){ + return { + type: 'fail', + result: d.content + } + } + else{ + return { + type: 'success', + result: d.content + } + } + break + } + default:{ + return { + type: 'fail', + result: (language.errors.unknownModel) + } + } + } +} \ No newline at end of file diff --git a/src/ts/process/scripts.ts b/src/ts/process/scripts.ts new file mode 100644 index 00000000..514985ea --- /dev/null +++ b/src/ts/process/scripts.ts @@ -0,0 +1,15 @@ +import type { character } from "../database"; + +const dreg = /{{data}}/g + +export function processScript(char:character, data:string, mode:'editinput'|'editoutput'|'editprocess'){ + for (const script of char.customscript){ + if(script.type === mode){ + const reg = new RegExp(script.in,'g') + data = data.replace(reg, (v) => { + return script.out.replace(dreg, v) + }) + } + } + return data +} \ No newline at end of file diff --git a/src/ts/process/stableDiff.ts b/src/ts/process/stableDiff.ts new file mode 100644 index 00000000..ebcc4f54 --- /dev/null +++ b/src/ts/process/stableDiff.ts @@ -0,0 +1,158 @@ +import { get } from "svelte/store" +import { DataBase, type character } from "../database" +import { requestChatData } from "./request" +import { alertError } from "../alert" +import { globalFetch } from "../globalApi" +import { CharEmotion } from "../stores" + + +export async function stableDiff(currentChar:character,prompt:string){ + const mainPrompt = "assistant is a chat analyzer.\nuser will input a data of situation with key and values before chat, and a chat of a user and character.\nView the status of the chat and change the data.\nif data's key starts with $, it must change it every time.\nif data value is none, it must change it." + let db = get(DataBase) + + if(db.sdProvider === ''){ + alertError("Stable diffusion is not set in settings.") + return false + } + + let proompt = 'Data:' + + let currentSd:[string,string][] = [] + + const sdData = currentChar.chats[currentChar.chatPage].sdData + if(sdData){ + const das = sdData.split('\n') + for(const data of das){ + const splited = data.split(':::') + currentSd.push([splited[0].trim(), splited[1].trim()]) + } + } + else{ + currentSd = JSON.parse(JSON.stringify(currentChar.sdData)) + } + + for(const d of currentSd){ + let val = d[1].trim() + if(val === ''){ + val = 'none' + } + + if(!d[0].startsWith('|') || d[0] === 'negative' || d[0] === 'always'){ + proompt += `\n${d[0].trim()}: ${val}` + } + } + + proompt += `\n\nChat:\n${prompt}` + + const promptbody:OpenAIChat[] = [ + { + + role:'system', + content: mainPrompt + }, + { + role: 'user', + content: `Data:\ncharacter's appearance: red hair, cute, black eyes\ncurrent situation: none\n$character's pose: none\n$character's emotion: none\n\nChat:\nuser: *eats breakfeast* \n I'm ready.\ncharacter: Lemon waits patiently outside your room while you get ready. Once you are dressed and have finished your breakfast, she escorts you to the door.\n"Have a good day at school, Master. Don't forget to study hard and make the most of your time there," Lemon reminds you with a smile as she sees you off.` + }, + { + role: 'assistant', + content: "character's appearance: red hair, cute, black eyes\ncurrent situation: waking up in the morning\n$character's pose: standing\n$character's emotion: apologetic" + }, + { + + role:'system', + content: mainPrompt + }, + { + role: 'user', + content: proompt + }, + ] + + console.log(proompt) + const rq = await requestChatData({ + formated: promptbody, + currentChar: currentChar, + temperature: 0.2, + maxTokens: 300, + bias: {} + }, 'submodel') + + + if(rq.type === 'fail'){ + alertError(rq.result) + return false + } + else{ + const res = rq.result + const das = res.split('\n') + for(const data of das){ + const splited = data.split(':') + if(splited.length === 2){ + for(let i=0;i { + return val.join(':::') + }).join('\n') + + if(db.sdProvider === 'webui'){ + + let prompts:string[] = [] + let neg = '' + for(let i=0;i{ + return await tikJS(data) +} + +let tikParser:Tiktoken = null + +async function tikJS(text:string) { + if(!tikParser){ + const {Tiktoken} = await import('@dqbd/tiktoken') + const cl100k_base = await import("@dqbd/tiktoken/encoders/cl100k_base.json"); + + tikParser = new Tiktoken( + cl100k_base.bpe_ranks, + cl100k_base.special_tokens, + cl100k_base.pat_str + ); + } + return tikParser.encode(text) +} + +export async function tokenizerChar(char:character) { + const encoded = await encode(char.name + '\n' + char.firstMessage + '\n' + char.desc) + return encoded.length +} + +export async function tokenize(data:string) { + const encoded = await encode(data) + return encoded.length +} + +export async function tokenizeNum(data:string) { + const encoded = await encode(data) + return encoded +} diff --git a/src/ts/translator/translator.ts b/src/ts/translator/translator.ts new file mode 100644 index 00000000..73565774 --- /dev/null +++ b/src/ts/translator/translator.ts @@ -0,0 +1,49 @@ +import { Body,fetch,ResponseType } from "@tauri-apps/api/http" +import { isTauri } from "../globalApi" + +let cache={ + origin: [''], + trans: [''] +} + +export async function translate(params:string, reverse:boolean) { + if(!isTauri){ + return params + } + if(!reverse){ + const ind = cache.origin.indexOf(params) + if(ind !== -1){ + return cache.trans[ind] + } + } + else{ + const ind = cache.trans.indexOf(params) + if(ind !== -1){ + return cache.origin[ind] + } + } + return googleTrans(params, reverse) +} + +async function googleTrans(text:string, reverse:boolean) { + const arg = { + from: reverse ? 'ko' : 'en', + to: reverse ? 'en' : 'ko', + host: 'translate.google.com', + } + const body = Body.form({ + sl: reverse ? 'ko' : 'en', + tl: reverse ? 'en' : 'ko', + q: text, + }) + const url = `https://${arg.host}/translate_a/single?client=at&dt=t&dt=rm&dj=1` + + const f = await fetch(url, { + method: "POST", + body: body, + responseType: ResponseType.JSON + }) + + const res = f.data as {sentences:{trans?:string}[]} + return res.sentences.filter((s) => 'trans' in s).map((s) => s.trans).join(''); +} \ No newline at end of file diff --git a/src/ts/update.ts b/src/ts/update.ts new file mode 100644 index 00000000..e504eaca --- /dev/null +++ b/src/ts/update.ts @@ -0,0 +1,51 @@ +import { fetch } from "@tauri-apps/api/http"; +import { DataBase, appVer, setDatabase } from "./database"; +import { alertConfirm } from "./alert"; +import { language } from "../lang"; +import { get } from "svelte/store"; +import {open} from '@tauri-apps/api/shell' + + +export async function checkUpdate(){ + try { + let db = get(DataBase) + const da = await fetch('https://raw.githubusercontent.com/kwaroran/RisuAI-release/main/version.json') + //@ts-ignore + const v:string = da.data.version + if(!v){ + return + } + if(v === db.lastup){ + return + } + const nextVer = versionStringToNumber(v) + if(isNaN(nextVer) || (!nextVer)){ + return + } + const appVerNum = versionStringToNumber(appVer) + + if(appVerNum < nextVer){ + const conf = await alertConfirm(language.newVersion) + if(conf){ + open("https://github.com/kwaroran/RisuAI-release/releases/latest") + } + else{ + db = get(DataBase) + db.lastup = v + setDatabase(db) + } + } + + } catch (error) { + + } +} + +function versionStringToNumber(versionString:string):number { + return Number( + versionString + .split(".") + .map((component) => component.padStart(2, "0")) + .join("") + ); +} \ No newline at end of file diff --git a/src/ts/util.ts b/src/ts/util.ts new file mode 100644 index 00000000..2c4e0d68 --- /dev/null +++ b/src/ts/util.ts @@ -0,0 +1,271 @@ +import { get } from "svelte/store" +import type { Database, Message } from "./database" +import { DataBase } from "./database" +import { selectedCharID } from "./stores" +import {open} from '@tauri-apps/api/dialog' +import { readBinaryFile } from "@tauri-apps/api/fs" +import { basename } from "@tauri-apps/api/path" +import { createBlankChar, getCharImage } from "./characters" +import { appWindow } from '@tauri-apps/api/window'; +import { isTauri } from "./globalApi" + +export interface Messagec extends Message{ + index: number +} + +export function messageForm(arg:Message[], loadPages:number){ + let db = get(DataBase) + let selectedChar = get(selectedCharID) + function reformatContent(data:string){ + return data.trim().replace(`${db.characters[selectedChar].name}:`, '').trim() + } + + let a:Messagec[] = [] + for(let i=0;i setTimeout(resolve, ms) ); +} + +export function checkNullish(data:any){ + return data === undefined || data === null +} + +export async function selectSingleFile(ext:string[]){ + if(await !isTauri){ + const v = await selectFileByDom(ext, 'single') + const file = v[0] + return {name: file.name,data:await readFileAsUint8Array(file)} + } + + const selected = await open({ + filters: [{ + name: ext.join(', '), + extensions: ext + }] + }); + if (Array.isArray(selected)) { + return null + } else if (selected === null) { + return null + } else { + return {name: await basename(selected),data:await readBinaryFile(selected)} + } +} + +export async function selectMultipleFile(ext:string[]){ + if(!isTauri){ + const v = await selectFileByDom(ext, 'multiple') + let arr:{name:string, data:Uint8Array}[] = [] + for(const file of v){ + arr.push({name: file.name,data:await readFileAsUint8Array(file)}) + } + return arr + } + + const selected = await open({ + filters: [{ + name: ext.join(', '), + extensions: ext, + }], + multiple: true + }); + if (Array.isArray(selected)) { + let arr:{name:string, data:Uint8Array}[] = [] + for(const file of selected){ + arr.push({name: await basename(file),data:await readBinaryFile(file)}) + } + return arr + } else if (selected === null) { + return null + } else { + return [{name: await basename(selected),data:await readBinaryFile(selected)}] + } +} + +export const replacePlaceholders = (msg:string, name:string) => { + let db = get(DataBase) + let selectedChar = get(selectedCharID) + let currentChar = db.characters[selectedChar] + return msg.replace(/({{char}})|({{Char}})|()|()/gi, currentChar.name) + .replace(/({{user}})|({{User}})|()|()/gi, db.username) +} + +function selectFileByDom(allowedExtensions:string[], multiple:'multiple'|'single' = 'single') { + return new Promise((resolve) => { + const fileInput = document.createElement('input'); + fileInput.type = 'file'; + fileInput.multiple = multiple === 'multiple'; + + if (allowedExtensions && allowedExtensions.length) { + fileInput.accept = allowedExtensions.map(ext => `.${ext}`).join(','); + } + + fileInput.addEventListener('change', (event) => { + if (fileInput.files.length === 0) { + resolve([]); + return; + } + + const files = Array.from(fileInput.files).filter(file => { + const fileExtension = file.name.split('.').pop().toLowerCase(); + return !allowedExtensions || allowedExtensions.includes(fileExtension); + }); + + fileInput.remove() + resolve(files); + }); + + document.body.appendChild(fileInput); + fileInput.click(); + fileInput.style.display = 'none'; // Hide the file input element + }); +} + +function readFileAsUint8Array(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + + reader.onload = (event) => { + const buffer = event.target.result; + const uint8Array = new Uint8Array(buffer as ArrayBuffer); + resolve(uint8Array); + }; + + reader.onerror = (error) => { + reject(error); + }; + + reader.readAsArrayBuffer(file); + }); +} + +export async function changeFullscreen(){ + const db = get(DataBase) + const isFull = await appWindow.isFullscreen() + console.log(isFull) + console.log(db.fullScreen) + if(db.fullScreen && (!isFull)){ + await appWindow.setFullscreen(true) + } + if((!db.fullScreen) && (isFull)){ + await appWindow.setFullscreen(false) + } +} + +export async function getCustomBackground(db:string){ + if(db.length < 2){ + return '' + } + else{ + const filesrc = await getCharImage(db, 'plain') + return `background: url("${filesrc}"); background-size: cover;` + } +} + +export function findCharacterbyId(id:string) { + const db = get(DataBase) + for(const char of db.characters){ + if(char.type !== 'group'){ + if(char.chaId === id){ + return char + } + } + } + let unknown =createBlankChar() + unknown.name = 'Unknown Character' + return unknown +} + +export function defaultEmotion(em:[string,string][]){ + if(!em){ + return '' + } + for(const v of em){ + if(v[0] === 'neutral'){ + return v[1] + } + } + return '' +} + +export async function getEmotion(db:Database,chaEmotion:{[key:string]: [string, string, number][]}, type:'contain'|'plain'|'css'){ + const selectedChar = get(selectedCharID) + const currentDat = db.characters[selectedChar] + if(!currentDat){ + return [] + } + let charIdList:string[] = [] + + if(currentDat.type === 'group'){ + if(currentDat.characters.length === 0){ + return [] + } + switch(currentDat.viewScreen){ + case "multiple": + charIdList = currentDat.characters + break + case "single":{ + let newist:[string,string,number] = ['', '', 0] + let newistChar = currentDat.characters[0] + for(const currentChar of currentDat.characters){ + const cha = chaEmotion[currentChar] + if(cha){ + const latestEmotion = cha[cha.length - 1] + if(latestEmotion && latestEmotion[2] > newist[2]){ + newist = latestEmotion + newistChar = currentChar + } + } + } + charIdList = [newistChar] + break + } + case "emp":{ + charIdList = currentDat.characters + break + } + } + } + else{ + charIdList = [currentDat.chaId] + } + + let datas: string[] = [currentDat.viewScreen === 'emp' ? 'emp' : 'normal' as const] + for(const chaid of charIdList){ + const currentChar = findCharacterbyId(chaid) + if(currentChar.viewScreen === 'emotion'){ + const currEmotion = chaEmotion[currentChar.chaId] + let im = '' + if(!currEmotion || currEmotion.length === 0){ + im = (await getCharImage(defaultEmotion(currentChar?.emotionImages),type)) + } + else{ + im = (await getCharImage(currEmotion[currEmotion.length - 1][1], type)) + } + if(im && im.length > 2){ + datas.push(im) + } + } + else if(currentChar.viewScreen === 'imggen'){ + const currEmotion = chaEmotion[currentChar.chaId] + if(!currEmotion || currEmotion.length === 0){ + datas.push(await getCharImage(currentChar.image ?? '', 'plain')) + } + else{ + datas.push(currEmotion[currEmotion.length - 1][1]) + } + } + } + return datas +} \ No newline at end of file diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..4078e747 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..a409daf4 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,43 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx,svelte}", + ], + theme: { + extend: { + colors:{ + bgcolor: "#282a36", + darkbg: "#21222C", + borderc: "#6272a4", + selected: "#44475a", + draculared: "#ff5555" + }, + minWidth: { + '20': '5rem', + '14': '3.5rem', + 'half': '50%' + }, + maxWidth:{ + 'half': '50%', + '14': '3.5rem', + }, + borderWidth: { + '1': '1px', + }, + width: { + '2xl': '48rem', + }, + minHeight:{ + '8': '2rem', + '14': '3.5rem', + '20': '5rem', + + } + } + }, + plugins: [ + require('@tailwindcss/typography') + ], +} + diff --git a/todo.txt b/todo.txt new file mode 100644 index 00000000..ff430e3e --- /dev/null +++ b/todo.txt @@ -0,0 +1,13 @@ +디스플레이 이미지: +감정 외 특정 키워드 입력시 다른 이미지를 띄운다던지 등의 기능 추가 + +디스플레이: +어디까지 기억하는지 표시 추가 + +입력창: +입력창 엔터 되게 만들기 +현제 입력 토큰 보이기? + +플러그인: +일단 되게 만들기 + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..09246f64 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "resolveJsonModule": true, + "baseUrl": ".", + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true + }, + "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte", "public/sw.js", "public/pluginApi.ts"], + "exclude": ["src/**/web/*.ts"], + "references": [{ "path": "./tsconfig.node.json" }], + "ignoreDeprecations": "5.0" +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 00000000..65dbdb96 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node" + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..b0481948 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,63 @@ +import { defineConfig } from "vite"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; +import sveltePreprocess from "svelte-preprocess"; +import wasm from "vite-plugin-wasm"; +import { internalIpV4 } from 'internal-ip' +import topLevelAwait from "vite-plugin-top-level-await"; + +// https://vitejs.dev/config/ +export default defineConfig(async () => { + + const host = await internalIpV4() + + return { + plugins: [ + + svelte({ + preprocess: [ + sveltePreprocess({ + typescript: true, + }), + ], + onwarn: (warning, handler) => { + // disable a11y warnings + if (warning.code.startsWith("a11y-")) return; + handler(warning); + }, + }), + wasm(), + topLevelAwait(), + ], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // prevent vite from obscuring rust errors + clearScreen: false, + // tauri expects a fixed port, fail if that port is not available + server: { + host: '0.0.0.0', // listen on all addresses + port: 5174, + strictPort: true, + hmr: { + protocol: 'ws', + host, + port: 5184, + }, + }, + // to make use of `TAURI_DEBUG` and other env variables + // https://tauri.studio/v1/api/config#buildconfig.beforedevcommand + envPrefix: ["VITE_", "TAURI_"], + build: { + // Tauri supports es2021 + target: process.env.TAURI_PLATFORM == "windows" ? "chrome105" : "safari13", + // don't minify for debug builds + minify: process.env.TAURI_DEBUG ? false : 'esbuild', + // produce sourcemaps for debug builds + sourcemap: !!process.env.TAURI_DEBUG, + }, + + resolve:{ + alias:{ + 'src':'/src' + } + } +}});