diff --git a/.github/actions/image-build/action.yml b/.github/actions/image-build/action.yml new file mode 100644 index 0000000000..ee23bd8ba8 --- /dev/null +++ b/.github/actions/image-build/action.yml @@ -0,0 +1,118 @@ +name: 'Single arch image build' +description: 'Build single-arch image on platform appropriate runner' +inputs: + image: + description: 'Name of the image to build' + required: true + ghcr-token: + description: 'GitHub Container Registry token' + required: true + platform: + description: 'Platform to build for' + required: true + artifact-key-base: + description: 'Base key for artifact name' + required: true + context: + description: 'Path to build context' + required: true + dockerfile: + description: 'Path to Dockerfile' + required: true + build-args: + description: 'Docker build arguments' + required: false +runs: + using: 'composite' + steps: + - name: Prepare + id: prepare + shell: bash + env: + PLATFORM: ${{ inputs.platform }} + run: | + echo "platform-pair=${PLATFORM//\//-}" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 + + - name: Login to GitHub Container Registry + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 + if: ${{ !github.event.pull_request.head.repo.fork }} + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ inputs.ghcr-token }} + + - name: Generate cache key suffix + id: cache-key-suffix + shell: bash + env: + REF: ${{ github.ref_name }} + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + echo "cache-key-suffix=pr-${{ github.event.number }}" >> $GITHUB_OUTPUT + else + SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g') + echo "suffix=${SUFFIX}" >> $GITHUB_OUTPUT + fi + + - name: Generate cache target + id: cache-target + shell: bash + env: + BUILD_ARGS: ${{ inputs.build-args }} + IMAGE: ${{ inputs.image }} + SUFFIX: ${{ steps.cache-key-suffix.outputs.suffix }} + PLATFORM_PAIR: ${{ steps.prepare.outputs.platform-pair }} + run: | + HASH=$(sha256sum <<< "${BUILD_ARGS}" | cut -d' ' -f1) + CACHE_KEY="${PLATFORM_PAIR}-${HASH}" + echo "cache-key-base=${CACHE_KEY}" >> $GITHUB_OUTPUT + if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then + # Essentially just ignore the cache output (forks can't write to registry cache) + echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT + else + echo "cache-to=type=registry,ref=${IMAGE}-build-cache:${CACHE_KEY}-${SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT + fi + + - name: Generate docker image tags + id: meta + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5 + env: + DOCKER_METADATA_PR_HEAD_SHA: 'true' + + - name: Build and push image + id: build + uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + with: + context: ${{ inputs.context }} + file: ${{ inputs.dockerfile }} + platforms: ${{ inputs.platform }} + labels: ${{ steps.meta.outputs.labels }} + cache-to: ${{ steps.cache-target.outputs.cache-to }} + cache-from: | + type=registry,ref=${{ inputs.image }}-build-cache:${{ steps.cache-target.outputs.cache-key-base }}-${{ steps.cache-key-suffix.outputs.suffix }} + type=registry,ref=${{ inputs.image }}-build-cache:${{ steps.cache-target.outputs.cache-key-base }}-main + outputs: type=image,"name=${{ inputs.image }}",push-by-digest=true,name-canonical=true,push=${{ !github.event.pull_request.head.repo.fork }} + build-args: | + BUILD_ID=${{ github.run_id }} + BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.meta.outputs.tags }} + BUILD_SOURCE_REF=${{ github.ref_name }} + BUILD_SOURCE_COMMIT=${{ github.sha }} + ${{ inputs.build-args }} + + - name: Export digest + shell: bash + run: | # zizmor: ignore[template-injection] + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: ${{ inputs.artifact-key-base }}-${{ steps.cache-target.outputs.cache-key-base }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 69ef63efe9..415fdb880a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -50,7 +50,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@28deaeda66b76a05916b6923827895f2b14ab387 # v3 + uses: github/codeql-action/init@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -63,7 +63,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@28deaeda66b76a05916b6923827895f2b14ab387 # v3 + uses: github/codeql-action/autobuild@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3 # â„šī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -76,6 +76,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@28deaeda66b76a05916b6923827895f2b14ab387 # v3 + uses: github/codeql-action/analyze@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 1746c93bc7..056aa7e6f4 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -40,6 +40,8 @@ jobs: - 'machine-learning/**' workflow: - '.github/workflows/docker.yml' + - '.github/workflows/multi-runner-build.yml' + - '.github/actions/image-build' - name: Check if we should force jobs to run id: should_force @@ -103,429 +105,74 @@ jobs: docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_PR}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}" docker buildx imagetools create -t "${REGISTRY_NAME}/${REPOSITORY}:${TAG_COMMIT}" "${REGISTRY_NAME}/${REPOSITORY}:${TAG_OLD}" - build_and_push_ml: + machine-learning: name: Build and Push ML needs: pre-job - permissions: - contents: read - packages: write if: ${{ needs.pre-job.outputs.should_run_ml == 'true' }} - runs-on: ${{ matrix.runner }} - env: - image: immich-machine-learning - context: machine-learning - file: machine-learning/Dockerfile - GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-machine-learning strategy: - # Prevent a failure in one image from stopping the other builds fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - device: cpu - - - platform: linux/arm64 - runner: ubuntu-24.04-arm - device: cpu - - - platform: linux/amd64 - runner: ubuntu-latest - device: cuda - suffix: -cuda - - - platform: linux/amd64 - runner: mich - device: rocm - suffix: -rocm - - - platform: linux/amd64 - runner: ubuntu-latest - device: openvino - suffix: -openvino - - - platform: linux/arm64 - runner: ubuntu-24.04-arm - device: armnn - suffix: -armnn - - - platform: linux/arm64 - runner: ubuntu-24.04-arm - device: rknn - suffix: -rknn - - steps: - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - persist-credentials: false - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 - - - name: Login to GitHub Container Registry - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 - if: ${{ !github.event.pull_request.head.repo.fork }} - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Generate cache key suffix - env: - REF: ${{ github.ref_name }} - run: | - if [[ "${{ github.event_name }}" == "pull_request" ]]; then - echo "CACHE_KEY_SUFFIX=pr-${{ github.event.number }}" >> $GITHUB_ENV - else - SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g') - echo "CACHE_KEY_SUFFIX=${SUFFIX}" >> $GITHUB_ENV - fi - - - name: Generate cache target - id: cache-target - run: | - if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then - # Essentially just ignore the cache output (forks can't write to registry cache) - echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT - else - echo "cache-to=type=registry,ref=${GHCR_REPO}-build-cache:${PLATFORM_PAIR}-${{ matrix.device }}-${CACHE_KEY_SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT - fi - - - name: Generate docker image tags - id: meta - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5 - env: - DOCKER_METADATA_PR_HEAD_SHA: 'true' - - - name: Build and push image - id: build - uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 - with: - context: ${{ env.context }} - file: ${{ env.file }} - platforms: ${{ matrix.platforms }} - labels: ${{ steps.meta.outputs.labels }} - cache-to: ${{ steps.cache-target.outputs.cache-to }} - cache-from: | - type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ matrix.device }}-${{ env.CACHE_KEY_SUFFIX }} - type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ matrix.device }}-main - outputs: type=image,"name=${{ env.GHCR_REPO }}",push-by-digest=true,name-canonical=true,push=${{ !github.event.pull_request.head.repo.fork }} - build-args: | - DEVICE=${{ matrix.device }} - BUILD_ID=${{ github.run_id }} - BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.metadata.outputs.tags }} - BUILD_SOURCE_REF=${{ github.ref_name }} - BUILD_SOURCE_COMMIT=${{ github.sha }} - - - name: Export digest - run: | # zizmor: ignore[template-injection] - mkdir -p ${{ runner.temp }}/digests - digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: ml-digests-${{ matrix.device }}-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests/* - if-no-files-found: error - retention-days: 1 - - merge_ml: - name: Merge & Push ML - runs-on: ubuntu-latest - permissions: - contents: read - actions: read - packages: write - if: ${{ needs.pre-job.outputs.should_run_ml == 'true' && !github.event.pull_request.head.repo.fork }} - env: - GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-machine-learning - DOCKER_REPO: altran1502/immich-machine-learning - strategy: matrix: include: - device: cpu + tag-suffix: '' - device: cuda - suffix: -cuda - - device: rocm - suffix: -rocm + tag-suffix: '-cuda' + platforms: linux/amd64 - device: openvino - suffix: -openvino + tag-suffix: '-openvino' + platforms: linux/amd64 - device: armnn - suffix: -armnn + tag-suffix: '-armnn' + platforms: linux/arm64 - device: rknn - suffix: -rknn - needs: - - build_and_push_ml - steps: - - name: Download digests - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 - with: - path: ${{ runner.temp }}/digests - pattern: ml-digests-${{ matrix.device }}-* - merge-multiple: true - - - name: Login to Docker Hub - if: ${{ github.event_name == 'release' }} - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Login to GHCR - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3 - - - name: Generate docker image tags - id: meta - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5 - env: - DOCKER_METADATA_PR_HEAD_SHA: 'true' - with: - flavor: | - # Disable latest tag - latest=false - suffix=${{ matrix.suffix }} - images: | - name=${{ env.GHCR_REPO }} - name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }} - tags: | - # Tag with branch name - type=ref,event=branch - # Tag with pr-number - type=ref,event=pr - # Tag with long commit sha hash - type=sha,format=long,prefix=commit- - # Tag with git tag on release - type=ref,event=tag - type=raw,value=release,enable=${{ github.event_name == 'release' }} - - - name: Create manifest list and push - working-directory: ${{ runner.temp }}/digests - run: | - # Process annotations - declare -a ANNOTATIONS=() - if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then - while IFS= read -r annotation; do - # Extract key and value by removing the manifest: prefix - if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then - key="${BASH_REMATCH[1]}" - value="${BASH_REMATCH[2]}" - # Use array to properly handle arguments with spaces - ANNOTATIONS+=(--annotation "index:$key=$value") - fi - done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON") - fi - - TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - SOURCE_ARGS=$(printf "${GHCR_REPO}@sha256:%s " *) - - docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS - - build_and_push_server: - name: Build and Push Server - runs-on: ${{ matrix.runner }} - permissions: - contents: read - packages: write - needs: pre-job - if: ${{ needs.pre-job.outputs.should_run_server == 'true' }} - env: - image: immich-server - context: . - file: server/Dockerfile - GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-server - strategy: - fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - - platform: linux/arm64 - runner: ubuntu-24.04-arm - steps: - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - with: - persist-credentials: false - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3 - - - name: Login to GitHub Container Registry - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 - if: ${{ !github.event.pull_request.head.repo.fork }} - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Generate cache key suffix - env: - REF: ${{ github.ref_name }} - run: | - if [[ "${{ github.event_name }}" == "pull_request" ]]; then - echo "CACHE_KEY_SUFFIX=pr-${{ github.event.number }}" >> $GITHUB_ENV - else - SUFFIX=$(echo "${REF}" | sed 's/[^a-zA-Z0-9]/-/g') - echo "CACHE_KEY_SUFFIX=${SUFFIX}" >> $GITHUB_ENV - fi - - - name: Generate cache target - id: cache-target - run: | - if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then - # Essentially just ignore the cache output (forks can't write to registry cache) - echo "cache-to=type=local,dest=/tmp/discard,ignore-error=true" >> $GITHUB_OUTPUT - else - echo "cache-to=type=registry,ref=${GHCR_REPO}-build-cache:${PLATFORM_PAIR}-${CACHE_KEY_SUFFIX},mode=max,compression=zstd" >> $GITHUB_OUTPUT - fi - - - name: Generate docker image tags - id: meta - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5 - env: - DOCKER_METADATA_PR_HEAD_SHA: 'true' - - - name: Build and push image - id: build - uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 - with: - context: ${{ env.context }} - file: ${{ env.file }} - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - cache-to: ${{ steps.cache-target.outputs.cache-to }} - cache-from: | - type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-${{ env.CACHE_KEY_SUFFIX }} - type=registry,ref=${{ env.GHCR_REPO }}-build-cache:${{ env.PLATFORM_PAIR }}-main - outputs: type=image,"name=${{ env.GHCR_REPO }}",push-by-digest=true,name-canonical=true,push=${{ !github.event.pull_request.head.repo.fork }} - build-args: | - DEVICE=cpu - BUILD_ID=${{ github.run_id }} - BUILD_IMAGE=${{ github.event_name == 'release' && github.ref_name || steps.metadata.outputs.tags }} - BUILD_SOURCE_REF=${{ github.ref_name }} - BUILD_SOURCE_COMMIT=${{ github.sha }} - - - name: Export digest - run: | # zizmor: ignore[template-injection] - mkdir -p ${{ runner.temp }}/digests - digest="${{ steps.build.outputs.digest }}" - touch "${{ runner.temp }}/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: server-digests-${{ env.PLATFORM_PAIR }} - path: ${{ runner.temp }}/digests/* - if-no-files-found: error - retention-days: 1 - - merge_server: - name: Merge & Push Server - runs-on: ubuntu-latest + tag-suffix: '-rknn' + platforms: linux/arm64 + - device: rocm + tag-suffix: '-rocm' + platforms: linux/amd64 + runner-mapping: '{"linux/amd64": "mich"}' + uses: ./.github/workflows/multi-runner-build.yml permissions: contents: read actions: read packages: write - if: ${{ needs.pre-job.outputs.should_run_server == 'true' && !github.event.pull_request.head.repo.fork }} - env: - GHCR_REPO: ghcr.io/${{ github.repository_owner }}/immich-server - DOCKER_REPO: altran1502/immich-server - needs: - - build_and_push_server - steps: - - name: Download digests - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 - with: - path: ${{ runner.temp }}/digests - pattern: server-digests-* - merge-multiple: true + secrets: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + with: + image: immich-machine-learning + context: machine-learning + dockerfile: machine-learning/Dockerfile + platforms: ${{ matrix.platforms }} + runner-mapping: ${{ matrix.runner-mapping }} + tag-suffix: ${{ matrix.tag-suffix }} + dockerhub-push: ${{ github.event_name == 'release' }} + build-args: | + DEVICE=${{ matrix.device }} - - name: Login to Docker Hub - if: ${{ github.event_name == 'release' }} - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Login to GHCR - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3 - - - name: Generate docker image tags - id: meta - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5 - env: - DOCKER_METADATA_PR_HEAD_SHA: 'true' - with: - flavor: | - # Disable latest tag - latest=false - suffix=${{ matrix.suffix }} - images: | - name=${{ env.GHCR_REPO }} - name=${{ env.DOCKER_REPO }},enable=${{ github.event_name == 'release' }} - tags: | - # Tag with branch name - type=ref,event=branch - # Tag with pr-number - type=ref,event=pr - # Tag with long commit sha hash - type=sha,format=long,prefix=commit- - # Tag with git tag on release - type=ref,event=tag - type=raw,value=release,enable=${{ github.event_name == 'release' }} - - - name: Create manifest list and push - working-directory: ${{ runner.temp }}/digests - run: | - # Process annotations - declare -a ANNOTATIONS=() - if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then - while IFS= read -r annotation; do - # Extract key and value by removing the manifest: prefix - if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then - key="${BASH_REMATCH[1]}" - value="${BASH_REMATCH[2]}" - # Use array to properly handle arguments with spaces - ANNOTATIONS+=(--annotation "index:$key=$value") - fi - done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON") - fi - - TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - SOURCE_ARGS=$(printf "${GHCR_REPO}@sha256:%s " *) - - docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS + server: + name: Build and Push Server + needs: pre-job + if: ${{ needs.pre-job.outputs.should_run_server == 'true' }} + uses: ./.github/workflows/multi-runner-build.yml + permissions: + contents: read + actions: read + packages: write + secrets: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + with: + image: immich-server + context: . + dockerfile: server/Dockerfile + dockerhub-push: ${{ github.event_name == 'release' }} + build-args: | + DEVICE=cpu success-check-server: name: Docker Build & Push Server Success - needs: [merge_server, retag_server] + needs: [server, retag_server] permissions: {} runs-on: ubuntu-latest if: always() @@ -540,7 +187,7 @@ jobs: success-check-ml: name: Docker Build & Push ML Success - needs: [merge_ml, retag_ml] + needs: [machine-learning, retag_ml] permissions: {} runs-on: ubuntu-latest if: always() diff --git a/.github/workflows/fix-format.yml b/.github/workflows/fix-format.yml index 77b86cb0b8..e4911e69ce 100644 --- a/.github/workflows/fix-format.yml +++ b/.github/workflows/fix-format.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} diff --git a/.github/workflows/multi-runner-build.yml b/.github/workflows/multi-runner-build.yml new file mode 100644 index 0000000000..17eceb7e8f --- /dev/null +++ b/.github/workflows/multi-runner-build.yml @@ -0,0 +1,185 @@ +name: 'Multi-runner container image build' +on: + workflow_call: + inputs: + image: + description: 'Name of the image' + type: string + required: true + context: + description: 'Path to build context' + type: string + required: true + dockerfile: + description: 'Path to Dockerfile' + type: string + required: true + tag-suffix: + description: 'Suffix to append to the image tag' + type: string + default: '' + dockerhub-push: + description: 'Push to Docker Hub' + type: boolean + default: false + build-args: + description: 'Docker build arguments' + type: string + required: false + platforms: + description: 'Platforms to build for' + type: string + runner-mapping: + description: 'Mapping from platforms to runners' + type: string + secrets: + DOCKERHUB_USERNAME: + required: false + DOCKERHUB_TOKEN: + required: false + +env: + GHCR_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ inputs.image }} + DOCKERHUB_IMAGE: altran1502/${{ inputs.image }} + +jobs: + matrix: + name: 'Generate matrix' + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} + key: ${{ steps.artifact-key.outputs.base }} + steps: + - name: Generate build matrix + id: matrix + shell: bash + env: + PLATFORMS: ${{ inputs.platforms || 'linux/amd64,linux/arm64' }} + RUNNER_MAPPING: ${{ inputs.runner-mapping || '{"linux/amd64":"ubuntu-latest","linux/arm64":"ubuntu-24.04-arm"}' }} + run: | + matrix=$(jq -R -c \ + --argjson runner_mapping "${RUNNER_MAPPING}" \ + 'split(",") | map({platform: ., runner: $runner_mapping[.]})' \ + <<< "${PLATFORMS}") + echo "${matrix}" + echo "matrix=${matrix}" >> $GITHUB_OUTPUT + + - name: Determine artifact key + id: artifact-key + shell: bash + env: + IMAGE: ${{ inputs.image }} + SUFFIX: ${{ inputs.tag-suffix }} + run: | + if [[ -n "${SUFFIX}" ]]; then + base="${IMAGE}${SUFFIX}-digests" + else + base="${IMAGE}-digests" + fi + echo "${base}" + echo "base=${base}" >> $GITHUB_OUTPUT + + build: + needs: matrix + runs-on: ${{ matrix.runner }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.matrix.outputs.matrix) }} + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + with: + persist-credentials: false + + - uses: ./.github/actions/image-build + with: + context: ${{ inputs.context }} + dockerfile: ${{ inputs.dockerfile }} + image: ${{ env.GHCR_IMAGE }} + ghcr-token: ${{ secrets.GITHUB_TOKEN }} + platform: ${{ matrix.platform }} + artifact-key-base: ${{ needs.matrix.outputs.key }} + build-args: ${{ inputs.build-args }} + + merge: + needs: [matrix, build] + runs-on: ubuntu-latest + if: ${{ !github.event.pull_request.head.repo.fork }} + permissions: + contents: read + actions: read + packages: write + steps: + - name: Download digests + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4 + with: + path: ${{ runner.temp }}/digests + pattern: ${{ needs.matrix.outputs.key }}-* + merge-multiple: true + + - name: Login to Docker Hub + if: ${{ inputs.dockerhub-push }} + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GHCR + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3 + + - name: Generate docker image tags + id: meta + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5 + env: + DOCKER_METADATA_PR_HEAD_SHA: 'true' + with: + flavor: | + # Disable latest tag + latest=false + suffix=${{ inputs.tag-suffix }} + images: | + name=${{ env.GHCR_IMAGE }} + name=${{ env.DOCKERHUB_IMAGE }},enable=${{ inputs.dockerhub-push }} + tags: | + # Tag with branch name + type=ref,event=branch + # Tag with pr-number + type=ref,event=pr + # Tag with long commit sha hash + type=sha,format=long,prefix=commit- + # Tag with git tag on release + type=ref,event=tag + type=raw,value=release,enable=${{ github.event_name == 'release' }} + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + # Process annotations + declare -a ANNOTATIONS=() + if [[ -n "$DOCKER_METADATA_OUTPUT_JSON" ]]; then + while IFS= read -r annotation; do + # Extract key and value by removing the manifest: prefix + if [[ "$annotation" =~ ^manifest:(.+)=(.+)$ ]]; then + key="${BASH_REMATCH[1]}" + value="${BASH_REMATCH[2]}" + # Use array to properly handle arguments with spaces + ANNOTATIONS+=(--annotation "index:$key=$value") + fi + done < <(jq -r '.annotations[]' <<< "$DOCKER_METADATA_OUTPUT_JSON") + fi + + TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + SOURCE_ARGS=$(printf "${GHCR_IMAGE}@sha256:%s " *) + + docker buildx imagetools create $TAGS "${ANNOTATIONS[@]}" $SOURCE_ARGS diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 27957ca4a3..0f2a153de2 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -32,7 +32,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} @@ -83,7 +83,7 @@ jobs: steps: - name: Generate a token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 with: app-id: ${{ secrets.PUSH_O_MATIC_APP_ID }} private-key: ${{ secrets.PUSH_O_MATIC_APP_KEY }} diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index 3a0b702210..41e8f03c90 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -118,7 +118,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@28deaeda66b76a05916b6923827895f2b14ab387 # v3 + uses: github/codeql-action/upload-sarif@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3 with: sarif_file: results.sarif category: zizmor diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 605993f5e9..d52ca4e6f7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -346,7 +346,7 @@ jobs: working-directory: ./e2e strategy: matrix: - runner: [mich, ubuntu-24.04-arm] + runner: [ubuntu-latest, ubuntu-24.04-arm] steps: - name: Checkout code @@ -394,7 +394,7 @@ jobs: working-directory: ./e2e strategy: matrix: - runner: [mich, ubuntu-24.04-arm] + runner: [ubuntu-latest, ubuntu-24.04-arm] steps: - name: Checkout code @@ -593,8 +593,8 @@ jobs: echo "Changed files: ${CHANGED_FILES}" exit 1 - generated-typeorm-migrations-up-to-date: - name: TypeORM Checks + sql-schema-up-to-date: + name: SQL Schema Checks runs-on: ubuntu-latest permissions: contents: read @@ -641,7 +641,7 @@ jobs: - name: Generate new migrations continue-on-error: true - run: npm run migrations:generate TestMigration + run: npm run migrations:generate src/TestMigration - name: Find file changes uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20 diff --git a/cli/package-lock.json b/cli/package-lock.json index cc8e88012f..22fc4473f0 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -697,9 +697,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", - "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, "license": "MIT", "engines": { @@ -935,6 +935,28 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", + "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1367,17 +1389,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.0.tgz", - "integrity": "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", + "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/type-utils": "8.31.0", - "@typescript-eslint/utils": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/type-utils": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1397,16 +1419,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.0.tgz", - "integrity": "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", + "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4" }, "engines": { @@ -1422,14 +1444,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", - "integrity": "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", + "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0" + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1440,14 +1462,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.0.tgz", - "integrity": "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", + "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/utils": "8.31.0", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/utils": "8.31.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -1464,9 +1486,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", - "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", + "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", "dev": true, "license": "MIT", "engines": { @@ -1478,14 +1500,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", - "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", + "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1531,16 +1553,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.0.tgz", - "integrity": "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", + "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0" + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1555,13 +1577,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", - "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", + "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/types": "8.31.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -1718,6 +1740,20 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1808,6 +1844,27 @@ "dev": true, "license": "MIT" }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1895,6 +1952,16 @@ } } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1905,6 +1972,37 @@ "node": ">=8" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2084,6 +2182,49 @@ "dev": true, "license": "MIT" }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/core-js-compat": { "version": "3.41.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", @@ -2098,6 +2239,20 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2148,6 +2303,31 @@ "dev": true, "license": "MIT" }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2155,6 +2335,13 @@ "dev": true, "license": "MIT" }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.137", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz", @@ -2169,6 +2356,36 @@ "dev": true, "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", @@ -2176,6 +2393,19 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.25.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", @@ -2227,6 +2457,13 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2241,9 +2478,9 @@ } }, "node_modules/eslint": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", - "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2253,11 +2490,12 @@ "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.25.1", + "@eslint/js": "9.26.0", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -2281,7 +2519,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" @@ -2315,9 +2554,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.3.1.tgz", + "integrity": "sha512-vad9VWgEm9xaVXRNmb4aeOt0PWDc61IAdzghkbYQ2wavgax148iKoX1rNJcgkBGCipzLzOnHYVgL7xudM9yccQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2496,6 +2735,39 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/expect-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", @@ -2506,6 +2778,65 @@ "node": ">=12.0.0" } }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2596,6 +2927,24 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2664,6 +3013,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2679,6 +3048,55 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -2759,6 +3177,19 @@ "dev": true, "license": "MIT" }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2776,6 +3207,32 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", @@ -2796,6 +3253,36 @@ "dev": true, "license": "MIT" }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2859,6 +3346,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-builtin-module": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-4.0.0.tgz", @@ -2915,6 +3419,13 @@ "node": ">=0.12.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3151,6 +3662,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3173,6 +3717,29 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -3249,6 +3816,16 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -3271,6 +3848,52 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3359,6 +3982,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3396,6 +4029,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -3432,6 +4075,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -3527,6 +4180,20 @@ } } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3537,6 +4204,22 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3557,6 +4240,32 @@ ], "license": "MIT" }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/read-package-up": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", @@ -3704,6 +4413,23 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3727,6 +4453,34 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", @@ -3740,6 +4494,52 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3763,6 +4563,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -3836,6 +4712,16 @@ "dev": true, "license": "MIT" }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/std-env": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", @@ -4102,6 +4988,16 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -4169,6 +5065,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -4184,15 +5095,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.0.tgz", - "integrity": "sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", + "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.31.0", - "@typescript-eslint/parser": "8.31.0", - "@typescript-eslint/utils": "8.31.0" + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "@typescript-eslint/utils": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4226,6 +5137,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -4278,10 +5199,20 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.3.tgz", - "integrity": "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4655,6 +5586,13 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/yaml": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", @@ -4680,6 +5618,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 01be1ef247..57e0ee0438 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -116,7 +116,7 @@ services: redis: container_name: immich_redis - image: docker.io/valkey/valkey:8-bookworm@sha256:c855f98e09d558a0d7cc1a4e56473231206a4c54c0114ada9c485b47aeb92ec8 + image: docker.io/valkey/valkey:8-bookworm@sha256:4a9f847af90037d59b34cd4d4ad14c6e055f46540cf4ff757aaafb266060fa28 healthcheck: test: redis-cli ping || exit 1 diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index c4fb086a09..978d74defb 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -56,7 +56,7 @@ services: redis: container_name: immich_redis - image: docker.io/valkey/valkey:8-bookworm@sha256:c855f98e09d558a0d7cc1a4e56473231206a4c54c0114ada9c485b47aeb92ec8 + image: docker.io/valkey/valkey:8-bookworm@sha256:4a9f847af90037d59b34cd4d4ad14c6e055f46540cf4ff757aaafb266060fa28 healthcheck: test: redis-cli ping || exit 1 restart: always @@ -90,7 +90,7 @@ services: container_name: immich_prometheus ports: - 9090:9090 - image: prom/prometheus@sha256:339ce86a59413be18d0e445472891d022725b4803fab609069110205e79fb2f1 + image: prom/prometheus@sha256:e2b8aa62b64855956e3ec1e18b4f9387fb6203174a4471936f4662f437f04405 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index b9fa6f8b02..e6150f6938 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -49,7 +49,7 @@ services: redis: container_name: immich_redis - image: docker.io/valkey/valkey:8-bookworm@sha256:c855f98e09d558a0d7cc1a4e56473231206a4c54c0114ada9c485b47aeb92ec8 + image: docker.io/valkey/valkey:8-bookworm@sha256:4a9f847af90037d59b34cd4d4ad14c6e055f46540cf4ff757aaafb266060fa28 healthcheck: test: redis-cli ping || exit 1 restart: always diff --git a/docs/docs/administration/reverse-proxy.md b/docs/docs/administration/reverse-proxy.md index 06fe3ee5bb..742f0e110f 100644 --- a/docs/docs/administration/reverse-proxy.md +++ b/docs/docs/administration/reverse-proxy.md @@ -22,7 +22,7 @@ server { client_max_body_size 50000M; # Set headers - proxy_set_header Host $http_host; + proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; diff --git a/docs/docs/features/libraries.md b/docs/docs/features/libraries.md index 9eb05383b3..9f094509f4 100644 --- a/docs/docs/features/libraries.md +++ b/docs/docs/features/libraries.md @@ -72,7 +72,7 @@ In rare cases, the library watcher can hang, preventing Immich from starting up. ### Nightly job -There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library managment page. +There is an automatic scan job that is scheduled to run once a day. This job also cleans up any libraries stuck in deletion. It is possible to trigger the cleanup by clicking "Scan all libraries" in the library management page. ## Usage diff --git a/docs/docs/features/searching.md b/docs/docs/features/searching.md index 0ee1d01000..f6bfac6e7a 100644 --- a/docs/docs/features/searching.md +++ b/docs/docs/features/searching.md @@ -92,7 +92,7 @@ Memory and execution time estimates were obtained without acceleration on a 7800 **Execution Time (ms)**: After warming up the model with one pass, the mean execution time of 100 passes with the same input. -**Memory (MiB)**: The peak RSS usage of the process afer performing the above timing benchmark. Does not include image decoding, concurrent processing, the web server, etc., which are relatively constant factors. +**Memory (MiB)**: The peak RSS usage of the process after performing the above timing benchmark. Does not include image decoding, concurrent processing, the web server, etc., which are relatively constant factors. **Recall (%)**: Evaluated on Crossmodal-3600, the average of the recall@1, recall@5 and recall@10 results for zeroshot image retrieval. Chinese (Simplified), English, French, German, Italian, Japanese, Korean, Polish, Russian, Spanish and Turkish are additionally tested on XTD-10. Chinese (Simplified) and English are additionally tested on Flickr30k. The recall metrics are the average across all tested datasets. diff --git a/docs/docs/install/docker-compose.mdx b/docs/docs/install/docker-compose.mdx index fe5c043d01..7a0b566f5d 100644 --- a/docs/docs/install/docker-compose.mdx +++ b/docs/docs/install/docker-compose.mdx @@ -2,53 +2,13 @@ sidebar_position: 30 --- -import CodeBlock from '@theme/CodeBlock'; -import ExampleEnv from '!!raw-loader!../../../docker/example.env'; - # Docker Compose [Recommended] Docker Compose is the recommended method to run Immich in production. Below are the steps to deploy Immich with Docker Compose. -## Step 1 - Download the required files +import DockerComposeSteps from '/docs/partials/_docker-compose-install-steps.mdx'; -Create a directory of your choice (e.g. `./immich-app`) to hold the `docker-compose.yml` and `.env` files. - -```bash title="Move to the directory you created" -mkdir ./immich-app -cd ./immich-app -``` - -Download [`docker-compose.yml`][compose-file] and [`example.env`][env-file] by running the following commands: - -```bash title="Get docker-compose.yml file" -wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml -``` - -```bash title="Get .env file" -wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env -``` - -You can alternatively download these two files from your browser and move them to the directory that you created, in which case ensure that you rename `example.env` to `.env`. - -## Step 2 - Populate the .env file with custom values - - - {ExampleEnv} - - -- Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets. It should be a new directory on the server with enough free space. -- Consider changing `DB_PASSWORD` to a custom value. Postgres is not publicly exposed, so this password is only used for local authentication. - To avoid issues with Docker parsing this value, it is best to use only the characters `A-Za-z0-9`. `pwgen` is a handy utility for this. -- Set your timezone by uncommenting the `TZ=` line. -- Populate custom database information if necessary. - -## Step 3 - Start the containers - -From the directory you created in Step 1 (which should now contain your customized `docker-compose.yml` and `.env` files), run the following command to start Immich as a background service: - -```bash title="Start the containers" -docker compose up -d -``` + :::info Docker version If you get an error such as `unknown shorthand flag: 'd' in -d` or `open : permission denied`, you are probably running the wrong Docker version. (This happens, for example, with the docker.io package in Ubuntu 22.04.3 LTS.) You can correct the problem by following the complete [Docker Engine install](https://docs.docker.com/engine/install/) procedure for your distribution, crucially the "Uninstall old versions" and "Install using the apt/rpm repository" sections. These replace the distro's Docker packages with Docker's official ones. @@ -70,6 +30,3 @@ If you get an error `can't set healthcheck.start_interval as feature require Doc ## Next Steps Read the [Post Installation](/docs/install/post-install.mdx) steps and [upgrade instructions](/docs/install/upgrading.md). - -[compose-file]: https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml -[env-file]: https://github.com/immich-app/immich/releases/latest/download/example.env diff --git a/docs/docs/install/environment-variables.md b/docs/docs/install/environment-variables.md index e11547d240..c853a873ab 100644 --- a/docs/docs/install/environment-variables.md +++ b/docs/docs/install/environment-variables.md @@ -80,6 +80,7 @@ Information on the current workers can be found [here](/docs/administration/jobs | `DB_USERNAME` | Database user | `postgres` | server, database\*1 | | `DB_PASSWORD` | Database password | `postgres` | server, database\*1 | | `DB_DATABASE_NAME` | Database name | `immich` | server, database\*1 | +| `DB_SSL_MODE` | Database SSL mode | | server | | `DB_VECTOR_EXTENSION`\*2 | Database vector extension (one of [`pgvector`, `pgvecto.rs`]) | `pgvecto.rs` | server | | `DB_SKIP_MIGRATIONS` | Whether to skip running migrations on startup (one of [`true`, `false`]) | `false` | server | diff --git a/docs/docs/install/synology.md b/docs/docs/install/synology.md index 0ff6a3b85c..e8bca61489 100644 --- a/docs/docs/install/synology.md +++ b/docs/docs/install/synology.md @@ -29,7 +29,7 @@ Download [`docker-compose.yml`](https://github.com/immich-app/immich/releases/la ## Step 2 - Populate the .env file with custom values -Follow [Step 2 in Docker Compose](./docker-compose#step-2---populate-the-env-file-with-custom-values) for instructions on customizing the `.env` file, and then return back to this guide to continue. +Follow [Step 2 in Docker Compose](/docs/install/docker-compose#step-2---populate-the-env-file-with-custom-values) for instructions on customizing the `.env` file, and then return back to this guide to continue. ## Step 3 - Create a new project in Container Manager diff --git a/docs/docs/install/truenas.md b/docs/docs/install/truenas.md index 3cd772de63..bd0dc7af5f 100644 --- a/docs/docs/install/truenas.md +++ b/docs/docs/install/truenas.md @@ -2,7 +2,7 @@ sidebar_position: 80 --- -# TrueNAS SCALE [Community] +# TrueNAS [Community] :::note This is a community contribution and not officially supported by the Immich team, but included here for convenience. @@ -12,17 +12,17 @@ Community support can be found in the dedicated channel on the [Discord Server]( **Please report app issues to the corresponding [Github Repository](https://github.com/truenas/charts/tree/master/community/immich).** ::: -Immich can easily be installed on TrueNAS SCALE via the **Community** train application. -Consider reviewing the TrueNAS [Apps tutorial](https://www.truenas.com/docs/scale/scaletutorials/apps/) if you have not previously configured applications on your system. +Immich can easily be installed on TrueNAS Community Edition via the **Community** train application. +Consider reviewing the TrueNAS [Apps resources](https://apps.truenas.com/getting-started/) if you have not previously configured applications on your system. -TrueNAS SCALE makes installing and updating Immich easy, but you must use the Immich web portal and mobile app to configure accounts and access libraries. +TrueNAS Community Edition makes installing and updating Immich easy, but you must use the Immich web portal and mobile app to configure accounts and access libraries. ## First Steps -The Immich app in TrueNAS SCALE installs, completes the initial configuration, then starts the Immich web portal. -When updates become available, SCALE alerts and provides easy updates. +The Immich app in TrueNAS Community Edition installs, completes the initial configuration, then starts the Immich web portal. +When updates become available, TrueNAS alerts and provides easy updates. -Before installing the Immich app in SCALE, review the [Environment Variables](#environment-variables) documentation to see if you want to configure any during installation. +Before installing the Immich app in TrueNAS, review the [Environment Variables](#environment-variables) documentation to see if you want to configure any during installation. You may also configure environment variables at any time after deploying the application. ### Setting up Storage Datasets @@ -126,9 +126,9 @@ className="border rounded-xl" Accept the default port `30041` in **WebUI Port** or enter a custom port number. :::info Allowed Port Numbers -Only numbers within the range 9000-65535 may be used on SCALE versions below TrueNAS Scale 24.10 Electric Eel. +Only numbers within the range 9000-65535 may be used on TrueNAS versions below TrueNAS Community Edition 24.10 Electric Eel. -Regardless of version, to avoid port conflicts, don't use [ports on this list](https://www.truenas.com/docs/references/defaultports/). +Regardless of version, to avoid port conflicts, don't use [ports on this list](https://www.truenas.com/docs/solutions/optimizations/security/#truenas-default-ports). ::: ### Storage Configuration @@ -173,7 +173,7 @@ className="border rounded-xl" You may configure [External Libraries](/docs/features/libraries) by mounting them using **Additional Storage**. The **Mount Path** is the location you will need to copy and paste into the External Library settings within Immich. -The **Host Path** is the location on the TrueNAS SCALE server where your external library is located. +The **Host Path** is the location on the TrueNAS Community Edition server where your external library is located. @@ -188,17 +188,17 @@ className="border rounded-xl" Accept the default **CPU** limit of `2` threads or specify the number of threads (CPUs with Multi-/Hyper-threading have 2 threads per core). -Accept the default **Memory** limit of `4096` MB or specify the number of MB of RAM. If you're using Machine Learning you should probably set this above 8000 MB. +Specify the **Memory** limit in MB of RAM. Immich recommends at least 6000 MB (6GB). If you selected **Enable Machine Learning** in **Immich Configuration**, you should probably set this above 8000 MB. -:::info Older SCALE Versions -Before TrueNAS SCALE version 24.10 Electric Eel: +:::info Older TrueNAS Versions +Before TrueNAS Community Edition version 24.10 Electric Eel: The **CPU** value was specified in a different format with a default of `4000m` which is 4 threads. The **Memory** value was specified in a different format with a default of `8Gi` which is 8 GiB of RAM. The value was specified in bytes or a number with a measurement suffix. Examples: `129M`, `123Mi`, `1000000000` ::: -Enable **GPU Configuration** options if you have a GPU that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md). More info: [GPU Passthrough Docs for TrueNAS Apps](https://www.truenas.com/docs/truenasapps/#gpu-passthrough) +Enable **GPU Configuration** options if you have a GPU that you will use for [Hardware Transcoding](/docs/features/hardware-transcoding) and/or [Hardware-Accelerated Machine Learning](/docs/features/ml-hardware-acceleration.md). More info: [GPU Passthrough Docs for TrueNAS Apps](https://apps.truenas.com/managing-apps/installing-apps/#gpu-passthrough) ### Install @@ -240,7 +240,7 @@ className="border rounded-xl" /> :::info -Some Environment Variables are not available for the TrueNAS SCALE app. This is mainly because they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings). +Some Environment Variables are not available for the TrueNAS Community Edition app. This is mainly because they can be configured through GUI options in the [Edit Immich screen](#edit-app-settings). Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ`, `IMMICH_LOG_LEVEL`, `DB_PASSWORD`, `REDIS_PASSWORD`. ::: @@ -251,7 +251,7 @@ Some examples are: `IMMICH_VERSION`, `UPLOAD_LOCATION`, `DB_DATA_LOCATION`, `TZ` Make sure to read the general [upgrade instructions](/docs/install/upgrading.md). ::: -When updates become available, SCALE alerts and provides easy updates. +When updates become available, TrueNAS alerts and provides easy updates. To update the app to the latest version: - Go to the **Installed Applications** screen and select Immich from the list of installed applications. diff --git a/docs/docs/overview/comparison.md b/docs/docs/overview/comparison.md index 5d5e68f839..b843562c6e 100644 --- a/docs/docs/overview/comparison.md +++ b/docs/docs/overview/comparison.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 3 --- # Comparison diff --git a/docs/docs/overview/img/social-preview-light.webp b/docs/docs/overview/img/social-preview-light.webp new file mode 100644 index 0000000000..3d088f6522 Binary files /dev/null and b/docs/docs/overview/img/social-preview-light.webp differ diff --git a/docs/docs/overview/quick-start.mdx b/docs/docs/overview/quick-start.mdx index 872c0a42a2..28cee15007 100644 --- a/docs/docs/overview/quick-start.mdx +++ b/docs/docs/overview/quick-start.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 2 --- # Quick start @@ -10,11 +10,20 @@ to install and use it. ## Requirements -Check the [requirements page](/docs/install/requirements) to get started. +- A system with at least 4GB of RAM and 2 CPU cores. +- [Docker](https://docs.docker.com/engine/install/) + +> For a more detailed list of requirements, see the [requirements page](/docs/install/requirements). + +--- ## Set up the server -Follow the [Docker Compose (Recommended)](/docs/install/docker-compose) instructions to install the server. +import DockerComposeSteps from '/docs/partials/_docker-compose-install-steps.mdx'; + + + +--- ## Try the web app @@ -26,6 +35,8 @@ Try uploading a picture from your browser. +--- + ## Try the mobile app ### Download the Mobile App @@ -56,6 +67,8 @@ You can select the **Jobs** tab to see Immich processing your photos. +--- + ## Review the database backup and restore process Immich has built-in database backups. You can refer to the @@ -65,6 +78,8 @@ Immich has built-in database backups. You can refer to the The database only contains metadata and user information. You must setup manual backups of the images and videos stored in `UPLOAD_LOCATION`. ::: +--- + ## Where to go from here? You may decide you'd like to install the server a different way; the Install category on the left menu provides many options. diff --git a/docs/docs/overview/introduction.mdx b/docs/docs/overview/welcome.mdx similarity index 90% rename from docs/docs/overview/introduction.mdx rename to docs/docs/overview/welcome.mdx index e09aac6ebf..93ce705369 100644 --- a/docs/docs/overview/introduction.mdx +++ b/docs/docs/overview/welcome.mdx @@ -2,9 +2,13 @@ sidebar_position: 1 --- -# Introduction +# Welcome to Immich -Immich - Self-hosted photos and videos backup tool +Immich - Self-hosted photos and videos backup tool ## Welcome! diff --git a/docs/docs/partials/_docker-compose-install-steps.mdx b/docs/docs/partials/_docker-compose-install-steps.mdx new file mode 100644 index 0000000000..c538a6051e --- /dev/null +++ b/docs/docs/partials/_docker-compose-install-steps.mdx @@ -0,0 +1,43 @@ +import CodeBlock from '@theme/CodeBlock'; +import ExampleEnv from '!!raw-loader!../../../docker/example.env'; + +### Step 1 - Download the required files + +Create a directory of your choice (e.g. `./immich-app`) to hold the `docker-compose.yml` and `.env` files. + +```bash title="Move to the directory you created" +mkdir ./immich-app +cd ./immich-app +``` + +Download [`docker-compose.yml`](https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml) and [`example.env`](https://github.com/immich-app/immich/releases/latest/download/example.env) by running the following commands: + +```bash title="Get docker-compose.yml file" +wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml +``` + +```bash title="Get .env file" +wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env +``` + +You can alternatively download these two files from your browser and move them to the directory that you created, in which case ensure that you rename `example.env` to `.env`. + +### Step 2 - Populate the .env file with custom values + + + {ExampleEnv} + + +- Populate `UPLOAD_LOCATION` with your preferred location for storing backup assets. It should be a new directory on the server with enough free space. +- Consider changing `DB_PASSWORD` to a custom value. Postgres is not publicly exposed, so this password is only used for local authentication. + To avoid issues with Docker parsing this value, it is best to use only the characters `A-Za-z0-9`. `pwgen` is a handy utility for this. +- Set your timezone by uncommenting the `TZ=` line. +- Populate custom database information if necessary. + +### Step 3 - Start the containers + +From the directory you created in Step 1 (which should now contain your customized `docker-compose.yml` and `.env` files), run the following command to start Immich as a background service: + +```bash title="Start the containers" +docker compose up -d +``` diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 7166611a2e..d612dda253 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -95,7 +95,7 @@ const config = { position: 'right', }, { - to: '/docs/overview/introduction', + to: '/docs/overview/welcome', position: 'right', label: 'Docs', }, @@ -124,6 +124,12 @@ const config = { label: 'Discord', position: 'right', }, + { + type: 'html', + position: 'right', + value: + '', + }, ], }, footer: { @@ -134,7 +140,7 @@ const config = { items: [ { label: 'Welcome', - to: '/docs/overview/introduction', + to: '/docs/overview/welcome', }, { label: 'Installation', diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index fd3f199ce8..7f8c6d5761 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -7,14 +7,22 @@ @tailwind components; @tailwind utilities; -@import url('https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); - -body { - font-family: 'Be Vietnam Pro', serif; - font-optical-sizing: auto; - /* font-size: 1.125rem; +@font-face { + font-family: 'Overpass'; + src: url('/fonts/overpass/Overpass.ttf') format('truetype-variations'); + font-weight: 1 999; + font-style: normal; ascent-override: 106.25%; - size-adjust: 106.25%; */ + size-adjust: 106.25%; +} + +@font-face { + font-family: 'Overpass Mono'; + src: url('/fonts/overpass/OverpassMono.ttf') format('truetype-variations'); + font-weight: 1 999; + font-style: normal; + ascent-override: 106.25%; + size-adjust: 106.25%; } .breadcrumbs__link { @@ -29,6 +37,7 @@ img { /* You can override the default Infima variables here. */ :root { + font-family: 'Overpass', sans-serif; --ifm-color-primary: #4250af; --ifm-color-primary-dark: #4250af; --ifm-color-primary-darker: #4250af; @@ -59,14 +68,12 @@ div[class^='announcementBar_'] { } .menu__link { - padding: 10px; - padding-left: 16px; + padding: 10px 10px 10px 16px; border-radius: 24px; margin-right: 16px; } .menu__list-item-collapsible { - border-radius: 10px; margin-right: 16px; border-radius: 24px; } @@ -83,3 +90,12 @@ div[class*='navbar__items'] > li:has(a[class*='version-switcher-34ab39']) { code { font-weight: 600; } + +.buy-button { + padding: 8px 14px; + border: 1px solid transparent; + font-family: 'Overpass', sans-serif; + font-weight: 500; + cursor: pointer; + box-shadow: 0 0 5px 2px rgba(181, 206, 254, 0.4); +} diff --git a/docs/src/pages/cursed-knowledge.tsx b/docs/src/pages/cursed-knowledge.tsx index 1e5c724d16..6a0981a596 100644 --- a/docs/src/pages/cursed-knowledge.tsx +++ b/docs/src/pages/cursed-knowledge.tsx @@ -2,6 +2,7 @@ import { mdiBug, mdiCalendarToday, mdiCrosshairsOff, + mdiCrop, mdiDatabase, mdiLeadPencil, mdiLockOff, @@ -22,6 +23,18 @@ const withLanguage = (date: Date) => (language: string) => date.toLocaleDateStri type Item = Omit & { date: Date }; const items: Item[] = [ + { + icon: mdiCrop, + iconColor: 'tomato', + title: 'Image dimensions in EXIF metadata are cursed', + description: + 'The dimensions in EXIF metadata can be different from the actual dimensions of the image, causing issues with cropping and resizing.', + link: { + url: 'https://github.com/immich-app/immich/pull/17974', + text: '#17974', + }, + date: new Date(2025, 5, 5), + }, { icon: mdiMicrosoftWindows, iconColor: '#357EC7', diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index db299271aa..277a1d0b46 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -4,7 +4,7 @@ import Layout from '@theme/Layout'; import { discordPath, discordViewBox } from '@site/src/components/svg-paths'; import ThemedImage from '@theme/ThemedImage'; import Icon from '@mdi/react'; -import { mdiAndroid } from '@mdi/js'; + function HomepageHeader() { return (
@@ -13,11 +13,14 @@ function HomepageHeader() {
- + + + +

Self-hosted{' '} @@ -28,7 +31,7 @@ function HomepageHeader() { solution

-

+

Easily back up, organize, and manage your photos on your own server. Immich helps you browse, search and organize your photos and videos with ease, without sacrificing your privacy. @@ -36,27 +39,21 @@ function HomepageHeader() {

- Get started + Get Started - Demo - - - - Buy Merch + Open Demo
-
+ +

This project is available under GNU AGPL v3 license.

-

Privacy should not be a luxury

+

Privacy should not be a luxury

); diff --git a/docs/src/pages/privacy-policy.tsx b/docs/src/pages/privacy-policy.tsx index 7bc113c0fc..36ac76945d 100644 --- a/docs/src/pages/privacy-policy.tsx +++ b/docs/src/pages/privacy-policy.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import Link from '@docusaurus/Link'; import Layout from '@theme/Layout'; function HomepageHeader() { return ( diff --git a/docs/static/_redirects b/docs/static/_redirects index 889b4e6961..6683c78077 100644 --- a/docs/static/_redirects +++ b/docs/static/_redirects @@ -30,3 +30,4 @@ /docs/guides/api-album-sync /docs/community-projects 307 /docs/guides/remove-offline-files /docs/community-projects 307 /milestones /roadmap 307 +/docs/overview/introduction /docs/overview/welcome 307 \ No newline at end of file diff --git a/docs/static/archived-versions.json b/docs/static/archived-versions.json index 1e45c7a696..aefd29ebb5 100644 --- a/docs/static/archived-versions.json +++ b/docs/static/archived-versions.json @@ -3,50 +3,14 @@ "label": "v1.132.3", "url": "https://v1.132.3.archive.immich.app" }, - { - "label": "v1.132.2", - "url": "https://v1.132.2.archive.immich.app" - }, - { - "label": "v1.132.1", - "url": "https://v1.132.1.archive.immich.app" - }, - { - "label": "v1.132.0", - "url": "https://v1.132.0.archive.immich.app" - }, { "label": "v1.131.3", "url": "https://v1.131.3.archive.immich.app" }, - { - "label": "v1.131.2", - "url": "https://v1.131.2.archive.immich.app" - }, - { - "label": "v1.131.1", - "url": "https://v1.131.1.archive.immich.app" - }, - { - "label": "v1.131.0", - "url": "https://v1.131.0.archive.immich.app" - }, { "label": "v1.130.3", "url": "https://v1.130.3.archive.immich.app" }, - { - "label": "v1.130.2", - "url": "https://v1.130.2.archive.immich.app" - }, - { - "label": "v1.130.1", - "url": "https://v1.130.1.archive.immich.app" - }, - { - "label": "v1.130.0", - "url": "https://v1.130.0.archive.immich.app" - }, { "label": "v1.129.0", "url": "https://v1.129.0.archive.immich.app" @@ -63,46 +27,14 @@ "label": "v1.126.1", "url": "https://v1.126.1.archive.immich.app" }, - { - "label": "v1.126.0", - "url": "https://v1.126.0.archive.immich.app" - }, { "label": "v1.125.7", "url": "https://v1.125.7.archive.immich.app" }, - { - "label": "v1.125.6", - "url": "https://v1.125.6.archive.immich.app" - }, - { - "label": "v1.125.5", - "url": "https://v1.125.5.archive.immich.app" - }, - { - "label": "v1.125.3", - "url": "https://v1.125.3.archive.immich.app" - }, - { - "label": "v1.125.2", - "url": "https://v1.125.2.archive.immich.app" - }, - { - "label": "v1.125.1", - "url": "https://v1.125.1.archive.immich.app" - }, { "label": "v1.124.2", "url": "https://v1.124.2.archive.immich.app" }, - { - "label": "v1.124.1", - "url": "https://v1.124.1.archive.immich.app" - }, - { - "label": "v1.124.0", - "url": "https://v1.124.0.archive.immich.app" - }, { "label": "v1.123.0", "url": "https://v1.123.0.archive.immich.app" @@ -111,18 +43,6 @@ "label": "v1.122.3", "url": "https://v1.122.3.archive.immich.app" }, - { - "label": "v1.122.2", - "url": "https://v1.122.2.archive.immich.app" - }, - { - "label": "v1.122.1", - "url": "https://v1.122.1.archive.immich.app" - }, - { - "label": "v1.122.0", - "url": "https://v1.122.0.archive.immich.app" - }, { "label": "v1.121.0", "url": "https://v1.121.0.archive.immich.app" @@ -131,34 +51,14 @@ "label": "v1.120.2", "url": "https://v1.120.2.archive.immich.app" }, - { - "label": "v1.120.1", - "url": "https://v1.120.1.archive.immich.app" - }, - { - "label": "v1.120.0", - "url": "https://v1.120.0.archive.immich.app" - }, { "label": "v1.119.1", "url": "https://v1.119.1.archive.immich.app" }, - { - "label": "v1.119.0", - "url": "https://v1.119.0.archive.immich.app" - }, { "label": "v1.118.2", "url": "https://v1.118.2.archive.immich.app" }, - { - "label": "v1.118.1", - "url": "https://v1.118.1.archive.immich.app" - }, - { - "label": "v1.118.0", - "url": "https://v1.118.0.archive.immich.app" - }, { "label": "v1.117.0", "url": "https://v1.117.0.archive.immich.app" @@ -167,14 +67,6 @@ "label": "v1.116.2", "url": "https://v1.116.2.archive.immich.app" }, - { - "label": "v1.116.1", - "url": "https://v1.116.1.archive.immich.app" - }, - { - "label": "v1.116.0", - "url": "https://v1.116.0.archive.immich.app" - }, { "label": "v1.115.0", "url": "https://v1.115.0.archive.immich.app" @@ -187,18 +79,10 @@ "label": "v1.113.1", "url": "https://v1.113.1.archive.immich.app" }, - { - "label": "v1.113.0", - "url": "https://v1.113.0.archive.immich.app" - }, { "label": "v1.112.1", "url": "https://v1.112.1.archive.immich.app" }, - { - "label": "v1.112.0", - "url": "https://v1.112.0.archive.immich.app" - }, { "label": "v1.111.0", "url": "https://v1.111.0.archive.immich.app" @@ -211,14 +95,6 @@ "label": "v1.109.2", "url": "https://v1.109.2.archive.immich.app" }, - { - "label": "v1.109.1", - "url": "https://v1.109.1.archive.immich.app" - }, - { - "label": "v1.109.0", - "url": "https://v1.109.0.archive.immich.app" - }, { "label": "v1.108.0", "url": "https://v1.108.0.archive.immich.app" @@ -227,38 +103,14 @@ "label": "v1.107.2", "url": "https://v1.107.2.archive.immich.app" }, - { - "label": "v1.107.1", - "url": "https://v1.107.1.archive.immich.app" - }, - { - "label": "v1.107.0", - "url": "https://v1.107.0.archive.immich.app" - }, { "label": "v1.106.4", "url": "https://v1.106.4.archive.immich.app" }, - { - "label": "v1.106.3", - "url": "https://v1.106.3.archive.immich.app" - }, - { - "label": "v1.106.2", - "url": "https://v1.106.2.archive.immich.app" - }, - { - "label": "v1.106.1", - "url": "https://v1.106.1.archive.immich.app" - }, { "label": "v1.105.1", "url": "https://v1.105.1.archive.immich.app" }, - { - "label": "v1.105.0", - "url": "https://v1.105.0.archive.immich.app" - }, { "label": "v1.104.0", "url": "https://v1.104.0.archive.immich.app" @@ -267,26 +119,10 @@ "label": "v1.103.1", "url": "https://v1.103.1.archive.immich.app" }, - { - "label": "v1.103.0", - "url": "https://v1.103.0.archive.immich.app" - }, { "label": "v1.102.3", "url": "https://v1.102.3.archive.immich.app" }, - { - "label": "v1.102.2", - "url": "https://v1.102.2.archive.immich.app" - }, - { - "label": "v1.102.1", - "url": "https://v1.102.1.archive.immich.app" - }, - { - "label": "v1.102.0", - "url": "https://v1.102.0.archive.immich.app" - }, { "label": "v1.101.0", "url": "https://v1.101.0.archive.immich.app" diff --git a/docs/static/fonts/overpass/Overpass-Italic.ttf b/docs/static/fonts/overpass/Overpass-Italic.ttf new file mode 100644 index 0000000000..281dd742bb Binary files /dev/null and b/docs/static/fonts/overpass/Overpass-Italic.ttf differ diff --git a/docs/static/fonts/overpass/Overpass.ttf b/docs/static/fonts/overpass/Overpass.ttf new file mode 100644 index 0000000000..1cf730a5ad Binary files /dev/null and b/docs/static/fonts/overpass/Overpass.ttf differ diff --git a/docs/static/fonts/overpass/OverpassMono.ttf b/docs/static/fonts/overpass/OverpassMono.ttf new file mode 100644 index 0000000000..71ef818b33 Binary files /dev/null and b/docs/static/fonts/overpass/OverpassMono.ttf differ diff --git a/docs/static/img/logomark-dark-with-futo.svg b/docs/static/img/logomark-dark-with-futo.svg new file mode 100644 index 0000000000..5672d0f7fe --- /dev/null +++ b/docs/static/img/logomark-dark-with-futo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/logomark-light-with-futo.svg b/docs/static/img/logomark-light-with-futo.svg new file mode 100644 index 0000000000..9fa1ce3605 --- /dev/null +++ b/docs/static/img/logomark-light-with-futo.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/e2e/package-lock.json b/e2e/package-lock.json index a61324beff..2dc3923480 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -736,9 +736,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", - "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, "license": "MIT", "engines": { @@ -999,6 +999,28 @@ "semver": "bin/semver.js" } }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", + "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1683,17 +1705,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.0.tgz", - "integrity": "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", + "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/type-utils": "8.31.0", - "@typescript-eslint/utils": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/type-utils": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1713,16 +1735,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.0.tgz", - "integrity": "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", + "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4" }, "engines": { @@ -1738,14 +1760,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", - "integrity": "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", + "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0" + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1756,14 +1778,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.0.tgz", - "integrity": "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", + "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/utils": "8.31.0", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/utils": "8.31.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -1780,9 +1802,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", - "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", + "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", "dev": true, "license": "MIT", "engines": { @@ -1794,14 +1816,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", - "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", + "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1847,16 +1869,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.0.tgz", - "integrity": "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", + "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0" + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1871,13 +1893,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", - "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", + "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/types": "8.31.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2207,6 +2229,75 @@ "node": ">=14" } }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/body-parser/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2596,6 +2687,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/cookiejar": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", @@ -2631,6 +2742,20 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3009,9 +3134,9 @@ } }, "node_modules/eslint": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", - "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3021,11 +3146,12 @@ "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.25.1", + "@eslint/js": "9.26.0", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -3049,7 +3175,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" @@ -3083,9 +3210,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.3.1.tgz", + "integrity": "sha512-vad9VWgEm9xaVXRNmb4aeOt0PWDc61IAdzghkbYQ2wavgax148iKoX1rNJcgkBGCipzLzOnHYVgL7xudM9yccQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3277,6 +3404,39 @@ "url": "https://github.com/eta-dev/eta?sponsor=1" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/exiftool-vendored": { "version": "28.8.0", "resolved": "https://registry.npmjs.org/exiftool-vendored/-/exiftool-vendored-28.8.0.tgz", @@ -3327,6 +3487,170 @@ "node": ">=12.0.0" } }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3428,6 +3752,34 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3537,6 +3889,16 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4160,6 +4522,16 @@ "dev": true, "license": "ISC" }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-builtin-module": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-4.0.0.tgz", @@ -4238,6 +4610,13 @@ "node": ">=0.12.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4646,6 +5025,19 @@ "node": ">= 0.6" } }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5222,14 +5614,14 @@ } }, "node_modules/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-EpAhHFQc+aH9VfeffWIVC+XXk6lmAhS9W1FxtxcPXs94yxhrI1I6w/zkWfIOII/OkBv3Be04X3xMOj0kQ78l6w==", + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==", "dev": true, "license": "MIT", "dependencies": { "pg-connection-string": "^2.8.5", - "pg-pool": "^3.9.5", + "pg-pool": "^3.9.6", "pg-protocol": "^1.9.5", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -5410,6 +5802,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/playwright": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", @@ -5616,6 +6018,20 @@ } } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5676,6 +6092,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/raw-body": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", @@ -5904,6 +6330,33 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5987,6 +6440,98 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6747,15 +7292,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.0.tgz", - "integrity": "sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", + "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.31.0", - "@typescript-eslint/parser": "8.31.0", - "@typescript-eslint/utils": "8.31.0" + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "@typescript-eslint/utils": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7383,6 +7928,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/e2e/src/api/specs/activity.e2e-spec.ts b/e2e/src/api/specs/activity.e2e-spec.ts index ee75d6070b..70c32313f1 100644 --- a/e2e/src/api/specs/activity.e2e-spec.ts +++ b/e2e/src/api/specs/activity.e2e-spec.ts @@ -46,38 +46,6 @@ describe('/activities', () => { }); describe('GET /activities', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/activities'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should require an albumId', async () => { - const { status, body } = await request(app) - .get('/activities') - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID']))); - }); - - it('should reject an invalid albumId', async () => { - const { status, body } = await request(app) - .get('/activities') - .query({ albumId: uuidDto.invalid }) - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID']))); - }); - - it('should reject an invalid assetId', async () => { - const { status, body } = await request(app) - .get('/activities') - .query({ albumId: uuidDto.notFound, assetId: uuidDto.invalid }) - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['assetId must be a UUID']))); - }); - it('should start off empty', async () => { const { status, body } = await request(app) .get('/activities') @@ -192,30 +160,6 @@ describe('/activities', () => { }); describe('POST /activities', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).post('/activities'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should require an albumId', async () => { - const { status, body } = await request(app) - .post('/activities') - .set('Authorization', `Bearer ${admin.accessToken}`) - .send({ albumId: uuidDto.invalid }); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest(expect.arrayContaining(['albumId must be a UUID']))); - }); - - it('should require a comment when type is comment', async () => { - const { status, body } = await request(app) - .post('/activities') - .set('Authorization', `Bearer ${admin.accessToken}`) - .send({ albumId: uuidDto.notFound, type: 'comment', comment: null }); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest(['comment must be a string', 'comment should not be empty'])); - }); - it('should add a comment to an album', async () => { const { status, body } = await request(app) .post('/activities') @@ -330,20 +274,6 @@ describe('/activities', () => { }); describe('DELETE /activities/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).delete(`/activities/${uuidDto.notFound}`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should require a valid uuid', async () => { - const { status, body } = await request(app) - .delete(`/activities/${uuidDto.invalid}`) - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); - }); - it('should remove a comment from an album', async () => { const reaction = await createActivity({ albumId: album.id, diff --git a/e2e/src/api/specs/album.e2e-spec.ts b/e2e/src/api/specs/album.e2e-spec.ts index cede49f469..65a94122fa 100644 --- a/e2e/src/api/specs/album.e2e-spec.ts +++ b/e2e/src/api/specs/album.e2e-spec.ts @@ -9,7 +9,7 @@ import { LoginResponseDto, SharedLinkType, } from '@immich/sdk'; -import { createUserDto, uuidDto } from 'src/fixtures'; +import { createUserDto } from 'src/fixtures'; import { errorDto } from 'src/responses'; import { app, asBearerAuth, utils } from 'src/utils'; import request from 'supertest'; @@ -128,28 +128,6 @@ describe('/albums', () => { }); describe('GET /albums', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/albums'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should reject an invalid shared param', async () => { - const { status, body } = await request(app) - .get('/albums?shared=invalid') - .set('Authorization', `Bearer ${user1.accessToken}`); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest(['shared must be a boolean value'])); - }); - - it('should reject an invalid assetId param', async () => { - const { status, body } = await request(app) - .get('/albums?assetId=invalid') - .set('Authorization', `Bearer ${user1.accessToken}`); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest(['assetId must be a UUID'])); - }); - it("should not show other users' favorites", async () => { const { status, body } = await request(app) .get(`/albums/${user1Albums[0].id}?withoutAssets=false`) @@ -323,12 +301,6 @@ describe('/albums', () => { }); describe('GET /albums/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get(`/albums/${user1Albums[0].id}`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should return album info for own album', async () => { const { status, body } = await request(app) .get(`/albums/${user1Albums[0].id}?withoutAssets=false`) @@ -421,12 +393,6 @@ describe('/albums', () => { }); describe('GET /albums/statistics', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/albums/statistics'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should return total count of albums the user has access to', async () => { const { status, body } = await request(app) .get('/albums/statistics') @@ -438,12 +404,6 @@ describe('/albums', () => { }); describe('POST /albums', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).post('/albums').send({ albumName: 'New album' }); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should create an album', async () => { const { status, body } = await request(app) .post('/albums') @@ -471,12 +431,6 @@ describe('/albums', () => { }); describe('PUT /albums/:id/assets', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/assets`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should be able to add own asset to own album', async () => { const asset = await utils.createAsset(user1.accessToken); const { status, body } = await request(app) @@ -526,14 +480,6 @@ describe('/albums', () => { }); describe('PATCH /albums/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app) - .patch(`/albums/${uuidDto.notFound}`) - .send({ albumName: 'New album name' }); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should update an album', async () => { const album = await utils.createAlbum(user1.accessToken, { albumName: 'New album', @@ -576,15 +522,6 @@ describe('/albums', () => { }); describe('DELETE /albums/:id/assets', () => { - it('should require authentication', async () => { - const { status, body } = await request(app) - .delete(`/albums/${user1Albums[0].id}/assets`) - .send({ ids: [user1Asset1.id] }); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should require authorization', async () => { const { status, body } = await request(app) .delete(`/albums/${user1Albums[1].id}/assets`) @@ -679,13 +616,6 @@ describe('/albums', () => { }); }); - it('should require authentication', async () => { - const { status, body } = await request(app).put(`/albums/${user1Albums[0].id}/users`).send({ sharedUserIds: [] }); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should be able to add user to own album', async () => { const { status, body } = await request(app) .put(`/albums/${album.id}/users`) diff --git a/e2e/src/api/specs/api-key.e2e-spec.ts b/e2e/src/api/specs/api-key.e2e-spec.ts index 1748276625..e86edddcdf 100644 --- a/e2e/src/api/specs/api-key.e2e-spec.ts +++ b/e2e/src/api/specs/api-key.e2e-spec.ts @@ -1,5 +1,5 @@ import { LoginResponseDto, Permission, createApiKey } from '@immich/sdk'; -import { createUserDto, uuidDto } from 'src/fixtures'; +import { createUserDto } from 'src/fixtures'; import { errorDto } from 'src/responses'; import { app, asBearerAuth, utils } from 'src/utils'; import request from 'supertest'; @@ -24,12 +24,6 @@ describe('/api-keys', () => { }); describe('POST /api-keys', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).post('/api-keys').send({ name: 'API Key' }); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should not work without permission', async () => { const { secret } = await create(user.accessToken, [Permission.ApiKeyRead]); const { status, body } = await request(app).post('/api-keys').set('x-api-key', secret).send({ name: 'API Key' }); @@ -99,12 +93,6 @@ describe('/api-keys', () => { }); describe('GET /api-keys', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/api-keys'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should start off empty', async () => { const { status, body } = await request(app).get('/api-keys').set('Authorization', `Bearer ${admin.accessToken}`); expect(body).toEqual([]); @@ -125,12 +113,6 @@ describe('/api-keys', () => { }); describe('GET /api-keys/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get(`/api-keys/${uuidDto.notFound}`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should require authorization', async () => { const { apiKey } = await create(user.accessToken, [Permission.All]); const { status, body } = await request(app) @@ -140,14 +122,6 @@ describe('/api-keys', () => { expect(body).toEqual(errorDto.badRequest('API Key not found')); }); - it('should require a valid uuid', async () => { - const { status, body } = await request(app) - .get(`/api-keys/${uuidDto.invalid}`) - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); - }); - it('should get api key details', async () => { const { apiKey } = await create(user.accessToken, [Permission.All]); const { status, body } = await request(app) @@ -165,12 +139,6 @@ describe('/api-keys', () => { }); describe('PUT /api-keys/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).put(`/api-keys/${uuidDto.notFound}`).send({ name: 'new name' }); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should require authorization', async () => { const { apiKey } = await create(user.accessToken, [Permission.All]); const { status, body } = await request(app) @@ -181,15 +149,6 @@ describe('/api-keys', () => { expect(body).toEqual(errorDto.badRequest('API Key not found')); }); - it('should require a valid uuid', async () => { - const { status, body } = await request(app) - .put(`/api-keys/${uuidDto.invalid}`) - .send({ name: 'new name' }) - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); - }); - it('should update api key details', async () => { const { apiKey } = await create(user.accessToken, [Permission.All]); const { status, body } = await request(app) @@ -208,12 +167,6 @@ describe('/api-keys', () => { }); describe('DELETE /api-keys/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).delete(`/api-keys/${uuidDto.notFound}`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should require authorization', async () => { const { apiKey } = await create(user.accessToken, [Permission.All]); const { status, body } = await request(app) @@ -223,14 +176,6 @@ describe('/api-keys', () => { expect(body).toEqual(errorDto.badRequest('API Key not found')); }); - it('should require a valid uuid', async () => { - const { status, body } = await request(app) - .delete(`/api-keys/${uuidDto.invalid}`) - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); - }); - it('should delete an api key', async () => { const { apiKey } = await create(user.accessToken, [Permission.All]); const { status } = await request(app) diff --git a/e2e/src/api/specs/asset.e2e-spec.ts b/e2e/src/api/specs/asset.e2e-spec.ts index 01129b3299..8c203860df 100644 --- a/e2e/src/api/specs/asset.e2e-spec.ts +++ b/e2e/src/api/specs/asset.e2e-spec.ts @@ -3,6 +3,7 @@ import { AssetMediaStatus, AssetResponseDto, AssetTypeEnum, + AssetVisibility, getAssetInfo, getMyUser, LoginResponseDto, @@ -22,27 +23,9 @@ import { app, asBearerAuth, tempDir, TEN_TIMES, testAssetDir, utils } from 'src/ import request from 'supertest'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; -const makeUploadDto = (options?: { omit: string }): Record => { - const dto: Record = { - deviceAssetId: 'example-image', - deviceId: 'TEST', - fileCreatedAt: new Date().toISOString(), - fileModifiedAt: new Date().toISOString(), - isFavorite: 'testing', - duration: '0:00:00.000000', - }; - - const omit = options?.omit; - if (omit) { - delete dto[omit]; - } - - return dto; -}; - const locationAssetFilepath = `${testAssetDir}/metadata/gps-position/thompson-springs.jpg`; const ratingAssetFilepath = `${testAssetDir}/metadata/rating/mongolels.jpg`; -const facesAssetFilepath = `${testAssetDir}/metadata/faces/portrait.jpg`; +const facesAssetDir = `${testAssetDir}/metadata/faces`; const readTags = async (bytes: Buffer, filename: string) => { const filepath = join(tempDir, filename); @@ -137,9 +120,9 @@ describe('/asset', () => { // stats utils.createAsset(statsUser.accessToken), utils.createAsset(statsUser.accessToken, { isFavorite: true }), - utils.createAsset(statsUser.accessToken, { isArchived: true }), + utils.createAsset(statsUser.accessToken, { visibility: AssetVisibility.Archive }), utils.createAsset(statsUser.accessToken, { - isArchived: true, + visibility: AssetVisibility.Archive, isFavorite: true, assetData: { filename: 'example.mp4' }, }), @@ -160,13 +143,6 @@ describe('/asset', () => { }); describe('GET /assets/:id/original', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get(`/assets/${uuidDto.notFound}/original`); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should download the file', async () => { const response = await request(app) .get(`/assets/${user1Assets[0].id}/original`) @@ -178,20 +154,6 @@ describe('/asset', () => { }); describe('GET /assets/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get(`/assets/${uuidDto.notFound}`); - expect(body).toEqual(errorDto.unauthorized); - expect(status).toBe(401); - }); - - it('should require a valid id', async () => { - const { status, body } = await request(app) - .get(`/assets/${uuidDto.invalid}`) - .set('Authorization', `Bearer ${user1.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); - }); - it('should require access', async () => { const { status, body } = await request(app) .get(`/assets/${user2Assets[0].id}`) @@ -224,27 +186,19 @@ describe('/asset', () => { }); }); - it('should get the asset faces', async () => { - const config = await utils.getSystemConfig(admin.accessToken); - config.metadata.faces.import = true; - await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) }); - - // asset faces - const facesAsset = await utils.createAsset(admin.accessToken, { - assetData: { + describe('faces', () => { + const metadataFaceTests = [ + { + description: 'without orientation', filename: 'portrait.jpg', - bytes: await readFile(facesAssetFilepath), }, - }); - - await utils.waitForWebsocketEvent({ event: 'assetUpload', id: facesAsset.id }); - - const { status, body } = await request(app) - .get(`/assets/${facesAsset.id}`) - .set('Authorization', `Bearer ${admin.accessToken}`); - expect(status).toBe(200); - expect(body.id).toEqual(facesAsset.id); - expect(body.people).toMatchObject([ + { + description: 'adjusting face regions to orientation', + filename: 'portrait-orientation-6.jpg', + }, + ]; + // should produce same resulting face region coordinates for any orientation + const expectedFaces = [ { name: 'Marie Curie', birthDate: null, @@ -279,7 +233,30 @@ describe('/asset', () => { }, ], }, - ]); + ]; + + it.each(metadataFaceTests)('should get the asset faces from $filename $description', async ({ filename }) => { + const config = await utils.getSystemConfig(admin.accessToken); + config.metadata.faces.import = true; + await updateConfig({ systemConfigDto: config }, { headers: asBearerAuth(admin.accessToken) }); + + const facesAsset = await utils.createAsset(admin.accessToken, { + assetData: { + filename, + bytes: await readFile(`${facesAssetDir}/${filename}`), + }, + }); + + await utils.waitForWebsocketEvent({ event: 'assetUpload', id: facesAsset.id }); + + const { status, body } = await request(app) + .get(`/assets/${facesAsset.id}`) + .set('Authorization', `Bearer ${admin.accessToken}`); + + expect(status).toBe(200); + expect(body.id).toEqual(facesAsset.id); + expect(body.people).toMatchObject(expectedFaces); + }); }); it('should work with a shared link', async () => { @@ -333,7 +310,7 @@ describe('/asset', () => { }); it('disallows viewing archived assets', async () => { - const asset = await utils.createAsset(user1.accessToken, { isArchived: true }); + const asset = await utils.createAsset(user1.accessToken, { visibility: AssetVisibility.Archive }); const { status } = await request(app) .get(`/assets/${asset.id}`) @@ -354,13 +331,6 @@ describe('/asset', () => { }); describe('GET /assets/statistics', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/assets/statistics'); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should return stats of all assets', async () => { const { status, body } = await request(app) .get('/assets/statistics') @@ -384,7 +354,7 @@ describe('/asset', () => { const { status, body } = await request(app) .get('/assets/statistics') .set('Authorization', `Bearer ${statsUser.accessToken}`) - .query({ isArchived: true }); + .query({ visibility: AssetVisibility.Archive }); expect(status).toBe(200); expect(body).toEqual({ images: 1, videos: 1, total: 2 }); @@ -394,7 +364,7 @@ describe('/asset', () => { const { status, body } = await request(app) .get('/assets/statistics') .set('Authorization', `Bearer ${statsUser.accessToken}`) - .query({ isFavorite: true, isArchived: true }); + .query({ isFavorite: true, visibility: AssetVisibility.Archive }); expect(status).toBe(200); expect(body).toEqual({ images: 0, videos: 1, total: 1 }); @@ -404,7 +374,7 @@ describe('/asset', () => { const { status, body } = await request(app) .get('/assets/statistics') .set('Authorization', `Bearer ${statsUser.accessToken}`) - .query({ isFavorite: false, isArchived: false }); + .query({ isFavorite: false, visibility: AssetVisibility.Timeline }); expect(status).toBe(200); expect(body).toEqual({ images: 1, videos: 0, total: 1 }); @@ -425,13 +395,6 @@ describe('/asset', () => { await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration'); }); - it('should require authentication', async () => { - const { status, body } = await request(app).get('/assets/random'); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it.each(TEN_TIMES)('should return 1 random assets', async () => { const { status, body } = await request(app) .get('/assets/random') @@ -467,31 +430,9 @@ describe('/asset', () => { expect(status).toBe(200); expect(body).toEqual([expect.objectContaining({ id: user2Assets[0].id })]); }); - - it('should return error', async () => { - const { status } = await request(app) - .get('/assets/random?count=ABC') - .set('Authorization', `Bearer ${user1.accessToken}`); - - expect(status).toBe(400); - }); }); describe('PUT /assets/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).put(`/assets/:${uuidDto.notFound}`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should require a valid id', async () => { - const { status, body } = await request(app) - .put(`/assets/${uuidDto.invalid}`) - .set('Authorization', `Bearer ${user1.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(['id must be a UUID'])); - }); - it('should require access', async () => { const { status, body } = await request(app) .put(`/assets/${user2Assets[0].id}`) @@ -519,7 +460,7 @@ describe('/asset', () => { const { status, body } = await request(app) .put(`/assets/${user1Assets[0].id}`) .set('Authorization', `Bearer ${user1.accessToken}`) - .send({ isArchived: true }); + .send({ visibility: AssetVisibility.Archive }); expect(body).toMatchObject({ id: user1Assets[0].id, isArchived: true }); expect(status).toEqual(200); }); @@ -619,28 +560,6 @@ describe('/asset', () => { expect(status).toEqual(200); }); - it('should reject invalid gps coordinates', async () => { - for (const test of [ - { latitude: 12 }, - { longitude: 12 }, - { latitude: 12, longitude: 'abc' }, - { latitude: 'abc', longitude: 12 }, - { latitude: null, longitude: 12 }, - { latitude: 12, longitude: null }, - { latitude: 91, longitude: 12 }, - { latitude: -91, longitude: 12 }, - { latitude: 12, longitude: -181 }, - { latitude: 12, longitude: 181 }, - ]) { - const { status, body } = await request(app) - .put(`/assets/${user1Assets[0].id}`) - .send(test) - .set('Authorization', `Bearer ${user1.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest()); - } - }); - it('should update gps data', async () => { const { status, body } = await request(app) .put(`/assets/${user1Assets[0].id}`) @@ -712,17 +631,6 @@ describe('/asset', () => { expect(status).toEqual(200); }); - it('should reject invalid rating', async () => { - for (const test of [{ rating: 7 }, { rating: 3.5 }, { rating: null }]) { - const { status, body } = await request(app) - .put(`/assets/${user1Assets[0].id}`) - .send(test) - .set('Authorization', `Bearer ${user1.accessToken}`); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest()); - } - }); - it('should return tagged people', async () => { const { status, body } = await request(app) .put(`/assets/${user1Assets[0].id}`) @@ -746,25 +654,6 @@ describe('/asset', () => { }); describe('DELETE /assets', () => { - it('should require authentication', async () => { - const { status, body } = await request(app) - .delete(`/assets`) - .send({ ids: [uuidDto.notFound] }); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should require a valid uuid', async () => { - const { status, body } = await request(app) - .delete(`/assets`) - .send({ ids: [uuidDto.invalid] }) - .set('Authorization', `Bearer ${admin.accessToken}`); - - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(['each value in ids must be a UUID'])); - }); - it('should throw an error when the id is not found', async () => { const { status, body } = await request(app) .delete(`/assets`) @@ -877,13 +766,6 @@ describe('/asset', () => { }); describe('GET /assets/:id/thumbnail', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get(`/assets/${locationAsset.id}/thumbnail`); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should not include gps data for webp thumbnails', async () => { await utils.waitForWebsocketEvent({ event: 'assetUpload', @@ -919,13 +801,6 @@ describe('/asset', () => { }); describe('GET /assets/:id/original', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get(`/assets/${locationAsset.id}/original`); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should download the original', async () => { const { status, body, type } = await request(app) .get(`/assets/${locationAsset.id}/original`) @@ -946,43 +821,9 @@ describe('/asset', () => { }); }); - describe('PUT /assets', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).put('/assets'); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - }); - describe('POST /assets', () => { beforeAll(setupTests, 30_000); - it('should require authentication', async () => { - const { status, body } = await request(app).post(`/assets`); - expect(body).toEqual(errorDto.unauthorized); - expect(status).toBe(401); - }); - - it.each([ - { should: 'require `deviceAssetId`', dto: { ...makeUploadDto({ omit: 'deviceAssetId' }) } }, - { should: 'require `deviceId`', dto: { ...makeUploadDto({ omit: 'deviceId' }) } }, - { should: 'require `fileCreatedAt`', dto: { ...makeUploadDto({ omit: 'fileCreatedAt' }) } }, - { should: 'require `fileModifiedAt`', dto: { ...makeUploadDto({ omit: 'fileModifiedAt' }) } }, - { should: 'require `duration`', dto: { ...makeUploadDto({ omit: 'duration' }) } }, - { should: 'throw if `isFavorite` is not a boolean', dto: { ...makeUploadDto(), isFavorite: 'not-a-boolean' } }, - { should: 'throw if `isVisible` is not a boolean', dto: { ...makeUploadDto(), isVisible: 'not-a-boolean' } }, - { should: 'throw if `isArchived` is not a boolean', dto: { ...makeUploadDto(), isArchived: 'not-a-boolean' } }, - ])('should $should', async ({ dto }) => { - const { status, body } = await request(app) - .post('/assets') - .set('Authorization', `Bearer ${user1.accessToken}`) - .attach('assetData', makeRandomImage(), 'example.png') - .field(dto); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest()); - }); - const tests = [ { input: 'formats/avif/8bit-sRGB.avif', @@ -1244,31 +1085,21 @@ describe('/asset', () => { }, ]; - it(`should upload and generate a thumbnail for different file types`, async () => { - // upload in parallel - const assets = await Promise.all( - tests.map(async ({ input }) => { - const filepath = join(testAssetDir, input); - return utils.createAsset(admin.accessToken, { - assetData: { bytes: await readFile(filepath), filename: basename(filepath) }, - }); - }), - ); + it.each(tests)(`should upload and generate a thumbnail for different file types`, async ({ input, expected }) => { + const filepath = join(testAssetDir, input); + const response = await utils.createAsset(admin.accessToken, { + assetData: { bytes: await readFile(filepath), filename: basename(filepath) }, + }); - for (const { id, status } of assets) { - expect(status).toBe(AssetMediaStatus.Created); - // longer timeout as the thumbnail generation from full-size raw files can take a while - await utils.waitForWebsocketEvent({ event: 'assetUpload', id }); - } + expect(response.status).toBe(AssetMediaStatus.Created); + const id = response.id; + // longer timeout as the thumbnail generation from full-size raw files can take a while + await utils.waitForWebsocketEvent({ event: 'assetUpload', id }); - for (const [i, { id }] of assets.entries()) { - const { expected } = tests[i]; - const asset = await utils.getAssetInfo(admin.accessToken, id); - - expect(asset.exifInfo).toBeDefined(); - expect(asset.exifInfo).toMatchObject(expected.exifInfo); - expect(asset).toMatchObject(expected); - } + const asset = await utils.getAssetInfo(admin.accessToken, id); + expect(asset.exifInfo).toBeDefined(); + expect(asset.exifInfo).toMatchObject(expected.exifInfo); + expect(asset).toMatchObject(expected); }); it('should handle a duplicate', async () => { diff --git a/e2e/src/api/specs/auth.e2e-spec.ts b/e2e/src/api/specs/auth.e2e-spec.ts index 1b653a781f..0f407f4ba7 100644 --- a/e2e/src/api/specs/auth.e2e-spec.ts +++ b/e2e/src/api/specs/auth.e2e-spec.ts @@ -19,17 +19,6 @@ describe(`/auth/admin-sign-up`, () => { expect(body).toEqual(signupResponseDto.admin); }); - it('should sign up the admin with a local domain', async () => { - const { status, body } = await request(app) - .post('/auth/admin-sign-up') - .send({ ...signupDto.admin, email: 'admin@local' }); - expect(status).toEqual(201); - expect(body).toEqual({ - ...signupResponseDto.admin, - email: 'admin@local', - }); - }); - it('should not allow a second admin to sign up', async () => { await signUpAdmin({ signUpDto: signupDto.admin }); @@ -57,22 +46,6 @@ describe('/auth/*', () => { expect(body).toEqual(errorDto.incorrectLogin); }); - for (const key of Object.keys(loginDto.admin)) { - it(`should not allow null ${key}`, async () => { - const { status, body } = await request(app) - .post('/auth/login') - .send({ ...loginDto.admin, [key]: null }); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest()); - }); - - it('should reject an invalid email', async () => { - const { status, body } = await request(app).post('/auth/login').send({ email: [], password }); - expect(status).toBe(400); - expect(body).toEqual(errorDto.invalidEmail); - }); - } - it('should accept a correct password', async () => { const { status, body, headers } = await request(app).post('/auth/login').send({ email, password }); expect(status).toBe(201); @@ -127,14 +100,6 @@ describe('/auth/*', () => { }); describe('POST /auth/change-password', () => { - it('should require authentication', async () => { - const { status, body } = await request(app) - .post(`/auth/change-password`) - .send({ password, newPassword: 'Password1234' }); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should require the current password', async () => { const { status, body } = await request(app) .post(`/auth/change-password`) diff --git a/e2e/src/api/specs/download.e2e-spec.ts b/e2e/src/api/specs/download.e2e-spec.ts index 3d3e6c7650..4dcb6934af 100644 --- a/e2e/src/api/specs/download.e2e-spec.ts +++ b/e2e/src/api/specs/download.e2e-spec.ts @@ -1,6 +1,5 @@ import { AssetMediaResponseDto, LoginResponseDto } from '@immich/sdk'; import { readFile, writeFile } from 'node:fs/promises'; -import { errorDto } from 'src/responses'; import { app, tempDir, utils } from 'src/utils'; import request from 'supertest'; import { beforeAll, describe, expect, it } from 'vitest'; @@ -17,15 +16,6 @@ describe('/download', () => { }); describe('POST /download/info', () => { - it('should require authentication', async () => { - const { status, body } = await request(app) - .post(`/download/info`) - .send({ assetIds: [asset1.id] }); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should download info', async () => { const { status, body } = await request(app) .post('/download/info') @@ -42,15 +32,6 @@ describe('/download', () => { }); describe('POST /download/archive', () => { - it('should require authentication', async () => { - const { status, body } = await request(app) - .post(`/download/archive`) - .send({ assetIds: [asset1.id, asset2.id] }); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should download an archive', async () => { const { status, body } = await request(app) .post('/download/archive') diff --git a/e2e/src/api/specs/map.e2e-spec.ts b/e2e/src/api/specs/map.e2e-spec.ts index da5f779cff..977638aa24 100644 --- a/e2e/src/api/specs/map.e2e-spec.ts +++ b/e2e/src/api/specs/map.e2e-spec.ts @@ -1,4 +1,4 @@ -import { LoginResponseDto } from '@immich/sdk'; +import { AssetVisibility, LoginResponseDto } from '@immich/sdk'; import { readFile } from 'node:fs/promises'; import { basename, join } from 'node:path'; import { Socket } from 'socket.io-client'; @@ -44,7 +44,7 @@ describe('/map', () => { it('should get map markers for all non-archived assets', async () => { const { status, body } = await request(app) .get('/map/markers') - .query({ isArchived: false }) + .query({ visibility: AssetVisibility.Timeline }) .set('Authorization', `Bearer ${admin.accessToken}`); expect(status).toBe(200); diff --git a/e2e/src/api/specs/search.e2e-spec.ts b/e2e/src/api/specs/search.e2e-spec.ts index 1031390ee9..2f6ea75f77 100644 --- a/e2e/src/api/specs/search.e2e-spec.ts +++ b/e2e/src/api/specs/search.e2e-spec.ts @@ -1,9 +1,15 @@ -import { AssetMediaResponseDto, AssetResponseDto, deleteAssets, LoginResponseDto, updateAsset } from '@immich/sdk'; +import { + AssetMediaResponseDto, + AssetResponseDto, + AssetVisibility, + deleteAssets, + LoginResponseDto, + updateAsset, +} from '@immich/sdk'; import { DateTime } from 'luxon'; import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import { Socket } from 'socket.io-client'; -import { errorDto } from 'src/responses'; import { app, asBearerAuth, TEN_TIMES, testAssetDir, utils } from 'src/utils'; import request from 'supertest'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; @@ -50,7 +56,7 @@ describe('/search', () => { { filename: '/formats/motionphoto/samsung-one-ui-6.heic' }, { filename: '/formats/motionphoto/samsung-one-ui-5.jpg' }, - { filename: '/metadata/gps-position/thompson-springs.jpg', dto: { isArchived: true } }, + { filename: '/metadata/gps-position/thompson-springs.jpg', dto: { visibility: AssetVisibility.Archive } }, // used for search suggestions { filename: '/formats/png/density_plot.png' }, @@ -141,65 +147,6 @@ describe('/search', () => { }); describe('POST /search/metadata', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).post('/search/metadata'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - const badTests = [ - { - should: 'should reject page as a string', - dto: { page: 'abc' }, - expected: ['page must not be less than 1', 'page must be an integer number'], - }, - { - should: 'should reject page as a decimal', - dto: { page: 1.5 }, - expected: ['page must be an integer number'], - }, - { - should: 'should reject page as a negative number', - dto: { page: -10 }, - expected: ['page must not be less than 1'], - }, - { - should: 'should reject page as 0', - dto: { page: 0 }, - expected: ['page must not be less than 1'], - }, - { - should: 'should reject size as a string', - dto: { size: 'abc' }, - expected: [ - 'size must not be greater than 1000', - 'size must not be less than 1', - 'size must be an integer number', - ], - }, - { - should: 'should reject an invalid size', - dto: { size: -1.5 }, - expected: ['size must not be less than 1', 'size must be an integer number'], - }, - ...['isArchived', 'isFavorite', 'isEncoded', 'isOffline', 'isMotion', 'isVisible'].map((value) => ({ - should: `should reject ${value} not a boolean`, - dto: { [value]: 'immich' }, - expected: [`${value} must be a boolean value`], - })), - ]; - - for (const { should, dto, expected } of badTests) { - it(should, async () => { - const { status, body } = await request(app) - .post('/search/metadata') - .set('Authorization', `Bearer ${admin.accessToken}`) - .send(dto); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest(expected)); - }); - } - const searchTests = [ { should: 'should get my assets', @@ -231,12 +178,12 @@ describe('/search', () => { deferred: () => ({ dto: { size: 1, isFavorite: false }, assets: [assetLast] }), }, { - should: 'should search by isArchived (true)', - deferred: () => ({ dto: { isArchived: true }, assets: [assetSprings] }), + should: 'should search by visibility (AssetVisibility.Archive)', + deferred: () => ({ dto: { visibility: AssetVisibility.Archive }, assets: [assetSprings] }), }, { - should: 'should search by isArchived (false)', - deferred: () => ({ dto: { size: 1, isArchived: false }, assets: [assetLast] }), + should: 'should search by visibility (AssetVisibility.Timeline)', + deferred: () => ({ dto: { size: 1, visibility: AssetVisibility.Timeline }, assets: [assetLast] }), }, { should: 'should search by type (image)', @@ -245,7 +192,7 @@ describe('/search', () => { { should: 'should search by type (video)', deferred: () => ({ - dto: { type: 'VIDEO' }, + dto: { type: 'VIDEO', visibility: AssetVisibility.Hidden }, assets: [ // the three live motion photos { id: expect.any(String) }, @@ -289,13 +236,6 @@ describe('/search', () => { should: 'should search by takenAfter (no results)', deferred: () => ({ dto: { takenAfter: today.plus({ hour: 1 }).toJSDate() }, assets: [] }), }, - // { - // should: 'should search by originalPath', - // deferred: () => ({ - // dto: { originalPath: asset1.originalPath }, - // assets: [asset1], - // }), - // }, { should: 'should search by originalFilename', deferred: () => ({ @@ -325,7 +265,7 @@ describe('/search', () => { deferred: () => ({ dto: { city: '', - isVisible: true, + visibility: AssetVisibility.Timeline, includeNull: true, }, assets: [assetLast], @@ -336,7 +276,7 @@ describe('/search', () => { deferred: () => ({ dto: { city: null, - isVisible: true, + visibility: AssetVisibility.Timeline, includeNull: true, }, assets: [assetLast], @@ -357,7 +297,7 @@ describe('/search', () => { deferred: () => ({ dto: { state: '', - isVisible: true, + visibility: AssetVisibility.Timeline, withExif: true, includeNull: true, }, @@ -369,7 +309,7 @@ describe('/search', () => { deferred: () => ({ dto: { state: null, - isVisible: true, + visibility: AssetVisibility.Timeline, includeNull: true, }, assets: [assetLast, assetNotocactus], @@ -390,7 +330,7 @@ describe('/search', () => { deferred: () => ({ dto: { country: '', - isVisible: true, + visibility: AssetVisibility.Timeline, includeNull: true, }, assets: [assetLast], @@ -401,7 +341,7 @@ describe('/search', () => { deferred: () => ({ dto: { country: null, - isVisible: true, + visibility: AssetVisibility.Timeline, includeNull: true, }, assets: [assetLast], @@ -454,14 +394,6 @@ describe('/search', () => { } }); - describe('POST /search/smart', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).post('/search/smart'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - }); - describe('POST /search/random', () => { beforeAll(async () => { await Promise.all([ @@ -476,13 +408,6 @@ describe('/search', () => { await utils.waitForQueueFinish(admin.accessToken, 'thumbnailGeneration'); }); - it('should require authentication', async () => { - const { status, body } = await request(app).post('/search/random').send({ size: 1 }); - - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it.each(TEN_TIMES)('should return 1 random assets', async () => { const { status, body } = await request(app) .post('/search/random') @@ -512,12 +437,6 @@ describe('/search', () => { }); describe('GET /search/explore', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/search/explore'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should get explore data', async () => { const { status, body } = await request(app) .get('/search/explore') @@ -528,12 +447,6 @@ describe('/search', () => { }); describe('GET /search/places', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/search/places'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should get relevant places', async () => { const name = 'Paris'; @@ -552,12 +465,6 @@ describe('/search', () => { }); describe('GET /search/cities', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/search/cities'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should get all cities', async () => { const { status, body } = await request(app) .get('/search/cities') @@ -576,12 +483,6 @@ describe('/search', () => { }); describe('GET /search/suggestions', () => { - it('should require authentication', async () => { - const { status, body } = await request(app).get('/search/suggestions'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - it('should get suggestions for country (including null)', async () => { const { status, body } = await request(app) .get('/search/suggestions?type=country&includeNull=true') diff --git a/e2e/src/api/specs/timeline.e2e-spec.ts b/e2e/src/api/specs/timeline.e2e-spec.ts index bf330e994a..93ba8b6527 100644 --- a/e2e/src/api/specs/timeline.e2e-spec.ts +++ b/e2e/src/api/specs/timeline.e2e-spec.ts @@ -1,4 +1,4 @@ -import { AssetMediaResponseDto, LoginResponseDto, SharedLinkType, TimeBucketSize } from '@immich/sdk'; +import { AssetMediaResponseDto, AssetVisibility, LoginResponseDto, SharedLinkType, TimeBucketSize } from '@immich/sdk'; import { DateTime } from 'luxon'; import { createUserDto } from 'src/fixtures'; import { errorDto } from 'src/responses'; @@ -104,7 +104,7 @@ describe('/timeline', () => { const req1 = await request(app) .get('/timeline/buckets') .set('Authorization', `Bearer ${timeBucketUser.accessToken}`) - .query({ size: TimeBucketSize.Month, withPartners: true, isArchived: true }); + .query({ size: TimeBucketSize.Month, withPartners: true, visibility: AssetVisibility.Archive }); expect(req1.status).toBe(400); expect(req1.body).toEqual(errorDto.badRequest()); @@ -112,7 +112,7 @@ describe('/timeline', () => { const req2 = await request(app) .get('/timeline/buckets') .set('Authorization', `Bearer ${user.accessToken}`) - .query({ size: TimeBucketSize.Month, withPartners: true, isArchived: undefined }); + .query({ size: TimeBucketSize.Month, withPartners: true, visibility: undefined }); expect(req2.status).toBe(400); expect(req2.body).toEqual(errorDto.badRequest()); diff --git a/e2e/src/utils.ts b/e2e/src/utils.ts index 08b29a4a11..1d5004d385 100644 --- a/e2e/src/utils.ts +++ b/e2e/src/utils.ts @@ -3,6 +3,7 @@ import { AssetMediaCreateDto, AssetMediaResponseDto, AssetResponseDto, + AssetVisibility, CheckExistingAssetsDto, CreateAlbumDto, CreateLibraryDto, @@ -429,7 +430,10 @@ export const utils = { }, archiveAssets: (accessToken: string, ids: string[]) => - updateAssets({ assetBulkUpdateDto: { ids, isArchived: true } }, { headers: asBearerAuth(accessToken) }), + updateAssets( + { assetBulkUpdateDto: { ids, visibility: AssetVisibility.Archive } }, + { headers: asBearerAuth(accessToken) }, + ), deleteAssets: (accessToken: string, ids: string[]) => deleteAssets({ assetBulkDeleteDto: { ids } }, { headers: asBearerAuth(accessToken) }), diff --git a/e2e/src/web/specs/shared-link.e2e-spec.ts b/e2e/src/web/specs/shared-link.e2e-spec.ts index aeddb86322..017bc0fcb2 100644 --- a/e2e/src/web/specs/shared-link.e2e-spec.ts +++ b/e2e/src/web/specs/shared-link.e2e-spec.ts @@ -47,15 +47,13 @@ test.describe('Shared Links', () => { await page.locator(`[data-asset-id="${asset.id}"]`).hover(); await page.waitForSelector('[data-group] svg'); await page.getByRole('checkbox').click(); - await page.getByRole('button', { name: 'Download' }).click(); - await page.waitForEvent('download'); + await Promise.all([page.waitForEvent('download'), page.getByRole('button', { name: 'Download' }).click()]); }); test('download all from shared link', async ({ page }) => { await page.goto(`/share/${sharedLink.key}`); await page.getByRole('heading', { name: 'Test Album' }).waitFor(); - await page.getByRole('button', { name: 'Download' }).click(); - await page.waitForEvent('download'); + await Promise.all([page.waitForEvent('download'), page.getByRole('button', { name: 'Download' }).click()]); }); test('enter password for a shared link', async ({ page }) => { diff --git a/e2e/test-assets b/e2e/test-assets index 9e3b964b08..8885d6d01c 160000 --- a/e2e/test-assets +++ b/e2e/test-assets @@ -1 +1 @@ -Subproject commit 9e3b964b080dca6f035b29b86e66454ae8aeda78 +Subproject commit 8885d6d01c12242785b6ea68f4a277334f60bc90 diff --git a/i18n/ar.json b/i18n/ar.json index d6e26985cb..815d870b08 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -187,20 +187,13 @@ "oauth_auto_register": "Ø§Ų„ØĒØŗØŦŲŠŲ„ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊", "oauth_auto_register_description": "Ø§Ų„ØĒØŗØŦŲŠŲ„ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ Ų„Ų„Ų…ØŗØĒØŽØ¯Ų…ŲŠŲ† Ø§Ų„ØŦدد بؚد ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… OAuth", "oauth_button_text": "Ų†Øĩ Ø§Ų„Ø˛Øą", - "oauth_client_id": "Ų…ØšØąŲ Ø§Ų„ØšŲ…ŲŠŲ„", - "oauth_client_secret": "Ø§Ų„ØąŲ…Ø˛ Ø§Ų„ØŗØąŲŠ Ų„Ų„ØšŲ…ŲŠŲ„", "oauth_enable_description": "ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… OAuth", - "oauth_issuer_url": "ØšŲ†ŲˆØ§Ų† URL Ø§Ų„ØŽØ§Øĩ بØŦŲ‡ØŠ Ø§Ų„ØĨØĩØ¯Ø§Øą", "oauth_mobile_redirect_uri": "ØšŲ†ŲˆØ§Ų† URI Ų„ØĨؚاد؊ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØšŲ„Ų‰ Ø§Ų„Ų‡Ø§ØĒ؁", "oauth_mobile_redirect_uri_override": "ØĒØŦØ§ŲˆØ˛ ØšŲ†ŲˆØ§Ų† URI Ų„ØĨؚاد؊ Ø§Ų„ØĒ؈ØŦŲŠŲ‡ ØšŲ„Ų‰ Ø§Ų„Ų‡Ø§ØĒ؁", "oauth_mobile_redirect_uri_override_description": "Ų‚Ų… بØĒŲØšŲŠŲ„Ų‡ ØšŲ†Ø¯Ų…Ø§ Ų„Ø§ ŲŠØŗŲ…Ø­ Ų…ŲˆŲØą OAuth Ø¨Ų…ØšØąŲ URI Ų„Ų„ØŦŲˆØ§Ų„ØŒ Ų…ØĢŲ„ '{callback}'", - "oauth_profile_signing_algorithm": "ØŽŲˆØ§ØąØ˛Ų…ŲŠØŠ ØĒŲˆŲ‚ŲŠØš Ø§Ų„Ų…Ų„Ų Ø§Ų„Ø´ØŽØĩ؊", - "oauth_profile_signing_algorithm_description": "Ø§Ų„ØŽŲˆØ§ØąØ˛Ų…ŲŠØŠ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų…ØŠ Ų„Ų„ØĒŲˆŲ‚ŲŠØš ØšŲ„Ų‰ ؅؄؁ ØĒØšØąŲŠŲ Ø§Ų„Ų…ØŗØĒØŽØ¯Ų….", - "oauth_scope": "Ø§Ų„Ų†ØˇØ§Ų‚", "oauth_settings": "OAuth", "oauth_settings_description": "ØĨØ¯Ø§ØąØŠ ØĨؚداداØĒ ØĒØŗØŦŲŠŲ„ Ø§Ų„Ø¯ØŽŲˆŲ„ OAuth", "oauth_settings_more_details": "Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† Ø§Ų„ØĒŲØ§ØĩŲŠŲ„ Ø­ŲˆŲ„ Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠØŒ ŲŠØąØŦŲ‰ Ø§Ų„ØąØŦŲˆØš ØĨŲ„Ų‰ Ø§Ų„ŲˆØĢاØĻŲ‚.", - "oauth_signing_algorithm": "ØŽŲˆØ§ØąØ˛Ų…ŲŠØŠ Ø§Ų„ØĒŲˆŲ‚ŲŠØš", "oauth_storage_label_claim": "Ø§Ų„Ų…ØˇØ§Ų„Ø¨ØŠ بØĒØĩŲ†ŲŠŲ Ø§Ų„ØĒØŽØ˛ŲŠŲ†", "oauth_storage_label_claim_description": "Ų‚Ų… ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§ بØĒØšŲŠŲŠŲ† ØĒØĩŲ†ŲŠŲ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„ØŽØ§Øĩ Ø¨Ø§Ų„Ų…ØŗØĒØŽØ¯Ų… ØšŲ„Ų‰ Ų‚ŲŠŲ…ØŠ Ų‡Ø°Ų‡ Ø§Ų„Ų…ØˇØ§Ų„Ø¨ØŠ.", "oauth_storage_quota_claim": "Ø§Ų„Ų…ØˇØ§Ų„Ø¨ØŠ بحØĩØŠ Ø§Ų„ØĒØŽØ˛ŲŠŲ†", diff --git a/i18n/be.json b/i18n/be.json index eea566df6a..b8898d8aaf 100644 --- a/i18n/be.json +++ b/i18n/be.json @@ -14,6 +14,7 @@ "add_a_location": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐŧĐĩŅŅ†Đ°", "add_a_name": "Đ”Đ°Đ´Đ°Ņ†ŅŒ Ņ–ĐŧŅ", "add_a_title": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐˇĐ°ĐŗĐ°ĐģОваĐē", + "add_endpoint": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ĐēŅ€ĐžĐŋĐē҃ Đ´ĐžŅŅ‚ŅƒĐŋ҃", "add_exclusion_pattern": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ŅˆĐ°ĐąĐģĐžĐŊ Đ˛Ņ‹ĐēĐģŅŽŅ‡ŅĐŊĐŊŅ", "add_import_path": "Đ”Đ°Đ´Đ°Ņ†ŅŒ ҈ĐģŅŅ… Ņ–ĐŧĐŋĐ°Ņ€Ņ‚Ņƒ", "add_location": "Đ”Đ°Đ´Đ°ĐšŅ†Đĩ ĐŧĐĩŅŅ†Đ°", @@ -42,7 +43,7 @@ "backup_database_enable_description": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ Ņ€ŅĐˇĐĩŅ€Đ˛Đ°Đ˛Đ°ĐŊĐŊĐĩ ĐąĐ°ĐˇŅ‹ даĐŊҋ҅", "backup_keep_last_amount": "КоĐģҌĐēĐ°ŅŅ†ŅŒ ĐŋаĐŋŅŅ€ŅĐ´ĐŊŅ–Ņ… Ņ€ŅĐˇĐĩŅ€Đ˛ĐžĐ˛Ņ‹Ņ… ĐēĐžĐŋŅ–Đš Đ´ĐģŅ ĐˇĐ°Ņ…Đ°Đ˛Đ°ĐŊĐŊŅ", "backup_settings": "НаĐģĐ°Đ´Ņ‹ Ņ€ŅĐˇĐĩŅ€Đ˛ĐžĐ˛Đ°ĐŗĐ° ĐēаĐŋŅ–ŅĐ˛Đ°ĐŊĐŊŅ", - "backup_settings_description": "ĐšŅ–Ņ€Đ°Đ˛Đ°ĐŊĐŊĐĩ ĐŊаĐģадĐēаĐŧŅ– Ņ€ŅĐˇĐĩŅ€Đ˛ĐžĐ˛Đ°ĐŗĐ° ĐēаĐŋŅ–ŅĐ˛Đ°ĐŊĐŊŅ ĐąĐ°ĐˇŅ‹ даĐŊҋ҅", + "backup_settings_description": "ĐšŅ–Ņ€Đ°Đ˛Đ°ĐŊĐŊĐĩ ĐŊаĐģадаĐŧŅ– даĐŧĐŋа ĐąĐ°ĐˇŅ‹ дадСĐĩĐŊҋ҅. Đ—Đ°ŅžĐ˛Đ°ĐŗĐ°: ĐŗŅŅ‚Ņ‹Ņ ĐˇĐ°Đ´Đ°Ņ‡Ņ‹ ĐŊĐĩ ĐēаĐŊŅ‚Ņ€Đ°ĐģŅŽŅŽŅ†Ņ†Đ°, Ņ– Ņž Đ˛Ņ‹ĐŋадĐē҃ ĐŊŅŅžĐ´Đ°Ņ‡Ņ‹ ĐŋавĐĩдаĐŧĐģĐĩĐŊĐŊĐĩ адĐŋŅ€Đ°ŅžĐģĐĩĐŊа ĐŊĐĩ ĐąŅƒĐ´ĐˇĐĩ.", "check_all": "ĐŸŅ€Đ°Đ˛ĐĩŅ€Ņ‹Ņ†ŅŒ ҃ҁĐĩ", "cleanup": "ĐŅ‡Ņ‹ŅŅ‚Đēа", "cleared_jobs": "ĐŅ‡Ņ‹ŅˆŅ‡Đ°ĐŊŅ‹ СадаĐŊĐŊŅ– Đ´ĐģŅ: {job}", @@ -62,8 +63,18 @@ "external_library_created_at": "ЗĐŊĐĩ҈ĐŊŅŅ ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēа (ŅŅ‚Đ˛ĐžŅ€Đ°ĐŊа {date})", "external_library_management": "ĐšŅ–Ņ€Đ°Đ˛Đ°ĐŊĐŊĐĩ СĐŊĐĩ҈ĐŊŅĐš ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēаК", "face_detection": "Đ’Ņ‹ŅŅžĐģĐĩĐŊĐŊĐĩ Ņ‚Đ˛Đ°Ņ€Đ°Ņž", + "face_detection_description": "Đ’Ņ‹ŅŅžĐģŅŅ†ŅŒ Ņ‚Đ˛Đ°Ņ€Ņ‹ ĐŊа Ņ„ĐžŅ‚Đ°ĐˇĐ´Ņ‹ĐŧĐēĐ°Ņ… Ņ– Đ˛Ņ–Đ´ŅĐ° С даĐŋаĐŧĐžĐŗĐ°Đš ĐŧĐ°ŅˆŅ‹ĐŊĐŊĐ°ĐŗĐ° ĐŊĐ°Đ˛ŅƒŅ‡Đ°ĐŊĐŊŅ. ДĐģŅ Đ˛Ņ–Đ´ŅĐ° ŅžĐģŅ–Ņ‡Đ˛Đ°ĐĩŅ†Ņ†Đ° Ņ‚ĐžĐģҌĐēŅ– ĐŧŅ–ĐŊŅ–ŅŅ†ŅŽŅ€Đ°. \"АйĐŊĐ°Đ˛Ņ–Ņ†ŅŒ\" (ĐŋĐĩŅ€Đ°)аĐŋŅ€Đ°Ņ†ĐžŅžĐ˛Đ°Đĩ ŅžŅĐĩ ĐŧĐĩĐ´Ņ‹Ņ. \"ĐĄĐēŅ–ĐŊŅƒŅ†ŅŒ\" Đ´Đ°Đ´Đ°Ņ‚ĐēОва Đ°Ņ‡Ņ‹ŅˆŅ‡Đ°Đĩ ŅžŅĐĩ ĐąŅĐŗŅƒŅ‡Ņ‹Ņ дадСĐĩĐŊŅ‹Ņ ĐŋŅ€Đ° Ņ‚Đ˛Đ°Ņ€Ņ‹. \"ĐĐ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Đĩ\" ŅŅ‚Đ°Đ˛Ņ–Ņ†ŅŒ ҃ Ņ‡Đ°Ņ€ĐŗŅƒ ĐŧĐĩĐ´Ņ‹Ņ, ŅĐēŅ–Ņ ŅŅˆŅ‡Ņ ĐŊĐĩ ĐąŅ‹ĐģŅ– аĐŋŅ€Đ°Ņ†Đ°Đ˛Đ°ĐŊŅ‹Ņ. Đ’Ņ‹ŅŅžĐģĐĩĐŊŅ‹Ņ Ņ‚Đ˛Đ°Ņ€Ņ‹ ĐąŅƒĐ´ŅƒŅ†ŅŒ ĐŋĐ°ŅŅ‚Đ°ŅžĐģĐĩĐŊŅ‹ Ņž Ņ‡Đ°Ņ€ĐŗŅƒ Đ´ĐģŅ Ņ€Đ°ŅĐŋаСĐŊаваĐŊĐŊŅ Đ°ŅĐžĐą ĐŋĐ°ŅĐģŅ ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž, С ĐŗŅ€ŅƒĐŋаваĐŊĐŊĐĩĐŧ Ņ–Ņ… Đŋа ҖҁĐŊŅƒŅŽŅ‡Ņ‹Ņ… айО ĐŊĐžĐ˛Ņ‹Ņ… ĐģŅŽĐ´ĐˇŅŅ….", + "facial_recognition_job_description": "Đ“Ņ€ŅƒĐŋĐ°Đ˛Đ°Ņ†ŅŒ Đ˛Ņ‹ŅŅžĐģĐĩĐŊŅ‹Ņ Ņ‚Đ˛Đ°Ņ€Ņ‹ Đŋа Đ°ŅĐžĐąĐ°Ņ…. Đ“ŅŅ‚Ņ‹ ŅŅ‚Đ°Đŋ Đ˛Ņ‹ĐēĐžĐŊваĐĩŅ†Ņ†Đ° ĐŋĐ°ŅĐģŅ ĐˇĐ°Đ˛ŅŅ€ŅˆŅĐŊĐŊŅ Đ˛Ņ‹ŅŅžĐģĐĩĐŊĐŊŅ Ņ‚Đ˛Đ°Ņ€Đ°Ņž. \"ĐĄĐēŅ–ĐŊŅƒŅ†ŅŒ\" (ĐŋĐ°ŅžŅ‚ĐžŅ€ĐŊа) ĐŋĐĩŅ€Đ°ĐŗŅ€ŅƒĐŋĐžŅžĐ˛Đ°Đĩ ŅžŅĐĩ Ņ‚Đ˛Đ°Ņ€Ņ‹. \"ĐĐ´ŅŅƒŅ‚ĐŊŅ–Ņ‡Đ°Đĩ\" ŅŅ‚Đ°Đ˛Ņ–Ņ†ŅŒ ҃ Ņ‡Đ°Ņ€ĐŗŅƒ Ņ‚Đ˛Đ°Ņ€Ņ‹, ŅĐēŅ–Ņ ŅŅˆŅ‡Ņ ĐŊĐĩ ĐŋҀҋĐŋŅ–ŅĐ°ĐŊŅ‹Ņ да ŅĐēОК-ĐŊĐĩĐąŅƒĐ´ĐˇŅŒ Đ°ŅĐžĐąŅ‹.", + "failed_job_command": "КаĐŧаĐŊда {command} ĐŊĐĩ Đ˛Ņ‹ĐēаĐŊаĐģĐ°ŅŅ Đ´ĐģŅ СадаĐŊĐŊŅ: {job}", "force_delete_user_warning": "ĐŸĐĐŸĐ¯Đ Đ­Đ”Đ–ĐĐĐĐ•: Đ“ŅŅ‚Đ° дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩадĐēĐģадĐŊа Đ˛Ņ‹Đ´Đ°ĐģŅ–Ņ†ŅŒ ĐēĐ°Ņ€Ņ‹ŅŅ‚Đ°ĐģҌĐŊŅ–Đēа Ņ– ŅžŅĐĩ ай'ĐĩĐē҂ҋ. Đ“ŅŅ‚Đ° дСĐĩŅĐŊĐŊĐĩ ĐŊĐĩ ĐŧĐžĐļа ĐąŅ‹Ņ†ŅŒ Đ°Đ´Ņ€ĐžĐąĐģĐĩĐŊа Ņ– Ņ„Đ°ĐšĐģŅ‹ ĐŊĐĩĐŧĐ°ĐŗŅ‡Ņ‹Đŧа ĐąŅƒĐ´ĐˇĐĩ адĐŊĐ°Đ˛Ņ–Ņ†ŅŒ.", + "forcing_refresh_library_files": "ĐŸŅ€Ņ‹ĐŧŅƒŅĐžĐ˛Đ°Đĩ айĐŊĐ°ŅžĐģĐĩĐŊĐŊĐĩ ŅžŅŅ–Ņ… Ņ„Đ°ĐšĐģĐ°Ņž ĐąŅ–ĐąĐģŅ–ŅŅ‚ŅĐēŅ–", "image_format": "Đ¤Đ°Ņ€ĐŧĐ°Ņ‚", + "image_format_description": "WebP ŅŅ‚Đ˛Đ°Ņ€Đ°Đĩ ĐŧĐĩĐŊŅˆŅ‹Ņ Ņ„Đ°ĐšĐģŅ‹, ҇ҋĐŧ JPEG, аĐģĐĩ ĐŋавОĐģҌĐŊĐĩĐš ĐēĐ°Đ´ŅƒĐĩ.", + "image_fullsize_description": "Đ’Ņ‹ŅĐ˛Đ° Ņž ĐŋĐžŅžĐŊŅ‹Đŧ ĐŋаĐŧĐĩҀҋ ĐąĐĩС ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊҋ҅, Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ĐĩŅ†Ņ†Đ° ĐŋҀҋ ĐŋавĐĩĐģŅ–Ņ‡ŅĐŊĐŊŅ–", + "image_fullsize_enabled": "ĐŖĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ŅŅ‚Đ˛Đ°Ņ€ŅĐŊĐŊĐĩ Đ˛Ņ‹ŅĐ˛Ņ‹ Ņž ĐŋĐžŅžĐŊŅ‹Đŧ ĐŋаĐŧĐĩҀҋ", + "image_fullsize_enabled_description": "ĐĄŅ‚Đ˛Đ°Ņ€Đ°Ņ†ŅŒ Đ˛Ņ‹ŅĐ˛Ņƒ Ņž ĐŋĐžŅžĐŊŅ‹Đŧ ĐŋаĐŧĐĩҀҋ Đ´ĐģŅ Ņ„Đ°Ņ€ĐŧĐ°Ņ‚Đ°Ņž, ŅˆŅ‚Đž ĐŊĐĩ ĐŋŅ€Ņ‹Đ´Đ°Ņ‚ĐŊŅ‹Ņ Đ´ĐģŅ Đ˛ŅĐą. КаĐģŅ– ŅžĐēĐģŅŽŅ‡Đ°ĐŊа ĐžĐŋŅ†Ņ‹Ņ \"ĐĐ´Đ´Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐĩŅ€Đ°Đ˛Đ°ĐŗŅƒ ŅžĐąŅƒĐ´Đ°Đ˛Đ°ĐŊаК ĐŋŅ€Đ°ŅĐ˛Đĩ\", ĐŋŅ€Đ°ĐŗĐģŅĐ´Ņ‹ Đ˛Ņ‹ĐēĐ°Ņ€Ņ‹ŅŅ‚ĐžŅžĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐŊĐĩĐŋĐ°ŅŅ€ŅĐ´ĐŊа ĐąĐĩС ĐēаĐŊвĐĩŅ€Ņ‚Đ°Ņ†Ņ‹Ņ–. НĐĩ ŅžĐŋĐģŅ‹Đ˛Đ°Đĩ ĐŊа Đ˛ŅĐą-ĐŋŅ€Ņ‹Đ´Đ°Ņ‚ĐŊŅ‹Ņ Ņ„Đ°Ņ€ĐŧĐ°Ņ‚Ņ‹, Ņ‚Đ°ĐēŅ–Ņ ŅĐē JPEG.", + "image_fullsize_quality_description": "Đ¯ĐēĐ°ŅŅ†ŅŒ Đ˛Ņ‹ŅĐ˛Ņ‹ Ņž ĐŋĐžŅžĐŊŅ‹Đŧ ĐŋаĐŧĐĩҀҋ ад 1 да 100. БоĐģҌ҈ Đ˛Ņ‹ŅĐžĐēаĐĩ СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ ĐģĐĩĐŋŅˆĐ°Đĩ, аĐģĐĩ ĐŋŅ€Ņ‹Đ˛ĐžĐ´ĐˇŅ–Ņ†ŅŒ да ĐŋавĐĩĐģŅ–Ņ‡ŅĐŊĐŊŅ ĐŋаĐŧĐĩŅ€Ņƒ Ņ„Đ°ĐšĐģа.", + "image_fullsize_title": "НаĐģĐ°Đ´Ņ‹ Đ˛Ņ‹ŅĐ˛Ņ‹ Ņž ĐŋĐžŅžĐŊŅ‹Đŧ ĐŋаĐŧĐĩҀҋ", "image_preview_title": "НаĐģĐ°Đ´Ņ‹ ĐŋаĐŋŅŅ€ŅĐ´ĐŊŅĐŗĐ° ĐŋŅ€Đ°ĐŗĐģŅĐ´Ņƒ", "image_quality": "Đ¯ĐēĐ°ŅŅ†ŅŒ", "image_resolution": "Đ Đ°ĐˇĐ´ĐˇŅĐģŅĐģҌĐŊĐ°ŅŅ†ŅŒ", diff --git a/i18n/bg.json b/i18n/bg.json index e9e72743e3..468b1637b0 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -183,20 +183,13 @@ "oauth_auto_register": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ", "oauth_auto_register_description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€Đ°ĐŊĐĩ ĐŊа ĐŊОви ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģи ҁĐģĐĩĐ´ вĐģиСаĐŊĐĩ ҁ OAuth", "oauth_button_text": "ĐĸĐĩĐēҁ҂ ĐŊа ĐąŅƒŅ‚ĐžĐŊа", - "oauth_client_id": "КĐģиĐĩĐŊ҂ҁĐēи ID", - "oauth_client_secret": "КĐģиĐĩĐŊ҂ҁĐēа Ņ‚Đ°ĐšĐŊа", "oauth_enable_description": "ВĐģиСаĐŊĐĩ ҁ OAuth", - "oauth_issuer_url": "URL ĐŊа Đ¸ĐˇĐ´Đ°Ņ‚ĐĩĐģŅ", "oauth_mobile_redirect_uri": "URI Са ĐŧОйиĐģĐŊĐž ĐŋŅ€ĐĩĐŊĐ°ŅĐžŅ‡Đ˛Đ°ĐŊĐĩ", "oauth_mobile_redirect_uri_override": "URI ĐŋŅ€ĐĩĐŊĐ°ŅĐžŅ‡Đ˛Đ°ĐŊĐĩ Са ĐŧОйиĐģĐŊи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°", "oauth_mobile_redirect_uri_override_description": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸ ĐēĐžĐŗĐ°Ņ‚Đž Đ´ĐžŅŅ‚Đ°Đ˛Ņ‡Đ¸Đēа Са OAuth ŅƒĐ´ĐžŅŅ‚ĐžĐ˛ĐĩŅ€ŅĐ˛Đ°ĐŊĐĩ ĐŊĐĩ ĐŋОСвОĐģŅĐ˛Đ° Са ĐŧОйиĐģĐŊи URI идĐĩĐŊŅ‚Đ¸Ņ„Đ¸ĐēĐ°Ņ‚ĐžŅ€Đ¸, ĐēĐ°Ņ‚Đž '{callback}'", - "oauth_profile_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚ŅŠĐŧ Са ŅŅŠĐˇĐ´Đ°Đ˛Đ°ĐŊĐĩ ĐŊа ĐŋŅ€ĐžŅ„Đ¸Đģи", - "oauth_profile_signing_algorithm_description": "АĐģĐŗĐžŅ€Đ¸Ņ‚ŅŠĐŧ иСĐŋĐžĐģСваĐŊ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģҁĐēи ĐŋŅ€ĐžŅ„Đ¸Đģ.", - "oauth_scope": "ОбĐģĐ°ŅŅ‚/ĐžĐąŅ…Đ˛Đ°Ņ‚ ĐŊа ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ", "oauth_settings": "OAuth", "oauth_settings_description": "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŊа ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ¸Ņ‚Đĩ Са Đ˛Ņ…ĐžĐ´ ҁ OAuth", "oauth_settings_more_details": "За ĐŋОвĐĩ҇Đĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ Са Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊаĐģĐŊĐžŅŅ‚Ņ‚Đ°, ҁĐĩ ĐŋĐžŅ‚ŅŠŅ€ŅĐĩŅ‚Đĩ в docs.", - "oauth_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚ŅŠĐŧ Са вĐŋĐ¸ŅĐ˛Đ°ĐŊĐĩ", "oauth_storage_label_claim": "Đ—Đ°ŅĐ˛Đēа Са ĐĩŅ‚Đ¸ĐēĐĩŅ‚ Са ŅŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ", "oauth_storage_label_claim_description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž ĐˇĐ°Đ´Đ°ĐšŅ‚Đĩ ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ° Са ŅŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ ĐŊа ĐŋĐžŅ‚Ņ€ĐĩĐąĐ¸Ņ‚ĐĩĐģŅ ҁҊҁ ŅŅ‚ĐžĐšĐŊĐžŅŅ‚Ņ‚Đ° ĐžŅ‚ Ņ‚Đ°ĐˇĐ¸ ĐˇĐ°ŅĐ˛Đēа.", "oauth_storage_quota_claim": "Đ—Đ°ŅĐ˛Đēа Са ĐēĐ˛ĐžŅ‚Đ° Са ŅŅŠŅ…Ņ€Đ°ĐŊĐĩĐŊиĐĩ", diff --git a/i18n/bi.json b/i18n/bi.json index a70ce05dfb..8a4f4a6193 100644 --- a/i18n/bi.json +++ b/i18n/bi.json @@ -138,17 +138,12 @@ "oauth_auto_register": "", "oauth_auto_register_description": "", "oauth_button_text": "", - "oauth_client_id": "", - "oauth_client_secret": "", "oauth_enable_description": "", - "oauth_issuer_url": "", "oauth_mobile_redirect_uri": "", "oauth_mobile_redirect_uri_override": "", "oauth_mobile_redirect_uri_override_description": "", - "oauth_scope": "", "oauth_settings": "", "oauth_settings_description": "", - "oauth_signing_algorithm": "", "oauth_storage_label_claim": "", "oauth_storage_label_claim_description": "", "oauth_storage_quota_claim": "", diff --git a/i18n/ca.json b/i18n/ca.json index c2482f3ddd..38210ee5a9 100644 --- a/i18n/ca.json +++ b/i18n/ca.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Registre automàtic", "oauth_auto_register_description": "Registra nous usuaris automàticament desprÊs d'iniciar sessiÃŗ amb OAuth", "oauth_button_text": "Text del botÃŗ", - "oauth_client_id": "ID Client", - "oauth_client_secret": "Secret de Client", "oauth_enable_description": "Iniciar sessiÃŗ amb OAuth", - "oauth_issuer_url": "URL de l'emissor", "oauth_mobile_redirect_uri": "URI de redirecciÃŗ mÃ˛bil", "oauth_mobile_redirect_uri_override": "Sobreescriu l'URI de redirecciÃŗ mÃ˛bil", "oauth_mobile_redirect_uri_override_description": "Habilita quan el proveïdor d'OAuth no permet una URI mÃ˛bil, com ara '{callback}'", - "oauth_profile_signing_algorithm": "Algoritme de signatura del perfil", - "oauth_profile_signing_algorithm_description": "Algoritme utilitzat per signar el perfil d’usuari.", - "oauth_scope": "Abast", "oauth_settings": "OAuth", "oauth_settings_description": "Gestiona la configuraciÃŗ de l'inici de sessiÃŗ OAuth", "oauth_settings_more_details": "Per a mÊs detalls sobre aquesta funcionalitat, consulteu la documentaciÃŗ.", - "oauth_signing_algorithm": "Algorisme de signatura", "oauth_storage_label_claim": "PeticiÃŗ d'etiquetatge d'emmagatzematge", "oauth_storage_label_claim_description": "Estableix automàticament l'etiquetatge d'emmagatzematge de l'usuari a aquest valor.", "oauth_storage_quota_claim": "Quota d'emmagatzematge reclamada", diff --git a/i18n/cs.json b/i18n/cs.json index 46cde0affd..039df198d9 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -192,26 +192,22 @@ "oauth_auto_register": "AutomatickÃĄ registrace", "oauth_auto_register_description": "Automaticky registrovat novÊ uÅživatele po přihlÃĄÅĄení pomocí OAuth", "oauth_button_text": "Text tlačítka", - "oauth_client_id": "Client ID", - "oauth_client_secret": "Client Secret", + "oauth_client_secret_description": "VyÅžaduje se, pokud poskytovatel OAuth nepodporuje PKCE (Proof Key for Code Exchange)", "oauth_enable_description": "PřihlÃĄsit pomocí OAuth", - "oauth_issuer_url": "URL vydavatele", "oauth_mobile_redirect_uri": "Mobilní přesměrovÃĄní URI", "oauth_mobile_redirect_uri_override": "Přepsat mobilní přesměrovÃĄní URI", "oauth_mobile_redirect_uri_override_description": "Povolit, pokud poskytovatel OAuth nepovoluje mobilní URI, například '{callback}'", - "oauth_profile_signing_algorithm": "Algoritmus podepisovÃĄní profilu", - "oauth_profile_signing_algorithm_description": "Algoritmus pouÅžitÃŊ k podepsÃĄní profilu uÅživatele.", - "oauth_scope": "Rozsah", "oauth_settings": "OAuth", "oauth_settings_description": "SprÃĄva nastavení OAuth přihlÃĄÅĄení", "oauth_settings_more_details": "DalÅĄÃ­ podrobnosti o tÊto funkci naleznete v dokumentaci.", - "oauth_signing_algorithm": "Algoritmus podepisovÃĄní", "oauth_storage_label_claim": "Deklarace ÅĄtítku ÃēloÅžiÅĄtě", "oauth_storage_label_claim_description": "Automaticky nastavit ÅĄtítek ÃēloÅžiÅĄtě uÅživatele na hodnotu tÊto deklarace.", "oauth_storage_quota_claim": "Deklarace kvÃŗty ÃēloÅžiÅĄtě", "oauth_storage_quota_claim_description": "Automaticky nastavit kvÃŗtu ÃēloÅžiÅĄtě uÅživatele na hodnotu tÊto deklarace.", "oauth_storage_quota_default": "VÃŊchozí kvÃŗta ÃēloÅžiÅĄtě (GiB)", "oauth_storage_quota_default_description": "KvÃŗta v GiB, kterÃĄ se pouÅžije, pokud není poskytnuta ÅžÃĄdnÃĄ deklarace (pro neomezenou kvÃŗtu zadejte 0).", + "oauth_timeout": "ČasovÃŊ limit poÅžadavku", + "oauth_timeout_description": "ČasovÃŊ limit pro poÅžadavky v milisekundÃĄch", "offline_paths": "Cesty offline", "offline_paths_description": "Tyto vÃŊsledky mohou bÃŊt způsobeny ručním odstraněním souborů, kterÊ nejsou souÄÃĄstí externí knihovny.", "password_enable_description": "PřihlÃĄÅĄení pomocí e-mailu a hesla", @@ -818,7 +814,7 @@ "enabled": "Povoleno", "end_date": "KonečnÊ datum", "enqueued": "Ve frontě", - "enter_wifi_name": "Zadejte nÃĄzev WiFi", + "enter_wifi_name": "Zadejte nÃĄzev Wi-Fi", "error": "Chyba", "error_change_sort_album": "Nepodařilo se změnit pořadí alba", "error_delete_face": "Chyba při odstraňovÃĄní obličeje z poloÅžky", @@ -853,10 +849,12 @@ "failed_to_keep_this_delete_others": "Nepodařilo se zachovat tuto poloÅžku a odstranit ostatní poloÅžky", "failed_to_load_asset": "Nepodařilo se načíst poloÅžku", "failed_to_load_assets": "Nepodařilo se načíst poloÅžky", + "failed_to_load_notifications": "Nepodařilo se načíst oznÃĄmení", "failed_to_load_people": "Chyba načítÃĄní osob", "failed_to_remove_product_key": "Nepodařilo se odebrat klíč produktu", "failed_to_stack_assets": "Nepodařilo se seskupit poloÅžky", "failed_to_unstack_assets": "Nepodařilo se rozloÅžit poloÅžky", + "failed_to_update_notification_status": "Nepodařilo se aktualizovat stav oznÃĄmení", "import_path_already_exists": "Tato cesta importu jiÅž existuje.", "incorrect_email_or_password": "NesprÃĄvnÃŊ e-mail nebo heslo", "paths_validation_failed": "{paths, plural, one {# cesta neproÅĄla} few {# cesty neproÅĄly} other {# cest neproÅĄlo}} kontrolou", @@ -978,7 +976,7 @@ "external": "Externí", "external_libraries": "Externí knihovny", "external_network": "Externí síÅĨ", - "external_network_sheet_info": "Pokud nejste v preferovanÊ síti WiFi, aplikace se připojí k serveru prostřednictvím první z níŞe uvedenÃŊch adres URL, kterÊ můŞe dosÃĄhnout, počínaje shora dolů", + "external_network_sheet_info": "Pokud nejste v preferovanÊ síti Wi-Fi, aplikace se připojí k serveru prostřednictvím první z níŞe uvedenÃŊch adres URL, kterÊ můŞe dosÃĄhnout, počínaje shora dolů", "face_unassigned": "Nepřiřazena", "failed": "Selhalo", "failed_to_load_assets": "Nepodařilo se načíst poloÅžky", @@ -1125,7 +1123,7 @@ "local_network": "Místní síÅĨ", "local_network_sheet_info": "Aplikace se při pouÅžití zadanÊ sítě Wi-Fi připojí k serveru prostřednictvím tohoto URL", "location_permission": "OprÃĄvnění polohy", - "location_permission_content": "Aby bylo moÅžnÊ pouŞívat funkci automatickÊho přepínÃĄní, potřebuje Immich oprÃĄvnění k přesnÊ poloze, aby mohl přečíst nÃĄzev aktuÃĄlní WiFi sítě", + "location_permission_content": "Aby bylo moÅžnÊ pouŞívat funkci automatickÊho přepínÃĄní, potřebuje Immich oprÃĄvnění k přesnÊ poloze, aby mohl přečíst nÃĄzev aktuÃĄlní sítě Wi-Fi", "location_picker_choose_on_map": "Vyberte na mapě", "location_picker_latitude_error": "Zadejte platnou zeměpisnou ÅĄÃ­Å™ku", "location_picker_latitude_hint": "Zadejte vlastní zeměpisnou ÅĄÃ­Å™ku", @@ -1199,6 +1197,9 @@ "map_settings_only_show_favorites": "Zobrazit pouze oblíbenÊ", "map_settings_theme_settings": "Motiv mapy", "map_zoom_to_see_photos": "OddÃĄlit pro zobrazení fotografií", + "mark_all_as_read": "Označit vÅĄe jako přečtenÊ", + "mark_as_read": "Označit jako přečtenÊ", + "marked_all_as_read": "VÅĄe označeno jako přečtenÊ", "matches": "Shody", "media_type": "Typ mÊdia", "memories": "Vzpomínky", @@ -1225,6 +1226,8 @@ "month": "Měsíc", "monthly_title_text_date_format": "LLLL y", "more": "Více", + "moved_to_archive": "{count, plural, one {Přesunuta # poloÅžka} few {Přesunuty # poloÅžky} other {Přesunuto # poloÅžek}} do archivu", + "moved_to_library": "{count, plural, one {Přesunuta # poloÅžka} few {Přesunuty # poloÅžky} other {Přesunuto # poloÅžek}} do knihovny", "moved_to_trash": "Přesunuto do koÅĄe", "multiselect_grid_edit_date_time_err_read_only": "Nelze upravit datum poloÅžek pouze pro čtení, přeskakuji", "multiselect_grid_edit_gps_err_read_only": "Nelze upravit polohu poloÅžek pouze pro čtení, přeskakuji", @@ -1257,6 +1260,8 @@ "no_favorites_message": "Přidejte si oblíbenÊ poloÅžky a rychle najděte svÊ nejlepÅĄÃ­ obrÃĄzky a videa", "no_libraries_message": "Vytvořte si externí knihovnu pro zobrazení fotografií a videí", "no_name": "Bez jmÊna", + "no_notifications": "ÅŊÃĄdnÃĄ oznÃĄmení", + "no_people_found": "Nebyli nalezeni ÅžÃĄdní odpovídající lidÊ", "no_places": "ÅŊÃĄdnÃĄ místa", "no_results": "ÅŊÃĄdnÊ vÃŊsledky", "no_results_description": "Zkuste pouŞít synonymum nebo obecnějÅĄÃ­ klíčovÊ slovo", @@ -1432,6 +1437,8 @@ "recent_searches": "NedÃĄvnÃĄ vyhledÃĄvÃĄní", "recently_added": "NedÃĄvno přidanÊ", "recently_added_page_title": "NedÃĄvno přidanÊ", + "recently_taken": "NedÃĄvno pořízenÊ", + "recently_taken_page_title": "NedÃĄvno pořízenÊ", "refresh": "Obnovit", "refresh_encoded_videos": "Obnovit kÃŗdovanÃĄ videa", "refresh_faces": "Obnovit obličeje", @@ -1566,6 +1573,7 @@ "select_keep_all": "Vybrat ponechat vÅĄe", "select_library_owner": "Vyberte vlastníka knihovny", "select_new_face": "VÃŊběr novÊho obličeje", + "select_person_to_tag": "Vyberte osobu, kterou chcete označit", "select_photos": "Vybrat fotky", "select_trash_all": "Vybrat vyhodit vÅĄe", "select_user_for_sharing_page_err_album": "Nepodařilo se vytvořit album", @@ -1889,11 +1897,11 @@ "week": "TÃŊden", "welcome": "Vítejte", "welcome_to_immich": "Vítejte v Immichi", - "wifi_name": "NÃĄzev WiFi", + "wifi_name": "NÃĄzev Wi-Fi", "year": "Rok", "years_ago": "Před {years, plural, one {rokem} other {# lety}}", "yes": "Ano", "you_dont_have_any_shared_links": "NemÃĄte ÅžÃĄdnÊ sdílenÊ odkazy", - "your_wifi_name": "VÃĄÅĄ nÃĄzev WiFi", + "your_wifi_name": "NÃĄzev vaÅĄÃ­ Wi-Fi", "zoom_image": "ZvětÅĄit obrÃĄzek" } diff --git a/i18n/da.json b/i18n/da.json index a9aaef523c..e5e9e017aa 100644 --- a/i18n/da.json +++ b/i18n/da.json @@ -72,6 +72,9 @@ "image_format_description": "WebP producerer mindre filer end JPEG, men er langsommere at komprimere.", "image_fullsize_description": "Fuld størrelses billede uden metadata, brugt nÃĨr zoomet ind", "image_fullsize_enabled": "Aktiver fuld størrelses billede generering", + "image_fullsize_enabled_description": "Generer fuld-størrelses billede for ikke-web-venlige formater. NÃĨr \"ForetrÃĻk indlejret forhÃĨndsvisning\" er slÃĨet til, bliver indlejrede forhÃĨndsvisninger brugt direkte uden konvertering. PÃĨvirker ikke web-venlige formater sÃĨsom JPEG.", + "image_fullsize_quality_description": "Fuld-størrelses billede kvalitet fra 1-100. Højere er bedre, men producerer større filer.", + "image_fullsize_title": "Full-størrelses billede indstillinger", "image_prefer_embedded_preview": "ForetrÃĻk indlejret forhÃĨndsvisning", "image_prefer_embedded_preview_setting_description": "Brug indlejrede forhÃĨndsvisninger i RAW fotos som input til billedbehandling og nÃĨr det er tilgÃĻngeligt. Dette kan give mere nøjagtige farver for nogle billeder, men kvaliteten af forhÃĨndsvisningen er kameraafhÃĻngig, og billedet kan have flere komprimeringsartefakter.", "image_prefer_wide_gamut": "ForetrÃĻkker bred farveskala", @@ -189,20 +192,13 @@ "oauth_auto_register": "AutoregistrÊr", "oauth_auto_register_description": "RegistrÊr automatisk nye brugere efter at have logget ind med OAuth", "oauth_button_text": "Knaptekst", - "oauth_client_id": "Kunde-ID", - "oauth_client_secret": "Kundehemmelighed", "oauth_enable_description": "Log ind med OAuth", - "oauth_issuer_url": "Udsteder-URL", "oauth_mobile_redirect_uri": "Mobilomdiregerings-URL", "oauth_mobile_redirect_uri_override": "TilsidesÃĻttelse af mobil omdiregerings-URL", "oauth_mobile_redirect_uri_override_description": "Aktiver, nÃĨr OAuth-udbyderen ikke tillader en mobil URI, som '{callback}'", - "oauth_profile_signing_algorithm": "Log-ind-algoritme", - "oauth_profile_signing_algorithm_description": "Algoritme til signering af brugerprofilen.", - "oauth_scope": "Omfang", "oauth_settings": "OAuth", "oauth_settings_description": "Administrer OAuth login-indstillinger", "oauth_settings_more_details": "LÃĻs flere detaljer om funktionen i dokumentationen.", - "oauth_signing_algorithm": "Signeringsalgoritme", "oauth_storage_label_claim": "LagringsmÃĻrkat fordring", "oauth_storage_label_claim_description": "SÃĻt automatisk brugerens lagringsmÃĻrkat til denne fordrings vÃĻrdi.", "oauth_storage_quota_claim": "Lagringskvotefordring", diff --git a/i18n/de.json b/i18n/de.json index b0649474fd..f0b0763886 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -106,7 +106,7 @@ "library_scanning_enable_description": "Regelmäßiges Scannen der Bibliothek aktivieren", "library_settings": "Externe Bibliothek", "library_settings_description": "Einstellungen externer Bibliotheken verwalten", - "library_tasks_description": "ÜberprÃŧfe externe Bibliotheken auf neue oder veränderte Medien", + "library_tasks_description": "ÜberprÃŧfe externe Bibliotheken auf neue und/oder veränderte Medien", "library_watching_enable_description": "Überwache externe Bibliotheken auf Dateiänderungen", "library_watching_settings": "BibliotheksÃŧberwachung (EXPERIMENTELL)", "library_watching_settings_description": "Automatisch auf geänderte Dateien prÃŧfen", @@ -192,32 +192,28 @@ "oauth_auto_register": "Automatische Registrierung", "oauth_auto_register_description": "Automatische Registrierung neuer Benutzer nach der OAuth-Anmeldung", "oauth_button_text": "Button-Text", - "oauth_client_id": "Client-ID", - "oauth_client_secret": "Client-Geheimnis", + "oauth_client_secret_description": "Erforderlich wenn PKCE (Proof Key for Code Exchange) nicht vom OAuth- Anbieter unterstÃŧtzt wird", "oauth_enable_description": "Anmeldung mit OAuth", - "oauth_issuer_url": "Aussteller-URL", "oauth_mobile_redirect_uri": "Mobile Umleitungs-URI", "oauth_mobile_redirect_uri_override": "Mobile Umleitungs-URI Ãŧberschreiben", "oauth_mobile_redirect_uri_override_description": "Einschalten, wenn der OAuth-Anbieter keine mobile URI wie '{callback}' erlaubt", - "oauth_profile_signing_algorithm": "Algorithmus zur Profilsignierung", - "oauth_profile_signing_algorithm_description": "Dieser Algorithmus wird fÃŧr die Signatur des Benutzerprofils verwendet.", - "oauth_scope": "Umfang", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth-Anmeldeeinstellungen verwalten", "oauth_settings_more_details": "Weitere Informationen zu dieser Funktion findest du in der Dokumentation.", - "oauth_signing_algorithm": "Signier-Algorithmus", "oauth_storage_label_claim": "Speicherpfadbezeichnung", "oauth_storage_label_claim_description": "Die Speicherpfadbezeichnung des Benutzers automatisch auf den Wert dieser Eingabe setzen.", "oauth_storage_quota_claim": "Speicherkontingentangabe", "oauth_storage_quota_claim_description": "Setzen Sie das Speicherkontingent des Benutzers automatisch auf den angegebenen Wert.", "oauth_storage_quota_default": "Standard-Speicherplatzkontingent (GiB)", "oauth_storage_quota_default_description": "Kontingent in GiB, das verwendet werden soll, wenn keines Ãŧbermittelt wird (gib 0 fÃŧr ein unbegrenztes Kontingent ein).", + "oauth_timeout": "ZeitÃŧberschreitung bei Anfrage", + "oauth_timeout_description": "ZeitÃŧberschreitung fÃŧr Anfragen in Millisekunden", "offline_paths": "Offline-Pfade", - "offline_paths_description": "Die Ergebnisse kÃļnnten durch manuelles LÃļschen von Dateien, die nicht Teil einer externen Bibliothek sind, verursacht sein.", - "password_enable_description": "Login mit E-Mail und Passwort", - "password_settings": "Passwort-Login", + "offline_paths_description": "Dies kÃļnnte durch manuelles LÃļschen von Dateien, die nicht Teil einer externen Bibliothek sind, verursacht sein.", + "password_enable_description": "Mit E-Mail und Passwort anmelden", + "password_settings": "Passwort-Anmeldung", "password_settings_description": "Passwort-Anmeldeeinstellungen verwalten", - "paths_validated_successfully": "Alle Pfade wurden erfolgreich validiert", + "paths_validated_successfully": "Alle Pfade erfolgreich ÃŧberprÃŧft", "person_cleanup_job": "Personen aufräumen", "quota_size_gib": "Kontingent (GiB)", "refreshing_all_libraries": "Alle Bibliotheken aktualisieren", @@ -251,7 +247,7 @@ "storage_template_hash_verification_enabled_description": "Aktiviert die Hash-Verifizierung. Deaktiviere diese Option nur, wenn du dir Ãŧber die damit verbundenen Auswirkungen im Klaren bist", "storage_template_migration": "Migration von Speichervorlagen", "storage_template_migration_description": "Diese Aufgabe wendet die aktuelle {template} auf zuvor hochgeladene Dateien an", - "storage_template_migration_info": "Die Vorlage wird alle Dateierweiterungen in Kleinbuchstaben umwandeln. Vorlagenänderungen gelten nur fÃŧr neue Dateien. Um die Vorlage rÃŧckwirkend auf bereits hochgeladene Assets anzuwenden, fÃŧhre den {job} aus.", + "storage_template_migration_info": "Die Speichervorlage wird alle Dateierweiterungen in Kleinbuchstaben umwandeln. Vorlagenänderungen gelten nur fÃŧr neue Dateien. Um die Vorlage rÃŧckwirkend auf bereits hochgeladene Assets anzuwenden, fÃŧhre den {job} aus.", "storage_template_migration_job": "Speichervorlagenmigrations-Aufgabe", "storage_template_more_details": "Weitere Details zu dieser Funktion findest du unter Speichervorlage und dessen Implikationen", "storage_template_onboarding_description": "Wenn aktiviert, sortiert diese Funktion Dateien automatisch basierend auf einer benutzerdefinierten Vorlage. Aufgrund von Stabilitätsproblemen ist die Funktion standardmäßig deaktiviert. Weitere Informationen findest du in der Dokumentation.", @@ -481,18 +477,18 @@ "assets_added_to_album_count": "{count, plural, one {# Datei} other {# Dateien}} zum Album hinzugefÃŧgt", "assets_added_to_name_count": "{count, plural, one {# Element} other {# Elemente}} zu {hasName, select, true {{name}} other {neuem Album}} hinzugefÃŧgt", "assets_count": "{count, plural, one {# Datei} other {# Dateien}}", - "assets_deleted_permanently": "{} Datei/en permanent gelÃļscht", - "assets_deleted_permanently_from_server": "{} Datei/en wurden permanent vom Immich Server gelÃļscht", + "assets_deleted_permanently": "{} Element(e) permanent gelÃļscht", + "assets_deleted_permanently_from_server": "{} Element(e) permanent vom Immich-Server gelÃļscht", "assets_moved_to_trash_count": "{count, plural, one {# Datei} other {# Dateien}} in den Papierkorb verschoben", "assets_permanently_deleted_count": "{count, plural, one {# Datei} other {# Dateien}} endgÃŧltig gelÃļscht", "assets_removed_count": "{count, plural, one {# Datei} other {# Dateien}} entfernt", - "assets_removed_permanently_from_device": "{} Datei/en wurden permanent vom Gerät gelÃļscht", + "assets_removed_permanently_from_device": "{} Element(e) permanent von Ihrem Gerät gelÃļscht", "assets_restore_confirmation": "Bist du sicher, dass du alle Dateien aus dem Papierkorb wiederherstellen willst? Diese Aktion kann nicht rÃŧckgängig gemacht werden! Beachte, dass Offline-Dateien auf diese Weise nicht wiederhergestellt werden kÃļnnen.", "assets_restored_count": "{count, plural, one {# Datei} other {# Dateien}} wiederhergestellt", - "assets_restored_successfully": "{} Datei/en erfolgreich wiederhergestellt", - "assets_trashed": "{} Datei/en gelÃļscht", + "assets_restored_successfully": "{} Element(e) erfolgreich wiederhergestellt", + "assets_trashed": "{} Element(e) gelÃļscht", "assets_trashed_count": "{count, plural, one {# Datei} other {# Dateien}} in den Papierkorb verschoben", - "assets_trashed_from_server": "{} Datei/en vom Immich-Server gelÃļscht", + "assets_trashed_from_server": "{} Element(e) vom Immich-Server gelÃļscht", "assets_were_part_of_album_count": "{count, plural, one {# Datei ist} other {# Dateien sind}} bereits im Album vorhanden", "authorized_devices": "Verwendete Geräte", "automatic_endpoint_switching_subtitle": "Verbinden Sie sich lokal Ãŧber ein bestimmtes WLAN, wenn es verfÃŧgbar ist, und verwenden Sie andere VerbindungsmÃļglichkeiten anderswo", @@ -535,7 +531,7 @@ "backup_controller_page_backup": "Sicherung", "backup_controller_page_backup_selected": "Ausgewählt: ", "backup_controller_page_backup_sub": "Gesicherte Fotos und Videos", - "backup_controller_page_created": "Erstellt: {}", + "backup_controller_page_created": "Erstellt am: {}", "backup_controller_page_desc_backup": "Aktiviere die Sicherung, um Elemente immer automatisch auf den Server zu laden, während du die App benutzt.", "backup_controller_page_excluded": "Ausgeschlossen: ", "backup_controller_page_failed": "Fehlgeschlagen ({})", @@ -580,7 +576,7 @@ "cache_settings_duplicated_assets_clear_button": "LEEREN", "cache_settings_duplicated_assets_subtitle": "Fotos und Videos, die von der App blockiert werden", "cache_settings_duplicated_assets_title": "Duplikate ({})", - "cache_settings_image_cache_size": "{} Bilder im Zwischenspeicher", + "cache_settings_image_cache_size": "Bilder im Zwischenspeicher ({} Bilder)", "cache_settings_statistics_album": "Vorschaubilder der Bibliothek", "cache_settings_statistics_assets": "{} Elemente ({})", "cache_settings_statistics_full": "Originalbilder", @@ -588,7 +584,7 @@ "cache_settings_statistics_thumbnail": "Vorschaubilder", "cache_settings_statistics_title": "Zwischenspeicher-Nutzung", "cache_settings_subtitle": "Kontrollieren, wie Immich den Zwischenspeicher nutzt", - "cache_settings_thumbnail_size": "{} Vorschaubilder im Zwischenspeicher", + "cache_settings_thumbnail_size": "Vorschaubilder im Zwischenspeicher ({} Bilder)", "cache_settings_tile_subtitle": "Lokalen Speicher verwalten", "cache_settings_tile_title": "Lokaler Speicher", "cache_settings_title": "Zwischenspeicher Einstellungen", @@ -647,8 +643,8 @@ "comments_and_likes": "Kommentare & Likes", "comments_are_disabled": "Kommentare sind deaktiviert", "common_create_new_album": "Neues Album erstellen", - "common_server_error": "Bitte ÃŧberprÃŧfe Deine Netzwerkverbindung und stelle sicher, dass die App und Server Versionen kompatibel sind.", - "completed": "Fertig", + "common_server_error": "Bitte ÃŧberprÃŧfe deine Netzwerkverbindung und stelle sicher, dass die App und Server Versionen kompatibel sind.", + "completed": "Abgeschlossen", "confirm": "Bestätigen", "confirm_admin_password": "Administrator Passwort bestätigen", "confirm_delete_face": "Bist du sicher dass du das Gesicht von {name} aus der Datei entfernen willst?", @@ -853,10 +849,12 @@ "failed_to_keep_this_delete_others": "Fehler beim LÃļschen der anderen Dateien", "failed_to_load_asset": "Fehler beim Laden der Datei", "failed_to_load_assets": "Fehler beim Laden der Dateien", + "failed_to_load_notifications": "Fehler beim Laden der Benachrichtigungen", "failed_to_load_people": "Fehler beim Laden von Personen", "failed_to_remove_product_key": "Fehler beim Entfernen des ProduktschlÃŧssels", "failed_to_stack_assets": "Dateien konnten nicht gestapelt werden", "failed_to_unstack_assets": "Dateien konnten nicht entstapelt werden", + "failed_to_update_notification_status": "Benachrichtigungsstatus aktualisieren fehlgeschlagen", "import_path_already_exists": "Dieser Importpfad existiert bereits.", "incorrect_email_or_password": "UngÃŧltige E-Mail oder Passwort", "paths_validation_failed": "{paths, plural, one {# Pfad konnte} other {# Pfade konnten}} nicht validiert werden", @@ -960,7 +958,7 @@ "exif_bottom_sheet_person_age": "Alter {}", "exif_bottom_sheet_person_age_months": "{} Monate alt", "exif_bottom_sheet_person_age_year_months": "1 Jahr, {} Monate alt", - "exif_bottom_sheet_person_age_years": "{} alt", + "exif_bottom_sheet_person_age_years": "Alter {}", "exit_slideshow": "Diashow beenden", "expand_all": "Alle aufklappen", "experimental_settings_new_asset_list_subtitle": "In Arbeit", @@ -969,7 +967,7 @@ "experimental_settings_title": "Experimentell", "expire_after": "Verfällt nach", "expired": "Verfallen", - "expires_date": "Läuft {date} ab", + "expires_date": "Läuft am {date} ab", "explore": "Erkunden", "explorer": "Datei-Explorer", "export": "Exportieren", @@ -1125,7 +1123,7 @@ "local_network": "Lokales Netzwerk", "local_network_sheet_info": "Die App stellt Ãŧber diese URL eine Verbindung zum Server her, wenn sie das angegebene WLAN-Netzwerk verwendet", "location_permission": "Standort Genehmigung", - "location_permission_content": "Um die automatische Umschaltfunktion nutzen zu kÃļnnen, benÃļtigt Immich eine genaue Standortberechtigung, damit es den Namen des aktuellen WLAN-Netzwerks ermitteln kann", + "location_permission_content": "Um die automatische Umschaltfunktion nutzen zu kÃļnnen, benÃļtigt Immich genaue Standortberechtigung, damit es den Namen des aktuellen WLAN-Netzwerks ermitteln kann", "location_picker_choose_on_map": "Auf der Karte auswählen", "location_picker_latitude_error": "GÃŧltigen Breitengrad eingeben", "location_picker_latitude_hint": "Breitengrad eingeben", @@ -1190,15 +1188,18 @@ "map_settings": "Karteneinstellungen", "map_settings_dark_mode": "Dunkler Modus", "map_settings_date_range_option_day": "Letzte 24 Stunden", - "map_settings_date_range_option_days": "Letzte {} Tage", + "map_settings_date_range_option_days": "Letzten {} Tage", "map_settings_date_range_option_year": "Letztes Jahr", - "map_settings_date_range_option_years": "Letzte {} Jahre", + "map_settings_date_range_option_years": "Letzten {} Jahre", "map_settings_dialog_title": "Karteneinstellungen", "map_settings_include_show_archived": "Archivierte anzeigen", "map_settings_include_show_partners": "Partner einbeziehen", "map_settings_only_show_favorites": "Nur Favoriten anzeigen", "map_settings_theme_settings": "Karten Design", "map_zoom_to_see_photos": "Ansicht verkleinern um Fotos zu sehen", + "mark_all_as_read": "Alle als gelesen markieren", + "mark_as_read": "Als gelesen markieren", + "marked_all_as_read": "Alle als gelesen markiert", "matches": "Treffer", "media_type": "Medientyp", "memories": "Erinnerungen", @@ -1208,7 +1209,7 @@ "memories_start_over": "Erneut beginnen", "memories_swipe_to_close": "Nach oben Wischen zum schließen", "memories_year_ago": "ein Jahr her", - "memories_years_ago": "{} Jahre her", + "memories_years_ago": "Vor {} Jahren", "memory": "Erinnerung", "memory_lane_title": "Foto-Erinnerungen {title}", "menu": "MenÃŧ", @@ -1225,6 +1226,8 @@ "month": "Monat", "monthly_title_text_date_format": "MMMM y", "more": "Mehr", + "moved_to_archive": "{count, plural, one {# Datei} other {# Dateien}} archiviert", + "moved_to_library": "{count, plural, one {# Datei} other {# Dateien}} in die Bibliothek verschoben", "moved_to_trash": "In den Papierkorb verschoben", "multiselect_grid_edit_date_time_err_read_only": "Das Datum und die Uhrzeit von schreibgeschÃŧtzten Inhalten kann nicht verändert werden, Ãŧberspringen", "multiselect_grid_edit_gps_err_read_only": "Der Aufnahmeort von schreibgeschÃŧtzten Inhalten kann nicht verändert werden, Ãŧberspringen", @@ -1257,6 +1260,8 @@ "no_favorites_message": "FÃŧge Favoriten hinzu, um deine besten Bilder und Videos schnell zu finden", "no_libraries_message": "Eine externe Bibliothek erstellen, um deine Fotos und Videos anzusehen", "no_name": "Kein Name", + "no_notifications": "Keine Benachrichtigungen", + "no_people_found": "Keine passenden Personen gefunden", "no_places": "Keine Orte", "no_results": "Keine Ergebnisse", "no_results_description": "Versuche es mit einem Synonym oder einem allgemeineren Stichwort", @@ -1377,7 +1382,7 @@ "profile_drawer_app_logs": "Logs", "profile_drawer_client_out_of_date_major": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Major-Version.", "profile_drawer_client_out_of_date_minor": "Mobile-App ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.", - "profile_drawer_client_server_up_to_date": "Die App-Version / Server-Version sind aktuell", + "profile_drawer_client_server_up_to_date": "Die App- und Server-Versionen sind aktuell", "profile_drawer_github": "GitHub", "profile_drawer_server_out_of_date_major": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Major-Version.", "profile_drawer_server_out_of_date_minor": "Server-Version ist veraltet. Bitte aktualisiere auf die neueste Minor-Version.", @@ -1432,6 +1437,8 @@ "recent_searches": "Letzte Suchen", "recently_added": "KÃŧrzlich hinzugefÃŧgt", "recently_added_page_title": "Zuletzt hinzugefÃŧgt", + "recently_taken": "KÃŧrzlich aufgenommen", + "recently_taken_page_title": "KÃŧrzlich aufgenommen", "refresh": "Aktualisieren", "refresh_encoded_videos": "Kodierte Videos aktualisieren", "refresh_faces": "Gesichter aktualisieren", @@ -1566,6 +1573,7 @@ "select_keep_all": "Alle behalten", "select_library_owner": "Bibliotheksbesitzer auswählen", "select_new_face": "Neues Gesicht auswählen", + "select_person_to_tag": "Wählen Sie eine Person zum Markieren aus", "select_photos": "Fotos auswählen", "select_trash_all": "Alle lÃļschen", "select_user_for_sharing_page_err_album": "Album konnte nicht erstellt werden", @@ -1596,7 +1604,7 @@ "setting_languages_apply": "Anwenden", "setting_languages_subtitle": "App-Sprache ändern", "setting_languages_title": "Sprachen", - "setting_notifications_notify_failures_grace_period": "Benachrichtigung bei Fehler/n in der Hintergrundsicherung: {}", + "setting_notifications_notify_failures_grace_period": "Benachrichtigung bei Fehler(n) in der Hintergrundsicherung: {}", "setting_notifications_notify_hours": "{} Stunden", "setting_notifications_notify_immediately": "sofort", "setting_notifications_notify_minutes": "{} Minuten", @@ -1636,25 +1644,25 @@ "shared_link_create_error": "Fehler beim Erstellen der Linkfreigabe", "shared_link_edit_description_hint": "Beschreibung eingeben", "shared_link_edit_expire_after_option_day": "1 Tag", - "shared_link_edit_expire_after_option_days": "{} Tage", + "shared_link_edit_expire_after_option_days": "{} Tagen", "shared_link_edit_expire_after_option_hour": "1 Stunde", "shared_link_edit_expire_after_option_hours": "{} Stunden", "shared_link_edit_expire_after_option_minute": "1 Minute", "shared_link_edit_expire_after_option_minutes": "{} Minuten", - "shared_link_edit_expire_after_option_months": "{} Monate", + "shared_link_edit_expire_after_option_months": "{} Monaten", "shared_link_edit_expire_after_option_year": "{} Jahr", "shared_link_edit_password_hint": "Passwort eingeben", "shared_link_edit_submit_button": "Link aktualisieren", "shared_link_error_server_url_fetch": "Fehler beim Ermitteln der Server-URL", - "shared_link_expires_day": "Verfällt in {} Tag", - "shared_link_expires_days": "Verfällt in {} Tagen", - "shared_link_expires_hour": "Verfällt in {} Stunde", - "shared_link_expires_hours": "Verfällt in {} Stunden", - "shared_link_expires_minute": "Verfällt in {} Minute", - "shared_link_expires_minutes": "Verfällt in {} Minuten", + "shared_link_expires_day": "Läuft ab in {} Tag", + "shared_link_expires_days": "Läuft ab in {} Tagen", + "shared_link_expires_hour": "Läuft ab in {} Stunde", + "shared_link_expires_hours": "Läuft ab in {} Stunden", + "shared_link_expires_minute": "Läuft ab in {} Minute", + "shared_link_expires_minutes": "Läuft ab in {} Minuten", "shared_link_expires_never": "Läuft nie ab", - "shared_link_expires_second": "Verfällt in {} Sekunde", - "shared_link_expires_seconds": "Verfällt in {} Sekunden", + "shared_link_expires_second": "Läuft ab in {} Sekunde", + "shared_link_expires_seconds": "Läuft ab in {} Sekunden", "shared_link_individual_shared": "Individuell geteilt", "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "Geteilte Links verwalten", @@ -1745,7 +1753,7 @@ "tag_assets": "Dateien taggen", "tag_created": "Tag erstellt: {tag}", "tag_feature_description": "Durchsuchen von Fotos und Videos, gruppiert nach logischen Tag-Themen", - "tag_not_found_question": "Kein Tag zu finden? Erstelle einen neuen Tag.", + "tag_not_found_question": "Kein Tag vorhanden? Erstelle einen neuen Tag.", "tag_people": "Personen taggen", "tag_updated": "Tag aktualisiert: {tag}", "tagged_assets": "{count, plural, one {# Datei} other {# Dateien}} getagged", @@ -1832,7 +1840,7 @@ "upload_status_errors": "Fehler", "upload_status_uploaded": "Hochgeladen", "upload_success": "Hochladen erfolgreich. Aktualisiere die Seite, um neue hochgeladene Dateien zu sehen.", - "upload_to_immich": "Zu Immich hochladen ({})", + "upload_to_immich": "Auf Immich hochladen ({})", "uploading": "Wird hochgeladen", "url": "URL", "usage": "Verwendung", diff --git a/i18n/el.json b/i18n/el.json index a8a56f5122..305f34e7d0 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -14,7 +14,7 @@ "add_a_location": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŧÎ¯ÎąĪ‚ Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯ÎąĪ‚", "add_a_name": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚", "add_a_title": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī„Î¯Ī„ÎģÎŋĪ…", - "add_endpoint": "Add endpoint", + "add_endpoint": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī„ÎĩÎģΚÎēÎŋĪ ĪƒÎˇÎŧÎĩίÎŋĪ…", "add_exclusion_pattern": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŧÎŋĪ„Î¯Î˛ÎŋĪ… ÎąĪ€ÎŋÎēÎģÎĩÎšĪƒÎŧÎŋĪ", "add_import_path": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŧÎŋÎŊÎŋĪ€ÎąĪ„ÎšÎŋĪ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚", "add_location": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯ÎąĪ‚", @@ -192,20 +192,13 @@ "oauth_auto_register": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇ", "oauth_auto_register_description": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎēÎąĪ„ÎąĪ‡ĪŽĪÎˇĪƒÎˇ ÎŊέÎŋĪ… Ī‡ĪÎŽĪƒĪ„Îˇ ÎąĪ†ÎŋĪ ĪƒĪ…ÎŊδÎĩθÎĩί ÎŧÎĩ OAuth", "oauth_button_text": "ΚÎĩίÎŧÎĩÎŊÎŋ ÎēÎŋĪ…ÎŧĪ€ÎšÎŋĪ", - "oauth_client_id": "Î¤ÎąĪ…Ī„ĪŒĪ„ÎˇĪ„Îą Ī€ÎĩÎģÎŦĪ„Îˇ (Client)", - "oauth_client_secret": "ÎœĪ…ĪƒĪ„ÎšÎēĪŒĪ‚ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ÎĩÎģÎŦĪ„Îˇ", "oauth_enable_description": "ÎŖĪÎŊδÎĩĪƒÎˇ ÎŧÎĩ OAuth", - "oauth_issuer_url": "ΔιÎĩĪÎ¸Ī…ÎŊĪƒÎˇ URL ÎĩÎēÎ´ĪŒĪ„Îˇ", "oauth_mobile_redirect_uri": "URI ΑÎŊÎąÎēÎąĪ„ÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ÎŗÎšÎą ÎēΚÎŊÎˇĪ„ÎŦ Ī„ÎˇÎģÎ­Ī†Ī‰ÎŊÎą", "oauth_mobile_redirect_uri_override": "Î ĪÎŋĪƒĪ€Î­ÎģÎąĪƒÎˇ URI ÎąÎŊÎąÎēÎąĪ„ÎĩĪÎ¸Ī…ÎŊĪƒÎˇĪ‚ ÎŗÎšÎą ÎēΚÎŊÎˇĪ„ÎŦ Ī„ÎˇÎģÎ­Ī†Ī‰ÎŊÎą", "oauth_mobile_redirect_uri_override_description": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îŋ ĪŒĪ„ÎąÎŊ Îŋ Ī€ÎŦ΁Îŋ·ÎŋĪ‚ OAuth δÎĩÎŊ ÎĩĪ€ÎšĪ„ĪÎ­Ī€ÎĩΚ ÎŧΚι URI ÎŗÎšÎą ÎēΚÎŊÎˇĪ„ÎŦ, ĪŒĪ€Ī‰Ī‚ Ī„Îŋ '{callback}'", - "oauth_profile_signing_algorithm": "ΑÎģÎŗĪŒĪÎšÎ¸ÎŧÎŋĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ΀΁ÎŋĪ†Î¯Îģ", - "oauth_profile_signing_algorithm_description": "ΑÎģÎŗĪŒĪÎšÎ¸ÎŧÎŋĪ‚ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą Ī„ÎˇÎŊ ĪƒĪÎŊδÎĩĪƒÎˇ ΄ΉÎŊ Ī‡ĪÎˇĪƒĪ„ĪŽÎŊ.", - "oauth_scope": "Î•ĪĪÎŋĪ‚", "oauth_settings": "OAuth", "oauth_settings_description": "Î”ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩΉÎŊ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ OAuth", "oauth_settings_more_details": "Για Ī€ÎĩĪÎšĪƒĪƒĪŒĪ„Îĩ΁ÎĩĪ‚ ÎģÎĩ΀΄ÎŋÎŧÎ­ĪÎĩΚÎĩĪ‚ ĪƒĪ‡ÎĩĪ„ÎšÎēÎŦ ÎŧÎĩ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ Î´Ī…ÎŊÎąĪ„ĪŒĪ„ÎˇĪ„Îą, ÎąÎŊÎąĪ„ĪÎ­ÎžĪ„Îĩ ĪƒĪ„ÎˇÎŊ Ī„ÎĩÎēÎŧÎˇĪÎ¯Ī‰ĪƒÎˇ.", - "oauth_signing_algorithm": "ΑÎģÎŗĪŒĪÎšÎ¸ÎŧÎŋĪ‚ Ī…Ī€ÎŋÎŗĪÎąĪ†ÎŽĪ‚", "oauth_storage_label_claim": "ΔήÎģĪ‰ĪƒÎˇ ÎĩĪ„ÎšÎēÎ­Ī„ÎąĪ‚ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇĪ‚", "oauth_storage_label_claim_description": "ÎŸĪÎ¯ÎļÎĩΚ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą Ī„ÎˇÎŊ ÎĩĪ„ÎšÎēÎ­Ī„Îą ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇĪ‚ Ī„ÎŋĪ… Ī‡ĪÎŽĪƒĪ„Îˇ ĪƒĪ„Îˇ δΡÎģΉÎŧέÎŊΡ Ī„ÎšÎŧÎŽ.", "oauth_storage_quota_claim": "ΔήÎģĪ‰ĪƒÎˇ Ī€Îŋ΃ÎŋĪƒĪ„ÎŋĪ ÎąĪ€ÎŋθΎÎēÎĩĪ…ĪƒÎˇĪ‚", @@ -375,7 +368,7 @@ "advanced_settings_enable_alternate_media_filter_title": "[ΠΕΙΡΑΜΑΤΙΚΟ] Î§ĪÎŽĪƒÎˇ ÎĩÎŊÎąÎģÎģÎąÎēĪ„ÎšÎēÎŋĪ Ī†Î¯Îģ΄΁ÎŋĪ… ĪƒĪ…ÎŗĪ‡ĪÎŋÎŊÎšĪƒÎŧÎŋĪ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚", "advanced_settings_log_level_title": "Î•Ī€Î¯Ī€ÎĩδÎŋ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚: {}", "advanced_settings_prefer_remote_subtitle": "ΜÎĩĪÎšÎēÎ­Ī‚ ĪƒĪ…ĪƒÎēÎĩĪ…Î­Ī‚ ÎąĪÎŗÎŋĪÎŊ Ī€ÎŋÎģĪ ÎŊÎą ΆÎŋĪĪ„ĪŽĪƒÎŋĪ…ÎŊ ÎŧΚÎē΁ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎąĪ€ĪŒ ÎąĪĪ‡ÎĩÎ¯Îą ĪƒĪ„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ. ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ĪĪÎ¸ÎŧÎšĪƒÎˇ ÎŗÎšÎą ÎŊÎą ΆÎŋĪĪ„ĪŽÎŊÎŋÎŊĪ„ÎąÎš ÎąÎŊĪ„Î¯ ÎąĪ…Ī„ÎŋĪ ÎąĪ€ÎŋÎŧÎąÎēĪĪ…ĪƒÎŧέÎŊÎĩĪ‚ ÎĩΚÎēΌÎŊÎĩĪ‚.", - "advanced_settings_prefer_remote_title": "Î ĪÎŋĪ„Î¯ÎŧÎˇĪƒÎˇ ÎąĪ€ÎŋÎŧÎąÎēĪĪ…ĪƒÎŧέÎŊΉÎŊ ÎĩΚÎēΌÎŊΉÎŊ.", + "advanced_settings_prefer_remote_title": "Î ĪÎŋĪ„Î¯ÎŧÎˇĪƒÎˇ ÎąĪ€ÎŋÎŧÎąÎēĪĪ…ĪƒÎŧέÎŊΉÎŊ ÎĩΚÎēΌÎŊΉÎŊ", "advanced_settings_proxy_headers_subtitle": "ΚαθÎŋĪÎšĪƒÎŧĪŒĪ‚ ÎēÎĩĪ†ÎąÎģÎ¯Î´Ī‰ÎŊ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎŧÎĩ΃ÎŋÎģÎŦÎ˛ÎˇĪƒÎˇĪ‚ Ī€ÎŋĪ… Ī„Îŋ Immich Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą ĪƒĪ„Î­ÎģÎŊÎĩΚ ÎŧÎĩ ÎēÎŦθÎĩ ÎąÎ¯Ī„ÎˇÎŧÎą δΚÎēĪ„ĪÎŋĪ…", "advanced_settings_proxy_headers_title": "ΚÎĩĪ†ÎąÎģίδÎĩĪ‚ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎŧÎĩ΃ÎŋÎģÎŦÎ˛ÎˇĪƒÎˇĪ‚", "advanced_settings_self_signed_ssl_subtitle": "Î ÎąĪÎąÎēÎŦÎŧ΀΄ÎĩΚ Ī„ÎŋÎŊ έÎģÎĩÎŗĪ‡Îŋ Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŋĪ SSL Ī„ÎŋĪ… δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ. Î‘Ī€ÎąĪÎąÎ¯Ī„ÎˇĪ„Îŋ ÎŗÎšÎą ÎąĪ…Ī„Îŋ-Ī…Ī€ÎŋÎŗÎĩÎŗĪÎąÎŧÎŧέÎŊÎą Ī€ÎšĪƒĪ„ÎŋĪ€ÎŋÎšÎˇĪ„ÎšÎēÎŦ.", @@ -405,7 +398,7 @@ "album_share_no_users": "ÎĻÎąÎ¯ÎŊÎĩĪ„ÎąÎš ĪŒĪ„Îš Î­Ī‡ÎĩĪ„Îĩ ÎēÎŋΚÎŊÎŋĪ€ÎŋÎšÎŽĪƒÎĩΚ ÎąĪ…Ī„ĪŒ Ī„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ΃Îĩ ΌÎģÎŋĪ…Ī‚ Ī„ÎŋĪ…Ī‚ Ī‡ĪÎŽĪƒĪ„ÎĩĪ‚ ÎŽ δÎĩÎŊ Î­Ī‡ÎĩĪ„Îĩ Ī‡ĪÎŽĪƒĪ„ÎĩĪ‚ ÎŗÎšÎą ÎŊÎą Ī„Îŋ ÎēÎŋΚÎŊÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ.", "album_thumbnail_card_item": "1 ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎŋ", "album_thumbnail_card_items": "{} ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą", - "album_thumbnail_card_shared": "¡ ΚÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„Îŋ", + "album_thumbnail_card_shared": " ΚÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„Îŋ", "album_thumbnail_shared_by": "ΚÎŋΚÎŊÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋ ÎąĪ€ĪŒ {}", "album_updated": "ΤÎŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ, ÎĩÎŊΡÎŧÎĩĪĪŽÎ¸ÎˇÎēÎĩ", "album_updated_setting_description": "ΛÎŦβÎĩĪ„Îĩ ÎĩΚδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎŧÎ­ĪƒĪ‰ email ĪŒĪ„ÎąÎŊ έÎŊÎą ÎēÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ Î­Ī‡ÎĩΚ ÎŊέι ÎąĪĪ‡ÎĩÎ¯Îą", @@ -474,46 +467,46 @@ "asset_skipped_in_trash": "ÎŖĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ", "asset_uploaded": "ΑÎŊÎĩβÎŦĪƒĪ„ÎˇÎēÎĩ", "asset_uploading": "ΑÎŊÎĩβÎŦÎļÎĩĪ„ÎąÎšâ€Ļ", - "asset_viewer_settings_subtitle": "Manage your gallery viewer settings", + "asset_viewer_settings_subtitle": "Î”ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩΉÎŊ ΀΁ÎŋβÎŋÎģÎŽĪ‚ ĪƒĪ…ÎģÎģÎŋÎŗÎŽĪ‚", "asset_viewer_settings_title": "Î ĪÎŋβÎŋÎģÎŽ ÎŖĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ", "assets": "ΑÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą", "assets_added_count": "Î ĪÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}}", "assets_added_to_album_count": "Î ĪÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}} ĪƒĪ„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "assets_added_to_name_count": "Î ĪÎŋĪƒĪ„Î­Î¸ÎˇÎēÎĩ {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}} ĪƒĪ„Îŋ {hasName, select, true {{name}} other {ÎŊέÎŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ}}", "assets_count": "{count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}}", - "assets_deleted_permanently": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ(-Îą) Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ(-ÎąÎŊ) ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ", - "assets_deleted_permanently_from_server": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ(Îą) Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ(-ÎąÎŊ) ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ÎąĪ€ĪŒ Ī„ÎŋÎŊ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ Immich", - "assets_moved_to_trash_count": "ΜÎĩĪ„ÎąÎēΚÎŊΎθΡÎēÎĩ/ÎēÎąÎŊ {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}} ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ", - "assets_permanently_deleted_count": "Î”ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎĩ/ÎēÎąÎŊ ÎŧΌÎŊΚÎŧÎą {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}}", + "assets_deleted_permanently": "{} Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎąÎŊ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ", + "assets_deleted_permanently_from_server": "{} Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Î´ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎąÎŊ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ÎąĪ€ĪŒ Ī„Îŋ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ Immich", + "assets_moved_to_trash_count": "ΜÎĩĪ„ÎąÎēΚÎŊΎθΡÎēÎąÎŊ {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}} ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ", + "assets_permanently_deleted_count": "Î”ÎšÎąÎŗĪÎŦĪ†ÎˇÎēÎąÎŊ ÎŧΌÎŊΚÎŧÎą {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}}", "assets_removed_count": "Î‘Ī†ÎąÎšĪÎ­Î¸ÎˇÎēÎąÎŊ {count, plural, one {# ÎąĪĪ‡ÎĩίÎŋ} other {# ÎąĪĪ‡ÎĩÎ¯Îą}}", - "assets_removed_permanently_from_device": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎēÎąĪ„ÎąĪÎŗÎŽÎ¸ÎˇÎēÎąÎŊ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ÎąĪ€ĪŒ Ī„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ ĪƒÎąĪ‚", + "assets_removed_permanently_from_device": "{} Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎēÎąĪ„ÎąĪÎŗÎŽÎ¸ÎˇÎēÎąÎŊ ÎŋĪÎšĪƒĪ„ÎšÎēÎŦ ÎąĪ€ĪŒ Ī„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ ĪƒÎąĪ‚", "assets_restore_confirmation": "Î•Î¯ĪƒĪ„Îĩ βέβιΚÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą ÎĩĪ€ÎąÎŊÎąĪ†Î­ĪÎĩĪ„Îĩ ΌÎģÎą Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī€ÎŋĪ… Î˛ĪÎ¯ĪƒÎēÎŋÎŊĪ„ÎąÎš ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ; Î‘Ī…Ī„ÎŽ Ρ ÎĩÎŊÎ­ĪÎŗÎĩΚι δÎĩÎŊ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎąÎŊÎąÎšĪÎĩθÎĩί! ΛÎŦβÎĩĪ„Îĩ Ī…Ī€ĪŒĪˆÎˇ ĪŒĪ„Îš δÎĩÎŊ θι ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ ÎĩĪ€ÎąÎŊÎąĪ†Îŋ΁ÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ÎĩÎēĪ„ĪŒĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚.", "assets_restored_count": "ÎˆÎŗÎšÎŊÎĩ ÎĩĪ€ÎąÎŊÎąĪ†Îŋ΁ÎŦ {count, plural, one {# ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋĪ…} other {# ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ}}", - "assets_restored_successfully": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎąĪ€ÎŋÎēÎąĪ„ÎąĪƒĪ„ÎŦθΡÎēÎąÎŊ ÎŧÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡Î¯Îą", + "assets_restored_successfully": "{} Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎąĪ€ÎŋÎēÎąĪ„ÎąĪƒĪ„ÎŦθΡÎēÎąÎŊ ÎŧÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡Î¯Îą", "assets_trashed": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŧÎĩĪ„ÎąĪ†Î­ĪÎ¸ÎˇÎēÎąÎŊ ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ", "assets_trashed_count": "ΜÎĩĪ„ÎąÎēΚÎŊ. ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŦ΄ΉÎŊ {count, plural, one {# ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ} other {# ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą}}", - "assets_trashed_from_server": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŧÎĩĪ„ÎąĪ†Î­ĪÎ¸ÎˇÎēÎąÎŊ ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ ÎąĪ€ĪŒ Ī„ÎŋÎŊ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ Immich", + "assets_trashed_from_server": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŧÎĩĪ„ÎąĪ†Î­ĪÎ¸ÎˇÎēÎąÎŊ ĪƒĪ„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ ÎąĪ€ĪŒ Ī„Îŋ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ Immich", "assets_were_part_of_album_count": "{count, plural, one {ΤÎŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ ÎąÎŊÎŽÎēÎĩΚ} other {Τι ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎąÎŊÎŽÎēÎŋĪ…ÎŊ}} ΎδΡ ĪƒĪ„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "authorized_devices": "ΕξÎŋĪ…ĪƒÎšÎŋδÎŋĪ„ÎˇÎŧέÎŊÎĩĪ‚ ÎŖĪ…ĪƒÎēÎĩĪ…Î­Ī‚", - "automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere", - "automatic_endpoint_switching_title": "Automatic URL switching", + "automatic_endpoint_switching_subtitle": "ÎŖĪÎŊδÎĩĪƒÎˇ Ī„ÎŋĪ€ÎšÎēÎŦ ÎŧÎ­ĪƒĪ‰ Ī„ÎŋĪ… ÎēιθÎŋĪÎšĪƒÎŧέÎŊÎŋĪ… Wi-Fi ĪŒĪ„ÎąÎŊ ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ÎēιΚ Ī‡ĪÎŽĪƒÎˇ ÎĩÎŊÎąÎģÎģÎąÎēĪ„ÎšÎēĪŽÎŊ ĪƒĪ…ÎŊÎ´Î­ĪƒÎĩΉÎŊ ÎąÎģÎģÎŋĪ", + "automatic_endpoint_switching_title": "Î‘Ī…Ī„ĪŒÎŧÎąĪ„Îˇ ÎĩÎŊÎąÎģÎģÎąÎŗÎŽ URL", "back": "Î Î¯ĪƒĪ‰", "back_close_deselect": "Î Î¯ĪƒĪ‰, ÎēÎģÎĩÎ¯ĪƒÎšÎŧÎŋ ÎŽ ÎąĪ€ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ", - "background_location_permission": "Background location permission", - "background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name", + "background_location_permission": "ΆδÎĩΚι Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯ÎąĪ‚ ĪƒĪ„Îŋ Ī€ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ", + "background_location_permission_content": "ΤÎŋ Immich ÎŗÎšÎą ÎŊÎą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎąÎģÎģÎŦÎļÎĩΚ δίÎēĪ„Ī…Îą ĪŒĪ„ÎąÎŊ Ī„ĪÎ­Ī‡ÎĩΚ ĪƒĪ„Îŋ Ī€ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ, Ī€ĪÎ­Ī€ÎĩΚ *Ī€ÎŦÎŊĪ„Îą* ÎŊÎą Î­Ī‡ÎĩΚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇ ĪƒĪ„ÎˇÎŊ ÎąÎēĪÎšÎ˛ÎŽ Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą ĪŽĪƒĪ„Îĩ Ρ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ ÎŊÎą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą δΚιβÎŦÎļÎĩΚ Ī„Îŋ ΌÎŊÎŋÎŧÎą Ī„ÎŋĪ… δΚÎēĪ„ĪÎŋĪ… Wi-Fi", "backup_album_selection_page_albums_device": "ΆÎģÎŧĪ€ÎŋĪ…Îŧ ĪƒĪ„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ ({})", "backup_album_selection_page_albums_tap": "ΠÎŦĪ„ÎˇÎŧÎą ÎŗÎšÎą ĪƒĪ…ÎŧĪ€ÎĩĪÎ¯ÎģÎˇĪˆÎˇ, Î´ÎšĪ€ÎģΌ Ī€ÎŦĪ„ÎˇÎŧÎą ÎŗÎšÎą ÎĩÎžÎąÎ¯ĪÎĩĪƒÎˇ", - "backup_album_selection_page_assets_scatter": "Τι ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą Î´ÎšÎąĪƒÎēÎŋĪĪ€ÎšĪƒĪ„ÎŋĪÎŊ ΃Îĩ Ī€ÎŋÎģÎģÎŦ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ. ÎˆĪ„ĪƒÎš, Ī„Îą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ÎŧĪ€Îŋ΁ÎŋĪÎŊ ÎŊÎą Ī€ÎĩĪÎšÎģÎˇĪ†Î¸ÎŋĪÎŊ ÎŽ ÎŊÎą ÎĩÎžÎąÎšĪÎĩθÎŋĪÎŊ ÎēÎąĪ„ÎŦ Ī„Îˇ δΚιδΚÎēÎąĪƒÎ¯Îą δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚.", + "backup_album_selection_page_assets_scatter": "Τι ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą Î´ÎšÎąĪƒÎēÎŋĪĪ€ÎšĪƒĪ„ÎŋĪÎŊ ΃Îĩ Ī€ÎŋÎģÎģÎŦ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ. ÎˆĪ„ĪƒÎš, Ī„Îą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ÎŧĪ€Îŋ΁ÎŋĪÎŊ ÎŊÎą Ī€ÎĩĪÎšÎģÎˇĪ†Î¸ÎŋĪÎŊ ÎŽ ÎŊÎą ÎĩÎžÎąÎšĪÎĩθÎŋĪÎŊ ÎēÎąĪ„ÎŦ Ī„Îˇ δΚιδΚÎēÎąĪƒÎ¯Îą δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚.", "backup_album_selection_page_select_albums": "Î•Ī€ÎšÎģÎŋÎŗÎŽ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "backup_album_selection_page_selection_info": "ΠÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎŽĪ‚", "backup_album_selection_page_total_assets": "ÎŖĪ…ÎŊÎŋÎģΚÎēÎŦ ÎŧÎŋÎŊιδΚÎēÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą", "backup_all": "ΌÎģÎą", - "backup_background_service_backup_failed_message": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚. Î•Ī€ÎąÎŊÎŦÎģÎˇĪˆÎˇ...", - "backup_background_service_connection_failed_message": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎŧÎĩ Ī„Îŋ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ. Î•Ī€ÎąÎŊÎŦÎģÎˇĪˆÎˇ...", + "backup_background_service_backup_failed_message": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚. Î•Ī€ÎąÎŊÎŦÎģÎˇĪˆÎˇâ€Ļ", + "backup_background_service_connection_failed_message": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ĪƒĪÎŊδÎĩĪƒÎˇĪ‚ ÎŧÎĩ Ī„Îŋ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ. Î•Ī€ÎąÎŊÎŦÎģÎˇĪˆÎˇâ€Ļ", "backup_background_service_current_upload_notification": "ΜÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇ {}", - "backup_background_service_default_notification": "ΈÎģÎĩÎŗĪ‡ÎŋĪ‚ ÎŗÎšÎą ÎŊέι ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą...", + "backup_background_service_default_notification": "ΈÎģÎĩÎŗĪ‡ÎŋĪ‚ ÎŗÎšÎą ÎŊέι ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îąâ€Ļ", "backup_background_service_error_title": "ÎŖĪ†ÎŦÎģÎŧÎą δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚", - "backup_background_service_in_progress_notification": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ΄ΉÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ĪƒÎąĪ‚...", + "backup_background_service_in_progress_notification": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ΄ΉÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ĪƒÎąĪ‚â€Ļ", "backup_background_service_upload_failure_notification": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ÎŧÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚ {}", "backup_controller_page_albums": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "backup_controller_page_background_app_refresh_disabled_content": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎˇÎŊ ÎąÎŊÎąÎŊÎ­Ī‰ĪƒÎˇ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ ĪƒĪ„Îŋ Ī€ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ ĪƒĪ„ÎšĪ‚ ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ > ΓÎĩÎŊΚÎēÎŦ > ΑÎŊÎąÎŊÎ­Ī‰ĪƒÎˇ Î•Ī†ÎąĪÎŧÎŋÎŗÎŽĪ‚ ĪƒĪ„Îŋ Î ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ ÎŗÎšÎą ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„ÎˇÎŊ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ Ī€ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ.", @@ -531,7 +524,7 @@ "backup_controller_page_background_is_on": "Η ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ Ī€ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ", "backup_controller_page_background_turn_off": "Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ Ī…Ī€ÎˇĪÎĩĪƒÎ¯ÎąĪ‚ Ī€ÎąĪÎąĪƒÎēΡÎŊίÎŋĪ…", "backup_controller_page_background_turn_on": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ Ī…Ī€ÎˇĪÎĩĪƒÎ¯ÎąĪ‚ Ī€ÎąĪÎąĪƒÎēΡÎŊίÎŋĪ…", - "backup_controller_page_background_wifi": "ÎœĪŒÎŊÎŋ ΃Îĩ ĪƒĪÎŊδÎĩĪƒÎˇ WiFi", + "backup_controller_page_background_wifi": "ÎœĪŒÎŊÎŋ ΃Îĩ ĪƒĪÎŊδÎĩĪƒÎˇ Wi-Fi", "backup_controller_page_backup": "ΑÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚", "backup_controller_page_backup_selected": "Î•Ī€ÎšÎģÎĩÎŗÎŧέÎŊÎą: ", "backup_controller_page_backup_sub": "ÎĻΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎŗÎšÎą Ī„Îą ÎŋĪ€ÎŋÎ¯Îą Î­Ī‡ÎŋĪ…ÎŊ δΡÎŧΚÎŋĪ…ĪÎŗÎˇÎ¸Îĩί ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚", @@ -547,13 +540,13 @@ "backup_controller_page_remainder_sub": "ÎĨĪ€ĪŒÎģÎŋÎšĪ€ÎĩĪ‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎŗÎšÎą ÎąÎŊĪ„ÎšÎŗĪÎąĪ†ÎŽ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩĪ€ÎšÎģÎŋÎŗÎŽ", "backup_controller_page_server_storage": "Î§Ī‰ĪÎˇĪ„ÎšÎēĪŒĪ„ÎˇĪ„Îą ΔιαÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "backup_controller_page_start_backup": "ΈÎŊÎąĪÎžÎˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚", - "backup_controller_page_status_off": "Η ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ\n", + "backup_controller_page_status_off": "Η ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ, ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ", "backup_controller_page_status_on": "Η ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ", "backup_controller_page_storage_format": "{} ÎąĪ€ĪŒ {} ΃Îĩ Ī‡ĪÎŽĪƒÎˇ", "backup_controller_page_to_backup": "ΆÎģÎŧĪ€ÎŋĪ…Îŧ ÎŗÎšÎą δΡÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚", - "backup_controller_page_total_sub": "ΌÎģÎĩĪ‚ ÎŋΚ ÎŧÎŋÎŊιδΚÎēÎ­Ī‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎąĪ€ĪŒ Ī„Îą ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ\n", - "backup_controller_page_turn_off": "Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ\n", - "backup_controller_page_turn_on": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ\n", + "backup_controller_page_total_sub": "ΌÎģÎĩĪ‚ ÎŋΚ ÎŧÎŋÎŊιδΚÎēÎ­Ī‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎąĪ€ĪŒ Ī„Îą ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", + "backup_controller_page_turn_off": "Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ", + "backup_controller_page_turn_on": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ", "backup_controller_page_uploading_file_info": "ΜÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī€ÎģÎˇĪÎŋΆÎŋĪÎšĪŽÎŊ ÎąĪĪ‡ÎĩίÎŋĪ…", "backup_err_only_album": "ΔÎĩÎŊ ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇ Ī„ÎŋĪ… ÎŧÎŋÎŊιδΚÎēÎŋĪ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "backup_info_card_assets": "ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą", @@ -562,7 +555,7 @@ "backup_manual_success": "Î•Ī€ÎšĪ„Ī…Ī‡Î¯Îą", "backup_manual_title": "ÎšÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇ ÎŧÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚", "backup_options_page_title": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚", - "backup_setting_subtitle": "Manage background and foreground upload settings", + "backup_setting_subtitle": "Î”ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩΉÎŊ ÎŧÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚ ĪƒĪ„Îŋ Ī€ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ ÎēιΚ ĪƒĪ„Îŋ ΀΁Îŋ΃ÎēÎŽÎŊΚÎŋ", "backward": "Î ĪÎŋĪ‚ Ī„Îą Ī€Î¯ĪƒĪ‰", "birthdate_saved": "Η ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą ÎŗÎ­ÎŊÎŊÎˇĪƒÎˇĪ‚ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡ĪŽĪ‚", "birthdate_set_description": "Η ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą ÎŗÎ­ÎŊÎŊÎˇĪƒÎˇĪ‚ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš ÎŗÎšÎą Ī„ÎŋÎŊ Ī…Ī€ÎŋÎģÎŋÎŗÎšĪƒÎŧΌ Ī„ÎˇĪ‚ ΡÎģΚÎēÎ¯ÎąĪ‚ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… ÎąĪ„ĪŒÎŧÎŋĪ…, Ī„Îˇ ·΁ÎŋÎŊΚÎēÎŽ ĪƒĪ„ÎšÎŗÎŧÎŽ ÎŧÎšÎąĪ‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎąĪ‚.", @@ -579,7 +572,7 @@ "cache_settings_clear_cache_button_title": "ÎšÎąÎ¸ÎąĪÎ¯ÎļÎĩΚ Ī„Îˇ ΀΁ÎŋĪƒĪ‰ĪÎšÎŊÎŽ ÎŧÎŊÎŽÎŧΡ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚. Î‘Ī…Ī„ĪŒ θι ÎĩĪ€ÎˇĪÎĩÎŦ΃ÎĩΚ ĪƒÎˇÎŧÎąÎŊĪ„ÎšÎēÎŦ Ī„ÎˇÎŊ ÎąĪ€ĪŒÎ´ÎŋĪƒÎˇ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚ ÎŧÎ­Ī‡ĪÎš ÎŊÎą ÎąÎŊιδΡÎŧΚÎŋĪ…ĪÎŗÎˇÎ¸Îĩί Ρ ΀΁ÎŋĪƒĪ‰ĪÎšÎŊÎŽ ÎŧÎŊÎŽÎŧΡ.", "cache_settings_duplicated_assets_clear_button": "Î•ÎšÎšÎ‘Î˜Î‘ÎĄÎ™ÎŖÎ—", "cache_settings_duplicated_assets_subtitle": "ÎĻΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ Ī€ÎŋĪ… Î­Ī‡ÎŋĪ…ÎŊ ÎŧĪ€ÎĩΚ ĪƒĪ„Îˇ ÎŧÎąĪĪÎˇ ÎģÎ¯ĪƒĪ„Îą ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ", - "cache_settings_duplicated_assets_title": "Î”ÎšĪ€ÎģÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ({})", + "cache_settings_duplicated_assets_title": "Î”ÎšĪ€ÎģĪŒĪ„Ī…Ī€Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ({})", "cache_settings_image_cache_size": "ÎœÎ­ÎŗÎĩθÎŋĪ‚ ΀΁ÎŋĪƒĪ‰ĪÎšÎŊÎŽĪ‚ ÎŧÎŊÎŽÎŧÎˇĪ‚ ÎĩΚÎēΌÎŊΉÎŊ ({} ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą)", "cache_settings_statistics_album": "ΜιÎē΁ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ βΚβÎģΚÎŋθΎÎēÎˇĪ‚", "cache_settings_statistics_assets": "{} ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ({})", @@ -597,12 +590,12 @@ "camera_model": "ΜÎŋÎŊĪ„Î­ÎģÎŋ ÎēÎŦÎŧÎĩĪÎąĪ‚", "cancel": "ΑÎēĪĪĪ‰ĪƒÎˇ", "cancel_search": "ΑÎēĪĪĪ‰ĪƒÎˇ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚", - "canceled": "Canceled", + "canceled": "ΑÎē΅΁ΉÎŧέÎŊÎŋ", "cannot_merge_people": "Î‘Î´ĪÎŊÎąĪ„Îˇ Ρ ĪƒĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ ÎąĪ„ĪŒÎŧΉÎŊ", "cannot_undo_this_action": "ΔÎĩÎŊ ÎŧĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎŊÎąÎšĪÎ­ĪƒÎĩĪ„Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„ÎˇÎŊ ÎĩÎŊÎ­ĪÎŗÎĩΚι!", "cannot_update_the_description": "Î‘Î´ĪÎŊÎąĪ„Îˇ Ρ ÎĩÎŊΡÎŧÎ­ĪĪ‰ĪƒÎˇ Ī„ÎˇĪ‚ Ī€ÎĩĪÎšÎŗĪÎąĪ†ÎŽĪ‚", "change_date": "ΑÎģÎģÎąÎŗÎŽ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯ÎąĪ‚", - "change_display_order": "Change display order", + "change_display_order": "ΑÎģÎģÎąÎŗÎŽ ΃ÎĩÎšĪÎŦĪ‚ ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇĪ‚", "change_expiration_time": "ΑÎģÎģÎąÎŗÎŽ Ī‡ĪĪŒÎŊÎŋĪ… ÎģÎŽÎžÎˇĪ‚", "change_location": "ΑÎģÎģÎąÎŗÎŽ Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯ÎąĪ‚", "change_name": "ΑÎģÎģÎąÎŗÎŽ ÎŋÎŊÎŋÎŧÎąĪƒÎ¯ÎąĪ‚", @@ -617,9 +610,9 @@ "change_your_password": "ΑÎģÎģÎŦÎžĪ„Îĩ Ī„ÎŋÎŊ ÎēĪ‰Î´ÎšÎēΌ ĪƒÎąĪ‚", "changed_visibility_successfully": "Η ΀΁ÎŋβÎŋÎģÎŽ, ÎŦÎģÎģιΞÎĩ ÎŧÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡Î¯Îą", "check_all": "Î•Ī€ÎšÎģÎŋÎŗÎŽ ΌÎģΉÎŊ", - "check_corrupt_asset_backup": "Check for corrupt asset backups", - "check_corrupt_asset_backup_button": "Perform check", - "check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.", + "check_corrupt_asset_backup": "ΈÎģÎĩÎŗĪ‡ÎŋĪ‚ ÎŗÎšÎą ÎēÎąĪ„ÎĩĪƒĪ„ĪÎąÎŧÎŧέÎŊÎą ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ", + "check_corrupt_asset_backup_button": "ΕÎēĪ„Î­ÎģÎĩĪƒÎˇ ÎĩÎģÎ­ÎŗĪ‡ÎŋĪ…", + "check_corrupt_asset_backup_description": "ΕÎēĪ„Î­ÎģÎĩ΃Îĩ ÎąĪ…Ī„ĪŒÎŊ Ī„ÎŋÎŊ έÎģÎĩÎŗĪ‡Îŋ ÎŧΌÎŊÎŋ ÎŧÎ­ĪƒĪ‰ Wi-Fi ÎēιΚ ÎąĪ†ÎŋĪ Î­Ī‡ÎŋĪ…ÎŊ ÎąĪ€ÎŋθΡÎēÎĩĪ…Ī„Îĩί ΌÎģÎą Ī„Îą ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†Îą ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ΄ΉÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ. Η δΚιδΚÎēÎąĪƒÎ¯Îą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą Î´ÎšÎąĪÎēÎ­ĪƒÎĩΚ ÎŧÎĩĪÎšÎēÎŦ ÎģÎĩ΀΄ÎŦ.", "check_logs": "ΕÎģÎ­ÎŗÎžĪ„Îĩ Ī„Îą ÎąĪĪ‡ÎĩÎ¯Îą ÎēÎąĪ„ÎąÎŗĪÎąĪ†ÎŽĪ‚", "choose_matching_people_to_merge": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„Îą ÎąÎŊĪ„Î¯ĪƒĪ„ÎŋÎšĪ‡Îą ÎŦĪ„ÎŋÎŧÎą ÎŗÎšÎą ĪƒĪ…ÎŗĪ‡ĪŽÎŊÎĩĪ…ĪƒÎˇ", "city": "Î ĪŒÎģΡ", @@ -648,7 +641,7 @@ "comments_are_disabled": "Τι ĪƒĪ‡ĪŒÎģΚι ÎĩίÎŊιΚ ÎąĪ€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎą", "common_create_new_album": "ΔηÎŧΚÎŋĪ…ĪÎŗÎ¯Îą ÎŊέÎŋĪ… ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "common_server_error": "ΕÎģÎ­ÎŗÎžĪ„Îĩ Ī„Îˇ ĪƒĪÎŊδÎĩĪƒÎŽ ĪƒÎąĪ‚, βÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Îŋ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽĪ‚ ÎĩίÎŊιΚ ΀΁ÎŋĪƒÎ˛ÎŦĪƒÎšÎŧÎŋĪ‚ ÎēιΚ ĪŒĪ„Îš ÎŋΚ ÎĩÎēÎ´ĪŒĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚/δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎĩίÎŊιΚ ĪƒĪ…ÎŧÎ˛ÎąĪ„Î­Ī‚.", - "completed": "Completed", + "completed": "ΟÎģÎŋÎēÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ", "confirm": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ", "confirm_admin_password": "Î•Ī€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎŽ", "confirm_delete_face": "Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ Ī„Îŋ Ī€ĪĪŒĪƒĪ‰Ī€Îŋ Ī„ÎŋĪ…/Ī„ÎˇĪ‚ {name} ÎąĪ€ĪŒ Ī„Îŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ;", @@ -664,7 +657,7 @@ "control_bottom_app_bar_delete_from_local": "Î”ÎšÎąÎŗĪÎąĪ†ÎŽ ÎąĪ€ĪŒ Ī„Îˇ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ", "control_bottom_app_bar_edit_location": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą ΤÎŋĪ€ÎŋθÎĩĪƒÎ¯ÎąĪ‚", "control_bottom_app_bar_edit_time": "Î•Ī€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯Îą ΗÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯ÎąĪ‚ & ÎĪÎąĪ‚", - "control_bottom_app_bar_share_link": "Share Link", + "control_bottom_app_bar_share_link": "ΚÎŋΚÎŊÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îŋ ĪƒĪÎŊδÎĩ΃ÎŧÎŋ", "control_bottom_app_bar_share_to": "ΚÎŋΚÎŊÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎŖÎĩ", "control_bottom_app_bar_trash_from_immich": "ΜÎĩĪ„ÎąÎēίÎŊÎˇĪƒÎˇ ĪƒĪ„Îą Î‘Ī€ÎŋĪĪÎ¯ÎŧÎŧÎąĪ„Îą", "copied_image_to_clipboard": "Η ÎĩΚÎēΌÎŊÎą ÎąÎŊĪ„ÎšÎŗĪÎŦĪ†ÎˇÎēÎĩ ĪƒĪ„Îŋ Ī€ĪĪŒĪ‡ÎĩÎšĪÎŋ.", @@ -699,7 +692,7 @@ "crop": "Î‘Ī€ÎŋÎēÎŋĪ€ÎŽ", "curated_object_page_title": "Î ĪÎŦÎŗÎŧÎąĪ„Îą", "current_device": "Î¤ĪÎ­Ī‡ÎŋĪ…ĪƒÎą ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽ", - "current_server_address": "Current server address", + "current_server_address": "Î¤ĪÎ­Ī‡ÎŋĪ…ĪƒÎą δΚÎĩĪÎ¸Ī…ÎŊĪƒÎˇ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "custom_locale": "Î ĪÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊΡ ΤÎŋĪ€ÎšÎēÎŽ ÎĄĪÎ¸ÎŧÎšĪƒÎˇ", "custom_locale_description": "ΜÎŋ΁ΆÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„ÎšĪ‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊίÎĩĪ‚ ÎēιΚ Ī„ÎŋĪ…Ī‚ ÎąĪÎšÎ¸ÎŧÎŋĪĪ‚, ĪƒĪÎŧΆΉÎŊÎą ÎŧÎĩ Ī„Îˇ ÎŗÎģĪŽĪƒĪƒÎą ÎēιΚ Ī„ÎˇÎŊ Ī€ÎĩĪÎšÎŋĪ‡ÎŽ", "daily_title_text_date": "Ε, MMM dd", @@ -750,7 +743,7 @@ "direction": "ÎšÎąĪ„ÎĩĪÎ¸Ī…ÎŊĪƒÎˇ", "disabled": "Î‘Ī€ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋ", "disallow_edits": "Î‘Ī€ÎąÎŗĪŒĪÎĩĪ…ĪƒÎˇ ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒÎšĪŽÎŊ", - "discord": "Discord", + "discord": "ΠÎģÎąĪ„Ī†ĪŒĪÎŧÎą Discord", "discover": "ΑÎŊÎ¯Ī‡ÎŊÎĩĪ…ĪƒÎˇ", "dismiss_all_errors": "Î ÎąĪÎŦβÎģÎĩĪˆÎˇ ΌÎģΉÎŊ ΄ΉÎŊ ĪƒĪ†ÎąÎģÎŧÎŦ΄ΉÎŊ", "dismiss_error": "Î ÎąĪÎŦβÎģÎĩĪˆÎˇ ĪƒĪ†ÎŦÎģÎŧÎąĪ„ÎŋĪ‚", @@ -811,16 +804,16 @@ "editor_crop_tool_h2_aspect_ratios": "ΑÎŊÎąÎģÎŋÎŗÎ¯ÎĩĪ‚ Î´ÎšÎąĪƒĪ„ÎŦ΃ÎĩΉÎŊ", "editor_crop_tool_h2_rotation": "ΠÎĩĪÎšĪƒĪ„ĪÎŋĪ†ÎŽ", "email": "Email", - "empty_folder": "This folder is empty", + "empty_folder": "Î‘Ī…Ī„ĪŒĪ‚ Îŋ ΆÎŦÎēÎĩÎģÎŋĪ‚ ÎĩίÎŊιΚ ÎēÎĩÎŊĪŒĪ‚", "empty_trash": "ΆδÎĩÎšÎąĪƒÎŧÎą ÎēÎŦδÎŋĪ… ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ", "empty_trash_confirmation": "Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ÎŋĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą ιδÎĩΚÎŦ΃ÎĩĪ„Îĩ Ī„ÎŋÎŊ ÎēÎŦδÎŋ ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ; Î‘Ī…Ī„ĪŒ θι ÎąĪ†ÎąÎšĪÎ­ĪƒÎĩΚ ÎŧΌÎŊΚÎŧÎą ΌÎģÎą Ī„Îą ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī„ÎŋĪ… ÎēÎŦδÎŋĪ… ÎąĪ€ÎŋĪĪÎšÎŧÎŧÎŦ΄ΉÎŊ Ī„ÎŋĪ… Immich. \nÎ‘Ī…Ī„ÎŽ Ρ ÎĩÎŊÎ­ĪÎŗÎĩΚι δÎĩÎŊ ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ÎąÎŊÎąÎšĪÎĩθÎĩί!", "enable": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ", "enabled": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋ", "end_date": "ΤÎĩÎģΚÎēÎŽ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎ¯Îą", - "enqueued": "Enqueued", - "enter_wifi_name": "Enter WiFi name", + "enqueued": "ΤÎŋĪ€ÎŋθÎĩĪ„ÎŽÎ¸ÎˇÎēÎĩ ĪƒĪ„Îˇ ÎģÎ¯ĪƒĪ„Îą ÎąÎŊÎąÎŧÎŋÎŊÎŽĪ‚", + "enter_wifi_name": "Î•ÎšĪƒÎąÎŗĪ‰ÎŗÎŽ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Wi-Fi", "error": "ÎŖĪ†ÎŦÎģÎŧÎą", - "error_change_sort_album": "Failed to change album sort order", + "error_change_sort_album": "Î‘Ī€Î­Ī„Ī…Ī‡Îĩ Ρ ÎąÎģÎģÎąÎŗÎŽ ΃ÎĩÎšĪÎŦĪ‚ Ī„ÎŋĪ… ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "error_delete_face": "ÎŖĪ†ÎŦÎģÎŧÎą Î´ÎšÎąÎŗĪÎąĪ†ÎŽĪ‚ ΀΁ÎŋĪƒĪŽĪ€ÎŋĪ… ÎąĪ€ĪŒ Ī„Îŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩίÎŋ", "error_loading_image": "ÎŖĪ†ÎŦÎģÎŧÎą ÎēÎąĪ„ÎŦ Ī„Îˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ Ī„ÎˇĪ‚ ÎĩΚÎēΌÎŊÎąĪ‚", "error_saving_image": "ÎŖĪ†ÎŦÎģÎŧÎą: {}", @@ -857,6 +850,7 @@ "failed_to_remove_product_key": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ÎąĪ†ÎąÎ¯ĪÎĩĪƒÎˇĪ‚ ÎēÎģÎĩΚδΚÎŋĪ ΀΁ÎŋΊΌÎŊĪ„ÎŋĪ‚", "failed_to_stack_assets": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ĪƒĪ„ÎˇÎŊ ĪƒĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ ΄ΉÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ", "failed_to_unstack_assets": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ĪƒĪ„ÎˇÎŊ ÎąĪ€ÎŋĪƒĪ…ÎŧĪ€Î¯ÎĩĪƒÎˇ ΄ΉÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ", + "failed_to_update_notification_status": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą ÎĩÎŊΡÎŧÎ­ĪĪ‰ĪƒÎˇĪ‚ Ī„ÎˇĪ‚ ÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ ÎĩΚδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇĪ‚", "import_path_already_exists": "Î‘Ī…Ī„ÎŽ Ρ Î´ÎšÎąÎ´ĪÎŋÎŧÎŽ ÎĩÎšĪƒÎąÎŗĪ‰ÎŗÎŽĪ‚ Ī…Ī€ÎŦ΁·ÎĩΚ ΎδΡ.", "incorrect_email_or_password": "ΛαÎŊÎ¸ÎąĪƒÎŧέÎŊÎŋ email ÎŽ ÎēĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚", "paths_validation_failed": "{paths, plural, one {# Î´ÎšÎąÎ´ĪÎŋÎŧÎŽ} other {# Î´ÎšÎąÎ´ĪÎŋÎŧÎ­Ī‚}} ÎąĪ€Î­Ī„Ī…Ī‡ÎąÎŊ ÎēÎąĪ„ÎŦ Ī„ÎˇÎŊ ÎĩĪ€ÎšÎēĪĪĪ‰ĪƒÎˇ", @@ -955,12 +949,12 @@ "exif_bottom_sheet_description": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ΠÎĩĪÎšÎŗĪÎąĪ†ÎŽĪ‚...", "exif_bottom_sheet_details": "Î›Î•Î Î¤ÎŸÎœÎ•ÎĄÎ•Î™Î•ÎŖ", "exif_bottom_sheet_location": "Î¤ÎŸÎ ÎŸÎ˜Î•ÎŖÎ™Î‘", - "exif_bottom_sheet_people": "ΑΝΘΡΩΠΟΙ", + "exif_bottom_sheet_people": "ΑΤΟΜΑ", "exif_bottom_sheet_person_add_person": "Î ĪÎŋĪƒÎ¸ÎŽÎēΡ ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚", - "exif_bottom_sheet_person_age": "Age {}", - "exif_bottom_sheet_person_age_months": "Age {} months", - "exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months", - "exif_bottom_sheet_person_age_years": "Age {}", + "exif_bottom_sheet_person_age": "ΗÎģΚÎēÎ¯Îą {}", + "exif_bottom_sheet_person_age_months": "ΗÎģΚÎēÎ¯Îą {} ÎŧÎŽÎŊÎĩĪ‚", + "exif_bottom_sheet_person_age_year_months": "ΗÎģΚÎēÎ¯Îą 1 Î­Ī„ÎŋĪ…Ī‚, {} ÎŧΡÎŊĪŽÎŊ", + "exif_bottom_sheet_person_age_years": "ΗÎģΚÎēÎ¯Îą {}", "exit_slideshow": "ΈΞÎŋδÎŋĪ‚ ÎąĪ€ĪŒ Ī„ÎˇÎŊ Ī€ÎąĪÎŋĪ…ĪƒÎ¯ÎąĪƒÎˇ", "expand_all": "ΑÎŊÎŦĪ€Ī„Ī…ÎžÎˇ ΌÎģΉÎŊ", "experimental_settings_new_asset_list_subtitle": "ÎŖÎĩ ÎĩΞέÎģΚΞΡ", @@ -977,12 +971,12 @@ "extension": "Î•Ī€Î­ÎēĪ„ÎąĪƒÎˇ", "external": "Î•ÎžĪ‰Ī„ÎĩĪÎšÎēĪŒĪ‚", "external_libraries": "Î•ÎžĪ‰Ī„ÎĩĪÎšÎēÎ­Ī‚ βΚβÎģΚÎŋθΎÎēÎĩĪ‚", - "external_network": "External network", - "external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom", + "external_network": "Î•ÎžĪ‰Ī„ÎĩĪÎšÎēΌ δίÎē΄΅Îŋ", + "external_network_sheet_info": "ÎŒĪ„ÎąÎŊ δÎĩÎŊ ÎĩÎ¯ĪƒĪ„Îĩ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋΚ ĪƒĪ„Îŋ ΀΁ÎŋĪ„ÎšÎŧĪŽÎŧÎĩÎŊÎŋ δίÎē΄΅Îŋ Wi-Fi, Ρ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ θι ĪƒĪ…ÎŊδÎĩθÎĩί ÎŧÎĩ Ī„ÎŋÎŊ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎŧÎ­ĪƒĪ‰ Ī„ÎŋĪ… Ī€ĪĪŽĪ„ÎŋĪ… ÎąĪ€ĪŒ Ī„Îą Ī€ÎąĪÎąÎēÎŦ΄Ή URLs Ī€ÎŋĪ… ÎŧĪ€Îŋ΁Îĩί ÎŊÎą Î˛ĪÎĩΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ, ΞÎĩÎēΚÎŊĪŽÎŊĪ„ÎąĪ‚ ÎąĪ€ĪŒ Ī„Îŋ Ī€ÎŦÎŊΉ ΀΁ÎŋĪ‚ Ī„Îŋ ÎēÎŦ΄Ή", "face_unassigned": "Μη ÎąÎŊÎąĪ„ÎĩθÎĩΚÎŧέÎŊÎŋ", - "failed": "Failed", + "failed": "Î‘Ī€Î­Ī„Ī…Ī‡Îĩ", "failed_to_load_assets": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą Ī†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ", - "failed_to_load_folder": "Failed to load folder", + "failed_to_load_folder": "Î‘Ī€ÎŋĪ„Ī…Ī‡Î¯Îą Ī†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚ Ī†ÎąÎēέÎģÎŋĪ…", "favorite": "Î‘ÎŗÎąĪ€ÎˇÎŧέÎŊÎŋ", "favorite_or_unfavorite_photo": "ÎŸĪÎ¯ĪƒĪ„Îĩ ÎŧÎ¯Îą ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯Îą Ή΂ ÎąÎŗÎąĪ€ÎˇÎŧέÎŊΡ ÎŽ ÎąĪ†ÎąÎšĪÎ­ĪƒĪ„Îĩ Ī„ÎˇÎŊ ÎąĪ€ĪŒ Ī„Îą ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą", "favorites": "Î‘ÎŗÎąĪ€ÎˇÎŧέÎŊÎą", @@ -996,21 +990,22 @@ "filetype": "Î¤ĪĪ€ÎŋĪ‚ ÎąĪĪ‡ÎĩίÎŋĪ…", "filter": "ÎĻίÎģ΄΁Îŋ", "filter_people": "ÎĻΚÎģ΄΁ÎŦĪÎšĪƒÎŧÎą ÎąĪ„ĪŒÎŧΉÎŊ", + "filter_places": "ÎĻΚÎģ΄΁ÎŦĪÎšĪƒÎŧÎą Ī„ÎŋĪ€ÎŋθÎĩĪƒÎšĪŽÎŊ", "find_them_fast": "Î’ĪÎĩÎ¯Ī„Îĩ Ī„ÎŋĪ…Ī‚ ÎŗĪÎŽÎŗÎŋĪÎą ÎŧÎĩ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎēÎąĪ„ÎŦ ΌÎŊÎŋÎŧÎą", "fix_incorrect_match": "Î”ÎšĪŒĪÎ¸Ī‰ĪƒÎˇ ÎģÎąÎŊÎ¸ÎąĪƒÎŧέÎŊÎˇĪ‚ ÎąÎŊĪ„ÎšĪƒĪ„ÎŋÎ¯Ī‡ÎšĪƒÎˇĪ‚", - "folder": "Folder", - "folder_not_found": "Folder not found", + "folder": "ÎĻÎŦÎēÎĩÎģÎŋĪ‚", + "folder_not_found": "Ο ΆÎŦÎēÎĩÎģÎŋĪ‚ δÎĩÎŊ Î˛ĪÎ­Î¸ÎˇÎēÎĩ", "folders": "ÎĻÎŦÎēÎĩÎģÎŋΚ", "folders_feature_description": "ΠÎĩĪÎšÎŽÎŗÎˇĪƒÎˇ ĪƒĪ„ÎˇÎŊ ΀΁ÎŋβÎŋÎģÎŽ Ī†ÎąÎēέÎģÎŋĪ… ÎŗÎšÎą Ī„ÎšĪ‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Ī„Îą Î˛Î¯ÎŊĪ„ÎĩÎŋ ĪƒĪ„Îŋ ĪƒĪĪƒĪ„ÎˇÎŧÎą ÎąĪĪ‡ÎĩÎ¯Ī‰ÎŊ", "forward": "Î ĪÎŋĪ‚ Ī„Îą ÎĩÎŧĪ€ĪĪŒĪ‚", "general": "ΓÎĩÎŊΚÎēÎŦ", "get_help": "Î–ÎˇĪ„ÎŽĪƒĪ„Îĩ βÎŋΎθÎĩΚι", - "get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network", + "get_wifiname_error": "ΔÎĩÎŊ ÎŽĪ„ÎąÎŊ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ ÎģÎŽĪˆÎˇ Ī„ÎŋĪ… ÎŋÎŊΌÎŧÎąĪ„ÎŋĪ‚ Wi-Fi. ΒÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Î­Ī‡ÎĩĪ„Îĩ Î´ĪŽĪƒÎĩΚ Ī„ÎšĪ‚ ÎąĪ€ÎąĪÎąÎ¯Ī„ÎˇĪ„ÎĩĪ‚ ÎŦδÎĩΚÎĩĪ‚ ÎēιΚ ĪŒĪ„Îš ÎĩÎ¯ĪƒĪ„Îĩ ĪƒĪ…ÎŊδÎĩδÎĩÎŧέÎŊÎŋΚ ΃Îĩ δίÎē΄΅Îŋ Wi-Fi", "getting_started": "ΞÎĩÎēΚÎŊĪŽÎŊĪ„ÎąĪ‚", "go_back": "Î ÎˇÎŗÎąÎ¯ÎŊÎĩĪ„Îĩ Ī€Î¯ĪƒĪ‰", "go_to_folder": "ΜÎĩĪ„ÎŦÎ˛ÎąĪƒÎˇ ĪƒĪ„Îŋ ΆÎŦÎēÎĩÎģÎŋ", "go_to_search": "Î ÎˇÎŗÎąÎ¯ÎŊÎĩĪ„Îĩ ĪƒĪ„ÎˇÎŊ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ", - "grant_permission": "Grant permission", + "grant_permission": "Î•Ī€ÎšĪ„ĪÎ­ĪˆĪ„Îĩ Ī„ÎˇÎŊ ÎŦδÎĩΚι", "group_albums_by": "ΟÎŧιδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ÎēÎąĪ„ÎŦ...", "group_country": "ΟÎŧιδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎēÎąĪ„ÎŦ Ī‡ĪŽĪÎą", "group_no": "ΚαÎŧÎ¯Îą ÎŋÎŧÎŋδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ", @@ -1044,7 +1039,7 @@ "home_page_delete_remote_err_local": "ΤÎŋĪ€ÎšÎēÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ĪƒĪ„Îˇ Î´ÎšÎąÎŗĪÎąĪ†ÎŽ ÎąĪ€ÎŋÎŧÎąÎēĪĪ…ĪƒÎŧέÎŊÎˇĪ‚ ÎĩĪ€ÎšÎģÎŋÎŗÎŽĪ‚, Ī€ÎąĪÎąÎģÎĩÎ¯Ī€ÎĩĪ„ÎąÎš", "home_page_favorite_err_local": "ΔÎĩÎŊ ÎŧĪ€ÎŋĪĪŽ ÎąÎēΌÎŧÎą ÎŊÎą ÎąÎŗÎąĪ€ÎŽĪƒĪ‰ Ī„Îą Ī„ÎŋĪ€ÎšÎēÎŦ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą, Ī€ÎąĪÎąÎģÎĩÎ¯Ī€ÎĩĪ„ÎąÎš", "home_page_favorite_err_partner": "ΔÎĩÎŊ ÎĩίÎŊιΚ ÎąÎēΌÎŧÎą Î´Ī…ÎŊÎąĪ„ÎŽ Ρ Ī€ĪĪŒĪƒÎ¸ÎĩĪƒÎˇ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ĪƒĪ…ÎŊĪ„ĪĪŒĪ†ÎŋĪ… ĪƒĪ„Îą ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą, Ī€ÎąĪÎąÎģÎĩÎ¯Ī€ÎĩĪ„ÎąÎš", - "home_page_first_time_notice": "ΕÎŦÎŊ ÎąĪ…Ī„ÎŽ ÎĩίÎŊιΚ Ρ Ī€ĪĪŽĪ„Îˇ ΆÎŋ΁ÎŦ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ, βÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Î­Ī‡ÎĩĪ„Îĩ ÎĩĪ€ÎšÎģέΞÎĩΚ έÎŊÎą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†ÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚, ĪŽĪƒĪ„Îĩ Ī„Îŋ ·΁ÎŋÎŊÎŋδΚÎŦÎŗĪÎąÎŧÎŧÎą ÎŊÎą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽĪƒÎĩΚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ ĪƒĪ„Îą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ.", + "home_page_first_time_notice": "ΕÎŦÎŊ ÎąĪ…Ī„ÎŽ ÎĩίÎŊιΚ Ρ Ī€ĪĪŽĪ„Îˇ ΆÎŋ΁ÎŦ Ī€ÎŋĪ… Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„Îĩ Ī„ÎˇÎŊ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ, βÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Î­Ī‡ÎĩĪ„Îĩ ÎĩĪ€ÎšÎģέΞÎĩΚ έÎŊÎą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ÎąÎŊĪ„Î¯ÎŗĪÎąĪ†ÎŋĪ… ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚, ĪŽĪƒĪ„Îĩ Ī„Îŋ ·΁ÎŋÎŊÎŋδΚÎŦÎŗĪÎąÎŧÎŧÎą ÎŊÎą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą ĪƒĪ…ÎŧĪ€ÎģÎˇĪĪŽĪƒÎĩΚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ ĪƒĪ„Îą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "home_page_share_err_local": "ΔÎĩÎŊ ÎĩίÎŊιΚ Î´Ī…ÎŊÎąĪ„ÎŽ Ρ ÎēÎŋΚÎŊÎŽ Ī‡ĪÎŽĪƒÎˇ Ī„ÎŋĪ€ÎšÎēĪŽÎŊ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ ÎŧÎ­ĪƒĪ‰ ĪƒĪ…ÎŊÎ´Î­ĪƒÎŧÎŋĪ…, Ī€ÎąĪÎąÎģÎĩÎ¯Ī€ÎĩĪ„ÎąÎš", "home_page_upload_err_limit": "ÎœĪ€Îŋ΁ÎĩÎ¯Ī„Îĩ ÎŊÎą ÎąÎŊÎĩβÎŦ΃ÎĩĪ„Îĩ ÎŧΌÎŊÎŋ 30 ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą ÎēÎŦθÎĩ ΆÎŋ΁ÎŦ, Ī€ÎąĪÎąÎģÎĩÎ¯Ī€ÎĩĪ„ÎąÎš", "host": "ÎĻΚÎģÎŋΞÎĩÎŊÎ¯Îą", @@ -1122,9 +1117,9 @@ "loading": "ÎĻĪŒĪĪ„Ī‰ĪƒÎˇ", "loading_search_results_failed": "Η Ī†ĪŒĪĪ„Ī‰ĪƒÎˇ ÎąĪ€ÎŋĪ„ÎĩÎģÎĩ΃ÎŧÎŦ΄ΉÎŊ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚ ÎąĪ€Î­Ī„Ī…Ī‡Îĩ", "local_network": "Local network", - "local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network", - "location_permission": "Location permission", - "location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name", + "local_network_sheet_info": "Η ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽ θι ĪƒĪ…ÎŊδÎĩθÎĩί ÎŧÎĩ Ī„ÎŋÎŊ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ÎŧÎ­ĪƒĪ‰ ÎąĪ…Ī„ÎŋĪ Ī„ÎŋĪ… URL ĪŒĪ„ÎąÎŊ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„ÎąÎš Ī„Îŋ ÎēιθÎŋĪÎšĪƒÎŧέÎŊÎŋ δίÎē΄΅Îŋ Wi-Fi", + "location_permission": "ΆδÎĩΚι Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯ÎąĪ‚", + "location_permission_content": "Για ÎŊÎą Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚΡθÎĩί Ρ ÎģÎĩÎšĪ„ÎŋĪ…ĪÎŗÎ¯Îą ÎąĪ…Ī„ĪŒÎŧÎąĪ„ÎˇĪ‚ ÎĩÎŊÎąÎģÎģÎąÎŗÎŽĪ‚, Ī„Îŋ Immich ·΁ÎĩΚÎŦÎļÎĩĪ„ÎąÎš ÎŦδÎĩΚι ÎŗÎšÎą Ī„ÎˇÎŊ ÎąÎēĪÎšÎ˛ÎŽ Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą Ī„ÎˇĪ‚ ĪƒĪ…ĪƒÎēÎĩĪ…ÎŽĪ‚ ĪŽĪƒĪ„Îĩ ÎŊÎą ÎŧĪ€Îŋ΁Îĩί ÎŊÎą δΚιβÎŦÎļÎĩΚ Ī„Îŋ ΌÎŊÎŋÎŧÎą Ī„ÎŋĪ… Ī„ĪÎ­Ī‡ÎŋÎŊĪ„ÎŋĪ‚ δΚÎēĪ„ĪÎŋĪ… Wi-Fi", "location_picker_choose_on_map": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ĪƒĪ„Îŋ ·ÎŦĪĪ„Îˇ", "location_picker_latitude_error": "Î•ÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ έÎŊÎą Î­ÎŗÎē΅΁Îŋ ÎŗÎĩĪ‰ÎŗĪÎąĪ†ÎšÎēΌ Ī€ÎģÎŦĪ„ÎŋĪ‚", "location_picker_latitude_hint": "Î•ÎšĪƒÎąÎŗÎŦÎŗÎĩĪ„Îĩ Ī„Îŋ ÎŗÎĩĪ‰ÎŗĪÎąĪ†ÎšÎēΌ Ī€ÎģÎŦĪ„ÎŋĪ‚ ĪƒÎąĪ‚ ÎĩÎ´ĪŽ", @@ -1198,6 +1193,9 @@ "map_settings_only_show_favorites": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ÎŧΌÎŊÎŋ ÎąÎŗÎąĪ€ÎˇÎŧέÎŊΉÎŊ", "map_settings_theme_settings": "ΘέÎŧÎą ·ÎŦĪĪ„Îˇ", "map_zoom_to_see_photos": "ÎŖÎŧΚÎēĪĪÎŊÎĩĪ„Îĩ ÎŗÎšÎą ÎŊÎą δÎĩÎ¯Ī„Îĩ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚", + "mark_all_as_read": "Î•Ī€ÎšĪƒÎŽÎŧÎąÎŊĪƒÎˇ ΌÎģΉÎŊ Ή΂ ÎąÎŊÎąÎŗÎŊĪ‰ĪƒÎŧέÎŊÎą", + "mark_as_read": "Î•Ī€ÎšĪƒÎŽÎŧÎąÎŊĪƒÎˇ Ή΂ ÎąÎŊÎąÎŗÎŊĪ‰ĪƒÎŧέÎŊÎŋ", + "marked_all_as_read": "ΌÎģÎą ÎĩĪ€ÎšĪƒÎˇÎŧÎŦÎŊθΡÎēÎąÎŊ Ή΂ ÎąÎŊÎąÎŗÎŊĪ‰ĪƒÎŧέÎŊÎą", "matches": "ΑÎŊĪ„ÎšĪƒĪ„ÎŋÎšĪ‡Î¯ÎĩĪ‚", "media_type": "Î¤ĪĪ€ÎŋĪ‚ Ī€ÎŋÎģĪ…ÎŧÎ­ĪƒÎŋĪ…", "memories": "ΑÎŊÎąÎŧÎŊÎŽĪƒÎĩÎšĪ‚", @@ -1207,7 +1205,7 @@ "memories_start_over": "ΞÎĩÎēΚÎŊÎŽĪƒĪ„Îĩ ÎąĪ€ĪŒ Ī„ÎˇÎŊ ÎąĪĪ‡ÎŽ", "memories_swipe_to_close": "ÎŖĪĪÎĩĪ„Îĩ ΀΁ÎŋĪ‚ Ī„Îą Ī€ÎŦÎŊΉ ÎŗÎšÎą ÎŊÎą ÎēÎģÎĩÎ¯ĪƒÎĩĪ„Îĩ", "memories_year_ago": "Î ĪÎšÎŊ έÎŊÎą Ī‡ĪĪŒÎŊÎŋ", - "memories_years_ago": "Î ĪÎšÎŊ ÎąĪ€ĪŒ {} Ī‡ĪĪŒÎŊΚι", + "memories_years_ago": "Î ĪÎšÎŊ ÎąĪ€ĪŒ {} Î­Ī„Îˇ", "memory": "ΑÎŊÎŦÎŧÎŊÎˇĪƒÎˇ", "memory_lane_title": "Î”ÎšÎąÎ´ĪÎŋÎŧÎŽ ΑÎŊÎąÎŧÎŊÎŽĪƒÎĩΉÎŊ {title}", "menu": "ΜÎĩÎŊÎŋĪ", @@ -1231,8 +1229,8 @@ "my_albums": "Τι ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ÎŧÎŋĪ…", "name": "ΌÎŊÎŋÎŧÎą", "name_or_nickname": "ΌÎŊÎŋÎŧÎą ÎŽ ΈÎĩĪ…Î´ĪŽÎŊĪ…ÎŧÎŋ", - "networking_settings": "Networking", - "networking_subtitle": "Manage the server endpoint settings", + "networking_settings": "ΔιÎēĪ„ĪĪ‰ĪƒÎˇ", + "networking_subtitle": "Î”ÎšÎąĪ‡ÎĩÎ¯ĪÎšĪƒÎˇ ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩΉÎŊ Ī„ÎĩÎģΚÎēĪŽÎŊ ĪƒÎˇÎŧÎĩÎ¯Ī‰ÎŊ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "never": "ΠÎŋĪ„Î­", "new_album": "ΝέÎŋ ΆÎģÎŧĪ€ÎŋĪ…Îŧ", "new_api_key": "ΝέÎŋ API Key", @@ -1256,12 +1254,13 @@ "no_favorites_message": "Î ĪÎŋĪƒÎ¸Î­ĪƒĪ„Îĩ ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą ÎŗÎšÎą ÎŊÎą Î˛ĪÎĩÎ¯Ī„Îĩ ÎŗĪÎŽÎŗÎŋĪÎą Ī„ÎšĪ‚ ÎēÎąÎģĪĪ„Îĩ΁ÎĩĪ‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Ī„Îą Î˛Î¯ÎŊĪ„ÎĩΌ ĪƒÎąĪ‚", "no_libraries_message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ ÎŧΚι ÎĩÎžĪ‰Ī„ÎĩĪÎšÎēÎŽ βΚβÎģΚÎŋθΎÎēΡ ÎŗÎšÎą ÎŊÎą ΀΁ÎŋβÎŦÎģÎĩĪ„Îĩ Ī„ÎšĪ‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Ī„Îą Î˛Î¯ÎŊĪ„ÎĩΌ ĪƒÎąĪ‚", "no_name": "Î§Ī‰ĪÎ¯Ī‚ ΌÎŊÎŋÎŧÎą", + "no_notifications": "ΚαÎŧÎ¯Îą ÎĩΚδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ", "no_places": "ΚαÎŧÎ¯Îą Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą", "no_results": "ΚαÎŊέÎŊÎą ÎąĪ€ÎŋĪ„Î­ÎģÎĩ΃ÎŧÎą", "no_results_description": "ΔÎŋÎēΚÎŧÎŦĪƒĪ„Îĩ έÎŊÎą ĪƒĪ…ÎŊĪŽÎŊĪ…ÎŧÎŋ ÎŽ Ī€ÎšÎŋ ÎŗÎĩÎŊΚÎēÎŽ ÎģέΞΡ-ÎēÎģÎĩΚδί", "no_shared_albums_message": "ΔηÎŧΚÎŋĪ…ĪÎŗÎŽĪƒĪ„Îĩ έÎŊÎą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ ÎŗÎšÎą ÎŊÎą ÎŧÎŋÎšĪÎŦÎļÎĩĪƒĪ„Îĩ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎŧÎĩ ÎŦĪ„ÎŋÎŧÎą ĪƒĪ„Îŋ δίÎēĪ„Ī…ĪŒ ĪƒÎąĪ‚", "not_in_any_album": "ÎŖÎĩ ÎēÎąÎŊέÎŊÎą ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", - "not_selected": "Not selected", + "not_selected": "ΔÎĩÎŊ ÎĩĪ€ÎšÎģÎ­Ī‡Î¸ÎˇÎēÎĩ", "note_apply_storage_label_to_previously_uploaded assets": "ÎŖÎˇÎŧÎĩÎ¯Ī‰ĪƒÎˇ: Για ÎŊÎą ÎĩĪ†ÎąĪÎŧΌ΃ÎĩĪ„Îĩ Ī„ÎˇÎŊ Î•Ī„ÎšÎēÎ­Ī„Îą Î‘Ī€ÎŋθΎÎēÎĩĪ…ĪƒÎˇĪ‚ ΃Îĩ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Îą Ī€ÎŋĪ… Î­Ī‡ÎŋĪ…ÎŊ ÎŧÎĩĪ„ÎąĪ†ÎŋĪĪ„Ī‰Î¸Îĩί ΀΁ÎŋÎˇÎŗÎŋĪ…ÎŧέÎŊΉ΂, ÎĩÎēĪ„ÎĩÎģÎ­ĪƒĪ„Îĩ Ī„Îŋ", "notes": "ÎŖÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚", "notification_permission_dialog_content": "Για ÎŊÎą ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋÎšÎŽĪƒÎĩĪ„Îĩ Ī„ÎšĪ‚ ÎĩΚδÎŋĪ€ÎŋÎšÎŽĪƒÎĩÎšĪ‚, ÎŧÎĩĪ„ÎąÎ˛ÎĩÎ¯Ī„Îĩ ĪƒĪ„ÎšĪ‚ ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎēιΚ ÎĩĪ€ÎšÎģÎ­ÎžĪ„Îĩ ÎŊÎą ÎĩĪ€ÎšĪ„ĪÎ­Ī€ÎĩĪ„ÎąÎš.", @@ -1286,6 +1285,7 @@ "onboarding_welcome_user": "ΚαÎģĪ‰ĪƒĪŒĪÎšĪƒÎĩĪ‚, {user}", "online": "ÎŖÎĩ ĪƒĪÎŊδÎĩĪƒÎˇ", "only_favorites": "ÎœĪŒÎŊÎŋ ÎąÎŗÎąĪ€ÎˇÎŧέÎŊÎą", + "open": "ΆÎŊÎŋÎšÎŗÎŧÎą", "open_in_map_view": "ΆÎŊÎŋÎšÎŗÎŧÎą ΃Îĩ ΀΁ÎŋβÎŋÎģÎŽ ·ÎŦĪĪ„Îˇ", "open_in_openstreetmap": "ΆÎŊÎŋÎšÎŗÎŧÎą ĪƒĪ„Îŋ OpenStreetMap", "open_the_search_filters": "ΑÎŊÎŋÎ¯ÎžĪ„Îĩ Ī„Îą Ī†Î¯ÎģĪ„ĪÎą ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚", @@ -1363,7 +1363,7 @@ "play_motion_photo": "ΑÎŊÎąĪ€ÎąĪÎąÎŗĪ‰ÎŗÎŽ ΚιÎŊÎŋĪÎŧÎĩÎŊÎˇĪ‚ ÎĻΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎąĪ‚", "play_or_pause_video": "ΑÎŊÎąĪ€ÎąĪÎąÎŗĪ‰ÎŗÎŽ ÎŽ Ī€ÎąĪĪƒÎˇ Î˛Î¯ÎŊĪ„ÎĩÎŋ", "port": "Î˜ĪĪÎą", - "preferences_settings_subtitle": "Manage the app's preferences", + "preferences_settings_subtitle": "Î”ÎšÎąĪ‡ÎĩÎšĪÎšĪƒĪ„ÎĩÎ¯Ī„Îĩ Ī„ÎšĪ‚ ΀΁ÎŋĪ„ÎšÎŧÎŽĪƒÎĩÎšĪ‚ Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚", "preferences_settings_title": "Î ĪÎŋĪ„ÎšÎŧÎŽĪƒÎĩÎšĪ‚", "preset": "Î ĪÎŋÎēιθÎŋĪÎšĪƒÎŧέÎŊΡ ĪĪÎ¸ÎŧÎšĪƒÎˇ", "preview": "Î ĪÎŋÎĩĪ€ÎšĪƒÎēĪŒĪ€ÎˇĪƒÎˇ", @@ -1430,6 +1430,8 @@ "recent_searches": "Î ĪĪŒĪƒĪ†ÎąĪ„ÎĩĪ‚ ÎąÎŊÎąÎļÎˇĪ„ÎŽĪƒÎĩÎšĪ‚", "recently_added": "Î ĪÎŋĪƒĪ„Î­Î¸ÎˇÎēÎąÎŊ Ī€ĪĪŒĪƒĪ†ÎąĪ„Îą", "recently_added_page_title": "Î ĪÎŋĪƒĪ„Î­Î¸ÎˇÎēÎąÎŊ Î ĪĪŒĪƒĪ†ÎąĪ„Îą", + "recently_taken": "Î›ÎŽĪ†Î¸ÎˇÎēÎąÎŊ Ī€ĪĪŒĪƒĪ†ÎąĪ„Îą", + "recently_taken_page_title": "Î›ÎŽĪ†Î¸ÎˇÎēÎąÎŊ Î ĪĪŒĪƒĪ†ÎąĪ„Îą", "refresh": "ΑÎŊÎąÎŊÎ­Ī‰ĪƒÎˇ", "refresh_encoded_videos": "ΑÎŊÎąÎŊÎ­Ī‰ĪƒÎˇ ÎēĪ‰Î´ÎšÎēÎŋĪ€ÎŋΚΡÎŧέÎŊΉÎŊ Î˛Î¯ÎŊĪ„ÎĩÎŋ", "refresh_faces": "ΑÎŊÎąÎŊÎ­Ī‰ĪƒÎˇ ΀΁ÎŋĪƒĪŽĪ€Ī‰ÎŊ", @@ -1514,7 +1516,7 @@ "search_filter_date_title": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎĩĪĪÎŋĪ‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎšĪŽÎŊ", "search_filter_display_option_not_in_album": "ÎŒĪ‡Îš ĪƒĪ„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "search_filter_display_options": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎĩÎŧΆÎŦÎŊÎšĪƒÎˇĪ‚", - "search_filter_filename": "Search by file name", + "search_filter_filename": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŧÎĩ ΌÎŊÎŋÎŧÎą ÎąĪĪ‡ÎĩίÎŋĪ…", "search_filter_location": "ΤÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą", "search_filter_location_title": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ Ī„ÎŋĪ€ÎŋθÎĩĪƒÎ¯Îą", "search_filter_media_type": "Î¤ĪĪ€ÎŋĪ‚ ÎœÎ­ĪƒÎŋĪ…", @@ -1522,17 +1524,17 @@ "search_filter_people_title": "Î•Ī€ÎšÎģÎ­ÎžĪ„Îĩ ÎŦĪ„ÎŋÎŧÎą", "search_for": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŗÎšÎą", "search_for_existing_person": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ Ī…Ī€ÎŦ΁·ÎŋÎŊĪ„ÎŋĪ‚ ÎąĪ„ĪŒÎŧÎŋĪ…", - "search_no_more_result": "No more results", + "search_no_more_result": "ΔÎĩÎŊ Ī…Ī€ÎŦ΁·ÎŋĪ…ÎŊ ÎŦÎģÎģÎą ÎąĪ€ÎŋĪ„ÎĩÎģÎ­ĪƒÎŧÎąĪ„Îą", "search_no_people": "ΚαÎŊέÎŊÎą ÎŦĪ„ÎŋÎŧÎŋ", "search_no_people_named": "ΚαÎŊέÎŊÎą ÎŦĪ„ÎŋÎŧÎŋ ÎŧÎĩ ΌÎŊÎŋÎŧÎą \"{name}\"", - "search_no_result": "No results found, try a different search term or combination", + "search_no_result": "ΔÎĩÎŊ Î˛ĪÎ­Î¸ÎˇÎēÎąÎŊ ÎąĪ€ÎŋĪ„ÎĩÎģÎ­ĪƒÎŧÎąĪ„Îą, ΀΁ÎŋĪƒĪ€ÎąÎ¸ÎŽĪƒĪ„Îĩ ÎŧÎĩ Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎ­Ī‚ Îŋ΁ÎŋÎģÎŋÎŗÎ¯ÎĩĪ‚ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚ ÎŽ ĪƒĪ…ÎŊÎ´Ī…ÎąĪƒÎŧÎŋĪĪ‚", "search_options": "Î•Ī€ÎšÎģÎŋÎŗÎ­Ī‚ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚", "search_page_categories": "ÎšÎąĪ„ÎˇÎŗÎŋĪÎ¯ÎĩĪ‚", "search_page_motion_photos": "ΚιÎŊÎŋĪÎŧÎĩÎŊÎĩĪ‚ ÎĻΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚", "search_page_no_objects": "Μη Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎĩĪ‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ÎąÎŊĪ„ÎšÎēÎĩΚÎŧέÎŊΉÎŊ", "search_page_no_places": "Μη Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎĩĪ‚ Ī€ÎģÎˇĪÎŋΆÎŋĪÎ¯ÎĩĪ‚ ÎŗÎšÎą ÎŧÎ­ĪÎˇ", "search_page_screenshots": "ÎŖĪ„ÎšÎŗÎŧÎšĪŒĪ„Ī…Ī€Îą ÎŋÎ¸ĪŒÎŊÎˇĪ‚", - "search_page_search_photos_videos": "Search for your photos and videos", + "search_page_search_photos_videos": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŗÎšÎą Ī„ÎšĪ‚ ΆΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎēιΚ Ī„Îą Î˛Î¯ÎŊĪ„ÎĩΌ ĪƒÎąĪ‚", "search_page_selfies": "ÎŖÎ­ÎģĪ†Îš", "search_page_things": "Î ĪÎŦÎŗÎŧÎąĪ„Îą", "search_page_view_all_button": "Î ĪÎŋβÎŋÎģÎŽ ΌÎģΉÎŊ", @@ -1544,7 +1546,7 @@ "search_result_page_new_search_hint": "Νέα ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ", "search_settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚", "search_state": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŊÎŋÎŧÎŋĪ...", - "search_suggestion_list_smart_search_hint_1": "Η Î­ÎžĪ…Ī€ÎŊΡ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ ÎąĪ€ĪŒ ΀΁ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ, ÎŗÎšÎą ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îŋ ĪƒĪ…ÎŊĪ„ÎąÎēĪ„ÎšÎēΌ", + "search_suggestion_list_smart_search_hint_1": "Η Î­ÎžĪ…Ī€ÎŊΡ ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎĩίÎŊιΚ ÎĩÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊΡ ÎąĪ€ĪŒ ΀΁ÎŋÎĩĪ€ÎšÎģÎŋÎŗÎŽ, ÎŗÎšÎą ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎŧÎĩĪ„ÎąÎ´ÎĩδÎŋÎŧέÎŊΉÎŊ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋÎšÎŽĪƒĪ„Îĩ Ī„Îŋ ĪƒĪ…ÎŊĪ„ÎąÎēĪ„ÎšÎēΌ ", "search_suggestion_list_smart_search_hint_2": "m:Ό΁ÎŋĪ‚-ÎąÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇĪ‚", "search_tags": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎĩĪ„ÎšÎēÎĩĪ„ĪŽÎŊ...", "search_timezone": "ΑÎŊÎąÎļÎŽĪ„ÎˇĪƒÎˇ ÎļĪŽÎŊÎˇĪ‚ ĪŽĪÎąĪ‚...", @@ -1571,7 +1573,7 @@ "selected_count": "{count, plural, other {# ÎĩĪ€ÎšÎģÎĩÎŗÎŧέÎŊÎŋΚ}}", "send_message": "Î‘Ī€ÎŋĪƒĪ„ÎŋÎģÎŽ ÎŧΡÎŊĪÎŧÎąĪ„ÎŋĪ‚", "send_welcome_email": "Î‘Ī€ÎŋĪƒĪ„ÎŋÎģÎŽ email ÎēÎąÎģĪ‰ĪƒÎŋĪÎ¯ĪƒÎŧÎąĪ„ÎŋĪ‚", - "server_endpoint": "Server Endpoint", + "server_endpoint": "ΤÎĩÎģΚÎēΌ ĪƒÎˇÎŧÎĩίÎŋ ΔιαÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "server_info_box_app_version": "ΈÎēδÎŋĪƒÎˇ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚", "server_info_box_server_url": "URL δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ", "server_offline": "ΔιαÎēÎŋÎŧÎšĪƒĪ„ÎŽĪ‚ ΕÎēĪ„ĪŒĪ‚ ÎŖĪÎŊδÎĩĪƒÎˇĪ‚", @@ -1592,7 +1594,7 @@ "setting_image_viewer_preview_title": "ÎĻĪŒĪĪ„Ī‰ĪƒÎˇ ÎĩΚÎēΌÎŊÎąĪ‚ ΀΁ÎŋÎĩĪ€ÎšĪƒÎēĪŒĪ€ÎˇĪƒÎˇĪ‚", "setting_image_viewer_title": "ΕιÎēΌÎŊÎĩĪ‚", "setting_languages_apply": "Î•Ī†ÎąĪÎŧÎŋÎŗÎŽ", - "setting_languages_subtitle": "Change the app's language", + "setting_languages_subtitle": "ΑÎģÎģÎŦÎžĪ„Îĩ Ī„Îˇ ÎŗÎģĪŽĪƒĪƒÎą Ī„ÎˇĪ‚ ÎĩĪ†ÎąĪÎŧÎŋÎŗÎŽĪ‚", "setting_languages_title": "ΓÎģĪŽĪƒĪƒÎĩĪ‚", "setting_notifications_notify_failures_grace_period": "ΕιδÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ÎąĪ€ÎŋĪ„Ī…Ī‡ÎšĪŽÎŊ δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ ĪƒĪ„Îŋ Ī€ÎąĪÎąĪƒÎēÎŽÎŊΚÎŋ: {}", "setting_notifications_notify_hours": "{} ĪŽĪÎĩĪ‚", @@ -1606,8 +1608,8 @@ "setting_notifications_total_progress_subtitle": "ÎŖĪ…ÎŊÎŋÎģΚÎēÎŽ Ī€ĪĪŒÎŋδÎŋĪ‚ ÎŧÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚ (ÎŋÎģÎŋÎēÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ/ĪƒĪÎŊÎŋÎģÎŋ ĪƒĪ„ÎŋÎšĪ‡ÎĩÎ¯Ī‰ÎŊ)", "setting_notifications_total_progress_title": "ΕÎŧΆÎŦÎŊÎšĪƒÎˇ ĪƒĪ…ÎŊÎŋÎģΚÎēÎŽĪ‚ ΀΁ÎŋĪŒÎ´ÎŋĪ… δΡÎŧΚÎŋĪ…ĪÎŗÎ¯ÎąĪ‚ ÎąÎŊĪ„ÎšÎŗĪÎŦΆΉÎŊ ÎąĪƒĪ†ÎąÎģÎĩÎ¯ÎąĪ‚ Ī€ÎąĪÎąĪƒÎēΡÎŊίÎŋĪ…", "setting_video_viewer_looping_title": "ÎŖĪ…ÎŊÎĩĪ‡ÎŽĪ‚ Î•Ī€ÎąÎŊÎŦÎģÎˇĪˆÎˇ", - "setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.", - "setting_video_viewer_original_video_title": "Force original video", + "setting_video_viewer_original_video_subtitle": "ÎŒĪ„ÎąÎŊ ÎŧÎĩĪ„ÎąÎ´Î¯Î´ÎĩĪ„Îĩ έÎŊÎą Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎąĪ€ĪŒ Ī„ÎŋÎŊ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ, ÎąÎŊÎąĪ€ÎąĪÎŦÎŗÎĩĪ„Îĩ Ī„Îŋ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēΌ ÎąÎēΌÎŧΡ ÎēιΚ ĪŒĪ„ÎąÎŊ Ī…Ī€ÎŦ΁·ÎĩΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎŋ ÎŧÎĩ Î´ÎšÎąĪ†Îŋ΁ÎĩĪ„ÎšÎēÎŽ ÎēĪ‰Î´ÎšÎēÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ. ÎœĪ€Îŋ΁Îĩί ÎŊÎą ΀΁ÎŋÎēÎąÎģÎ­ĪƒÎĩΚ ÎēÎąÎ¸Ī…ĪƒĪ„Î­ĪÎˇĪƒÎˇ Ī†ĪŒĪĪ„Ī‰ĪƒÎˇĪ‚. Τι Î˛Î¯ÎŊĪ„ÎĩÎŋ Ī€ÎŋĪ… ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧÎą Ī„ÎŋĪ€ÎšÎēÎŦ, ÎąÎŊÎąĪ€ÎąĪÎŦÎŗÎŋÎŊĪ„ÎąÎš ĪƒĪ„ÎˇÎŊ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŽ Ī€ÎŋÎšĪŒĪ„ÎˇĪ„Îą, ÎąÎŊÎĩÎžÎąĪĪ„ÎŽĪ„Ī‰Ī‚ ÎąĪ…Ī„ÎŽĪ‚ Ī„ÎˇĪ‚ ĪĪÎ¸ÎŧÎšĪƒÎˇĪ‚.", + "setting_video_viewer_original_video_title": "ΑÎŊÎąÎŗÎēÎąĪƒĪ„ÎšÎēÎŽ ÎąÎŊÎąĪ€ÎąĪÎąÎŗĪ‰ÎŗÎŽ ÎąĪ…Î¸ÎĩÎŊĪ„ÎšÎēÎŋĪ Î˛Î¯ÎŊĪ„ÎĩÎŋ", "settings": "ÎĄĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚", "settings_require_restart": "Î•Ī€ÎąÎŊÎĩÎēÎēΚÎŊÎŽĪƒĪ„Îĩ Ī„Îŋ Immich ÎŗÎšÎą ÎŊÎą ÎĩĪ†ÎąĪÎŧΌ΃ÎĩĪ„Îĩ ÎąĪ…Ī„ÎŽÎŊ Ī„Îˇ ĪĪÎ¸ÎŧÎšĪƒÎˇ", "settings_saved": "Οι ĪĪ…Î¸ÎŧÎ¯ĪƒÎĩÎšĪ‚ ÎąĪ€ÎŋθΡÎēÎĩĪĪ„ÎˇÎēÎąÎŊ", @@ -1622,12 +1624,12 @@ "shared_album_section_people_action_error": "ÎŖĪ†ÎŦÎģÎŧÎą ÎąĪ€ÎŋĪ‡ĪŽĪÎˇĪƒÎˇĪ‚/ÎēÎąĪ„ÎŦĪÎŗÎˇĪƒÎˇĪ‚ ÎąĪ€ĪŒ Ī„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "shared_album_section_people_action_leave": "Î‘Ī€ÎŋĪ‡ĪŽĪÎˇĪƒÎˇ Ī‡ĪÎŽĪƒĪ„Îˇ ÎąĪ€ĪŒ Ī„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", "shared_album_section_people_action_remove_user": "ÎšÎąĪ„ÎŦĪÎŗÎˇĪƒÎˇ Ī‡ĪÎŽĪƒĪ„Îˇ ÎąĪ€ĪŒ Ī„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ", - "shared_album_section_people_title": "ΑΝΘΡΩΠΟΙ", + "shared_album_section_people_title": "ΑΤΟΜΑ", "shared_by": "ÎŖÎĩ ÎēÎŋΚÎŊÎŽ Ī‡ĪÎŽĪƒÎˇ ÎąĪ€ĪŒ", "shared_by_user": "ÎŖÎĩ ÎēÎŋΚÎŊÎŽ Ī‡ĪÎŽĪƒÎˇ ÎąĪ€ĪŒ {user}", "shared_by_you": "ÎŖÎĩ ÎēÎŋΚÎŊÎŽ Ī‡ĪÎŽĪƒÎˇ ÎąĪ€ĪŒ Îĩ΃ÎŦĪ‚", "shared_from_partner": "ÎĻΉ΄ÎŋÎŗĪÎąĪ†Î¯ÎĩĪ‚ ÎąĪ€ĪŒ {partner}", - "shared_intent_upload_button_progress_text": "{} / {} Uploaded", + "shared_intent_upload_button_progress_text": "{} / {} ΜÎĩĪ„ÎąĪ†Îŋ΁΄ΉÎŧέÎŊÎą", "shared_link_app_bar_title": "ΚÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„ÎŋΚ ÎŖĪÎŊδÎĩ΃ÎŧÎŋΚ", "shared_link_clipboard_copied_massage": "ΑÎŊĪ„ÎšÎŗĪÎŦĪ†ÎˇÎēÎĩ ĪƒĪ„Îŋ Ī€ĪĪŒĪ‡ÎĩÎšĪÎŋ", "shared_link_clipboard_text": "ÎŖĪÎŊδÎĩ΃ÎŧÎŋĪ‚: {}\nÎšĪ‰Î´ÎšÎēĪŒĪ‚ Ī€ĪĪŒĪƒÎ˛ÎąĪƒÎˇĪ‚: {}", @@ -1806,7 +1808,7 @@ "unlink_motion_video": "Î‘Ī€ÎŋĪƒĪ…ÎŊÎ´Î­ĪƒĪ„Îĩ Ī„Îŋ Î˛Î¯ÎŊĪ„ÎĩÎŋ ÎēίÎŊÎˇĪƒÎˇĪ‚", "unlink_oauth": "Î‘Ī€ÎŋĪƒĪÎŊδÎĩĪƒÎˇ OAuth", "unlinked_oauth_account": "Ο ÎģÎŋÎŗÎąĪÎšÎąĪƒÎŧĪŒĪ‚ OAuth ÎąĪ€ÎŋĪƒĪ…ÎŊδέθΡÎēÎĩ", - "unmute_memories": "Î‘Ī€ÎŋĪƒĪ…ÎŊÎ´Î­ĪƒĪ„Îĩ Ī„ÎšĪ‚ ÎąÎŊÎąÎŧÎŊÎŽĪƒÎĩÎšĪ‚", + "unmute_memories": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋÎ¯ÎˇĪƒÎˇ ΑÎŊÎąÎŧÎŊÎŽĪƒÎĩΉÎŊ", "unnamed_album": "ΑÎŊĪŽÎŊĪ…ÎŧÎŋ ΆÎģÎŧĪ€ÎŋĪ…Îŧ", "unnamed_album_delete_confirmation": "Î•Î¯ĪƒĪ„Îĩ ĪƒÎ¯ÎŗÎŋ΅΁ÎŋΚ ĪŒĪ„Îš θέÎģÎĩĪ„Îĩ ÎŊÎą Î´ÎšÎąÎŗĪÎŦΈÎĩĪ„Îĩ ÎąĪ…Ī„ĪŒ Ī„Îŋ ÎŦÎģÎŧĪ€ÎŋĪ…Îŧ;", "unnamed_share": "ΑÎŊĪŽÎŊĪ…ÎŧΡ ΚÎŋΚÎŊÎŽ Î§ĪÎŽĪƒÎˇ", @@ -1830,11 +1832,11 @@ "upload_status_errors": "ÎŖĪ†ÎŦÎģÎŧÎąĪ„Îą", "upload_status_uploaded": "ΜÎĩĪ„ÎąĪ†ÎŋĪĪ„ĪŽÎ¸ÎˇÎēÎąÎŊ", "upload_success": "Η ÎŧÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇ ÎŋÎģÎŋÎēÎģÎˇĪĪŽÎ¸ÎˇÎēÎĩ, ÎąÎŊÎąÎŊÎĩĪŽĪƒĪ„Îĩ Ī„Îˇ ΃ÎĩÎģÎ¯Î´Îą ÎŗÎšÎą ÎŊÎą δÎĩÎ¯Ī„Îĩ Ī„Îą ÎŊέι ÎąÎŊĪ„ÎšÎēÎĩίÎŧÎĩÎŊÎą.", - "upload_to_immich": "Upload to Immich ({})", - "uploading": "Uploading", + "upload_to_immich": "ΜÎĩĪ„ÎąĪ†ĪŒĪĪ„Ī‰ĪƒÎˇ ĪƒĪ„Îŋ Immich ({})", + "uploading": "ΜÎĩĪ„ÎąĪ†ÎŋĪĪ„ĪŽÎŊÎĩĪ„ÎąÎš", "url": "URL", "usage": "Î§ĪÎŽĪƒÎˇ", - "use_current_connection": "use current connection", + "use_current_connection": "Ī‡ĪÎŽĪƒÎˇ Ī„ĪÎ­Ī‡ÎŋĪ…ĪƒÎąĪ‚ ĪƒĪÎŊδÎĩĪƒÎˇĪ‚", "use_custom_date_range": "Î§ĪÎŽĪƒÎˇ ΀΁ÎŋĪƒÎąĪÎŧÎŋ΃ÎŧέÎŊÎŋĪ… ÎĩĪĪÎŋĪ…Ī‚ ΡÎŧÎĩ΁ÎŋÎŧΡÎŊÎšĪŽÎŊ", "user": "Î§ĪÎŽĪƒĪ„ÎˇĪ‚", "user_id": "ID Î§ĪÎŽĪƒĪ„Îˇ", @@ -1849,14 +1851,14 @@ "users": "Î§ĪÎŽĪƒĪ„ÎĩĪ‚", "utilities": "ΒÎŋÎˇÎ¸ÎˇĪ„ÎšÎēÎŦ ΀΁ÎŋÎŗĪÎŦÎŧÎŧÎąĪ„Îą", "validate": "Î•Ī€ÎšÎēĪĪĪ‰ĪƒÎˇ", - "validate_endpoint_error": "Please enter a valid URL", + "validate_endpoint_error": "Î ÎąĪÎąÎēÎąÎģĪŽ ÎĩÎšĪƒÎŦÎŗÎĩĪ„Îĩ έÎŊÎą Î­ÎŗÎē΅΁Îŋ URL", "variables": "ΜÎĩĪ„ÎąÎ˛ÎģÎˇĪ„Î­Ī‚", "version": "ΈÎēδÎŋĪƒÎˇ", "version_announcement_closing": "Ο Ī†Î¯ÎģÎŋĪ‚ ΃ÎŋĪ…, Alex", "version_announcement_message": "ΓÎĩΚÎŦ ĪƒÎąĪ‚! Μια ÎŊέι έÎēδÎŋĪƒÎˇ Ī„ÎŋĪ… Immich ÎĩίÎŊιΚ Î´ÎšÎąÎ¸Î­ĪƒÎšÎŧΡ. Î ÎąĪÎąÎēÎąÎģÎŋĪÎŧÎĩ ÎąĪ†ÎšÎĩĪĪŽĪƒĪ„Îĩ ÎģÎ¯ÎŗÎŋ Ī‡ĪĪŒÎŊÎŋ ÎŗÎšÎą ÎŊÎą δΚιβÎŦ΃ÎĩĪ„Îĩ Ī„ÎšĪ‚ ĪƒÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚ έÎēδÎŋĪƒÎˇĪ‚ ĪŽĪƒĪ„Îĩ ÎŊÎą βÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Ρ ĪĪÎ¸ÎŧÎšĪƒÎˇ ĪƒÎąĪ‚ ÎĩίÎŊιΚ ÎĩÎŊΡÎŧÎĩ΁ΉÎŧέÎŊΡ ÎēιΚ ÎŊÎą ÎąĪ€ÎŋĪ†ĪÎŗÎĩĪ„Îĩ Ī„Ī…Ī‡ĪŒÎŊ ĪƒĪ†ÎŦÎģÎŧÎąĪ„Îą, ÎĩΚδΚÎēÎŦ ÎąÎŊ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„Îĩ Ī„Îŋ WatchTower ÎŽ ÎŋĪ€ÎŋΚÎŋÎ´ÎŽĪ€ÎŋĪ„Îĩ ÎŧÎˇĪ‡ÎąÎŊÎšĪƒÎŧΌ Ī€ÎŋĪ… Î´ÎšÎąĪ‡ÎĩÎšĪÎ¯ÎļÎĩĪ„ÎąÎš ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îą Ī„ÎˇÎŊ ÎĩÎŊΡÎŧÎ­ĪĪ‰ĪƒÎˇ Ī„ÎˇĪ‚ ÎĩÎŗÎēÎąĪ„ÎŦĪƒĪ„ÎąĪƒÎˇĪ‚ Ī„ÎŋĪ… Immich ĪƒÎąĪ‚.", "version_announcement_overlay_release_notes": "ĪƒÎˇÎŧÎĩÎšĪŽĪƒÎĩÎšĪ‚ έÎēδÎŋĪƒÎˇĪ‚", "version_announcement_overlay_text_1": "ΓÎĩΚÎŦ ĪƒÎąĪ‚, Ī…Ī€ÎŦ΁·ÎĩΚ ÎŧΚι ÎŊέι έÎēδÎŋĪƒÎˇ Ī„ÎŋĪ…", - "version_announcement_overlay_text_2": "Ī€ÎąĪÎąÎēÎąÎģĪŽ ÎąĪ†ÎšÎĩĪĪŽĪƒĪ„Îĩ Ī‡ĪĪŒÎŊÎŋ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„Îŋ", + "version_announcement_overlay_text_2": "Ī€ÎąĪÎąÎēÎąÎģĪŽ ÎąĪ†ÎšÎĩĪĪŽĪƒĪ„Îĩ Ī‡ĪĪŒÎŊÎŋ ÎŊÎą ÎĩĪ€ÎšĪƒÎēÎĩĪ†Î¸ÎĩÎ¯Ī„Îĩ Ī„Îŋ ", "version_announcement_overlay_text_3": " ÎēιΚ βÎĩÎ˛ÎąÎšĪ‰Î¸ÎĩÎ¯Ī„Îĩ ĪŒĪ„Îš Ī„Îŋ docker-compose ÎēιΚ Ī„Îŋ .env ĪƒÎąĪ‚ ÎĩίÎŊιΚ ÎĩÎŊΡÎŧÎĩ΁ΉÎŧέÎŊΡ ÎŗÎšÎą Ī„ÎˇÎŊ ÎąĪ€ÎŋĪ†Ī…ÎŗÎŽ Ī„Ī…Ī‡ĪŒÎŊ ÎĩĪƒĪ†ÎąÎģÎŧέÎŊΉÎŊ δΚιÎŧÎŋĪĪ†ĪŽĪƒÎĩΉÎŊ, ÎĩΚδΚÎēÎŦ ÎĩÎŦÎŊ Ī‡ĪÎˇĪƒÎšÎŧÎŋĪ€ÎŋΚÎĩÎ¯Ī„Îĩ Ī„Îŋ WatchTower ÎŽ ÎŋĪ€ÎŋΚÎŋÎŊÎ´ÎŽĪ€ÎŋĪ„Îĩ ÎŧÎˇĪ‡ÎąÎŊÎšĪƒÎŧΌ Ī€ÎŋĪ… ·ÎĩÎšĪÎ¯ÎļÎĩĪ„ÎąÎš Ī„ÎˇÎŊ ÎąĪ…Ī„ĪŒÎŧÎąĪ„Îˇ ÎĩÎŊΡÎŧÎ­ĪĪ‰ĪƒÎˇ Ī„ÎŋĪ… δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ ĪƒÎąĪ‚.", "version_announcement_overlay_title": "Î”ÎšÎąÎ¸Î­ĪƒÎšÎŧΡ ÎŊέι έÎēδÎŋĪƒÎˇ δΚιÎēÎŋÎŧÎšĪƒĪ„ÎŽ 🎉", "version_history": "Î™ĪƒĪ„ÎŋĪÎšÎēΌ ΕÎēÎ´ĪŒĪƒÎĩΉÎŊ", @@ -1887,11 +1889,11 @@ "week": "ΕβδÎŋÎŧÎŦδι", "welcome": "ΚαÎģĪ‰ĪƒÎŋĪÎ¯ĪƒÎąĪ„Îĩ", "welcome_to_immich": "ΚαÎģĪ‰ĪƒÎŋĪÎ¯ĪƒÎąĪ„Îĩ ĪƒĪ„Îŋ Ιmmich", - "wifi_name": "WiFi Name", + "wifi_name": "ΌÎŊÎŋÎŧÎą Wi-Fi", "year": "ÎˆĪ„ÎŋĪ‚", "years_ago": "Ī€ĪÎšÎŊ ÎąĪ€ĪŒ {years, plural, one {# Ī‡ĪĪŒÎŊÎŋ} other {# Ī‡ĪĪŒÎŊΚι}}", "yes": "Ναι", "you_dont_have_any_shared_links": "ΔÎĩÎŊ Î­Ī‡ÎĩĪ„Îĩ ÎēÎŋΚÎŊĪŒĪ‡ĪÎˇĪƒĪ„ÎŋĪ…Ī‚ ĪƒĪ…ÎŊÎ´Î­ĪƒÎŧÎŋĪ…Ī‚", - "your_wifi_name": "Your WiFi name", + "your_wifi_name": "ΤÎŋ ΌÎŊÎŋÎŧÎą Ī„ÎŋĪ… Wi-Fi ĪƒÎąĪ‚", "zoom_image": "ΖÎŋĪ…Îŧ ΕιÎēΌÎŊÎąĪ‚" } diff --git a/i18n/en.json b/i18n/en.json index c01cd65712..2db9976fa6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1,4 +1,17 @@ { + "user_pin_code_settings": "PIN Code", + "user_pin_code_settings_description": "Manage your PIN code", + "current_pin_code": "Current PIN code", + "new_pin_code": "New PIN code", + "setup_pin_code": "Setup a PIN code", + "confirm_new_pin_code": "Confirm new PIN code", + "change_pin_code": "Change PIN code", + "unable_to_change_pin_code": "Unable to change PIN code", + "unable_to_setup_pin_code": "Unable to setup PIN code", + "pin_code_changed_successfully": "Successfully changed PIN code", + "pin_code_setup_successfully": "Successfully setup a PIN code", + "pin_code_reset_successfully": "Successfully reset PIN code", + "reset_pin_code": "Reset PIN code", "about": "About", "account": "Account", "account_settings": "Account Settings", @@ -53,6 +66,7 @@ "confirm_email_below": "To confirm, type \"{email}\" below", "confirm_reprocess_all_faces": "Are you sure you want to reprocess all faces? This will also clear named people.", "confirm_user_password_reset": "Are you sure you want to reset {user}'s password?", + "confirm_user_pin_code_reset": "Are you sure you want to reset {user}'s PIN code?", "create_job": "Create job", "cron_expression": "Cron expression", "cron_expression_description": "Set the scanning interval using the cron format. For more information please refer to e.g. Crontab Guru", @@ -369,7 +383,7 @@ "advanced": "Advanced", "advanced_settings_enable_alternate_media_filter_subtitle": "Use this option to filter media during sync based on alternate criteria. Only try this if you have issues with the app detecting all albums.", "advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Use alternate device album sync filter", - "advanced_settings_log_level_title": "Log level: {}", + "advanced_settings_log_level_title": "Log level: {level}", "advanced_settings_prefer_remote_subtitle": "Some devices are painfully slow to load thumbnails from assets on the device. Activate this setting to load remote images instead.", "advanced_settings_prefer_remote_title": "Prefer remote images", "advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", @@ -400,9 +414,9 @@ "album_remove_user_confirmation": "Are you sure you want to remove {user}?", "album_share_no_users": "Looks like you have shared this album with all users or you don't have any user to share with.", "album_thumbnail_card_item": "1 item", - "album_thumbnail_card_items": "{} items", + "album_thumbnail_card_items": "{count} items", "album_thumbnail_card_shared": " ¡ Shared", - "album_thumbnail_shared_by": "Shared by {}", + "album_thumbnail_shared_by": "Shared by {user}", "album_updated": "Album updated", "album_updated_setting_description": "Receive an email notification when a shared album has new assets", "album_user_left": "Left {album}", @@ -440,7 +454,7 @@ "archive": "Archive", "archive_or_unarchive_photo": "Archive or unarchive photo", "archive_page_no_archived_assets": "No archived assets found", - "archive_page_title": "Archive ({})", + "archive_page_title": "Archive ({count})", "archive_size": "Archive size", "archive_size_description": "Configure the archive size for downloads (in GiB)", "archived": "Archived", @@ -477,18 +491,18 @@ "assets_added_to_album_count": "Added {count, plural, one {# asset} other {# assets}} to the album", "assets_added_to_name_count": "Added {count, plural, one {# asset} other {# assets}} to {hasName, select, true {{name}} other {new album}}", "assets_count": "{count, plural, one {# asset} other {# assets}}", - "assets_deleted_permanently": "{} asset(s) deleted permanently", - "assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", + "assets_deleted_permanently": "{count} asset(s) deleted permanently", + "assets_deleted_permanently_from_server": "{count} asset(s) deleted permanently from the Immich server", "assets_moved_to_trash_count": "Moved {count, plural, one {# asset} other {# assets}} to trash", "assets_permanently_deleted_count": "Permanently deleted {count, plural, one {# asset} other {# assets}}", "assets_removed_count": "Removed {count, plural, one {# asset} other {# assets}}", - "assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", + "assets_removed_permanently_from_device": "{count} asset(s) removed permanently from your device", "assets_restore_confirmation": "Are you sure you want to restore all your trashed assets? You cannot undo this action! Note that any offline assets cannot be restored this way.", "assets_restored_count": "Restored {count, plural, one {# asset} other {# assets}}", - "assets_restored_successfully": "{} asset(s) restored successfully", - "assets_trashed": "{} asset(s) trashed", + "assets_restored_successfully": "{count} asset(s) restored successfully", + "assets_trashed": "{count} asset(s) trashed", "assets_trashed_count": "Trashed {count, plural, one {# asset} other {# assets}}", - "assets_trashed_from_server": "{} asset(s) trashed from the Immich server", + "assets_trashed_from_server": "{count} asset(s) trashed from the Immich server", "assets_were_part_of_album_count": "{count, plural, one {Asset was} other {Assets were}} already part of the album", "authorized_devices": "Authorized Devices", "automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere", @@ -497,7 +511,7 @@ "back_close_deselect": "Back, close, or deselect", "background_location_permission": "Background location permission", "background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name", - "backup_album_selection_page_albums_device": "Albums on device ({})", + "backup_album_selection_page_albums_device": "Albums on device ({count})", "backup_album_selection_page_albums_tap": "Tap to include, double tap to exclude", "backup_album_selection_page_assets_scatter": "Assets can scatter across multiple albums. Thus, albums can be included or excluded during the backup process.", "backup_album_selection_page_select_albums": "Select albums", @@ -506,11 +520,11 @@ "backup_all": "All", "backup_background_service_backup_failed_message": "Failed to backup assets. Retryingâ€Ļ", "backup_background_service_connection_failed_message": "Failed to connect to the server. Retryingâ€Ļ", - "backup_background_service_current_upload_notification": "Uploading {}", + "backup_background_service_current_upload_notification": "Uploading {filename}", "backup_background_service_default_notification": "Checking for new assetsâ€Ļ", "backup_background_service_error_title": "Backup error", "backup_background_service_in_progress_notification": "Backing up your assetsâ€Ļ", - "backup_background_service_upload_failure_notification": "Failed to upload {}", + "backup_background_service_upload_failure_notification": "Failed to upload {filename}", "backup_controller_page_albums": "Backup Albums", "backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.", "backup_controller_page_background_app_refresh_disabled_title": "Background app refresh disabled", @@ -521,22 +535,22 @@ "backup_controller_page_background_battery_info_title": "Battery optimizations", "backup_controller_page_background_charging": "Only while charging", "backup_controller_page_background_configure_error": "Failed to configure the background service", - "backup_controller_page_background_delay": "Delay new assets backup: {}", + "backup_controller_page_background_delay": "Delay new assets backup: {duration}", "backup_controller_page_background_description": "Turn on the background service to automatically backup any new assets without needing to open the app", "backup_controller_page_background_is_off": "Automatic background backup is off", "backup_controller_page_background_is_on": "Automatic background backup is on", "backup_controller_page_background_turn_off": "Turn off background service", "backup_controller_page_background_turn_on": "Turn on background service", - "backup_controller_page_background_wifi": "Only on WiFi", + "backup_controller_page_background_wifi": "Only on Wi-Fi", "backup_controller_page_backup": "Backup", "backup_controller_page_backup_selected": "Selected: ", "backup_controller_page_backup_sub": "Backed up photos and videos", - "backup_controller_page_created": "Created on: {}", + "backup_controller_page_created": "Created on: {date}", "backup_controller_page_desc_backup": "Turn on foreground backup to automatically upload new assets to the server when opening the app.", "backup_controller_page_excluded": "Excluded: ", - "backup_controller_page_failed": "Failed ({})", - "backup_controller_page_filename": "File name: {} [{}]", - "backup_controller_page_id": "ID: {}", + "backup_controller_page_failed": "Failed ({count})", + "backup_controller_page_filename": "File name: {filename} [{size}]", + "backup_controller_page_id": "ID: {id}", "backup_controller_page_info": "Backup Information", "backup_controller_page_none_selected": "None selected", "backup_controller_page_remainder": "Remainder", @@ -545,7 +559,7 @@ "backup_controller_page_start_backup": "Start Backup", "backup_controller_page_status_off": "Automatic foreground backup is off", "backup_controller_page_status_on": "Automatic foreground backup is on", - "backup_controller_page_storage_format": "{} of {} used", + "backup_controller_page_storage_format": "{used} of {total} used", "backup_controller_page_to_backup": "Albums to be backed up", "backup_controller_page_total_sub": "All unique photos and videos from selected albums", "backup_controller_page_turn_off": "Turn off foreground backup", @@ -570,21 +584,21 @@ "bulk_keep_duplicates_confirmation": "Are you sure you want to keep {count, plural, one {# duplicate asset} other {# duplicate assets}}? This will resolve all duplicate groups without deleting anything.", "bulk_trash_duplicates_confirmation": "Are you sure you want to bulk trash {count, plural, one {# duplicate asset} other {# duplicate assets}}? This will keep the largest asset of each group and trash all other duplicates.", "buy": "Purchase Immich", - "cache_settings_album_thumbnails": "Library page thumbnails ({} assets)", + "cache_settings_album_thumbnails": "Library page thumbnails ({count} assets)", "cache_settings_clear_cache_button": "Clear cache", "cache_settings_clear_cache_button_title": "Clears the app's cache. This will significantly impact the app's performance until the cache has rebuilt.", "cache_settings_duplicated_assets_clear_button": "CLEAR", "cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app", - "cache_settings_duplicated_assets_title": "Duplicated Assets ({})", - "cache_settings_image_cache_size": "Image cache size ({} assets)", + "cache_settings_duplicated_assets_title": "Duplicated Assets ({count})", + "cache_settings_image_cache_size": "Image cache size ({count} assets)", "cache_settings_statistics_album": "Library thumbnails", - "cache_settings_statistics_assets": "{} assets ({})", + "cache_settings_statistics_assets": "{count} assets ({size})", "cache_settings_statistics_full": "Full images", "cache_settings_statistics_shared": "Shared album thumbnails", "cache_settings_statistics_thumbnail": "Thumbnails", "cache_settings_statistics_title": "Cache usage", "cache_settings_subtitle": "Control the caching behaviour of the Immich mobile application", - "cache_settings_thumbnail_size": "Thumbnail cache size ({} assets)", + "cache_settings_thumbnail_size": "Thumbnail cache size ({count} assets)", "cache_settings_tile_subtitle": "Control the local storage behaviour", "cache_settings_tile_title": "Local Storage", "cache_settings_title": "Caching Settings", @@ -654,7 +668,7 @@ "contain": "Contain", "context": "Context", "continue": "Continue", - "control_bottom_app_bar_album_info_shared": "{} items ¡ Shared", + "control_bottom_app_bar_album_info_shared": "{count} items ¡ Shared", "control_bottom_app_bar_create_new_album": "Create new album", "control_bottom_app_bar_delete_from_immich": "Delete from Immich", "control_bottom_app_bar_delete_from_local": "Delete from device", @@ -763,7 +777,7 @@ "download_enqueue": "Download enqueued", "download_error": "Download Error", "download_failed": "Download failed", - "download_filename": "file: {}", + "download_filename": "file: {filename}", "download_finished": "Download finished", "download_include_embedded_motion_videos": "Embedded videos", "download_include_embedded_motion_videos_description": "Include videos embedded in motion photos as a separate file", @@ -814,12 +828,12 @@ "enabled": "Enabled", "end_date": "End date", "enqueued": "Enqueued", - "enter_wifi_name": "Enter WiFi name", + "enter_wifi_name": "Enter Wi-Fi name", "error": "Error", "error_change_sort_album": "Failed to change album sort order", "error_delete_face": "Error deleting face from asset", "error_loading_image": "Error loading image", - "error_saving_image": "Error: {}", + "error_saving_image": "Error: {error}", "error_title": "Error - Something went wrong", "errors": { "cannot_navigate_next_asset": "Cannot navigate to the next asset", @@ -922,6 +936,7 @@ "unable_to_remove_reaction": "Unable to remove reaction", "unable_to_repair_items": "Unable to repair items", "unable_to_reset_password": "Unable to reset password", + "unable_to_reset_pin_code": "Unable to reset PIN code", "unable_to_resolve_duplicate": "Unable to resolve duplicate", "unable_to_restore_assets": "Unable to restore assets", "unable_to_restore_trash": "Unable to restore trash", @@ -955,10 +970,10 @@ "exif_bottom_sheet_location": "LOCATION", "exif_bottom_sheet_people": "PEOPLE", "exif_bottom_sheet_person_add_person": "Add name", - "exif_bottom_sheet_person_age": "Age {}", - "exif_bottom_sheet_person_age_months": "Age {} months", - "exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months", - "exif_bottom_sheet_person_age_years": "Age {}", + "exif_bottom_sheet_person_age": "Age {age}", + "exif_bottom_sheet_person_age_months": "Age {months} months", + "exif_bottom_sheet_person_age_year_months": "Age 1 year, {months} months", + "exif_bottom_sheet_person_age_years": "Age {years}", "exit_slideshow": "Exit Slideshow", "expand_all": "Expand all", "experimental_settings_new_asset_list_subtitle": "Work in progress", @@ -1173,8 +1188,8 @@ "manage_your_devices": "Manage your logged-in devices", "manage_your_oauth_connection": "Manage your OAuth connection", "map": "Map", - "map_assets_in_bound": "{} photo", - "map_assets_in_bounds": "{} photos", + "map_assets_in_bound": "{count} photo", + "map_assets_in_bounds": "{count} photos", "map_cannot_get_user_location": "Cannot get user's location", "map_location_dialog_yes": "Yes", "map_location_picker_page_use_location": "Use this location", @@ -1188,9 +1203,9 @@ "map_settings": "Map settings", "map_settings_dark_mode": "Dark mode", "map_settings_date_range_option_day": "Past 24 hours", - "map_settings_date_range_option_days": "Past {} days", + "map_settings_date_range_option_days": "Past {days} days", "map_settings_date_range_option_year": "Past year", - "map_settings_date_range_option_years": "Past {} years", + "map_settings_date_range_option_years": "Past {years} years", "map_settings_dialog_title": "Map Settings", "map_settings_include_show_archived": "Include Archived", "map_settings_include_show_partners": "Include Partners", @@ -1209,7 +1224,7 @@ "memories_start_over": "Start Over", "memories_swipe_to_close": "Swipe up to close", "memories_year_ago": "A year ago", - "memories_years_ago": "{} years ago", + "memories_years_ago": "{years} years ago", "memory": "Memory", "memory_lane_title": "Memory Lane {title}", "menu": "Menu", @@ -1316,7 +1331,7 @@ "partner_page_partner_add_failed": "Failed to add partner", "partner_page_select_partner": "Select partner", "partner_page_shared_to_title": "Shared to", - "partner_page_stop_sharing_content": "{} will no longer be able to access your photos.", + "partner_page_stop_sharing_content": "{partner} will no longer be able to access your photos.", "partner_sharing": "Partner Sharing", "partners": "Partners", "password": "Password", @@ -1604,12 +1619,12 @@ "setting_languages_apply": "Apply", "setting_languages_subtitle": "Change the app's language", "setting_languages_title": "Languages", - "setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}", - "setting_notifications_notify_hours": "{} hours", + "setting_notifications_notify_failures_grace_period": "Notify background backup failures: {duration}", + "setting_notifications_notify_hours": "{count} hours", "setting_notifications_notify_immediately": "immediately", - "setting_notifications_notify_minutes": "{} minutes", + "setting_notifications_notify_minutes": "{count} minutes", "setting_notifications_notify_never": "never", - "setting_notifications_notify_seconds": "{} seconds", + "setting_notifications_notify_seconds": "{count} seconds", "setting_notifications_single_progress_subtitle": "Detailed upload progress information per asset", "setting_notifications_single_progress_title": "Show background backup detail progress", "setting_notifications_subtitle": "Adjust your notification preferences", @@ -1623,7 +1638,7 @@ "settings_saved": "Settings saved", "share": "Share", "share_add_photos": "Add photos", - "share_assets_selected": "{} selected", + "share_assets_selected": "{count} selected", "share_dialog_preparing": "Preparing...", "shared": "Shared", "shared_album_activities_input_disable": "Comment is disabled", @@ -1637,32 +1652,32 @@ "shared_by_user": "Shared by {user}", "shared_by_you": "Shared by you", "shared_from_partner": "Photos from {partner}", - "shared_intent_upload_button_progress_text": "{} / {} Uploaded", + "shared_intent_upload_button_progress_text": "{current} / {total} Uploaded", "shared_link_app_bar_title": "Shared Links", "shared_link_clipboard_copied_massage": "Copied to clipboard", - "shared_link_clipboard_text": "Link: {}\nPassword: {}", + "shared_link_clipboard_text": "Link: {link}\nPassword: {password}", "shared_link_create_error": "Error while creating shared link", "shared_link_edit_description_hint": "Enter the share description", "shared_link_edit_expire_after_option_day": "1 day", - "shared_link_edit_expire_after_option_days": "{} days", + "shared_link_edit_expire_after_option_days": "{count} days", "shared_link_edit_expire_after_option_hour": "1 hour", - "shared_link_edit_expire_after_option_hours": "{} hours", + "shared_link_edit_expire_after_option_hours": "{count} hours", "shared_link_edit_expire_after_option_minute": "1 minute", - "shared_link_edit_expire_after_option_minutes": "{} minutes", - "shared_link_edit_expire_after_option_months": "{} months", - "shared_link_edit_expire_after_option_year": "{} year", + "shared_link_edit_expire_after_option_minutes": "{count} minutes", + "shared_link_edit_expire_after_option_months": "{count} months", + "shared_link_edit_expire_after_option_year": "{count} year", "shared_link_edit_password_hint": "Enter the share password", "shared_link_edit_submit_button": "Update link", "shared_link_error_server_url_fetch": "Cannot fetch the server url", - "shared_link_expires_day": "Expires in {} day", - "shared_link_expires_days": "Expires in {} days", - "shared_link_expires_hour": "Expires in {} hour", - "shared_link_expires_hours": "Expires in {} hours", - "shared_link_expires_minute": "Expires in {} minute", - "shared_link_expires_minutes": "Expires in {} minutes", + "shared_link_expires_day": "Expires in {count} day", + "shared_link_expires_days": "Expires in {count} days", + "shared_link_expires_hour": "Expires in {count} hour", + "shared_link_expires_hours": "Expires in {count} hours", + "shared_link_expires_minute": "Expires in {count} minute", + "shared_link_expires_minutes": "Expires in {count} minutes", "shared_link_expires_never": "Expires ∞", - "shared_link_expires_second": "Expires in {} second", - "shared_link_expires_seconds": "Expires in {} seconds", + "shared_link_expires_second": "Expires in {count} second", + "shared_link_expires_seconds": "Expires in {count} seconds", "shared_link_individual_shared": "Individual shared", "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "Manage Shared links", @@ -1763,7 +1778,7 @@ "theme_selection": "Theme selection", "theme_selection_description": "Automatically set the theme to light or dark based on your browser's system preference", "theme_setting_asset_list_storage_indicator_title": "Show storage indicator on asset tiles", - "theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({})", + "theme_setting_asset_list_tiles_per_row_title": "Number of assets per row ({count})", "theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.", "theme_setting_colorful_interface_title": "Colorful interface", "theme_setting_image_viewer_quality_subtitle": "Adjust the quality of the detail image viewer", @@ -1798,11 +1813,11 @@ "trash_no_results_message": "Trashed photos and videos will show up here.", "trash_page_delete_all": "Delete All", "trash_page_empty_trash_dialog_content": "Do you want to empty your trashed assets? These items will be permanently removed from Immich", - "trash_page_info": "Trashed items will be permanently deleted after {} days", + "trash_page_info": "Trashed items will be permanently deleted after {days} days", "trash_page_no_assets": "No trashed assets", "trash_page_restore_all": "Restore All", "trash_page_select_assets_btn": "Select assets", - "trash_page_title": "Trash ({})", + "trash_page_title": "Trash ({count})", "trashed_items_will_be_permanently_deleted_after": "Trashed items will be permanently deleted after {days, plural, one {# day} other {# days}}.", "type": "Type", "unarchive": "Unarchive", @@ -1840,7 +1855,7 @@ "upload_status_errors": "Errors", "upload_status_uploaded": "Uploaded", "upload_success": "Upload success, refresh the page to see new upload assets.", - "upload_to_immich": "Upload to Immich ({})", + "upload_to_immich": "Upload to Immich ({count})", "uploading": "Uploading", "url": "URL", "usage": "Usage", @@ -1897,11 +1912,11 @@ "week": "Week", "welcome": "Welcome", "welcome_to_immich": "Welcome to Immich", - "wifi_name": "WiFi Name", + "wifi_name": "Wi-Fi Name", "year": "Year", "years_ago": "{years, plural, one {# year} other {# years}} ago", "yes": "Yes", "you_dont_have_any_shared_links": "You don't have any shared links", - "your_wifi_name": "Your WiFi name", + "your_wifi_name": "Your Wi-Fi name", "zoom_image": "Zoom Image" } diff --git a/i18n/es.json b/i18n/es.json index 64521c1aa8..1c46646c0d 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Registro automÃĄtico", "oauth_auto_register_description": "Registre automÃĄticamente nuevos usuarios despuÊs de iniciar sesiÃŗn con OAuth", "oauth_button_text": "Texto del botÃŗn", - "oauth_client_id": "ID Cliente", - "oauth_client_secret": "Secreto Cliente", "oauth_enable_description": "Iniciar sesiÃŗn con OAuth", - "oauth_issuer_url": "URL del emisor", "oauth_mobile_redirect_uri": "URI de redireccionamiento mÃŗvil", "oauth_mobile_redirect_uri_override": "Sobreescribir URI de redirecciÃŗn mÃŗvil", "oauth_mobile_redirect_uri_override_description": "Habilitar cuando el proveedor de OAuth no permite una URI mÃŗvil, como '{callback}'", - "oauth_profile_signing_algorithm": "Algoritmo de firma de perfiles", - "oauth_profile_signing_algorithm_description": "Algoritmo utilizado para firmar el perfil del usuario.", - "oauth_scope": "Ámbito", "oauth_settings": "OAuth", "oauth_settings_description": "Administrar la configuraciÃŗn de inicio de sesiÃŗn de OAuth", "oauth_settings_more_details": "Para mÃĄs detalles acerca de esta característica, consulte la documentaciÃŗn.", - "oauth_signing_algorithm": "Algoritmo de firma", "oauth_storage_label_claim": "PeticiÃŗn de etiqueta de almacenamiento", "oauth_storage_label_claim_description": "Establece la etiqueta del almacenamiento del usuario automÃĄticamente a este valor reclamado.", "oauth_storage_quota_claim": "Reclamar quota de almacenamiento", @@ -387,7 +380,7 @@ "advanced_settings_troubleshooting_title": "SoluciÃŗn de problemas", "age_months": "Tiempo {months, plural, one {# mes} other {# meses}}", "age_year_months": "1 aÃąo, {months, plural, one {# mes} other {# meses}}", - "age_years": "AntigÃŧedad {years, plural, one {# aÃąo} other {# aÃąos}}", + "age_years": "Edad {years, plural, one {# aÃąo} other {# aÃąos}}", "album_added": "Álbum aÃąadido", "album_added_notification_setting_description": "Reciba una notificaciÃŗn por correo electrÃŗnico cuando lo agreguen a un ÃĄlbum compartido", "album_cover_updated": "Portada del ÃĄlbum actualizada", @@ -481,7 +474,7 @@ "assets_added_to_album_count": "AÃąadido {count, plural, one {# asset} other {# assets}} al ÃĄlbum", "assets_added_to_name_count": "AÃąadido {count, plural, one {# asset} other {# assets}} a {hasName, select, true {{name}} other {new album}}", "assets_count": "{count, plural, one {# activo} other {# activos}}", - "assets_deleted_permanently": "{} elementos(s) eliminado(s) permanentemente", + "assets_deleted_permanently": "{} elemento(s) eliminado(s) permanentemente", "assets_deleted_permanently_from_server": "{} recurso(s) eliminado(s) de forma permanente del servidor de Immich", "assets_moved_to_trash_count": "{count, plural, one {# elemento movido} other {# elementos movidos}} a la papelera", "assets_permanently_deleted_count": "Eliminado permanentemente {count, plural, one {# elemento} other {# elementos}}", @@ -531,7 +524,7 @@ "backup_controller_page_background_is_on": "La copia de seguridad en segundo plano automÃĄtica estÃĄ activada", "backup_controller_page_background_turn_off": "Desactivar el servicio en segundo plano", "backup_controller_page_background_turn_on": "Activar el servicio en segundo plano", - "backup_controller_page_background_wifi": "Solo en WiFi", + "backup_controller_page_background_wifi": "Solo en Wi-Fi", "backup_controller_page_backup": "Copia de Seguridad", "backup_controller_page_backup_selected": "Seleccionado: ", "backup_controller_page_backup_sub": "Fotos y videos respaldados", @@ -818,7 +811,7 @@ "enabled": "Habilitado", "end_date": "Fecha final", "enqueued": "AÃąadido a la cola", - "enter_wifi_name": "Enter WiFi name", + "enter_wifi_name": "Introduce el nombre Wi-Fi", "error": "Error", "error_change_sort_album": "No se pudo cambiar el orden de visualizaciÃŗn del ÃĄlbum", "error_delete_face": "Error al eliminar la cara del archivo", @@ -853,10 +846,12 @@ "failed_to_keep_this_delete_others": "No se pudo conservar este activo y eliminar los demÃĄs", "failed_to_load_asset": "Error al cargar el elemento", "failed_to_load_assets": "Error al cargar los elementos", + "failed_to_load_notifications": "Error al cargar las notificaciones", "failed_to_load_people": "Error al cargar a los usuarios", "failed_to_remove_product_key": "No se pudo eliminar la clave del producto", "failed_to_stack_assets": "No se pudieron agrupar los archivos", "failed_to_unstack_assets": "Error al desagrupar los archivos", + "failed_to_update_notification_status": "Error al actualizar el estado de la notificaciÃŗn", "import_path_already_exists": "Esta ruta de importaciÃŗn ya existe.", "incorrect_email_or_password": "ContraseÃąa o email incorrecto", "paths_validation_failed": "FallÃŗ la validaciÃŗn en {paths, plural, one {# carpeta} other {# carpetas}}", @@ -1199,6 +1194,9 @@ "map_settings_only_show_favorites": "Mostrar solo favoritas", "map_settings_theme_settings": "Apariencia del Mapa", "map_zoom_to_see_photos": "Alejar para ver fotos", + "mark_all_as_read": "Marcar todos como leídos", + "mark_as_read": "Marcar como leído", + "marked_all_as_read": "Todos marcados como leídos", "matches": "Coincidencias", "media_type": "Tipo de medio", "memories": "Recuerdos", @@ -1257,6 +1255,7 @@ "no_favorites_message": "Agregue favoritos para encontrar rÃĄpidamente sus mejores fotos y videos", "no_libraries_message": "Crea una biblioteca externa para ver tus fotos y vídeos", "no_name": "Sin nombre", + "no_notifications": "Ninguna notificaciÃŗn", "no_places": "Sin lugares", "no_results": "Sin resultados", "no_results_description": "Pruebe con un sinÃŗnimo o una palabra clave mÃĄs general", @@ -1845,7 +1844,7 @@ "user_liked": "{user} le gustÃŗ {type, select, photo {this photo} video {this video} asset {this asset} other {it}}", "user_purchase_settings": "Compra", "user_purchase_settings_description": "Gestiona tu compra", - "user_role_set": "Carbiar {user} a {role}", + "user_role_set": "Establecer {user} como {role}", "user_usage_detail": "Detalle del uso del usuario", "user_usage_stats": "Estadísticas de uso de la cuenta", "user_usage_stats_description": "Ver estadísticas de uso de la cuenta", @@ -1891,11 +1890,11 @@ "week": "Semana", "welcome": "Bienvenido", "welcome_to_immich": "Bienvenido a Immich", - "wifi_name": "WiFi Name", + "wifi_name": "Nombre Wi-Fi", "year": "AÃąo", "years_ago": "Hace {years, plural, one {# aÃąo} other {# aÃąos}}", "yes": "Sí", "you_dont_have_any_shared_links": "No tienes ningÃēn enlace compartido", - "your_wifi_name": "El nombre de tu WiFi", + "your_wifi_name": "El nombre de tu Wi-Fi", "zoom_image": "Acercar Imagen" } diff --git a/i18n/et.json b/i18n/et.json index 98b829bc97..fce760e3a3 100644 --- a/i18n/et.json +++ b/i18n/et.json @@ -192,26 +192,22 @@ "oauth_auto_register": "Automaatne registreerimine", "oauth_auto_register_description": "Registreeri uued kasutajad automaatselt OAuth abil sisselogimisel", "oauth_button_text": "Nupu tekst", - "oauth_client_id": "Kliendi ID", - "oauth_client_secret": "Kliendi saladus", + "oauth_client_secret_description": "NÃĩutud, kui PKCE (Proof Key for Code Exchange) ei ole OAuth pakkuja poolt toetatud", "oauth_enable_description": "Sisene OAuth abil", - "oauth_issuer_url": "Väljastaja URL", "oauth_mobile_redirect_uri": "Mobiilne Ãŧmbersuunamise URI", "oauth_mobile_redirect_uri_override": "Mobiilse Ãŧmbersuunamise URI Ãŧlekirjutamine", "oauth_mobile_redirect_uri_override_description": "LÃŧlita sisse, kui OAuth pakkuja ei luba mobiilset URI-d, näiteks '{callback}'", - "oauth_profile_signing_algorithm": "Profiili allkirjastamise algoritm", - "oauth_profile_signing_algorithm_description": "Algoritm, mida kasutatakse kasutajaprofiili allkirjastamiseks.", - "oauth_scope": "Skoop", "oauth_settings": "OAuth", "oauth_settings_description": "Halda OAuth sisselogimise seadeid", "oauth_settings_more_details": "Selle funktsiooni kohta rohkem teada saamiseks loe dokumentatsiooni.", - "oauth_signing_algorithm": "Allkirjastamise algoritm", "oauth_storage_label_claim": "Talletussildi väide", "oauth_storage_label_claim_description": "Sea kasutaja talletussildiks automaatselt selle väite väärtus.", "oauth_storage_quota_claim": "Talletuskvoodi väide", "oauth_storage_quota_claim_description": "Sea kasutaja talletuskvoodiks automaatselt selle väite väärtus.", "oauth_storage_quota_default": "Vaikimisi talletuskvoot (GiB)", "oauth_storage_quota_default_description": "Kvoot (GiB), mida kasutada, kui Ãŧhtegi väidet pole esitatud (piiramatu kvoodi jaoks sisesta 0).", + "oauth_timeout": "Päringu ajalÃĩpp", + "oauth_timeout_description": "Päringute ajalÃĩpp millisekundites", "offline_paths": "Ühenduseta failiteed", "offline_paths_description": "Need tulemused vÃĩivad olla pÃĩhjustatud manuaalselt kustutatud failidest, mis ei ole osa välisest kogust.", "password_enable_description": "Logi sisse e-posti aadressi ja parooliga", @@ -371,9 +367,18 @@ "admin_password": "Administraatori parool", "administration": "Administratsioon", "advanced": "Täpsemad valikud", + "advanced_settings_enable_alternate_media_filter_subtitle": "Kasuta seda valikut, et filtreerida sÃŧnkroonimise ajal Ãŧksuseid alternatiivsete kriteeriumite alusel. Proovi seda ainult siis, kui rakendusel on probleeme kÃĩigi albumite tuvastamisega.", + "advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAALNE] Kasuta alternatiivset seadme albumi sÃŧnkroonimise filtrit", "advanced_settings_log_level_title": "Logimistase: {}", + "advanced_settings_prefer_remote_subtitle": "MÃĩned seadmed laadivad seadmes olevate Ãŧksuste pisipilte piinavalt aeglaselt. Aktiveeri see seadistus, et laadida selle asemel kaugpilte.", + "advanced_settings_prefer_remote_title": "Eelista kaugpilte", + "advanced_settings_proxy_headers_subtitle": "Määra vaheserveri päised, mida Immich peaks iga päringuga saatma", "advanced_settings_proxy_headers_title": "Vaheserveri päised", + "advanced_settings_self_signed_ssl_subtitle": "Jätab serveri lÃĩpp-punkti SSL-sertifikaadi kontrolli vahele. NÃĩutud endasigneeritud sertifikaatide jaoks.", "advanced_settings_self_signed_ssl_title": "Luba endasigneeritud SSL-sertifikaadid", + "advanced_settings_sync_remote_deletions_subtitle": "Kustuta vÃĩi taasta Ãŧksus selles seadmes automaatself, kui sama tegevus toimub veebis", + "advanced_settings_sync_remote_deletions_title": "SÃŧnkrooni kaugkustutamised [EKSPERIMENTAALNE]", + "advanced_settings_troubleshooting_subtitle": "Luba lisafunktsioonid tÃĩrkeotsinguks", "advanced_settings_troubleshooting_title": "TÃĩrkeotsing", "age_months": "Vanus {months, plural, one {# kuu} other {# kuud}}", "age_year_months": "Vanus 1 aasta, {months, plural, one {# kuu} other {# kuud}}", @@ -407,6 +412,7 @@ "album_viewer_appbar_share_err_remove": "Üksuste albumist eemaldamisel tekkis probleeme", "album_viewer_appbar_share_err_title": "Albumi pealkirja muutmine ebaÃĩnnestus", "album_viewer_appbar_share_leave": "Lahku albumist", + "album_viewer_appbar_share_to": "Jaga", "album_viewer_page_share_add_users": "Lisa kasutajaid", "album_with_link_access": "Luba kÃĩigil, kellel on link, näha selle albumi fotosid ja isikuid.", "albums": "Albumid", @@ -433,6 +439,7 @@ "archive": "Arhiiv", "archive_or_unarchive_photo": "Arhiveeri vÃĩi taasta foto", "archive_page_no_archived_assets": "Arhiveeritud Ãŧksuseid ei leitud", + "archive_page_title": "Arhiveeri ({})", "archive_size": "Arhiivi suurus", "archive_size_description": "Seadista arhiivi suurus allalaadimiseks (GiB)", "archived": "Arhiveeritud", @@ -452,6 +459,8 @@ "asset_list_layout_settings_group_by": "Grupeeri Ãŧksused", "asset_list_layout_settings_group_by_month_day": "Kuu + päev", "asset_list_layout_sub_title": "Asetus", + "asset_list_settings_subtitle": "Fotoruudustiku paigutuse sätted", + "asset_list_settings_title": "Fotoruudustik", "asset_offline": "Üksus pole kättesaadav", "asset_offline_description": "Seda välise kogu Ãŧksust ei leitud kettalt. Abi saamiseks palun vÃĩta Ãŧhendust oma Immich'i administraatoriga.", "asset_restored_successfully": "Üksus edukalt taastatud", @@ -459,20 +468,29 @@ "asset_skipped_in_trash": "PrÃŧgikastis", "asset_uploaded": "Üleslaaditud", "asset_uploading": "Üleslaadimineâ€Ļ", + "asset_viewer_settings_subtitle": "Halda galeriivaaturi seadeid", + "asset_viewer_settings_title": "Üksuste vaatur", "assets": "Üksused", "assets_added_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} lisatud", "assets_added_to_album_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} albumisse lisatud", "assets_added_to_name_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} lisatud {hasName, select, true {albumisse {name}} other {uude albumisse}}", "assets_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}}", + "assets_deleted_permanently": "{} Ãŧksus(t) jäädavalt kustutatud", + "assets_deleted_permanently_from_server": "{} Ãŧksus(t) Immich'i serverist jäädavalt kustutatud", "assets_moved_to_trash_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} liigutatud prÃŧgikasti", "assets_permanently_deleted_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} jäädavalt kustutatud", "assets_removed_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} eemaldatud", + "assets_removed_permanently_from_device": "{} Ãŧksus(t) seadmest jäädavalt eemaldatud", "assets_restore_confirmation": "Kas oled kindel, et soovid oma prÃŧgikasti liigutatud Ãŧksused taastada? Seda ei saa tagasi vÃĩtta! Pane tähele, et sel meetodil ei saa taastada Ãŧhenduseta Ãŧksuseid.", "assets_restored_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} taastatud", + "assets_restored_successfully": "{} Ãŧksus(t) edukalt taastatud", + "assets_trashed": "{} Ãŧksus(t) liigutatud prÃŧgikasti", "assets_trashed_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} liigutatud prÃŧgikasti", + "assets_trashed_from_server": "{} Ãŧksus(t) liigutatud Immich'i serveris prÃŧgikasti", "assets_were_part_of_album_count": "{count, plural, one {Üksus oli} other {Üksused olid}} juba osa albumist", "authorized_devices": "Autoriseeritud seadmed", "automatic_endpoint_switching_subtitle": "Ühendu lokaalselt Ãŧle valitud WiFi-vÃĩrgu, kui see on saadaval, ja kasuta mujal alternatiivseid Ãŧhendusi", + "automatic_endpoint_switching_title": "Automaatne URL-i ÃŧmberlÃŧlitamine", "back": "Tagasi", "back_close_deselect": "Tagasi, sulge vÃĩi tÃŧhista valik", "backup_album_selection_page_select_albums": "Vali albumid", @@ -481,7 +499,16 @@ "backup_all": "KÃĩik", "backup_background_service_default_notification": "Uute Ãŧksuste kontrollimineâ€Ļ", "backup_background_service_error_title": "Varundamise viga", + "backup_controller_page_background_app_refresh_disabled_content": "Taustal varundamise kasutamiseks luba rakenduse taustal värskendamine: Seaded > Üldine > Rakenduse taustal värskendamine.", + "backup_controller_page_background_app_refresh_disabled_title": "Rakenduse taustal värskendamine keelatud", + "backup_controller_page_background_battery_info_link": "Näita mulle, kuidas", "backup_controller_page_background_battery_info_ok": "OK", + "backup_controller_page_background_configure_error": "Taustateenuse seadistamine ebaÃĩnnestus", + "backup_controller_page_background_description": "LÃŧlita taustateenus sisse, et uusi Ãŧksuseid automaatselt varundada, ilma et peaks rakendust avama", + "backup_controller_page_background_is_off": "Automaatne varundamine on välja lÃŧlitatud", + "backup_controller_page_background_is_on": "Automaatne varundamine on sisse lÃŧlitatud", + "backup_controller_page_background_turn_off": "LÃŧlita taustateenus välja", + "backup_controller_page_background_turn_on": "LÃŧlita taustateenus sisse", "backup_controller_page_background_wifi": "Ainult WiFi-vÃĩrgus", "backup_controller_page_backup_sub": "Varundatud fotod ja videod", "backup_controller_page_desc_backup": "LÃŧlita sisse esiplaanil varundamine, et rakenduse avamisel uued Ãŧksused automaatselt serverisse Ãŧles laadida.", @@ -504,7 +531,12 @@ "bulk_trash_duplicates_confirmation": "Kas oled kindel, et soovid {count, plural, one {# dubleeritud Ãŧksuse} other {# dubleeritud Ãŧksust}} masskustutada? Sellega jäetakse alles iga grupi suurim Ãŧksus ning duplikaadid liigutatakse prÃŧgikasti.", "buy": "Osta Immich", "cache_settings_clear_cache_button": "TÃŧhjenda puhver", + "cache_settings_statistics_album": "Kogu pisipildid", + "cache_settings_statistics_full": "TäismÃĩÃĩdus pildid", + "cache_settings_statistics_shared": "Jagatud albumite pisipildid", + "cache_settings_statistics_thumbnail": "Pisipildid", "cache_settings_statistics_title": "Puhvri kasutus", + "cache_settings_thumbnail_size": "Pisipiltide puhvri suurus ({} Ãŧksust)", "camera": "Kaamera", "camera_brand": "Kaamera mark", "camera_model": "Kaamera mudel", @@ -733,10 +765,12 @@ "failed_to_keep_this_delete_others": "Selle Ãŧksuse säilitamine ja Ãŧlejäänute kustutamine ebaÃĩnnestus", "failed_to_load_asset": "Üksuse laadimine ebaÃĩnnestus", "failed_to_load_assets": "Üksuste laadimine ebaÃĩnnestus", + "failed_to_load_notifications": "Teavituste laadimine ebaÃĩnnestus", "failed_to_load_people": "Isikute laadimine ebaÃĩnnestus", "failed_to_remove_product_key": "TootevÃĩtme eemaldamine ebaÃĩnnestus", "failed_to_stack_assets": "Üksuste virnastamine ebaÃĩnnestus", "failed_to_unstack_assets": "Üksuste eraldamine ebaÃĩnnestus", + "failed_to_update_notification_status": "Teavituste seisundi uuendamine ebaÃĩnnestus", "import_path_already_exists": "See imporditee on juba olemas.", "incorrect_email_or_password": "Vale e-posti aadress vÃĩi parool", "paths_validation_failed": "{paths, plural, one {# tee} other {# teed}} ei valideerunud", @@ -883,11 +917,15 @@ "group_owner": "Grupeeri omaniku kaupa", "group_places_by": "Grupeeri kohad...", "group_year": "Grupeeri aasta kaupa", + "haptic_feedback_switch": "Luba haptiline tagasiside", + "haptic_feedback_title": "Haptiline tagasiside", "has_quota": "On kvoot", "header_settings_add_header_tip": "Lisa päis", "header_settings_field_validator_msg": "Väärtus ei saa olla tÃŧhi", "header_settings_header_name_input": "Päise nimi", "header_settings_header_value_input": "Päise väärtus", + "headers_settings_tile_subtitle": "Määra vaheserveri päised, mida rakendus peaks iga päringuga saatma", + "headers_settings_tile_title": "Kohandatud vaheserveri päised", "hi_user": "Tere {name} ({email})", "hide_all_people": "Peida kÃĩik isikud", "hide_gallery": "Peida galerii", @@ -989,7 +1027,12 @@ "login_form_err_http": "Palun täpsusta http:// vÃĩi https://", "login_form_err_invalid_email": "Vigane e-posti aadress", "login_form_err_invalid_url": "Vigane URL", + "login_form_err_leading_whitespace": "Eelnevad tÃŧhikud", + "login_form_err_trailing_whitespace": "Järgnevad tÃŧhikud", "login_form_password_hint": "parool", + "login_form_save_login": "Jää sisselogituks", + "login_form_server_empty": "Sisesta serveri URL.", + "login_form_server_error": "Serveriga Ãŧhendumine ebaÃĩnnestus.", "login_has_been_disabled": "Sisselogimine on keelatud.", "login_password_changed_success": "Parool edukalt uuendatud", "logout_all_device_confirmation": "Kas oled kindel, et soovid kÃĩigist seadmetest välja logida?", @@ -1009,17 +1052,27 @@ "manage_your_devices": "Halda oma autenditud seadmeid", "manage_your_oauth_connection": "Halda oma OAuth Ãŧhendust", "map": "Kaart", + "map_assets_in_bound": "{} foto", + "map_assets_in_bounds": "{} fotot", + "map_location_dialog_yes": "Jah", + "map_location_picker_page_use_location": "Kasuta seda asukohta", "map_marker_for_images": "Kaardimarker kohas {city}, {country} tehtud piltide jaoks", "map_marker_with_image": "Kaardimarker pildiga", "map_settings": "Kaardi seaded", "map_settings_date_range_option_day": "Viimased 24 tundi", + "map_settings_date_range_option_days": "Viimased {} päeva", "map_settings_date_range_option_year": "Viimane aasta", + "map_settings_date_range_option_years": "Viimased {} aastat", "map_settings_dialog_title": "Kaardi seaded", + "mark_all_as_read": "Märgi kÃĩik loetuks", + "mark_as_read": "Märgi loetuks", + "marked_all_as_read": "KÃĩik märgiti loetuks", "matches": "Ühtivad failid", "media_type": "Meediumi tÃŧÃŧp", "memories": "Mälestused", "memories_setting_description": "Halda, mida sa oma mälestustes näed", "memories_year_ago": "Aasta tagasi", + "memories_years_ago": "{} aastat tagasi", "memory": "Mälestus", "memory_lane_title": "Mälestus {title}", "menu": "MenÃŧÃŧ", @@ -1034,7 +1087,10 @@ "missing": "Puuduvad", "model": "Mudel", "month": "Kuu", + "monthly_title_text_date_format": "MMMM y", "more": "Rohkem", + "moved_to_archive": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} liigutatud arhiivi", + "moved_to_library": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} liigutatud kogusse", "moved_to_trash": "Liigutatud prÃŧgikasti", "multiselect_grid_edit_date_time_err_read_only": "Kirjutuskaitsega Ãŧksus(t)e kuupäeva ei saa muuta, jätan vahele", "multiselect_grid_edit_gps_err_read_only": "Kirjutuskaitsega Ãŧksus(t)e asukohta ei saa muuta, jätan vahele", @@ -1066,6 +1122,7 @@ "no_favorites_message": "Lisa lemmikud, et oma parimaid fotosid ja videosid kiiresti leida", "no_libraries_message": "Lisa väline kogu oma fotode ja videote vaatamiseks", "no_name": "Nimetu", + "no_notifications": "Teavitusi pole", "no_places": "Kohti ei ole", "no_results": "Vasteid pole", "no_results_description": "Proovi sÃŧnonÃŧÃŧmi vÃĩi Ãŧldisemat märksÃĩna", @@ -1073,6 +1130,9 @@ "not_in_any_album": "Pole Ãŧheski albumis", "note_apply_storage_label_to_previously_uploaded assets": "Märkus: Et rakendada talletussilt varem Ãŧleslaaditud Ãŧksustele, käivita", "notes": "Märkused", + "notification_permission_list_tile_content": "Anna luba teavituste saatmiseks.", + "notification_permission_list_tile_enable_button": "Luba teavitused", + "notification_permission_list_tile_title": "Teavituste luba", "notification_toggle_setting_description": "Luba e-posti teel teavitused", "notifications": "Teavitused", "notifications_setting_description": "Halda teavitusi", @@ -1083,6 +1143,7 @@ "offline_paths_description": "Need tulemused vÃĩivad olla pÃĩhjustatud manuaalselt kustutatud failidest, mis ei ole osa välisest kogust.", "ok": "Ok", "oldest_first": "Vanemad eespool", + "on_this_device": "Sellel seadmel", "onboarding": "KasutuselevÃĩtt", "onboarding_privacy_description": "Järgnevad (valikulised) funktsioonid sÃĩltuvad välistest teenustest ning neid saab igal ajal administraatori seadetes välja lÃŧlitada.", "onboarding_theme_description": "Vali oma serverile värviteema. Saad seda hiljem seadetes muuta.", @@ -1090,6 +1151,7 @@ "onboarding_welcome_user": "Tere tulemast, {user}", "online": "Ühendatud", "only_favorites": "Ainult lemmikud", + "open": "Ava", "open_in_map_view": "Ava kaardi vaates", "open_in_openstreetmap": "Ava OpenStreetMap", "open_the_search_filters": "Ava otsingufiltrid", @@ -1106,6 +1168,7 @@ "partner_can_access": "{partner} pääseb ligi", "partner_can_access_assets": "KÃĩik su fotod ja videod, välja arvatud arhiveeritud ja kustutatud", "partner_can_access_location": "Asukohad, kus su fotod tehti", + "partner_list_user_photos": "Kasutaja {user} fotod", "partner_list_view_all": "Vaata kÃĩiki", "partner_page_partner_add_failed": "Partneri lisamine ebaÃĩnnestus", "partner_page_select_partner": "Vali partner", @@ -1138,6 +1201,7 @@ "permanently_deleted_asset": "Üksus jäädavalt kustutatud", "permanently_deleted_assets_count": "{count, plural, one {# Ãŧksus} other {# Ãŧksust}} jäädavalt kustutatud", "permission_onboarding_back": "Tagasi", + "permission_onboarding_continue_anyway": "Jätka sellegipoolest", "person": "Isik", "person_birthdate": "SÃŧndinud {date}", "person_hidden": "{name}{hidden, select, true { (peidetud)} other {}}", @@ -1155,6 +1219,7 @@ "play_motion_photo": "Esita liikuv foto", "play_or_pause_video": "Esita vÃĩi peata video", "port": "Port", + "preferences_settings_subtitle": "Halda rakenduse eelistusi", "preferences_settings_title": "Eelistused", "preset": "Eelseadistus", "preview": "Eelvaade", @@ -1292,6 +1357,7 @@ "search_camera_model": "Otsi kaamera mudelit...", "search_city": "Otsi linna...", "search_country": "Otsi riiki...", + "search_filter_apply": "Rakenda filter", "search_filter_camera_title": "Vali kaamera tÃŧÃŧp", "search_filter_date": "Kuupäev", "search_filter_date_interval": "{start} kuni {end}", @@ -1338,6 +1404,7 @@ "select_keep_all": "Vali jäta kÃĩik alles", "select_library_owner": "Vali kogu omanik", "select_new_face": "Vali uus nägu", + "select_person_to_tag": "Vali sildistamiseks isik", "select_photos": "Vali fotod", "select_trash_all": "Vali kÃĩik prÃŧgikasti", "select_user_for_sharing_page_err_album": "Albumi lisamine ebaÃĩnnestus", @@ -1359,13 +1426,26 @@ "set_date_of_birth": "Määra sÃŧnnikuupäev", "set_profile_picture": "Sea profiilipilt", "set_slideshow_to_fullscreen": "Kuva slaidiesitlus täisekraanil", + "setting_image_viewer_help": "Detailivaatur laadib kÃĩigepealt väikese pisipildi, seejärel keskmises mÃĩÃĩdus eelvaate (kui lubatud) ja lÃĩpuks originaalpildi (kui lubatud).", + "setting_image_viewer_preview_subtitle": "Luba keskmise resolutsiooniga pildi laadimine. Keela, et laadida kohe originaalpilt vÃĩi kasutada ainult pisipilti.", + "setting_image_viewer_preview_title": "Laadi pildi eelvaade", + "setting_image_viewer_title": "Pildid", "setting_languages_apply": "Rakenda", + "setting_languages_subtitle": "Muuda rakenduse keelt", "setting_languages_title": "Keeled", + "setting_notifications_notify_hours": "{} tundi", "setting_notifications_notify_immediately": "kohe", + "setting_notifications_notify_minutes": "{} minutit", "setting_notifications_notify_never": "mitte kunagi", + "setting_notifications_notify_seconds": "{} sekundit", + "setting_notifications_single_progress_title": "Kuva taustal varundamise detailset edenemist", + "setting_notifications_subtitle": "Halda oma teavituste eelistusi", + "setting_notifications_total_progress_title": "Kuva taustal varundamise Ãŧldist edenemist", "settings": "Seaded", "settings_saved": "Seaded salvestatud", "share": "Jaga", + "share_add_photos": "Lisa fotosid", + "share_assets_selected": "{} valitud", "shared": "Jagatud", "shared_album_section_people_action_error": "Viga albumist eemaldamisel/lahkumisel", "shared_album_section_people_action_leave": "Eemalda kasutaja albumist", @@ -1377,10 +1457,25 @@ "shared_from_partner": "Fotod partnerilt {partner}", "shared_link_app_bar_title": "Jagatud lingid", "shared_link_clipboard_copied_massage": "Kopeeritud lÃĩikelauale", + "shared_link_clipboard_text": "Link: {}\nParool: {}", "shared_link_create_error": "Viga jagatud lingi loomisel", "shared_link_edit_expire_after_option_day": "1 päev", + "shared_link_edit_expire_after_option_days": "{} päeva", "shared_link_edit_expire_after_option_hour": "1 tund", + "shared_link_edit_expire_after_option_hours": "{} tundi", "shared_link_edit_expire_after_option_minute": "1 minut", + "shared_link_edit_expire_after_option_minutes": "{} minutit", + "shared_link_edit_expire_after_option_months": "{} kuud", + "shared_link_edit_expire_after_option_year": "{} aasta", + "shared_link_expires_day": "Aegub {} päeva pärast", + "shared_link_expires_days": "Aegub {} päeva pärast", + "shared_link_expires_hour": "Aegub {} tunni pärast", + "shared_link_expires_hours": "Aegub {} tunni pärast", + "shared_link_expires_minute": "Aegub {} minuti pärast", + "shared_link_expires_minutes": "Aegub {} minuti pärast", + "shared_link_expires_never": "Ei aegu", + "shared_link_expires_second": "Aegub {} sekundi pärast", + "shared_link_expires_seconds": "Aegub {} sekundi pärast", "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "Halda jagatud linke", "shared_link_options": "Jagatud lingi valikud", @@ -1475,6 +1570,10 @@ "theme": "Teema", "theme_selection": "Teema valik", "theme_selection_description": "Sea automaatselt hele vÃĩi tume teema vastavalt veebilehitseja eelistustele", + "theme_setting_colorful_interface_subtitle": "Rakenda taustapindadele primaarne värv.", + "theme_setting_colorful_interface_title": "Värviline kasutajaliides", + "theme_setting_image_viewer_quality_subtitle": "Kohanda detailvaaturi kvaliteeti", + "theme_setting_image_viewer_quality_title": "Pildivaaturi kvaliteet", "theme_setting_primary_color_title": "PÃĩhivärv", "theme_setting_system_primary_color_title": "Kasuta sÃŧsteemset värvi", "theme_setting_system_theme_switch": "Automaatne (järgi sÃŧsteemi seadet)", @@ -1497,6 +1596,7 @@ "trash_all": "KÃĩik prÃŧgikasti", "trash_count": "Liiguta {count, number} prÃŧgikasti", "trash_delete_asset": "Kustuta Ãŧksus", + "trash_emptied": "PrÃŧgikast tÃŧhjendatud", "trash_no_results_message": "Siia ilmuvad prÃŧgikasti liigutatud fotod ja videod.", "trash_page_delete_all": "Kustuta kÃĩik", "trash_page_restore_all": "Taasta kÃĩik", @@ -1557,6 +1657,7 @@ "version": "Versioon", "version_announcement_closing": "Sinu sÃĩber, Alex", "version_announcement_message": "Hei! Saadaval on uus Immich'i versioon. Palun vÃĩta aega, et lugeda väljalasketeadet ning veendu, et su seadistus on ajakohane, et vältida konfiguratsiooniprobleeme, eriti kui kasutad WatchTower'it vÃĩi muud mehhanismi, mis Immich'it automaatselt uuendab.", + "version_announcement_overlay_title": "Uus serveri versioon saadaval 🎉", "version_history": "Versiooniajalugu", "version_history_item": "Versioon {version} paigaldatud {date}", "video": "Video", diff --git a/i18n/fa.json b/i18n/fa.json index a6cca739b4..0b50274f4d 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -153,20 +153,13 @@ "oauth_auto_register": "ØĢبØĒ ØŽŲˆØ¯ÚŠØ§Øą", "oauth_auto_register_description": "ÚŠØ§ØąØ¨ØąØ§Ų† ØŦدید ØąØ§ ŲžØŗ Ø§Ø˛ ŲˆØąŲˆØ¯ با OAuth Ø¨Ų‡ ØˇŲˆØą ØŽŲˆØ¯ÚŠØ§Øą ØĢبØĒ Ų†Ø§Ų… ÚŠŲ†", "oauth_button_text": "Ų…ØĒŲ† Ø¯ÚŠŲ…Ų‡", - "oauth_client_id": "Ø´Ų†Ø§ØŗŲ‡ ÚŠØ§ØąØ¨Øą", - "oauth_client_secret": "Ø´Ų†Ø§ØŗŲ‡ Ų…Ø­ØąŲ…Ø§Ų†Ų‡ ÚŠØ§ØąØ¨Øą", "oauth_enable_description": "ŲˆØąŲˆØ¯ ØĒŲˆØŗØˇ OAuth", - "oauth_issuer_url": "Ų†Ø´Ø§Ų†ÛŒ ŲˆØ¨ ØĩØ§Ø¯Øą ÚŠŲ†Ų†Ø¯Ų‡", "oauth_mobile_redirect_uri": "ØĒØēÛŒÛŒØą Ų…ØŗÛŒØą URI Ų…ŲˆØ¨Ø§ÛŒŲ„", "oauth_mobile_redirect_uri_override": "ØĒØēÛŒÛŒØą Ų…ØŗÛŒØą URI ØĒ؄؁؆ Ų‡Ų…ØąØ§Ų‡", "oauth_mobile_redirect_uri_override_description": "Ø˛Ų…Ø§Ų†ÛŒ ÚŠŲ‡ 'app.immich:/' یڊ URI ŲžØąØ´ Ų†Ø§Ų…ØšØĒØ¨Øą Ø§ØŗØĒ، ŲØšØ§Ų„ ÚŠŲ†ÛŒØ¯.", - "oauth_profile_signing_algorithm": "Ø§Ų„Ú¯ŲˆØąÛŒØĒŲ… Ø§Ų…Øļای ŲžØąŲˆŲØ§ÛŒŲ„", - "oauth_profile_signing_algorithm_description": "Ø§Ų„Ú¯ŲˆØąÛŒØĒŲ… Ų…ŲˆØąØ¯ Ø§ØŗØĒŲØ§Ø¯Ų‡ Ø¨ØąØ§ÛŒ Ø§Ų…Øļای ŲžØąŲˆŲØ§ÛŒŲ„ ÚŠØ§ØąØ¨Øą.", - "oauth_scope": "Ų…Ø­Ø¯ŲˆØ¯Ų‡", "oauth_settings": "OAuth", "oauth_settings_description": "Ų…Ø¯ÛŒØąÛŒØĒ ØĒŲ†Ø¸ÛŒŲ…Ø§ØĒ ŲˆØąŲˆØ¯ Ø¨Ų‡ ØŗÛŒØŗØĒŲ… OAuth", "oauth_settings_more_details": "Ø¨ØąØ§ÛŒ ØŦØ˛ØĻیاØĒ بیشØĒØą Ø¯Øą Ų…ŲˆØąØ¯ Ø§ÛŒŲ† ŲˆÛŒÚ˜Ú¯ÛŒØŒ Ø¨Ų‡ Ų…ØŗØĒŲ†Ø¯Ø§ØĒ Ų…ØąØ§ØŦØšŲ‡ ÚŠŲ†ÛŒØ¯.", - "oauth_signing_algorithm": "Ø§Ų„Ú¯ŲˆØąÛŒØĒŲ… Ø§Ų…Øļا", "oauth_storage_label_claim": "Ø¯ØąØŽŲˆØ§ØŗØĒ Ø¨ØąÚ†ØŗØ¨ ؁Øļای Ø°ØŽÛŒØąŲ‡ ØŗØ§Ø˛ÛŒ", "oauth_storage_label_claim_description": "ØĒŲ†Ø¸ÛŒŲ… ØŽŲˆØ¯ÚŠØ§Øą Ø¨ØąÚ†ØŗØ¨ ؁Øļای Ø°ØŽÛŒØąŲ‡â€ŒØŗØ§Ø˛ÛŒ ÚŠØ§ØąØ¨Øą Ø¨Ų‡ Ų…Ų‚Ø¯Ø§Øą Ø¯ØąØŽŲˆØ§ØŗØĒ Ø´Ø¯Ų‡.", "oauth_storage_quota_claim": "Ø¯ØąØŽŲˆØ§ØŗØĒ ØŗŲ‡Ų…ÛŒŲ‡ ؁Øļای Ø°ØŽÛŒØąŲ‡ ØŗØ§Ø˛ÛŒ", diff --git a/i18n/fi.json b/i18n/fi.json index 8e64c372de..e57c758419 100644 --- a/i18n/fi.json +++ b/i18n/fi.json @@ -14,7 +14,7 @@ "add_a_location": "Lisää sijainti", "add_a_name": "Lisää nimi", "add_a_title": "Lisää otsikko", - "add_endpoint": "Add endpoint", + "add_endpoint": "Lisää päätepiste", "add_exclusion_pattern": "Lisää poissulkemismalli", "add_import_path": "Lisää tuontipolku", "add_location": "Lisää sijainti", @@ -28,7 +28,7 @@ "add_to_album_bottom_sheet_already_exists": "Kohde on jo albumissa {album}", "add_to_shared_album": "Lisää jaettuun albumiin", "add_url": "Lisää URL", - "added_to_archive": "Arkistoitu", + "added_to_archive": "Lisätty arkistoon", "added_to_favorites": "Lisätty suosikkeihin", "added_to_favorites_count": "{count, number} lisätty suosikkeihin", "admin": { @@ -39,12 +39,13 @@ "authentication_settings_disable_all": "Haluatko varmasti poistaa kaikki kirjautumistavat käytÃļstä? Kirjautuminen on tämän jälkeen mahdotonta.", "authentication_settings_reenable": "Ottaaksesi uudestaan käyttÃļÃļn, käytä Palvelin Komentoa.", "background_task_job": "TaustatyÃļt", - "backup_database": "Varmuuskopioi Tietokanta", - "backup_database_enable_description": "Ota käyttÃļÃļn tietokannan varmuuskopiointi", - "backup_keep_last_amount": "Varmuuskopioiden lukumäärä", - "backup_settings": "Varmuuskopioinnin asetukset", - "backup_settings_description": "Hallitse tietokannan varmuuskopioiden asetuksia", + "backup_database": "Luo tietokantavedos", + "backup_database_enable_description": "Ota tietokantavedokset käyttÃļÃļn", + "backup_keep_last_amount": "Säilytettävien tietokantavedosten määrä", + "backup_settings": "Tietokantavedosten asetukset", + "backup_settings_description": "Hallitse tietokannan vedosasetuksia. Huomautus: Näitä tehtäviä ei valvota, eikä sinulle ilmoiteta epäonnistumisista.", "check_all": "Tarkista kaikki", + "cleanup": "Siivous", "cleared_jobs": "TyÃļn {job} tehtävät tyhjennetty", "config_set_by_file": "Asetukset on tällä hetkellä määritelty tiedostosta", "confirm_delete_library": "Haluatko varmasti poistaa kirjaston {library}?", @@ -69,8 +70,13 @@ "forcing_refresh_library_files": "Pakotetaan virkistämään kaikkien kirjastojen tiedostot", "image_format": "Tiedostomuoto", "image_format_description": "WebP tuottaa pienempiä tiedostoja kuin JPEG, mutta on hitaampi pakata.", + "image_fullsize_description": "Täysikokoinen kuva ilman metatietoja, käytetään zoomattaessa", + "image_fullsize_enabled": "Ota käyttÃļÃļn täysikokoisen kuvan luonti", + "image_fullsize_enabled_description": "Luo täysikokoinen kuva ei-verkkoystävällisille formaateille. Jos \"Suosi upotettua esikatselua\" on käytÃļssä, upotettuja esikatseluja käytetään suoraan ilman muuntamista. Ei vaikuta verkkoyhteensopiviin formaatteihin, kuten JPEG:hen.", + "image_fullsize_quality_description": "Täysikokoisen kuvan laatualue 1–100. Suurempi arvo on parempi, mutta johtaa suurempiin tiedostoihin.", + "image_fullsize_title": "Täysikokoisen kuvan asetukset", "image_prefer_embedded_preview": "Suosi upotettua esikatselua", - "image_prefer_embedded_preview_setting_description": "Käytä RAW-kuvissa upotettuja esikatselukuvia aina kun mahdollista. Tämä voi joissain kuvissa tuottaa tarkemmat värit, mutta esikatselun laatu on riippuvainen kamerasta ja kuvassa voi olla enemmän pakkauksesta aiheutuvia häiriÃļitä.", + "image_prefer_embedded_preview_setting_description": "Käytä RAW-kuviin upotettuja esikatseluja kuvankäsittelyn syÃļtteenä ja aina kun mahdollista. Tämä voi tarjota tarkempia värejä joillekin kuville, mutta esikatselun laatu riippuu kamerasta ja kuvassa voi olla enemmän pakkausartefakteja.", "image_prefer_wide_gamut": "Suosi laajaa väriskaalaa", "image_prefer_wide_gamut_setting_description": "Käytä Display P3 -nimiavaruutta pikkukuville. Tämä säilÃļÃļ värien vivahteet paremmin, mutta kuvat saattavat näyttää erilaisilta vanhemmissa laitteissa. sRGB-kuvat pidetään muuttumattomina, jottei värit muuttuisi.", "image_preview_description": "Keskikokoinen kuva, josta metatiedot on poistettu, käytetään yksittäisen resurssin katseluun ja koneoppimiseen", @@ -100,11 +106,11 @@ "library_scanning_enable_description": "Ota käyttÃļÃļn ajoittaiset kirjastojen skannaukset", "library_settings": "Ulkoinen kirjasto", "library_settings_description": "Hallitse ulkoisen kirjaston asetuksia", - "library_tasks_description": "Suorita kirjastotoimintoja", + "library_tasks_description": "Skannaa ulkoisia kirjastoja uusien ja/tai muutoksien varalta", "library_watching_enable_description": "Tarkkaile tiedostojen muuttumisia ulkoisissa kirjastoissa", "library_watching_settings": "Kirjaston tarkkailu (KOKEELLINEN)", "library_watching_settings_description": "Tarkkaile muuttuvia tiedostoja automaattisesti", - "logging_enable_description": "Ota käyttÃļÃļn lokitus", + "logging_enable_description": "Ota lokikirjaus käyttÃļÃļn", "logging_level_description": "Kun käytÃļssä, mitä lokituksen tasoa käytetään.", "logging_settings": "Lokit", "machine_learning_clip_model": "CLIP-malli", @@ -135,7 +141,7 @@ "machine_learning_smart_search_description": "Etsi kuvia merkityksellisemmin käyttäen CLIP-upotuksia", "machine_learning_smart_search_enabled": "Ota käyttÃļÃļn älykäs haku", "machine_learning_smart_search_enabled_description": "Jos ei käytÃļssä, kuvia ei koodata älykkäälle etsinnälle.", - "machine_learning_url_description": "Koneoppimispalvelimen URL. MIkäli URL:liä on useampi kuin yksi, järjestelmä yrittää ottaa yhteyden jokaiseen erikseen järjestyksessä ensimmäisestä viimeiseen, kunnes pyyntÃļÃļn vastataan onnistuneesti.", + "machine_learning_url_description": "Koneoppimispalvelimen URL-osoite. Jos lisätään useampi kuin yksi URL-osoite, kutakin osoitetta kohden yritetään kerran, kunnes yksi niistä vastaa. Yritykset tehdään järjestyksessä ensimmäisestä viimeiseen. Palvelimet, jotka eivät vastaa, ohitetaan tilapäisesti, kunnes ne ovat taas tavoitettavissa.", "manage_concurrency": "Hallitse yhtäaikaisia toimintoja", "manage_log_settings": "Hallitse lokien asetuksia", "map_dark_style": "Tumma teema", @@ -151,13 +157,15 @@ "map_settings": "Kartta", "map_settings_description": "Hallitse kartan asetuksia", "map_style_description": "style.json-karttateeman URL", + "memory_cleanup_job": "Muistin siivous", + "memory_generate_job": "Muistin generointi", "metadata_extraction_job": "Kerää metadata", "metadata_extraction_job_description": "Poimi metatiedot aineistoista, kuten GPS, kasvot ja resoluutio", "metadata_faces_import_setting": "Ota käyttÃļÃļn kasvojen tuonti", "metadata_faces_import_setting_description": "Tuo kasvot kuvan EXIF- ja kylkiäistiedostoista", "metadata_settings": "Metatietoasetukset", "metadata_settings_description": "Hallitse metatietoja", - "migration_job": "Migrointi", + "migration_job": "Migraatio", "migration_job_description": "Migroi aineiston pikkukuvat ja kasvot uusimpaan kansiorakenteeseen", "no_paths_added": "Polkuja ei asetettu", "no_pattern_added": "Kaavoja ei lisättynä", @@ -184,26 +192,22 @@ "oauth_auto_register": "Automaattinen rekisterÃļinti", "oauth_auto_register_description": "RekisterÃļi uudet OAuth:lla kirjautuvat käyttäjät automaattisesti", "oauth_button_text": "Painikkeen teksti", - "oauth_client_id": "Client ID", - "oauth_client_secret": "Asiakassalaisuusavain", + "oauth_client_secret_description": "Vaaditaan, jos OAuth-palveluntarjoaja ei tue PKCE:tä (Proof Key for Code Exchange)", "oauth_enable_description": "Kirjaudu käyttäen OAuthia", - "oauth_issuer_url": "Toimitsijan URL", "oauth_mobile_redirect_uri": "Mobiilin uudellenohjaus-URI", "oauth_mobile_redirect_uri_override": "Ohita mobiilin uudelleenohjaus-URI", "oauth_mobile_redirect_uri_override_description": "Ota käyttÃļÃļn kun OAuth tarjoaja ei salli mobiili URI:a, kuten '{callback}'", - "oauth_profile_signing_algorithm": "Profiilin allekirjoitusalgoritmi", - "oauth_profile_signing_algorithm_description": "Algoritmi, jota käytetään käyttäjäprofiilin allekirjoittamiseen.", - "oauth_scope": "Skooppi (Scope)", "oauth_settings": "OAuth", "oauth_settings_description": "Hallitse OAuth-kirjautumisen asetuksia", "oauth_settings_more_details": "Saadaksesi lisätietoja tästä toiminnosta, katso dokumentaatio.", - "oauth_signing_algorithm": "Allekirjoitusalgoritmi", "oauth_storage_label_claim": "Tallennustilan nimikkeen valtuutusväittämä (claim)", "oauth_storage_label_claim_description": "Määriä käyttäjän tallennustilan nimike tämän väittämän arvoksi automaattisesti.", "oauth_storage_quota_claim": "Tallennustilan kiintiÃļn väittämä (claim)", "oauth_storage_quota_claim_description": "Aseta automaattisesti käyttäjien tallennustilan määrä tähän arvoon.", "oauth_storage_quota_default": "Tallennustilan oletuskiintiÃļ (Gt)", "oauth_storage_quota_default_description": "Käytettävä kiintiÃļn määrä gigatavuissa, käytetään kun väittämää ei ole annettu (0 rajoittamaton kiintiÃļ).", + "oauth_timeout": "PyynnÃļn aikakatkaisu", + "oauth_timeout_description": "PyyntÃļjen aikakatkaisu millisekunteina", "offline_paths": "Offline-tilan polut", "offline_paths_description": "Nämä tulokset voivat johtua tiedostoista, jotka on käsin poistettu, eivätkä ole ulkoisessa kirjastossa.", "password_enable_description": "Kirjaudu käyttäen sähkÃļpostiosoitetta ja salasanaa", @@ -243,7 +247,7 @@ "storage_template_hash_verification_enabled_description": "Ottaa käyttÃļÃļn tarkistussummien laskennan. Älä poista käytÃļstä, ellet ole aivan varma seurauksista", "storage_template_migration": "Tallennustilan mallien migraatio", "storage_template_migration_description": "Käytä nykyistä {template}a aikaisemmin lähetettyihin kohteisiin", - "storage_template_migration_info": "Malli vaikuttaa vain uusiin kohteisiin. Käyttääksesi mallia jo olemassa oleviin kohteisiin, aja {job}.", + "storage_template_migration_info": "Tallennusmalli muuntaa kaikki tiedostopäätteet pieniksi kirjaimiksi. Mallipohjan muutokset koskevat vain uusia resursseja. Jos haluat käyttää mallipohjaa takautuvasti aiemmin ladattuihin resursseihin, suorita {job}.", "storage_template_migration_job": "Tallennustilan mallin muutostyÃļ", "storage_template_more_details": "Saadaksesi lisätietoa tästä ominaisuudesta, katso Tallennustilan Mallit sekä mihin se vaikuttaa", "storage_template_onboarding_description": "Kun tämä ominaisuus on käytÃļssä, se järjestää tiedostot automaattisesti käyttäjän määrittämän mallin perusteella. Vakausongelmien vuoksi ominaisuus on oletuksena poistettu käytÃļstä. Lisätietoja on dokumentaatiossa.", @@ -268,7 +272,7 @@ "theme_settings": "Teeman asetukset", "theme_settings_description": "Kustomoi Immichin web-käyttÃļliittymää", "these_files_matched_by_checksum": "Näillä tiedostoilla on yhteinen tarkistussumma", - "thumbnail_generation_job": "Generoi pikkukuvat", + "thumbnail_generation_job": "Luo pikkukuvat", "thumbnail_generation_job_description": "Generoi isot, pienet sekä sumeat pikkukuvat jokaisesta aineistosta, kuten myÃļs henkilÃļistä", "transcoding_acceleration_api": "Kiihdytysrajapinta", "transcoding_acceleration_api_description": "Rajapinta, jolla keskustellaan laittesi kanssa nopeuttaaksemme koodausta. Tämä asetus on paras mahdollinen: Mikäli ongelmia ilmenee, palataan käyttämään ohjelmistopohjaista koodausta. VP9 voi toimia tai ei, riippuen laitteistosi kokoonpanosta.", @@ -319,7 +323,7 @@ "transcoding_settings_description": "Hallitse, mitkä videot transkoodataan ja miten niitä käsitellään", "transcoding_target_resolution": "Kohderesoluutio", "transcoding_target_resolution_description": "Korkeampi resoluutio on tarkempi, mutta kestää kauemmin enkoodata, vie enemmän tilaa ja voi hidastaa sovelluksen responsiivisuutta.", - "transcoding_temporal_aq": "Temporal AQ", + "transcoding_temporal_aq": "Väliaikainen AQ", "transcoding_temporal_aq_description": "Vaikuttaa vain NVENC:lle. Parantaa laatua kohtauksissa, joissa on paljon yksityiskohtia ja vähän liikettä. Ei välttämättä ole yhteensopiva vanhempien laitteiden kanssa.", "transcoding_threads": "Säikeet", "transcoding_threads_description": "Korkeampi arvo nopeuttaa enkoodausta, mutta vie tilaa palvelimen muilta tehtäviltä. Tämä arvo ei tulisi olla suurempi mitä suorittimen ytimien määrä. Suurin mahdollinen käyttÃļ, mikäli arvo on 0.", @@ -363,13 +367,17 @@ "admin_password": "Ylläpitäjän salasana", "administration": "Ylläpito", "advanced": "Edistyneet", - "advanced_settings_log_level_title": "Lokitaso: {}", + "advanced_settings_enable_alternate_media_filter_subtitle": "Käytä tätä vaihtoehtoa suodattaaksesi mediaa synkronoinnin aikana vaihtoehtoisten kriteerien perusteella. Kokeile tätä vain, jos sovelluksessa on ongelmia kaikkien albumien tunnistamisessa.", + "advanced_settings_enable_alternate_media_filter_title": "[KOKEELLINEN] Käytä vaihtoehtoisen laitteen albumin synkronointisuodatinta", + "advanced_settings_log_level_title": "Kirjaustaso: {}", "advanced_settings_prefer_remote_subtitle": "Jotkut laitteet ovat erittäin hitaita lataamaan esikatselukuvia laitteen kohteista. Aktivoi tämä asetus käyttääksesi etäkuvia.", "advanced_settings_prefer_remote_title": "Suosi etäkuvia", - "advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", + "advanced_settings_proxy_headers_subtitle": "Määritä välityspalvelimen otsikot(proxy headers), jotka Immichin tulisi lähettää jokaisen verkkopyynnÃļn mukana", "advanced_settings_proxy_headers_title": "Proxy Headers", "advanced_settings_self_signed_ssl_subtitle": "Ohita SSL sertifikaattivarmennus palvelimen päätepisteellä. Vaaditaan self-signed -sertifikaateissa.", "advanced_settings_self_signed_ssl_title": "Salli self-signed SSL -sertifikaatit", + "advanced_settings_sync_remote_deletions_subtitle": "Poista tai palauta kohde automaattisesti tällä laitteella, kun kyseinen toiminto suoritetaan verkossa", + "advanced_settings_sync_remote_deletions_title": "Synkronoi etäpoistot [KOKEELLINEN]", "advanced_settings_tile_subtitle": "Edistyneen käyttäjän asetukset", "advanced_settings_troubleshooting_subtitle": "Ota vianetsinnän lisäominaisuudet käyttÃļÃļn", "advanced_settings_troubleshooting_title": "Vianetsintä", @@ -393,7 +401,7 @@ "album_share_no_users": "Näyttää että olet jakanut tämän albumin kaikkien kanssa, tai sinulla ei ole käyttäjiä joille jakaa.", "album_thumbnail_card_item": "1 kohde", "album_thumbnail_card_items": "{} kohdetta", - "album_thumbnail_card_shared": "Jaettu", + "album_thumbnail_card_shared": " ¡ Jaettu", "album_thumbnail_shared_by": "Jakanut {}", "album_updated": "Albumi päivitetty", "album_updated_setting_description": "Saa sähkÃļpostia kun jaetussa albumissa on uutta sisältÃļä", @@ -418,6 +426,7 @@ "allow_edits": "Salli muutokset", "allow_public_user_to_download": "Salli julkisten käyttäjien ladata tiedostoja", "allow_public_user_to_upload": "Salli julkisten käyttäjien lähettää tiedostoja", + "alt_text_qr_code": "QR-koodi", "anti_clockwise": "Vastapäivään", "api_key": "API-avain", "api_key_description": "Tämä arvo näytetään vain kerran. Varmista, että olet kopioinut sen ennen kuin suljet ikkunan.", @@ -434,7 +443,7 @@ "archive_page_title": "Arkisto ({})", "archive_size": "Arkiston koko", "archive_size_description": "Määritä arkiston koko latauksissa (Gt)", - "archived": "Archived", + "archived": "Arkistoitu", "archived_count": "{count, plural, other {Arkistoitu #}}", "are_these_the_same_person": "Ovatko he sama henkilÃļ?", "are_you_sure_to_do_this": "Haluatko varmasti tehdä tämän?", @@ -456,38 +465,38 @@ "asset_list_settings_title": "Kuvaruudukko", "asset_offline": "Aineisto offline-tilassa", "asset_offline_description": "Tätä ulkoista resurssia ei enää lÃļydy levyltä. Ole hyvä ja ota yhteyttä Immich-järjestelmänvalvojaan saadaksesi apua.", - "asset_restored_successfully": "Asset restored successfully", + "asset_restored_successfully": "Kohde palautettu onnistuneesti", "asset_skipped": "Ohitettu", "asset_skipped_in_trash": "Roskakorissa", "asset_uploaded": "Lähetetty", - "asset_uploading": "Lähetetäänâ€Ļ", - "asset_viewer_settings_subtitle": "Manage your gallery viewer settings", + "asset_uploading": "Ladataanâ€Ļ", + "asset_viewer_settings_subtitle": "Galleriakatseluohjelman asetusten hallinta", "asset_viewer_settings_title": "Katselin", "assets": "kohdetta", "assets_added_count": "Lisätty {count, plural, one {# kohde} other {# kohdetta}}", "assets_added_to_album_count": "Albumiin lisätty {count, plural, one {# kohde} other {# kohdetta}}", "assets_added_to_name_count": "Lisätty {count, plural, one {# kohde} other {# kohdetta}} {hasName, select, true {{name}} other {uuteen albumiin}}", "assets_count": "{count, plural, one {# media} other {# mediaa}}", - "assets_deleted_permanently": "{} asset(s) deleted permanently", - "assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", + "assets_deleted_permanently": "{} kohdetta poistettu pysyvästi", + "assets_deleted_permanently_from_server": "{} objektia poistettu pysyvästi Immich-palvelimelta", "assets_moved_to_trash_count": "Siirretty {count, plural, one {# media} other {# mediaa}} roskakoriin", "assets_permanently_deleted_count": "{count, plural, one {# media} other {# mediaa}} poistettu pysyvästi", "assets_removed_count": "{count, plural, one {# media} other {# mediaa}} poistettu", - "assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", + "assets_removed_permanently_from_device": "{} kohdetta on poistettu pysyvästi laitteeltasi", "assets_restore_confirmation": "Haluatko varmasti palauttaa kaikki roskakoriisi siirretyt resurssit? Tätä toimintoa ei voi peruuttaa! Huomaa, että offline-resursseja ei voida palauttaa tällä tavalla.", "assets_restored_count": "{count, plural, one {# media} other {# mediaa}} palautettu", - "assets_restored_successfully": "{} asset(s) restored successfully", - "assets_trashed": "{} asset(s) trashed", + "assets_restored_successfully": "{} kohdetta palautettu onnistuneesti", + "assets_trashed": "{} kohdetta siirretty roskakoriin", "assets_trashed_count": "{count, plural, one {# media} other {# mediaa}} siirretty roskakoriin", - "assets_trashed_from_server": "{} asset(s) trashed from the Immich server", + "assets_trashed_from_server": "{} kohdetta siirretty roskakoriin Immich-palvelimelta", "assets_were_part_of_album_count": "{count, plural, one {Media oli} other {Mediat olivat}} jo albumissa", "authorized_devices": "Valtuutetut laitteet", - "automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere", - "automatic_endpoint_switching_title": "Automatic URL switching", + "automatic_endpoint_switching_subtitle": "Yhdistä paikallisesti nimetyn Wi-Fi-yhteyden kautta, kun se on saatavilla, ja käytä vaihtoehtoisia yhteyksiä muualla", + "automatic_endpoint_switching_title": "Automaattinen URL-osoitteen vaihto", "back": "Takaisin", "back_close_deselect": "Palaa, sulje tai poista valinnat", - "background_location_permission": "Background location permission", - "background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name", + "background_location_permission": "Taustasijainnin käyttÃļoikeus", + "background_location_permission_content": "Jotta sovellus voi vaihtaa verkkoa taustalla toimiessaan, Immichillä on *aina* oltava pääsy tarkkaan sijaintiin, jotta se voi lukea Wi-Fi-verkon nimen", "backup_album_selection_page_albums_device": "Laitteen albumit ({})", "backup_album_selection_page_albums_tap": "Napauta sisällyttääksesi, kaksoisnapauta jättääksesi pois", "backup_album_selection_page_assets_scatter": "Kohteet voivat olla hajaantuneina useisiin albumeihin. Albumeita voidaan sisällyttää varmuuskopiointiin tai jättää siitä pois.", @@ -495,15 +504,15 @@ "backup_album_selection_page_selection_info": "Valintatiedot", "backup_album_selection_page_total_assets": "Uniikkeja kohteita yhteensä", "backup_all": "Kaikki", - "backup_background_service_backup_failed_message": "Kohteiden varmuuskopiointi epäonnistui. Yritetään uudelleen...", - "backup_background_service_connection_failed_message": "Palvelimeen ei saatu yhteyttä. Yritetään uudelleen...", + "backup_background_service_backup_failed_message": "Kohteiden varmuuskopiointi epäonnistui. Yritetään uudelleenâ€Ļ", + "backup_background_service_connection_failed_message": "Palvelimeen ei saatu yhteyttä. Yritetään uudelleenâ€Ļ", "backup_background_service_current_upload_notification": "Lähetetään {}", - "backup_background_service_default_notification": "Tarkistetaan uusia kohteita...", + "backup_background_service_default_notification": "Tarkistetaan uusia kohteitaâ€Ļ", "backup_background_service_error_title": "Virhe varmuuskopioinnissa", - "backup_background_service_in_progress_notification": "Varmuuskopioidaan kohteita...", - "backup_background_service_upload_failure_notification": "Lähetys palvelimelle epäonnistui {}", + "backup_background_service_in_progress_notification": "Varmuuskopioidaan kohteitaâ€Ļ", + "backup_background_service_upload_failure_notification": "Lähetys epäonnistui {}", "backup_controller_page_albums": "Varmuuskopioi albumit", - "backup_controller_page_background_app_refresh_disabled_content": "Salli sovelluksen päivittäminen taustalla suorittaaksesi varmuuskopiointia taustalla: Asetukset > Yleiset > Appien päivitys taustalla", + "backup_controller_page_background_app_refresh_disabled_content": "Salli sovelluksen päivittäminen taustalla suorittaaksesi varmuuskopiointia taustalla: Asetukset > Yleiset > Appien päivitys taustalla.", "backup_controller_page_background_app_refresh_disabled_title": "Sovelluksen päivittäminen taustalla on pois päältä", "backup_controller_page_background_app_refresh_enable_button_text": "Siirry asetuksiin", "backup_controller_page_background_battery_info_link": "Näytä minulle miten", @@ -524,9 +533,9 @@ "backup_controller_page_backup_sub": "Varmuuskopioidut kuvat ja videot", "backup_controller_page_created": "Luotu: {}", "backup_controller_page_desc_backup": "Kytke varmuuskopiointi päälle lähettääksesi uudet kohteet palvelimelle automaattisesti.", - "backup_controller_page_excluded": "Jätetty pois: ", + "backup_controller_page_excluded": "Poissuljettu: ", "backup_controller_page_failed": "Epäonnistui ({})", - "backup_controller_page_filename": "Tiedoston nimi: {} [{}]", + "backup_controller_page_filename": "Tiedostonimi: {} [{}]", "backup_controller_page_id": "ID: {}", "backup_controller_page_info": "Varmuuskopioinnin tiedot", "backup_controller_page_none_selected": "Ei mitään", @@ -545,11 +554,11 @@ "backup_err_only_album": "Vähintään yhden albumin tulee olla valittuna", "backup_info_card_assets": "kohdetta", "backup_manual_cancelled": "Peruutettu", - "backup_manual_in_progress": "Lähetys palvelimelle on jo käynnissä. Kokeile uudelleen hetken kuluttua.", + "backup_manual_in_progress": "Lähetys palvelimelle on jo käynnissä. Kokeile myÃļhemmin uudelleen", "backup_manual_success": "Onnistui", "backup_manual_title": "Lähetyksen tila", "backup_options_page_title": "Varmuuskopioinnin asetukset", - "backup_setting_subtitle": "Manage background and foreground upload settings", + "backup_setting_subtitle": "Hallinnoi aktiivisia ja taustalla olevia lähetysasetuksia", "backward": "Taaksepäin", "birthdate_saved": "Syntymäaika tallennettu", "birthdate_set_description": "Syntymäaikaa käytetään laskemaan henkilÃļn ikä kuvanottohetkellä.", @@ -567,7 +576,7 @@ "cache_settings_duplicated_assets_clear_button": "Tyhjennä", "cache_settings_duplicated_assets_subtitle": "Sovelluksen mustalle listalle merkitsemät valokuvat ja videot", "cache_settings_duplicated_assets_title": "Kaksoiskappaleet ({})", - "cache_settings_image_cache_size": "Kuvien välimuistin koko ({} kohdetta)", + "cache_settings_image_cache_size": "Kuvavälimuistin koko ({} kohdetta)", "cache_settings_statistics_album": "Kirjaston esikatselukuvat", "cache_settings_statistics_assets": "{} kohdetta ({})", "cache_settings_statistics_full": "Täysikokoiset kuvat", @@ -584,12 +593,12 @@ "camera_model": "Kameran malli", "cancel": "Peruuta", "cancel_search": "Peru haku", - "canceled": "Canceled", + "canceled": "Peruutettu", "cannot_merge_people": "Ihmisiä ei voitu yhdistää", "cannot_undo_this_action": "Et voi perua tätä toimintoa!", "cannot_update_the_description": "Kuvausta ei voi päivittää", "change_date": "Vaihda päiväys", - "change_display_order": "Change display order", + "change_display_order": "Muuta näyttÃļjärjestystä", "change_expiration_time": "Muuta erääntymisaikaa", "change_location": "Vaihda sijainti", "change_name": "Vaihda nimi", @@ -597,16 +606,16 @@ "change_password": "Vaihda Salasana", "change_password_description": "Tämä on joko ensimmäinen kertasi kun kirjaudut järjestelmään, tai salasanasi on pyydetty vaihtamaan. Määritä uusi salasana alle.", "change_password_form_confirm_password": "Vahvista salasana", - "change_password_form_description": "Hei {name},\n\nTämä on joko ensimmäinen kirjautumisesi järjestelmään tai salasanan vaihtaminen vaihtaminen on pakotettu. Ole hyvä ja syÃļtä uusi salasana alle.", + "change_password_form_description": "Hei {name},\n\nTämä on joko ensimmäinen kerta, kun kirjaudut järjestelmään, tai sinulta on pyydetty salasanan vaihtoa. Ole hyvä ja syÃļtä uusi salasana alle.", "change_password_form_new_password": "Uusi salasana", "change_password_form_password_mismatch": "Salasanat eivät täsmää", "change_password_form_reenter_new_password": "Uusi salasana uudelleen", "change_your_password": "Vaihda salasanasi", "changed_visibility_successfully": "Näkyvyys vaihdettu", "check_all": "Valitse kaikki", - "check_corrupt_asset_backup": "Check for corrupt asset backups", - "check_corrupt_asset_backup_button": "Perform check", - "check_corrupt_asset_backup_description": "Run this check only over Wi-Fi and once all assets have been backed-up. The procedure might take a few minutes.", + "check_corrupt_asset_backup": "Vioittuneiden varmuuskopioiden tarkistaminen", + "check_corrupt_asset_backup_button": "Suorita tarkistus", + "check_corrupt_asset_backup_description": "Suorita tämä tarkistus vain Wi-Fi-yhteyden kautta ja vasta, kun kaikki kohteet on varmuuskopioitu. Toimenpide voi kestää muutamia minuutteja.", "check_logs": "Katso lokeja", "choose_matching_people_to_merge": "Valitse henkilÃļt joka yhdistetään", "city": "Kaupunki", @@ -618,11 +627,11 @@ "client_cert_dialog_msg_confirm": "OK", "client_cert_enter_password": "Enter Password", "client_cert_import": "Import", - "client_cert_import_success_msg": "Client certificate is imported", - "client_cert_invalid_msg": "Invalid certificate file or wrong password", - "client_cert_remove_msg": "Client certificate is removed", - "client_cert_subtitle": "Supports PKCS12 (.p12, .pfx) format only. Certificate Import/Remove is available only before login", - "client_cert_title": "SSL Client Certificate", + "client_cert_import_success_msg": "Asiakasvarmenne tuotu", + "client_cert_invalid_msg": "Virheellinen varmennetiedosto tai väärä salasana", + "client_cert_remove_msg": "Asiakassertifikaatti on poistettu", + "client_cert_subtitle": "Vain PKCS12 (.p12, .pfx) -muotoa tuetaan. Varmenteen tuonti/poisto on käytettävissä vain ennen sisäänkirjautumista", + "client_cert_title": "SSL-asiakassertifikaatti", "clockwise": "MyÃļtäpäivään", "close": "Sulje", "collapse": "Supista", @@ -635,9 +644,10 @@ "comments_are_disabled": "Kommentointi ei käytÃļssä", "common_create_new_album": "Luo uusi albumi", "common_server_error": "Tarkista internet-yhteytesi. Varmista että palvelin on saavutettavissa ja sovellus-/palvelinversiot ovat yhteensopivia.", - "completed": "Completed", + "completed": "Valmis", "confirm": "Vahvista", "confirm_admin_password": "Vahvista ylläpitäjän salasana", + "confirm_delete_face": "Haluatko poistaa {name} kasvot kohteesta?", "confirm_delete_shared_link": "Haluatko varmasti poistaa tämän jaetun linkin?", "confirm_keep_this_delete_others": "Kuvapinon muut kuvat tätä lukuunottamatta poistetaan. Oletko varma, että haluat jatkaa?", "confirm_password": "Vahvista salasana", @@ -650,7 +660,7 @@ "control_bottom_app_bar_delete_from_local": "Poista laitteelta", "control_bottom_app_bar_edit_location": "Muokkaa sijaintia", "control_bottom_app_bar_edit_time": "Muokkaa aikaa", - "control_bottom_app_bar_share_link": "Share Link", + "control_bottom_app_bar_share_link": "Jaa linkki", "control_bottom_app_bar_share_to": "Jaa", "control_bottom_app_bar_trash_from_immich": "Siirrä roskakoriin", "copied_image_to_clipboard": "Kuva kopioitu leikepÃļydälle.", @@ -682,10 +692,10 @@ "create_tag_description": "Luo uusi tunniste. Sisäkkäisiä tunnisteita varten syÃļtä tunnisteen täydellinen polku kauttaviivat mukaan luettuna.", "create_user": "Luo käyttäjä", "created": "Luotu", - "crop": "Crop", + "crop": "Rajaa", "curated_object_page_title": "Asiat", "current_device": "Nykyinen laite", - "current_server_address": "Current server address", + "current_server_address": "Nykyinen palvelinosoite", "custom_locale": "Muokatut maa-asetukset", "custom_locale_description": "Muotoile päivämäärät ja numerot perustuen alueen kieleen", "daily_title_text_date": "E, MMM dd", @@ -715,6 +725,7 @@ "delete_dialog_ok_force": "Poista kuitenkin", "delete_dialog_title": "Poista pysyvästi", "delete_duplicates_confirmation": "Haluatko varmasti poistaa nämä kaksoiskappaleet pysyvästi?", + "delete_face": "Poista kasvot", "delete_key": "Poista avain", "delete_library": "Poista kirjasto", "delete_link": "Poista linkki", @@ -747,26 +758,26 @@ "documentation": "Dokumentaatio", "done": "Valmis", "download": "Lataa", - "download_canceled": "Download canceled", - "download_complete": "Download complete", - "download_enqueue": "Download enqueued", + "download_canceled": "Lataus peruutettu", + "download_complete": "Lataus valmis", + "download_enqueue": "Latausjonossa", "download_error": "Download Error", - "download_failed": "Download failed", - "download_filename": "file: {}", - "download_finished": "Download finished", + "download_failed": "Lataus epäonnistui", + "download_filename": "tiedosto: {}", + "download_finished": "Lataus valmis", "download_include_embedded_motion_videos": "Upotetut videot", "download_include_embedded_motion_videos_description": "Sisällytä liikekuviin upotetut videot erillisinä tiedostoina", - "download_notfound": "Download not found", - "download_paused": "Download paused", + "download_notfound": "Latausta ei lÃļytynyt", + "download_paused": "Lataus keskeytetty", "download_settings": "Lataukset", "download_settings_description": "Hallitse aineiston lataukseen liittyviä asetuksia", - "download_started": "Download started", - "download_sucess": "Download success", - "download_sucess_android": "The media has been downloaded to DCIM/Immich", - "download_waiting_to_retry": "Waiting to retry", + "download_started": "Lataus aloitettu", + "download_sucess": "Lataus onnistui", + "download_sucess_android": "Media on ladattu DCIM/Immichiin", + "download_waiting_to_retry": "Odotetaan uudelleenyritystä", "downloading": "Ladataan", "downloading_asset_filename": "Ladataan mediaa {filename}", - "downloading_media": "Downloading media", + "downloading_media": "Median lataaminen", "drop_files_to_upload": "Pudota tiedostot mihin tahansa ladataksesi ne", "duplicates": "Kaksoiskappaleet", "duplicates_description": "Selvitä jokaisen kohdalla mitkä (jos yksikään) ovat kaksoiskappaleita", @@ -796,18 +807,19 @@ "editor_crop_tool_h2_aspect_ratios": "Kuvasuhteet", "editor_crop_tool_h2_rotation": "Rotaatio", "email": "SähkÃļposti", - "empty_folder": "This folder is empty", + "empty_folder": "Kansio on tyhjä", "empty_trash": "Tyhjennä roskakori", "empty_trash_confirmation": "Haluatko varmasti tyhjentää roskakorin? Tämä poistaa pysyvästi kaikki tiedostot Immich:stä.\nToimintoa ei voi perua!", "enable": "Ota käyttÃļÃļn", "enabled": "KäytÃļssä", "end_date": "Päättymispäivä", - "enqueued": "Enqueued", - "enter_wifi_name": "Enter WiFi name", + "enqueued": "Lisätty jonoon", + "enter_wifi_name": "Anna Wi-Fi-verkon nimi", "error": "Virhe", - "error_change_sort_album": "Failed to change album sort order", + "error_change_sort_album": "Albumin lajittelujärjestyksen muuttaminen epäonnistui", + "error_delete_face": "Virhe kasvojen poistamisessa kohteesta", "error_loading_image": "Kuvan lataus ei onnistunut", - "error_saving_image": "Error: {}", + "error_saving_image": "Virhe: {}", "error_title": "Virhe - Jotain meni pieleen", "errors": { "cannot_navigate_next_asset": "Seuraavaan mediaan ei voi siirtyä", @@ -837,10 +849,12 @@ "failed_to_keep_this_delete_others": "Muiden kohteiden poisto epäonnistui", "failed_to_load_asset": "Kohteen lataus epäonnistui", "failed_to_load_assets": "Kohteiden lataus epäonnistui", + "failed_to_load_notifications": "Ilmoitusten lataaminen epäonnistui", "failed_to_load_people": "HenkilÃļiden lataus epäonnistui", "failed_to_remove_product_key": "Tuoteavaimen poistaminen epäonnistui", "failed_to_stack_assets": "Medioiden pinoaminen epäonnistui", "failed_to_unstack_assets": "Medioiden pinoamisen purku epäonnistui", + "failed_to_update_notification_status": "Ilmoituksen tilan päivittäminen epäonnistui", "import_path_already_exists": "Tämä tuontipolku on jo olemassa.", "incorrect_email_or_password": "Väärä sähkÃļpostiosoite tai salasana", "paths_validation_failed": "{paths, plural, one {# polun} other {# polun}} validointi epäonnistui", @@ -908,7 +922,7 @@ "unable_to_remove_reaction": "Reaktion poistaminen epäonnistui", "unable_to_repair_items": "Kohteiden korjaaminen epäonnistui", "unable_to_reset_password": "Salasanan nollaaminen epäonnistui", - "unable_to_resolve_duplicate": "Virheilmoitus näkyy, kun palvelin palauttaa virheen painettaessa roskakorin tai säilytä-painiketta.", + "unable_to_resolve_duplicate": "Kaksoiskappaleen ratkaiseminen epäonnistui", "unable_to_restore_assets": "Kohteen palauttaminen epäonnistui", "unable_to_restore_trash": "Kohteiden palauttaminen epäonnistui", "unable_to_restore_user": "Käyttäjän palauttaminen epäonnistui", @@ -941,10 +955,10 @@ "exif_bottom_sheet_location": "SIJAINTI", "exif_bottom_sheet_people": "IHMISET", "exif_bottom_sheet_person_add_person": "Lisää nimi", - "exif_bottom_sheet_person_age": "Age {}", - "exif_bottom_sheet_person_age_months": "Age {} months", - "exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months", - "exif_bottom_sheet_person_age_years": "Age {}", + "exif_bottom_sheet_person_age": "Ikä {}", + "exif_bottom_sheet_person_age_months": "Ikä {} kuukautta", + "exif_bottom_sheet_person_age_year_months": "Ikä 1 vuosi, {} kuukautta", + "exif_bottom_sheet_person_age_years": "Ikä {}", "exit_slideshow": "Poistu diaesityksestä", "expand_all": "Laajenna kaikki", "experimental_settings_new_asset_list_subtitle": "TyÃļn alla", @@ -961,12 +975,12 @@ "extension": "Tiedostopääte", "external": "Ulkoisesta", "external_libraries": "Ulkoiset kirjastot", - "external_network": "External network", - "external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom", + "external_network": "Ulkoinen verkko", + "external_network_sheet_info": "Kun laite ei ole yhteydessä valittuun Wi-Fi-verkkoon, sovellus yrittää muodostaa yhteyden palvelimeen alla olevista URL-osoitteista ylhäältä alas, kunnes yhteys muodostuu", "face_unassigned": "Ei määritelty", - "failed": "Failed", + "failed": "Epäonnistui", "failed_to_load_assets": "Kohteiden lataus epäonnistui", - "failed_to_load_folder": "Failed to load folder", + "failed_to_load_folder": "Kansion lataaminen epäonnistui", "favorite": "Suosikki", "favorite_or_unfavorite_photo": "Suosikki- tai ei-suosikkikuva", "favorites": "Suosikit", @@ -980,21 +994,22 @@ "filetype": "Tiedostotyyppi", "filter": "Filter", "filter_people": "Suodata henkilÃļt", + "filter_places": "Suodata paikkoja", "find_them_fast": "LÃļydä nopeasti hakemalla nimellä", "fix_incorrect_match": "Korjaa virheellinen osuma", - "folder": "Folder", - "folder_not_found": "Folder not found", + "folder": "Kansio", + "folder_not_found": "Kansiota ei lÃļytynyt", "folders": "Kansiot", "folders_feature_description": "Käytetään kansionäkymää valokuvien ja videoiden selaamiseen järjestelmässä", "forward": "Eteenpäin", "general": "Yleinen", "get_help": "Hae apua", - "get_wifiname_error": "Could not get Wi-Fi name. Make sure you have granted the necessary permissions and are connected to a Wi-Fi network", + "get_wifiname_error": "Wi-Fi-verkon nimen hakeminen epäonnistui. Varmista, että olet myÃļntänyt tarvittavat käyttÃļoikeudet ja että olet yhteydessä Wi-Fi-verkkoon", "getting_started": "Aloittaminen", "go_back": "Palaa", "go_to_folder": "Mene kansioon", "go_to_search": "Siirry hakuun", - "grant_permission": "Grant permission", + "grant_permission": "MyÃļnnä lupa", "group_albums_by": "Ryhmitä albumi...", "group_country": "Ryhmitä maan mukaan", "group_no": "Ei ryhmitystä", @@ -1004,12 +1019,12 @@ "haptic_feedback_switch": "Ota haptinen palaute käyttÃļÃļn", "haptic_feedback_title": "Haptinen palaute", "has_quota": "On kiintiÃļ", - "header_settings_add_header_tip": "Add Header", - "header_settings_field_validator_msg": "Value cannot be empty", + "header_settings_add_header_tip": "Lisää otsikko", + "header_settings_field_validator_msg": "Arvo ei voi olla tyhjä", "header_settings_header_name_input": "Header name", "header_settings_header_value_input": "Header value", - "headers_settings_tile_subtitle": "Define proxy headers the app should send with each network request", - "headers_settings_tile_title": "Custom proxy headers", + "headers_settings_tile_subtitle": "Määritä välityspalvelimen otsikot, jotka sovelluksen tulisi lähettää jokaisen verkkopyynnÃļn mukana", + "headers_settings_tile_title": "Mukautettu proxy headers", "hi_user": "Hei {name} ({email})", "hide_all_people": "Piilota kaikki henkilÃļt", "hide_gallery": "Piilota galleria", @@ -1028,13 +1043,13 @@ "home_page_delete_remote_err_local": "Paikallisia kohteita etäkohdevalintojen joukossa, ohitetaan", "home_page_favorite_err_local": "Paikallisten kohteiden lisääminen suosikkeihin ei ole mahdollista, ohitetaan", "home_page_favorite_err_partner": "Kumppanin kohteita ei voi vielä merkitä suosikiksi. Hypätään yli", - "home_page_first_time_notice": "Jos käytät sovellusta ensimmäistä kertaa, muista valita varmuuskopioitavat albumi(t), jotta aikajanalla voi olla kuvia ja videoita.", + "home_page_first_time_notice": "Jos käytät sovellusta ensimmäistä kertaa, muista valita varmuuskopioitavat albumi(t), jotta aikajanalla voi olla kuvia ja videoita", "home_page_share_err_local": "Paikallisia kohteita ei voitu jakaa linkkien avulla. Hypätään yli", "home_page_upload_err_limit": "Voit lähettää palvelimelle enintään 30 kohdetta kerrallaan, ohitetaan", "host": "Isäntä", "hour": "Tunti", - "ignore_icloud_photos": "Ignore iCloud photos", - "ignore_icloud_photos_description": "Photos that are stored on iCloud will not be uploaded to the Immich server", + "ignore_icloud_photos": "Ohita iCloud-kuvat", + "ignore_icloud_photos_description": "iCloudiin tallennettuja kuvia ei ladata Immich-palvelimelle", "image": "Kuva", "image_alt_text_date": "{isVideo, select, true {Video} other {Kuva}} otettu {date}", "image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Kuva}} otettu {person1} kanssa {date}", @@ -1046,7 +1061,7 @@ "image_alt_text_date_place_2_people": "{isVideo, select, true {Video} other {Kuva}} otettu {city}ssä, {country}ssä {person1}n ja {person2}n kanssa {date}", "image_alt_text_date_place_3_people": "{isVideo, select, true {Video} other {Kuva}} otettu {city}ssä, {country}ssä {person1}n, {person2}n ja {person3}n kanssa {date}", "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Video} other {Kuva}} otettu {city}ssä, {country}ssä {person1}n, {person2}n ja {additionalCount, number} muun kanssa {date}", - "image_saved_successfully": "Image saved", + "image_saved_successfully": "Kuva tallennettu", "image_viewer_page_state_provider_download_started": "Lataaminen aloitettu", "image_viewer_page_state_provider_download_success": "Lataus onnistui", "image_viewer_page_state_provider_share_error": "Jakovirhe", @@ -1068,8 +1083,8 @@ "night_at_midnight": "Joka yÃļ keskiyÃļllä", "night_at_twoam": "Joka yÃļ klo 02:00" }, - "invalid_date": "Invalid date", - "invalid_date_format": "Invalid date format", + "invalid_date": "Virheellinen päivämäärä", + "invalid_date_format": "Virheellinen päivämäärämuoto", "invite_people": "Kutsu ihmisiä", "invite_to_album": "Kutsu albumiin", "items_count": "{count, plural, one {# kpl} other {# kpl}}", @@ -1085,6 +1100,7 @@ "latest_version": "Viimeisin versio", "latitude": "Leveysaste", "leave": "Lähde", + "lens_model": "Objektiivin malli", "let_others_respond": "Anna muiden vastata", "level": "Taso", "library": "Kirjasto", @@ -1105,9 +1121,9 @@ "loading": "Ladataan", "loading_search_results_failed": "Hakutulosten lataaminen epäonnistui", "local_network": "Local network", - "local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network", - "location_permission": "Location permission", - "location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name", + "local_network_sheet_info": "Sovellus muodostaa yhteyden palvelimeen tämän URL-osoitteen kautta, kun käytetään määritettyä Wi-Fi-verkkoa", + "location_permission": "Sijainnin käyttÃļoikeus", + "location_permission_content": "Automaattisen vaihtotoiminnon käyttämiseksi Immich tarvitsee tarkan sijainnin käyttÃļoikeuden, jotta se voi lukea nykyisen Wi-Fi-verkon nimen", "location_picker_choose_on_map": "Valitse kartalta", "location_picker_latitude_error": "Lisää kelvollinen leveysaste", "location_picker_latitude_hint": "SyÃļtä leveysaste", @@ -1131,7 +1147,7 @@ "login_form_err_trailing_whitespace": "Lopussa välilyÃļnti", "login_form_failed_get_oauth_server_config": "Virhe kirjauduttaessa OAuth:lla, tarkista palvelimen URL", "login_form_failed_get_oauth_server_disable": "OAuth-ominaisuus ei ole käytÃļssä tällä palvelimella", - "login_form_failed_login": "Virhe kirjautumisessa. Tarkista palvelimen URL, sähkÃļpostiosoite ja salasana.", + "login_form_failed_login": "Virhe kirjautumisessa. Tarkista palvelimen URL, sähkÃļpostiosoite ja salasana", "login_form_handshake_exception": "Tapahtui poikkeus kättelyssä palvelimen kanssa. Kytke päälle self-signed -sertifikaattituki asetuksista, mikäli käytät self-signed -sertifikaatteja.", "login_form_password_hint": "salasana", "login_form_save_login": "Pysy kirjautuneena", @@ -1145,8 +1161,9 @@ "longitude": "Pituusaste", "look": "Tyyli", "loop_videos": "Toista videot uudelleen", - "loop_videos_description": "Ota käyttÃļÃļn videon automaattinen toisto tarkemmassa näkymässä.", + "loop_videos_description": "Ota käyttÃļÃļn jatkuva videotoisto tarkemmassa näkymässä.", "main_branch_warning": "Käytät kehitysversiota; suosittelemme vahvasti käyttämään julkaisuversiota!", + "main_menu": "Päävalikko", "make": "Valmistaja", "manage_shared_links": "Hallitse jaettuja linkkejä", "manage_sharing_with_partners": "Hallitse jakamista kumppaneille", @@ -1180,6 +1197,9 @@ "map_settings_only_show_favorites": "Näytä vain suosikit", "map_settings_theme_settings": "Kartan teema", "map_zoom_to_see_photos": "Tarkenna nähdäksesi kuvat", + "mark_all_as_read": "Merkitse kaikki luetuiksi", + "mark_as_read": "Merkitse luetuksi", + "marked_all_as_read": "Merkitty kaikki luetuiksi", "matches": "Osumia", "media_type": "Median tyyppi", "memories": "Muistoja", @@ -1188,8 +1208,8 @@ "memories_setting_description": "Hallitse mitä näet muistoissasi", "memories_start_over": "Aloita alusta", "memories_swipe_to_close": "Pyyhkäise ylÃļs sulkeaksesi", - "memories_year_ago": "A year ago", - "memories_years_ago": "{} years ago", + "memories_year_ago": "Vuosi sitten", + "memories_years_ago": "{} vuotta sitten", "memory": "Muisto", "memory_lane_title": "Muistojen polku {title}", "menu": "Valikko", @@ -1206,14 +1226,17 @@ "month": "Kuukauden mukaan", "monthly_title_text_date_format": "MMMM y", "more": "Enemmän", + "moved_to_archive": "Siirretty {count, plural, one {# kohde} other {# kohdetta}} arkistoon", + "moved_to_library": "Siirretty {count, plural, one {# kohde} other {# kohdetta}} kirjastoon", "moved_to_trash": "Siirretty roskakoriin", "multiselect_grid_edit_date_time_err_read_only": "Vain luku -tilassa olevien kohteiden päivämäärää ei voitu muokata, ohitetaan", "multiselect_grid_edit_gps_err_read_only": "Vain luku-tilassa olevien kohteiden sijantitietoja ei voitu muokata, ohitetaan", - "my_albums": "Albumini", + "mute_memories": "Mykistä muistot", + "my_albums": "Omat albumit", "name": "Nimi", "name_or_nickname": "Nimi tai lempinimi", - "networking_settings": "Networking", - "networking_subtitle": "Manage the server endpoint settings", + "networking_settings": "Verkko", + "networking_subtitle": "Hallitse palvelinasetuksia", "never": "ei koskaan", "new_album": "Uusi Albumi", "new_api_key": "Uusi API-avain", @@ -1237,12 +1260,14 @@ "no_favorites_message": "Lisää suosikkeja lÃļytääksesi nopeasti parhaat kuvasi ja videosi", "no_libraries_message": "Luo ulkoinen kirjasto nähdäksesi valokuvasi ja videot", "no_name": "Ei nimeä", + "no_notifications": "Ei ilmoituksia", + "no_people_found": "Ei vastaavia henkilÃļitä", "no_places": "Ei paikkoja", "no_results": "Ei tuloksia", "no_results_description": "Kokeile synonyymiä tai yleisempää avainsanaa", "no_shared_albums_message": "Luo albumi, jotta voit jakaa kuvia ja videoita toisille", "not_in_any_album": "Ei yhdessäkään albumissa", - "not_selected": "Not selected", + "not_selected": "Ei valittu", "note_apply_storage_label_to_previously_uploaded assets": "Huom: Jotta voit soveltaa tallennustunnistetta aiemmin ladattuihin kohteisiin, suorita", "notes": "Muistiinpanot", "notification_permission_dialog_content": "Ottaaksesi ilmoitukset käyttÃļÃļn, siirry asetuksiin ja valitse 'salli'.", @@ -1259,7 +1284,7 @@ "offline_paths_description": "Nämä tulokset voivat johtua tiedostojen manuaalisesta poistamisesta, jotka eivät ole osa ulkoista kirjastoa.", "ok": "Ok", "oldest_first": "Vanhin ensin", - "on_this_device": "On this device", + "on_this_device": "Laitteella", "onboarding": "KäyttÃļÃļnotto", "onboarding_privacy_description": "Seuraavat (valinnaiset) ominaisuudet perustuvat ulkoisiin palveluihin, ja ne voidaan poistaa käytÃļstä milloin tahansa hallinta asetuksista.", "onboarding_theme_description": "Valitse väriteema istunnollesi. Voit muuttaa tämän myÃļhemmin asetuksistasi.", @@ -1267,6 +1292,7 @@ "onboarding_welcome_user": "Tervetuloa {user}", "online": "Online", "only_favorites": "Vain suosikit", + "open": "Avaa", "open_in_map_view": "Avaa karttanäkymässä", "open_in_openstreetmap": "Avaa OpenStreetMapissa", "open_the_search_filters": "Avaa hakusuodattimet", @@ -1328,6 +1354,7 @@ "permission_onboarding_permission_limited": "Rajoitettu käyttÃļoikeus. Salliaksesi Immichin varmuuskopioida ja hallita koko kuvakirjastoasi, myÃļnnä oikeus kuviin ja videoihin asetuksista.", "permission_onboarding_request": "Immich vaatii käyttÃļoikeuden kuvien ja videoiden käyttämiseen.", "person": "HenkilÃļ", + "person_birthdate": "Syntynyt {date}", "person_hidden": "{name}{hidden, select, true { (piilotettu)} other {}}", "photo_shared_all_users": "Näyttää että olet jakanut kuvasi kaikkien käyttäjien kanssa, tai sinulla ei ole käyttäjää kenelle jakaa.", "photos": "Kuvat", @@ -1337,12 +1364,13 @@ "pick_a_location": "Valitse sijainti", "place": "Sijainti", "places": "Paikat", + "places_count": "{count, plural, one {{count, number} Paikka} other {{count, number} Paikkaa}}", "play": "Toista", "play_memories": "Toista muistot", "play_motion_photo": "Toista Liikekuva", "play_or_pause_video": "Toista tai keskeytä video", "port": "Portti", - "preferences_settings_subtitle": "Manage the app's preferences", + "preferences_settings_subtitle": "Hallitse sovelluksen asetuksia", "preferences_settings_title": "Asetukset", "preset": "Asetus", "preview": "Esikatselu", @@ -1407,8 +1435,10 @@ "recent": "Viimeisin", "recent-albums": "Viimeisimmät albumit", "recent_searches": "Edelliset haut", - "recently_added": "Recently added", + "recently_added": "Viimeksi lisätty", "recently_added_page_title": "Viimeksi lisätyt", + "recently_taken": "Viimeksi otettu", + "recently_taken_page_title": "Viimeksi Otettu", "refresh": "Päivitä", "refresh_encoded_videos": "Päivitä enkoodatut videot", "refresh_faces": "Päivitä kasvot", @@ -1429,12 +1459,16 @@ "remove_from_album": "Poista albumista", "remove_from_favorites": "Poista suosikeista", "remove_from_shared_link": "Poista jakolinkistä", + "remove_memory": "Tyhjennä muisti", + "remove_photo_from_memory": "Poista kuva muistista", "remove_url": "Poista URL", "remove_user": "Poista käyttäjä", "removed_api_key": "API-avain {name} poistettu", "removed_from_archive": "Poistettu arkistosta", "removed_from_favorites": "Poistettu suosikeista", "removed_from_favorites_count": "{count, plural, other {Poistettu #}} suosikeista", + "removed_memory": "Poistettu muistista", + "removed_photo_from_memory": "Kuva poistettu muistista", "removed_tagged_assets": "Poistettu tunniste {count, plural, one {# kohteesta} other {# kohteesta}}", "rename": "Nimeä uudelleen", "repair": "Korjaa", @@ -1443,6 +1477,7 @@ "repository": "Tietovarasto", "require_password": "Vaadi salasana", "require_user_to_change_password_on_first_login": "Vaadi käyttäjää vaihtamaan salasana seuraavalla kirjautumiskerralla", + "rescan": "Skannaa uudelleen", "reset": "Nollaa", "reset_password": "Nollaa salasana", "reset_people_visibility": "Nollaa henkilÃļiden näkyvyysasetukset", @@ -1460,7 +1495,7 @@ "role_editor": "Editori", "role_viewer": "Toistin", "save": "Tallenna", - "save_to_gallery": "Save to gallery", + "save_to_gallery": "Tallenna galleriaan", "saved_api_key": "API-avain tallennettu", "saved_profile": "Profiili tallennettu", "saved_settings": "Asetukset tallennettu", @@ -1474,6 +1509,7 @@ "search_albums": "Etsi albumeita", "search_by_context": "Etsi kontekstin perusteella", "search_by_description": "Etsi kuvauksen perusteella", + "search_by_description_example": "Vaelluspäivä Sapassa", "search_by_filename": "Hae tiedostonimen tai -päätteen mukaan", "search_by_filename_example": "esim. IMG_1234.JPG tai PNG", "search_camera_make": "Etsi kameramerkkiä...", @@ -1481,30 +1517,31 @@ "search_city": "Etsi kaupunkia...", "search_country": "Etsi maata...", "search_filter_apply": "Käytä", - "search_filter_camera_title": "Select camera type", + "search_filter_camera_title": "Valitse kameratyyppi", "search_filter_date": "Date", "search_filter_date_interval": "{start} to {end}", - "search_filter_date_title": "Select a date range", + "search_filter_date_title": "Valitse aikaväli", "search_filter_display_option_not_in_album": "Ei kuulu albumiin", - "search_filter_display_options": "Display Options", - "search_filter_filename": "Search by file name", - "search_filter_location": "Location", - "search_filter_location_title": "Select location", + "search_filter_display_options": "NäyttÃļasetukset", + "search_filter_filename": "Etsi tiedostonimellä", + "search_filter_location": "Sijainti", + "search_filter_location_title": "Valitse sijainti", "search_filter_media_type": "Media Type", - "search_filter_media_type_title": "Select media type", - "search_filter_people_title": "Select people", + "search_filter_media_type_title": "Valitse mediatyyppi", + "search_filter_people_title": "Valitse ihmiset", + "search_for": "Hae", "search_for_existing_person": "Etsi olemassa olevaa henkilÃļä", - "search_no_more_result": "No more results", + "search_no_more_result": "Ei enää tuloksia", "search_no_people": "Ei henkilÃļitä", "search_no_people_named": "Ei \"{name}\" nimisiä henkilÃļitä", - "search_no_result": "No results found, try a different search term or combination", + "search_no_result": "Ei tuloksia, kokeile toista hakusanaa tai -yhdistelmää", "search_options": "Hakuvaihtoehdot", "search_page_categories": "Kategoriat", "search_page_motion_photos": "Liikekuvat", "search_page_no_objects": "Objektitietoja ei ole saatavilla", "search_page_no_places": "Paikkatietoja ei ole saatavilla", "search_page_screenshots": "NäyttÃļkuvat", - "search_page_search_photos_videos": "Search for your photos and videos", + "search_page_search_photos_videos": "Hae kuvia tai videoita", "search_page_selfies": "Selfiet", "search_page_things": "Asiat", "search_page_view_all_button": "Näytä kaikki", @@ -1512,10 +1549,11 @@ "search_page_your_map": "Sinun karttasi", "search_people": "Etsi ihmisiä", "search_places": "Etsi paikkoja", + "search_rating": "Hae luokituksen mukaan...", "search_result_page_new_search_hint": "Uusi haku", "search_settings": "Hakuasetukset", - "search_state": "Etsi tilaa...", - "search_suggestion_list_smart_search_hint_1": "Älykäs haku on oletuksena käytÃļssä. Käytä metatietojen etsimiseen syntaksia", + "search_state": "Etsi maakuntaa...", + "search_suggestion_list_smart_search_hint_1": "Älykäs haku on oletuksena käytÃļssä. Käytä metatietojen etsimiseen syntaksia ", "search_suggestion_list_smart_search_hint_2": "m:hakusana", "search_tags": "Etsi tunnisteita...", "search_timezone": "Etsi aikavyÃļhyke...", @@ -1524,6 +1562,7 @@ "searching_locales": "Etsitään lokaaleja...", "second": "Toinen", "see_all_people": "Näytä kaikki henkilÃļt", + "select": "Valitse", "select_album_cover": "Valitse albmin kansi", "select_all": "Valitse kaikki", "select_all_duplicates": "Valitse kaikki kaksoiskappaleet", @@ -1534,6 +1573,7 @@ "select_keep_all": "Valitse pidä kaikki", "select_library_owner": "Valitse kirjaston omistaja", "select_new_face": "Valitse uudet kasvot", + "select_person_to_tag": "Valitse henkilÃļ, jonka haluat merkitä", "select_photos": "Valitse kuvat", "select_trash_all": "Valitse kaikki roskakoriin", "select_user_for_sharing_page_err_album": "Albumin luonti epäonnistui", @@ -1541,7 +1581,7 @@ "selected_count": "{count, plural, other {# valittu}}", "send_message": "Lähetä viesti", "send_welcome_email": "Lähetä tervetuloviesti", - "server_endpoint": "Server Endpoint", + "server_endpoint": "Palvelinosoite", "server_info_box_app_version": "Sovelluksen versio", "server_info_box_server_url": "Palvelimen URL-osoite", "server_offline": "Palvelin Offline-tilassa", @@ -1555,19 +1595,19 @@ "set_date_of_birth": "Aseta syntymäaika", "set_profile_picture": "Aseta profiilikuva", "set_slideshow_to_fullscreen": "Näytä diaesitys koko ruudulla", - "setting_image_viewer_help": "Sovellus lataa ensin pienen esikatselukuvan, toisena keskitarkkuuksisen kuvan (jos käytÃļssä) ja kolmantena alkuperäisen täysitarkkuuksisen kuvan (jos käytÃļssä)", + "setting_image_viewer_help": "Kuvaa katseltaessa ensin ladataan pikkukuva, sitten keskilaatuinen pikkukuva (jos käytÃļssä) ja lopuksi alkuperäinen (jos käytÃļssä).", "setting_image_viewer_original_subtitle": "Ota käyttÃļÃļn ladataksesi alkuperäinen täysitarkkuuksinen kuva (suuri!). Poista käytÃļstä vähentääksesi datan käyttÃļä (sekä verkossa että laitteen välimuistissa).", "setting_image_viewer_original_title": "Lataa alkuperäinen kuva", "setting_image_viewer_preview_subtitle": "Ota käyttÃļÃļn ladataksesi keskitarkkuuksinen kuva. Poista käytÃļstä ladataksesi alkuperäinen kuva tai käyttääksesi vain esikatselukuvaa.", "setting_image_viewer_preview_title": "Lataa esikatselukuva", "setting_image_viewer_title": "Kuvat", "setting_languages_apply": "Käytä", - "setting_languages_subtitle": "Change the app's language", + "setting_languages_subtitle": "Vaihda sovelluksen kieli", "setting_languages_title": "Kieli", "setting_notifications_notify_failures_grace_period": "Ilmoita taustavarmuuskopioinnin epäonnistumisista: {}", - "setting_notifications_notify_hours": "{} tunnin välein", + "setting_notifications_notify_hours": "{} tuntia", "setting_notifications_notify_immediately": "heti", - "setting_notifications_notify_minutes": "{} minuutin välein", + "setting_notifications_notify_minutes": "{} minuuttia", "setting_notifications_notify_never": "ei koskaan", "setting_notifications_notify_seconds": "{} sekuntia", "setting_notifications_single_progress_subtitle": "Yksityiskohtainen tieto palvelimelle lähettämisen edistymisestä kohteittain", @@ -1575,9 +1615,9 @@ "setting_notifications_subtitle": "Ilmoitusasetusten määrittely", "setting_notifications_total_progress_subtitle": "Lähetyksen yleinen edistyminen (kohteita lähetetty/yhteensä)", "setting_notifications_total_progress_title": "Näytä taustavarmuuskopioinnin kokonaisedistyminen", - "setting_video_viewer_looping_title": "Looping", - "setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.", - "setting_video_viewer_original_video_title": "Force original video", + "setting_video_viewer_looping_title": "Silmukkatoisto", + "setting_video_viewer_original_video_subtitle": "Kun toistat videota palvelimelta, toista alkuperäinen, vaikka transkoodattu versio olisi saatavilla. Tämä voi johtaa puskurointiin. Paikalliset videot toistetaan aina alkuperäislaadulla.", + "setting_video_viewer_original_video_title": "Pakota alkuperäinen video", "settings": "Asetukset", "settings_require_restart": "Käynnistä Immich uudelleen ottaaksesti tämän asetuksen käyttÃļÃļn", "settings_saved": "Asetukset tallennettu", @@ -1597,7 +1637,7 @@ "shared_by_user": "Käyttäjän {user} jakama", "shared_by_you": "Sinun jakamasi", "shared_from_partner": "Kumppanin {partner} kuvia", - "shared_intent_upload_button_progress_text": "{} / {} Uploaded", + "shared_intent_upload_button_progress_text": "{} / {} Lähetetty", "shared_link_app_bar_title": "Jaetut linkit", "shared_link_clipboard_copied_massage": "Kopioitu leikepÃļydältä", "shared_link_clipboard_text": "Linkki: {}\nSalasana: {}", @@ -1614,22 +1654,23 @@ "shared_link_edit_password_hint": "SyÃļtä jaon salasana", "shared_link_edit_submit_button": "Päivitä linkki", "shared_link_error_server_url_fetch": "Palvelimen URL-osoitetta ei voitu hakea", - "shared_link_expires_day": "Voimassaolo päättyy {} päivän kuluttua", - "shared_link_expires_days": "Voimassaolo päättyy {} päivän kuluttua", - "shared_link_expires_hour": "Voimassaolo päättyy {} tunnin kuluttua", - "shared_link_expires_hours": "Voimassaolo päättyy {} tunnin kuluttua", - "shared_link_expires_minute": "Voimassaolo päättyy {} minuutin kuluttua", - "shared_link_expires_minutes": "Voimassaolo päättyy {} minuutin kuluttua", + "shared_link_expires_day": "Vanhenee {} päivässä", + "shared_link_expires_days": "Vanhenee {} päivässä", + "shared_link_expires_hour": "Vanhenee {} tunnissa", + "shared_link_expires_hours": "Vanhenee {} tunnissa", + "shared_link_expires_minute": "Vanhenee {} minuutissa", + "shared_link_expires_minutes": "Vanhenee {} minuutissa", "shared_link_expires_never": "Voimassaolo päättyy ∞", - "shared_link_expires_second": "Voimassaolo päättyy {} sekunnin kuluttua", - "shared_link_expires_seconds": "Voimassaolo päättyy {} sekunnin kuluttua", - "shared_link_individual_shared": "Individual shared", + "shared_link_expires_second": "Vanhenee {} sekunnissa", + "shared_link_expires_seconds": "Vanhenee {} sekunnissa", + "shared_link_individual_shared": "YksilÃļllisesti jaettu", "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "Hallitse jaettuja linkkejä", "shared_link_options": "Jaetun linkin vaihtoehdot", "shared_links": "Jaetut linkit", + "shared_links_description": "Jaa kuvia ja videoita linkin avulla", "shared_photos_and_videos_count": "{assetCount, plural, other {# jaettua kuvaa ja videota.}}", - "shared_with_me": "Shared with me", + "shared_with_me": "Jaettu minulle", "shared_with_partner": "Jaa kumppanin {partner} kanssa", "sharing": "Jakaminen", "sharing_enter_password": "Nähdäksesi sivun sinun tulee antaa salasana.", @@ -1656,6 +1697,7 @@ "show_person_options": "Näytä henkilÃļasetukset", "show_progress_bar": "Näytä eteneminen", "show_search_options": "Näytä hakuvaihtoehdot", + "show_shared_links": "Näytä jaetut linkit", "show_slideshow_transition": "Näytä diaesitys siirtymä", "show_supporter_badge": "Kannattajan merkki", "show_supporter_badge_description": "Näytä kannattajan merkki", @@ -1687,7 +1729,7 @@ "stacktrace": "Vianetsintätiedot", "start": "Aloita", "start_date": "Alkupäivä", - "state": "Maakunta/osavaltio", + "state": "Maakunta", "status": "Tila", "stop_motion_photo": "Pysäytä liikkuva kuva", "stop_photo_sharing": "Lopetetaanko kuvien jakaminen?", @@ -1704,14 +1746,15 @@ "support_third_party_description": "Immich-asennuksesi on pakattu kolmannen osapuolen toimesta. Kohtaamasi ongelmat saattavat johtua tästä paketista, joten ilmoita niistä ensisijaisesti heille alla olevien linkkien kautta.", "swap_merge_direction": "Käännä yhdistämissuunta", "sync": "Synkronoi", - "sync_albums": "Sync albums", - "sync_albums_manual_subtitle": "Sync all uploaded videos and photos to the selected backup albums", - "sync_upload_album_setting_subtitle": "Create and upload your photos and videos to the selected albums on Immich", + "sync_albums": "Synkronoi albumit", + "sync_albums_manual_subtitle": "Synkronoi kaikki ladatut videot ja valokuvat valittuihin varmuuskopioalbumeihin", + "sync_upload_album_setting_subtitle": "Luo ja lataa valokuvasi ja videosi valittuihin albumeihin Immichissä", "tag": "Lisää tunniste", "tag_assets": "Lisää tunnisteita", "tag_created": "Luotu tunniste: {tag}", "tag_feature_description": "Selaa valokuvia ja videoita, jotka on ryhmitelty loogisten tunnisteotsikoiden mukaan", "tag_not_found_question": "EtkÃļ lÃļydä tunnistetta? Luo uusi tunniste ", + "tag_people": "Merkitse henkilÃļ tunnisteella", "tag_updated": "Päivitetty tunniste: {tag}", "tagged_assets": "Tunnistettu {count, plural, one {# kohde} other {# kohdetta}}", "tags": "Tunnisteet", @@ -1721,16 +1764,16 @@ "theme_selection_description": "Aseta vaalea tai tumma tila automaattisesti perustuen selaimesi asetuksiin", "theme_setting_asset_list_storage_indicator_title": "Näytä tallennustilan ilmaisin kohteiden kuvakkeissa", "theme_setting_asset_list_tiles_per_row_title": "Kohteiden määrä rivillä ({})", - "theme_setting_colorful_interface_subtitle": "Apply primary color to background surfaces.", - "theme_setting_colorful_interface_title": "Colorful interface", + "theme_setting_colorful_interface_subtitle": "Levitä pääväri taustalle.", + "theme_setting_colorful_interface_title": "Värikäs käyttÃļliittymä", "theme_setting_image_viewer_quality_subtitle": "Säädä kuvien katselun laatua", "theme_setting_image_viewer_quality_title": "Kuvien katseluohjelman laatu", - "theme_setting_primary_color_subtitle": "Pick a color for primary actions and accents.", - "theme_setting_primary_color_title": "Primary color", - "theme_setting_system_primary_color_title": "Use system color", + "theme_setting_primary_color_subtitle": "Valitse sovelluksen pääväri.", + "theme_setting_primary_color_title": "Väriteema", + "theme_setting_system_primary_color_title": "Käytä järjestelmän väriteemaa", "theme_setting_system_theme_switch": "Automaattinen (seuraa järjestelmän asetusta)", "theme_setting_theme_subtitle": "Valitse sovelluksen teema-asetukset", - "theme_setting_three_stage_loading_subtitle": "Kolmivaiheinen lataaminen saattaa parantaa latauksen suorituskykyä, mutta lisää kaistankäyttÃļä huomattavasti.", + "theme_setting_three_stage_loading_subtitle": "Kolmivaiheinen lataus saattaa parantaa lataustehoa, mutta aiheuttaa huomattavasti suuremman verkon kuormituksen", "theme_setting_three_stage_loading_title": "Ota kolmivaiheinen lataus käyttÃļÃļn", "they_will_be_merged_together": "Nämä tullaan yhdistämään", "third_party_resources": "Kolmannen osapuolen resurssit", @@ -1751,11 +1794,11 @@ "trash_all": "Vie kaikki roskakoriin", "trash_count": "Roskakori {count, number}", "trash_delete_asset": "Poista / vie roskakoriin", - "trash_emptied": "Emptied trash", + "trash_emptied": "Roskakori tyhjennetty", "trash_no_results_message": "Roskakorissa olevat kuvat ja videot näytetään täällä.", "trash_page_delete_all": "Poista kaikki", - "trash_page_empty_trash_dialog_content": "Haluatko poistaa roskakoriin siirretyt kohteet? Kohteet poistetaan lopullisesti Immich:sta.", - "trash_page_info": "Roskakoriin siirretyt kohteet poistetaan lopullisesti {} päivän kuluttua", + "trash_page_empty_trash_dialog_content": "Haluatko tyhjentää roskakorin? Kohteet poistetaan lopullisesti Immich:sta", + "trash_page_info": "Roskakorissa olevat kohteet poistetaan pysyvästi {} päivän kuluttua", "trash_page_no_assets": "Ei poistettuja kohteita", "trash_page_restore_all": "Palauta kaikki", "trash_page_select_assets_btn": "Valitse kohteet", @@ -1767,11 +1810,13 @@ "unfavorite": "Poista suosikeista", "unhide_person": "Poista henkilÃļ piilosta", "unknown": "Tuntematon", + "unknown_country": "Tuntematon maa", "unknown_year": "Tuntematon vuosi", "unlimited": "Rajoittamaton", "unlink_motion_video": "Poista liikevideon linkitys", "unlink_oauth": "Poista OAuth-linkitys", "unlinked_oauth_account": "LinkittämätÃļn OAuth-tili", + "unmute_memories": "Poista muistojen mykistys", "unnamed_album": "NimetÃļn albumi", "unnamed_album_delete_confirmation": "Haluatko varmasti poistaa tämän albumin?", "unnamed_share": "NimetÃļn jako", @@ -1795,11 +1840,11 @@ "upload_status_errors": "Virheet", "upload_status_uploaded": "Ladattu", "upload_success": "Lataus onnistui. Päivitä sivu jotta näet latauksesi.", - "upload_to_immich": "Upload to Immich ({})", - "uploading": "Uploading", + "upload_to_immich": "Lähetä Immichiin ({})", + "uploading": "Lähettään", "url": "URL", "usage": "KäyttÃļ", - "use_current_connection": "use current connection", + "use_current_connection": "käytä nykyistä yhteyttä", "use_custom_date_range": "Käytä omaa aikaväliä", "user": "Käyttäjä", "user_id": "Käyttäjän ID", @@ -1814,15 +1859,15 @@ "users": "Käyttäjät", "utilities": "Apuohjelmat", "validate": "Validoi", - "validate_endpoint_error": "Please enter a valid URL", + "validate_endpoint_error": "Anna kelvollinen URL-osoite", "variables": "Muuttujat", "version": "Versio", "version_announcement_closing": "Ystäväsi Alex", "version_announcement_message": "Hei! Sovelluksen uusi versio on saatavilla. Käythän vilkaisemassa julkaisun tiedot ja varmistathan, että ohjelman määritykset ovat ajan tasalla. Erityisesti, jos käytÃļssä on Watchtower tai jokin muu mekanismi Immich-sovelluksen automaattista päivitystä varten.", "version_announcement_overlay_release_notes": "julkaisutiedoissa", "version_announcement_overlay_text_1": "Hei, kaveri! Uusi palvelinversio on saatavilla sovelluksesta", - "version_announcement_overlay_text_2": "Ota hetki aikaa vieraillaksesi", - "version_announcement_overlay_text_3": "ja varmista, että käyttämäsi docker-compose ja .env-asetukset ovat ajantasalla välttyäksesi asetusongelmilta. Varsinkin jos käytät WatchToweria tai jotain muuta mekanismia päivittääksesi palvelinsovellusta automaattisesti.", + "version_announcement_overlay_text_2": "Ota hetki aikaa vieraillaksesi ", + "version_announcement_overlay_text_3": " ja varmista, että käyttämäsi docker-compose ja .env-asetukset ovat ajantasalla välttyäksesi asetusongelmilta. Varsinkin jos käytät WatchToweria tai jotain muuta mekanismia päivittääksesi palvelinsovellusta automaattisesti.", "version_announcement_overlay_title": "Uusi palvelinversio saatavilla 🎉", "version_history": "Versiohistoria", "version_history_item": "Asennettu {version} päivänä {date}", @@ -1836,10 +1881,12 @@ "view_all": "Näytä kaikki", "view_all_users": "Näytä kaikki käyttäjät", "view_in_timeline": "Näytä aikajanalla", + "view_link": "Näytä linkki", "view_links": "Näytä linkit", "view_name": "Näkymä", "view_next_asset": "Näytä seuraava", "view_previous_asset": "Näytä edellinen", + "view_qr_code": "Näytä QR-koodi", "view_stack": "Näytä pinona", "viewer_remove_from_stack": "Poista pinosta", "viewer_stack_use_as_main_asset": "Käytä pääkohteena", diff --git a/i18n/fr.json b/i18n/fr.json index 00a4a281b5..2576eb954f 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -39,11 +39,11 @@ "authentication_settings_disable_all": "Êtes-vous sÃģr de vouloir dÊsactiver toutes les mÊthodes de connexion ? La connexion sera complètement dÊsactivÊe.", "authentication_settings_reenable": "Pour rÊactiver, utilisez une Commande Serveur.", "background_task_job": "TÃĸches de fond", - "backup_database": "Sauvegarde de la base de donnÊes", - "backup_database_enable_description": "Activer la sauvegarde", - "backup_keep_last_amount": "Nombre de sauvegardes à conserver", - "backup_settings": "Paramètres de la sauvegarde", - "backup_settings_description": "GÊrer les paramètres de la sauvegarde", + "backup_database": "CrÊation d'une image de la base de donnÊes", + "backup_database_enable_description": "Activer la crÊation d'images de la base de donnÊes", + "backup_keep_last_amount": "Nombre d'images à conserver", + "backup_settings": "Paramètres de crÊation d'images de la base de donnÊes", + "backup_settings_description": "GÊrer les paramètres de crÊation d'images de la base de donnÊes. Note : ces tÃĸches ne sont pas contrôlÊes et vous ne serez pas averti(e) en cas d'Êchec.", "check_all": "Tout cocher", "cleanup": "Nettoyage", "cleared_jobs": "TÃĸches supprimÊes pour : {job}", @@ -63,7 +63,7 @@ "external_library_created_at": "Bibliothèque externe (crÊÊe le {date})", "external_library_management": "Gestion de la bibliothèque externe", "face_detection": "DÊtection des visages", - "face_detection_description": "DÊtection des visages dans les mÊdias à l'aide de l'apprentissage automatique. Pour les vidÊos, seule la miniature est prise en compte. ÂĢ Actualiser Âģ (re)traite tous les mÊdias. ÂĢ RÊinitialiser Âģ retraite tous les mÊdias en repartant de zÊro. ÂĢ Manquant Âģ met en file d'attente les mÊdias qui n'ont pas encore ÊtÊ pris en compte. Lorsque la dÊtection est terminÊe, tous les visages dÊtectÊs sont ensuite mis en file d'attente pour la reconnaissance faciale.", + "face_detection_description": "DÊtection des visages dans les mÊdias à l'aide de l'apprentissage automatique. Pour les vidÊos, seule la miniature est prise en compte. ÂĢ Actualiser Âģ (re)traite tous les mÊdias. ÂĢ RÊinitialiser Âģ retraite tous les visages en repartant de zÊro. ÂĢ Manquant Âģ met en file d'attente les mÊdias qui n'ont pas encore ÊtÊ pris en compte. Lorsque la dÊtection est terminÊe, tous les visages dÊtectÊs sont ensuite mis en file d'attente pour la reconnaissance faciale.", "facial_recognition_job_description": "Regrouper les visages dÊtectÊs en personnes. Cette Êtape est exÊcutÊe une fois la dÊtection des visages terminÊe. ÂĢ RÊinitialiser Âģ (re)regroupe tous les visages. ÂĢ Manquant Âģ met en file d'attente les visages auxquels aucune personne n'a ÊtÊ attribuÊe.", "failed_job_command": "La commande {command} a ÊchouÊ pour la tÃĸche : {job}", "force_delete_user_warning": "ATTENTION : Cette opÊration entraÃŽne la suppression immÊdiate de l'utilisateur et de tous ses mÊdias. Cette opÊration ne peut ÃĒtre annulÊe et les fichiers ne peuvent ÃĒtre rÊcupÊrÊs.", @@ -169,7 +169,7 @@ "migration_job_description": "Migration des miniatures pour les mÊdias et les visages vers la dernière structure de dossiers", "no_paths_added": "Aucun chemin n'a ÊtÊ ajoutÊ", "no_pattern_added": "Aucun schÊma d'exclusion n'a ÊtÊ ajoutÊ", - "note_apply_storage_label_previous_assets": "Remarque : pour appliquer l'Êtiquette de stockage à des mÊdias prÊcÊdemment envoyÊs, exÊcutez la commande", + "note_apply_storage_label_previous_assets": "Remarque : pour appliquer l'Êtiquette de stockage à des mÊdias prÊcÊdemment tÊlÊversÊs, exÊcutez", "note_cannot_be_changed_later": "REMARQUE : Il n'est pas possible de modifier ce paramètre ultÊrieurement !", "notification_email_from_address": "Depuis l'adresse", "notification_email_from_address_description": "Adresse courriel de l'expÊditeur, par exemple : ÂĢ Serveur de photos Immich  Âģ", @@ -192,26 +192,22 @@ "oauth_auto_register": "Inscription automatique", "oauth_auto_register_description": "Inscrire automatiquement de nouveaux utilisateurs après leur connexion avec OAuth", "oauth_button_text": "Texte du bouton", - "oauth_client_id": "ID du client", - "oauth_client_secret": "Secret du client", + "oauth_client_secret_description": "NÊcessaire si le protocole PKCE (Proof Key for Code Exchange) n'est pas supportÊ mar le fournisseur d'authentification OAuth", "oauth_enable_description": "Connexion avec OAuth", - "oauth_issuer_url": "URL de l'Êmetteur", "oauth_mobile_redirect_uri": "URI de redirection mobile", "oauth_mobile_redirect_uri_override": "Remplacer l'URI de redirection mobile", "oauth_mobile_redirect_uri_override_description": "Activer quand le fournisseur d'OAuth ne permet pas un URI mobile, comme '{callback} '", - "oauth_profile_signing_algorithm": "Algorithme de signature de profil", - "oauth_profile_signing_algorithm_description": "Algorithme utilisÊ pour signer le profil utilisateur.", - "oauth_scope": "PÊrimètre", "oauth_settings": "OAuth", "oauth_settings_description": "GÊrer les paramètres de connexion OAuth", "oauth_settings_more_details": "Pour plus de dÊtails sur cette fonctionnalitÊ, consultez ce lien.", - "oauth_signing_algorithm": "Algorithme de signature", "oauth_storage_label_claim": "Demande d'Êtiquette de stockage", "oauth_storage_label_claim_description": "DÊfinir automatiquement l'Êtiquette de stockage de l'utilisateur sur la valeur de cette revendication.", "oauth_storage_quota_claim": "Demande de quota de stockage", "oauth_storage_quota_claim_description": "DÊfinir automatiquement le quota de stockage de l'utilisateur par la valeur de cette demande.", "oauth_storage_quota_default": "Quota de stockage par dÊfaut (Go)", "oauth_storage_quota_default_description": "Quota en Go à utiliser lorsqu'aucune valeur n'est prÊcisÊe (saisir 0 pour un quota illimitÊ).", + "oauth_timeout": "Expiration de la durÊe de la requÃĒte", + "oauth_timeout_description": "DÊlai d'expiration des requÃĒtes en millisecondes", "offline_paths": "Chemins d'accès hors ligne", "offline_paths_description": "Ces rÊsultats peuvent ÃĒtre dus à la suppression manuelle de fichiers qui ne font pas partie d'une bibliothèque externe.", "password_enable_description": "Connexion avec courriel et mot de passe", @@ -250,14 +246,14 @@ "storage_template_hash_verification_enabled": "VÊrification du hachage activÊe", "storage_template_hash_verification_enabled_description": "Active la vÊrification du hachage, ne dÊsactivez pas cette option à moins d'ÃĒtre sÃģr de ce que vous faites", "storage_template_migration": "Migration du modèle de stockage", - "storage_template_migration_description": "Appliquer le modèle courant {template} aux mÊdias prÊcÊdemment envoyÊs", - "storage_template_migration_info": "L'enregistrement des modèles convertit toutes les extensions en minuscule. Les changements de modèle ne s'appliqueront qu'aux nouveaux mÊdias. Pour appliquer rÊtroactivement le modèle aux mÊdias prÊcÊdemment envoyÊs, exÊcutez la tÃĸche {job}.", + "storage_template_migration_description": "Appliquer le modèle courant {template} aux mÊdias prÊcÊdemment tÊlÊversÊs", + "storage_template_migration_info": "L'enregistrement des modèles va convertir toutes les extensions en minuscule. Les changements de modèle ne s'appliqueront qu'aux nouveaux mÊdias. Pour appliquer rÊtroactivement le modèle aux mÊdias prÊcÊdemment tÊlÊversÊs, exÊcutez la tÃĸche {job}.", "storage_template_migration_job": "TÃĸche de migration du modèle de stockage", "storage_template_more_details": "Pour plus de dÊtails sur cette fonctionnalitÊ, reportez-vous au Modèle de stockage et à ses implications", "storage_template_onboarding_description": "Lorsqu'elle est activÊe, cette fonctionnalitÊ rÊorganise les fichiers basÊs sur un modèle dÊfini par l'utilisateur. En raison de problèmes de stabilitÊ, la fonction a ÊtÊ dÊsactivÊe par dÊfaut. Pour plus d'informations, veuillez consulter la documentation.", "storage_template_path_length": "Limite approximative de la longueur du chemin : {length, number}/{limit, number}", "storage_template_settings": "Modèle de stockage", - "storage_template_settings_description": "GÊrer la structure des dossiers et le nom des fichiers du mÊdia envoyÊ", + "storage_template_settings_description": "GÊrer la structure des dossiers et le nom des fichiers du mÊdia tÊlÊversÊ", "storage_template_user_label": "{label} est l'Êtiquette de stockage de l'utilisateur", "system_settings": "Paramètres du système", "tag_cleanup_job": "Nettoyage des Êtiquettes", @@ -345,7 +341,7 @@ "trash_settings": "Corbeille", "trash_settings_description": "GÊrer les paramètres de la corbeille", "untracked_files": "Fichiers non suivis", - "untracked_files_description": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent ÃĒtre le rÊsultat d'Êchecs de dÊplacement, d'envois interrompus, ou d'abandons en raison d'un bug", + "untracked_files_description": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent ÃĒtre le rÊsultat d'Êchecs de dÊplacement, de tÊlÊversements interrompus, ou d'abandons en raison d'un bug", "user_cleanup_job": "Nettoyage des utilisateurs", "user_delete_delay": "La suppression dÊfinitive du compte et des mÊdias de {user} sera programmÊe dans {delay, plural, one {# jour} other {# jours}}.", "user_delete_delay_settings": "DÊlai de suppression", @@ -372,7 +368,7 @@ "administration": "Administration", "advanced": "AvancÊ", "advanced_settings_enable_alternate_media_filter_subtitle": "Utilisez cette option pour filtrer les mÊdia durant la synchronisation avec des critères alternatifs. N'utilisez cela que lorsque l'application n'arrive pas à dÊtecter tout les albums.", - "advanced_settings_enable_alternate_media_filter_title": "[EXEPRIMENTAL] Utiliser le filtre de synchronisation d'album alternatif", + "advanced_settings_enable_alternate_media_filter_title": "[EXPÉRIMENTAL] Utiliser le filtre de synchronisation d'album alternatif", "advanced_settings_log_level_title": "Niveau de journalisation : {}", "advanced_settings_prefer_remote_subtitle": "Certains appareils sont très lents à charger des miniatures à partir de ressources prÊsentes sur l'appareil. Activez ce paramètre pour charger des images externes à la place.", "advanced_settings_prefer_remote_title": "PrÊfÊrer les images externes", @@ -381,7 +377,7 @@ "advanced_settings_self_signed_ssl_subtitle": "Permet d'ignorer la vÊrification du certificat SSL pour le point d'accès du serveur. Requis pour les certificats auto-signÊs.", "advanced_settings_self_signed_ssl_title": "Autoriser les certificats SSL auto-signÊs", "advanced_settings_sync_remote_deletions_subtitle": "Supprimer ou restaurer automatiquement un mÊdia sur cet appareil lorsqu'une action a ÊtÊ faite sur le web", - "advanced_settings_sync_remote_deletions_title": "Synchroniser les suppressions depuis le serveur [EXPERIMENTAL]", + "advanced_settings_sync_remote_deletions_title": "Synchroniser les suppressions depuis le serveur [EXPÉRIMENTAL]", "advanced_settings_tile_subtitle": "Paramètres d'utilisateur avancÊs", "advanced_settings_troubleshooting_subtitle": "Activer des fonctions supplÊmentaires pour le dÊpannage", "advanced_settings_troubleshooting_title": "DÊpannage", @@ -429,14 +425,14 @@ "allow_dark_mode": "Autoriser le mode sombre", "allow_edits": "Autoriser les modifications", "allow_public_user_to_download": "Permettre aux utilisateurs non connectÊs de tÊlÊcharger", - "allow_public_user_to_upload": "Permettre l'envoi aux utilisateurs non connectÊs", + "allow_public_user_to_upload": "Permettre le tÊlÊversement aux utilisateurs non connectÊs", "alt_text_qr_code": "Image du code QR", "anti_clockwise": "Sens anti-horaire", "api_key": "ClÊ API", "api_key_description": "Cette valeur ne sera affichÊe qu'une seule fois. Assurez-vous de la copier avant de fermer la fenÃĒtre.", "api_key_empty": "Le nom de votre clÊ API ne doit pas ÃĒtre vide", "api_keys": "ClÊs d'API", - "app_bar_signout_dialog_content": "Êtes-vous sÃģr de vouloir vous dÊconnecter?", + "app_bar_signout_dialog_content": "Êtes-vous sÃģr(e) de vouloir vous dÊconnecter ?", "app_bar_signout_dialog_ok": "Oui", "app_bar_signout_dialog_title": "Se dÊconnecter", "app_settings": "Paramètres de l'application", @@ -451,8 +447,8 @@ "archived_count": "{count, plural, one {# archivÊ} other {# archivÊs}}", "are_these_the_same_person": "Est-ce la mÃĒme personne ?", "are_you_sure_to_do_this": "Êtes-vous sÃģr de vouloir faire ceci ?", - "asset_action_delete_err_read_only": "Impossible de supprimer le(s) ÊlÊment(s) en lecture seule.", - "asset_action_share_err_offline": "Impossible de rÊcupÊrer le(s) ÊlÊment(s) hors ligne.", + "asset_action_delete_err_read_only": "Impossible de supprimer le(s) mÊdia(s) en lecture seule, ils sont ignorÊs", + "asset_action_share_err_offline": "Impossible de rÊcupÊrer le(s) mÊdia(s) hors ligne, ils sont ignorÊs", "asset_added_to_album": "AjoutÊ à l'album", "asset_adding_to_album": "Ajout à l'albumâ€Ļ", "asset_description_updated": "La description du mÊdia a ÊtÊ mise à jour", @@ -472,7 +468,7 @@ "asset_restored_successfully": "ÉlÊment restaurÊ avec succès", "asset_skipped": "SautÊ", "asset_skipped_in_trash": "À la corbeille", - "asset_uploaded": "EnvoyÊ", + "asset_uploaded": "TÊlÊversÊ", "asset_uploading": "TÊlÊversementâ€Ļ", "asset_viewer_settings_subtitle": "Modifier les paramètres du visualiseur photos", "asset_viewer_settings_title": "Visualiseur d'ÊlÊments", @@ -481,18 +477,18 @@ "assets_added_to_album_count": "{count, plural, one {# mÊdia ajoutÊ} other {# mÊdias ajoutÊs}} à l'album", "assets_added_to_name_count": "{count, plural, one {# mÊdia ajoutÊ} other {# mÊdias ajoutÊs}} à {hasName, select, true {{name}} other {new album}}", "assets_count": "{count, plural, one {# mÊdia} other {# mÊdias}}", - "assets_deleted_permanently": "{} ÊlÊment(s) supprimÊ(s) dÊfinitivement", - "assets_deleted_permanently_from_server": "{} ÊlÊment(s) supprimÊ(s) dÊfinitivement du serveur Immich", + "assets_deleted_permanently": "{} mÊdia(s) supprimÊ(s) dÊfinitivement", + "assets_deleted_permanently_from_server": "{} mÊdia(s) supprimÊ(s) dÊfinitivement du serveur Immich", "assets_moved_to_trash_count": "{count, plural, one {# mÊdia dÊplacÊ} other {# mÊdias dÊplacÊs}} dans la corbeille", "assets_permanently_deleted_count": "{count, plural, one {# mÊdia supprimÊ} other {# mÊdias supprimÊs}} dÊfinitivement", "assets_removed_count": "{count, plural, one {# mÊdia supprimÊ} other {# mÊdias supprimÊs}}", - "assets_removed_permanently_from_device": "{} ÊlÊment(s) supprimÊ(s) dÊfinitivement de votre appareil", + "assets_removed_permanently_from_device": "{} mÊdia(s) supprimÊ(s) dÊfinitivement de votre appareil", "assets_restore_confirmation": "Êtes-vous sÃģr de vouloir restaurer tous vos mÊdias de la corbeille ? Vous ne pouvez pas annuler cette action ! Notez que les mÊdias hors ligne ne peuvent ÃĒtre restaurÊs de cette façon.", "assets_restored_count": "{count, plural, one {# mÊdia restaurÊ} other {# mÊdias restaurÊs}}", "assets_restored_successfully": "ÉlÊment restaurÊ avec succès", - "assets_trashed": "{} ÊlÊment(s) dÊplacÊ(s) vers la corbeille", + "assets_trashed": "{} mÊdia(s) dÊplacÊ(s) vers la corbeille", "assets_trashed_count": "{count, plural, one {# mÊdia} other {# mÊdias}} mis à la corbeille", - "assets_trashed_from_server": "{} ÊlÊment(s) dÊplacÊ(s) vers la corbeille du serveur Immich", + "assets_trashed_from_server": "{} mÊdia(s) dÊplacÊ(s) vers la corbeille du serveur Immich", "assets_were_part_of_album_count": "{count, plural, one {Un mÊdia est} other {Des mÊdias sont}} dÊjà dans l'album", "authorized_devices": "Appareils autorisÊs", "automatic_endpoint_switching_subtitle": "Se connecter localement lorsque connectÊ au WI-FI spÊcifiÊ mais utiliser une adresse alternative lorsque connectÊ à un autre rÊseau", @@ -508,13 +504,13 @@ "backup_album_selection_page_selection_info": "Informations sur la sÊlection", "backup_album_selection_page_total_assets": "Total des ÊlÊments uniques", "backup_all": "Tout", - "backup_background_service_backup_failed_message": "Échec de la sauvegarde des ÊlÊments. Nouvelle tentative...", - "backup_background_service_connection_failed_message": "Impossible de se connecter au serveur. Nouvelle tentative...", - "backup_background_service_current_upload_notification": "Envoi {}", - "backup_background_service_default_notification": "Recherche de nouveaux ÊlÊments...", + "backup_background_service_backup_failed_message": "Échec de la sauvegarde des mÊdias. Nouvelle tentativeâ€Ļ", + "backup_background_service_connection_failed_message": "Impossible de se connecter au serveur. Nouvelle tentativeâ€Ļ", + "backup_background_service_current_upload_notification": "TÊlÊversement {}", + "backup_background_service_default_notification": "Recherche de nouveaux mÊdiasâ€Ļ", "backup_background_service_error_title": "Erreur de sauvegarde", - "backup_background_service_in_progress_notification": "Sauvegarde de vos ÊlÊments...", - "backup_background_service_upload_failure_notification": "Échec lors de l'envoi {}", + "backup_background_service_in_progress_notification": "Sauvegarde de vos mÊdiasâ€Ļ", + "backup_background_service_upload_failure_notification": "Échec lors du tÊlÊversement {}", "backup_controller_page_albums": "Sauvegarder les albums", "backup_controller_page_background_app_refresh_disabled_content": "Activez le rafraÃŽchissement de l'application en arrière-plan dans Paramètres > GÊnÊral > RafraÃŽchissement de l'application en arrière-plan afin d'utiliser la sauvegarde en arrière-plan.", "backup_controller_page_background_app_refresh_disabled_title": "RafraÃŽchissement de l'application en arrière-plan dÊsactivÊ", @@ -525,19 +521,19 @@ "backup_controller_page_background_battery_info_title": "Optimisation de la batterie", "backup_controller_page_background_charging": "Seulement pendant la charge", "backup_controller_page_background_configure_error": "Échec de la configuration du service d'arrière-plan", - "backup_controller_page_background_delay": "Retarder la sauvegarde des nouveaux ÊlÊments : {}", - "backup_controller_page_background_description": "Activez le service d'arrière-plan pour sauvegarder automatiquement tous les nouveaux ÊlÊments sans avoir à ouvrir l'application.", + "backup_controller_page_background_delay": "Retarder la sauvegarde des nouveaux mÊdias : {}", + "backup_controller_page_background_description": "Activez le service d'arrière-plan pour sauvegarder automatiquement tous les nouveaux mÊdias sans avoir à ouvrir l'application", "backup_controller_page_background_is_off": "La sauvegarde automatique en arrière-plan est dÊsactivÊe", "backup_controller_page_background_is_on": "La sauvegarde automatique en arrière-plan est activÊe", "backup_controller_page_background_turn_off": "DÊsactiver le service d'arrière-plan", "backup_controller_page_background_turn_on": "Activer le service d'arrière-plan", - "backup_controller_page_background_wifi": "Uniquement sur WiFi", + "backup_controller_page_background_wifi": "Uniquement en wifi", "backup_controller_page_backup": "SauvegardÊ", - "backup_controller_page_backup_selected": "SÊlectionnÊ: ", + "backup_controller_page_backup_selected": "SÊlectionnÊ : ", "backup_controller_page_backup_sub": "Photos et vidÊos sauvegardÊes", "backup_controller_page_created": "CrÊÊ le : {}", - "backup_controller_page_desc_backup": "Activez la sauvegarde pour envoyer automatiquement les nouveaux ÊlÊments sur le serveur.", - "backup_controller_page_excluded": "Exclus: ", + "backup_controller_page_desc_backup": "Activez la sauvegarde au premier plan pour tÊlÊverser automatiquement les nouveaux mÊdias sur le serveur lors de l'ouverture de l'application.", + "backup_controller_page_excluded": "Exclus : ", "backup_controller_page_failed": "Échec de l'opÊration ({})", "backup_controller_page_filename": "Nom du fichier : {} [{}]", "backup_controller_page_id": "ID : {}", @@ -554,15 +550,15 @@ "backup_controller_page_total_sub": "Toutes les photos et vidÊos uniques des albums sÊlectionnÊs", "backup_controller_page_turn_off": "DÊsactiver la sauvegarde", "backup_controller_page_turn_on": "Activer la sauvegarde", - "backup_controller_page_uploading_file_info": "Transfert des informations du fichier", + "backup_controller_page_uploading_file_info": "TÊlÊversement des informations du fichier", "backup_err_only_album": "Impossible de retirer le seul album", "backup_info_card_assets": "ÊlÊments", "backup_manual_cancelled": "AnnulÊ", - "backup_manual_in_progress": "TÊlÊchargement dÊjà en cours. Essayez après un instant", - "backup_manual_success": "Succès ", - "backup_manual_title": "Statut du tÊlÊchargement ", + "backup_manual_in_progress": "TÊlÊversement dÊjà en cours. RÊessayez plus tard", + "backup_manual_success": "Succès", + "backup_manual_title": "Statut du tÊlÊversement", "backup_options_page_title": "Options de sauvegarde", - "backup_setting_subtitle": "Ajuster les paramètres de sauvegarde", + "backup_setting_subtitle": "Ajuster les paramètres de tÊlÊversement au premier et en arrière-plan", "backward": "Arrière", "birthdate_saved": "Date de naissance enregistrÊe avec succès", "birthdate_set_description": "La date de naissance est utilisÊe pour calculer l'Ãĸge de cette personne au moment oÚ la photo a ÊtÊ prise.", @@ -574,21 +570,21 @@ "bulk_keep_duplicates_confirmation": "Êtes-vous sÃģr de vouloir conserver {count, plural, one {# doublon} other {# doublons}} ? Cela rÊsoudra tous les groupes de doublons sans rien supprimer.", "bulk_trash_duplicates_confirmation": "Êtes-vous sÃģr de vouloir mettre à la corbeille {count, plural, one {# doublon} other {# doublons}} ? Cette opÊration permet de conserver le plus grand mÊdia de chaque groupe et de mettre à la corbeille tous les autres doublons.", "buy": "Acheter Immich", - "cache_settings_album_thumbnails": "Page des miniatures de la bibliothèque ({} ÊlÊments)", + "cache_settings_album_thumbnails": "Page des miniatures de la bibliothèque ({} mÊdias)", "cache_settings_clear_cache_button": "Effacer le cache", "cache_settings_clear_cache_button_title": "Efface le cache de l'application. Cela aura un impact significatif sur les performances de l'application jusqu'à ce que le cache soit reconstruit.", "cache_settings_duplicated_assets_clear_button": "EFFACER", "cache_settings_duplicated_assets_subtitle": "Photos et vidÊos qui sont exclues par l'application", - "cache_settings_duplicated_assets_title": "ÉlÊments dupliquÊs ({})", - "cache_settings_image_cache_size": "Taille du cache des images ({} ÊlÊments)", + "cache_settings_duplicated_assets_title": "MÊdias dupliquÊs ({})", + "cache_settings_image_cache_size": "Taille du cache des images ({} mÊdias)", "cache_settings_statistics_album": "Miniatures de la bibliothèque", - "cache_settings_statistics_assets": "{} ÊlÊments ({})", + "cache_settings_statistics_assets": "{} mÊdias ({})", "cache_settings_statistics_full": "Images complètes", "cache_settings_statistics_shared": "Miniatures de l'album partagÊ", "cache_settings_statistics_thumbnail": "Miniatures", "cache_settings_statistics_title": "Utilisation du cache", "cache_settings_subtitle": "Contrôler le comportement de mise en cache de l'application mobile Immich", - "cache_settings_thumbnail_size": "Taille du cache des miniatures ({} ÊlÊments)", + "cache_settings_thumbnail_size": "Taille du cache des miniatures ({} mÊdias)", "cache_settings_tile_subtitle": "Contrôler le comportement du stockage local", "cache_settings_tile_title": "Stockage local", "cache_settings_title": "Paramètres de mise en cache", @@ -658,13 +654,13 @@ "contain": "Contenu", "context": "Contexte", "continue": "Continuer", - "control_bottom_app_bar_album_info_shared": "{} ÊlÊments ¡ PartagÊs", + "control_bottom_app_bar_album_info_shared": "{} mÊdias ¡ PartagÊs", "control_bottom_app_bar_create_new_album": "CrÊer un nouvel album", "control_bottom_app_bar_delete_from_immich": "Supprimer de Immich", "control_bottom_app_bar_delete_from_local": "Supprimer de l'appareil", "control_bottom_app_bar_edit_location": "Modifier la localisation", "control_bottom_app_bar_edit_time": "Modifier la date et l'heure", - "control_bottom_app_bar_share_link": "Share Link", + "control_bottom_app_bar_share_link": "Lien partagÊ", "control_bottom_app_bar_share_to": "Partager à", "control_bottom_app_bar_trash_from_immich": "DÊplacer vers la corbeille", "copied_image_to_clipboard": "Image copiÊe dans le presse-papiers.", @@ -699,7 +695,7 @@ "crop": "Recadrer", "curated_object_page_title": "Objets", "current_device": "Appareil actuel", - "current_server_address": "Adresse actuelle du serveur ", + "current_server_address": "Adresse actuelle du serveur", "custom_locale": "Paramètres rÊgionaux personnalisÊs", "custom_locale_description": "Afficher les dates et nombres en fonction des paramètres rÊgionaux", "daily_title_text_date": "E, dd MMM", @@ -722,10 +718,10 @@ "delete": "Supprimer", "delete_album": "Supprimer l'album", "delete_api_key_prompt": "Voulez-vous vraiment supprimer cette clÊ API ?", - "delete_dialog_alert": "Ces ÊlÊments seront dÊfinitivement supprimÊs de Immich et de votre appareil.", - "delete_dialog_alert_local": "Ces ÊlÊments seront dÊfinitivement supprimÊs de votre appareil mais resteront disponibles sur le serveur d'Immich.", - "delete_dialog_alert_local_non_backed_up": "Certains ÊlÊments ne sont pas sauvegardÊs sur Immich et seront dÊfinitivement supprimÊs de votre appareil.", - "delete_dialog_alert_remote": "Ces ÊlÊments seront dÊfinitivement supprimÊs du serveur Immich.", + "delete_dialog_alert": "Ces mÊdias seront dÊfinitivement supprimÊs de Immich et de votre appareil", + "delete_dialog_alert_local": "Ces mÊdias seront dÊfinitivement supprimÊs de votre appareil mais resteront disponibles sur le serveur d'Immich", + "delete_dialog_alert_local_non_backed_up": "Certains mÊdias ne sont pas sauvegardÊs sur Immich et seront dÊfinitivement supprimÊs de votre appareil", + "delete_dialog_alert_remote": "Ces mÊdias seront dÊfinitivement supprimÊs du serveur Immich", "delete_dialog_ok_force": "Supprimer tout de mÃĒme", "delete_dialog_title": "Supprimer dÊfinitivement", "delete_duplicates_confirmation": "Êtes-vous certain de vouloir supprimer dÊfinitivement ces doublons ?", @@ -782,7 +778,7 @@ "downloading": "TÊlÊchargement", "downloading_asset_filename": "TÊlÊchargement du mÊdia {filename}", "downloading_media": "TÊlÊchargement du mÊdia", - "drop_files_to_upload": "DÊposez les fichiers n'importe oÚ pour envoyer", + "drop_files_to_upload": "DÊposez les fichiers n'importe oÚ pour tÊlÊverser", "duplicates": "Doublons", "duplicates_description": "Examiner chaque groupe et indiquer s'il y a des doublons", "duration": "DurÊe", @@ -818,7 +814,7 @@ "enabled": "ActivÊ", "end_date": "Date de fin", "enqueued": "Mis en file", - "enter_wifi_name": "Entrez le nom du rÊseau ", + "enter_wifi_name": "Entrez le nom du rÊseau wifi", "error": "Erreur", "error_change_sort_album": "Impossible de modifier l'ordre de tri des albums", "error_delete_face": "Erreur lors de la suppression du visage pour le mÊdia", @@ -853,10 +849,12 @@ "failed_to_keep_this_delete_others": "Impossible de conserver ce mÊdia et de supprimer les autres mÊdias", "failed_to_load_asset": "Impossible de charger le mÊdia", "failed_to_load_assets": "Impossible de charger les mÊdias", + "failed_to_load_notifications": "Erreur de rÊcupÊration des notifications", "failed_to_load_people": "Impossible de charger les personnes", "failed_to_remove_product_key": "Échec de suppression de la clÊ du produit", "failed_to_stack_assets": "Impossible d'empiler les mÊdias", "failed_to_unstack_assets": "Impossible de dÊpiler les mÊdias", + "failed_to_update_notification_status": "Erreur de mise à jour du statut des notifications", "import_path_already_exists": "Ce chemin d'importation existe dÊjà.", "incorrect_email_or_password": "Courriel ou mot de passe incorrect", "paths_validation_failed": "Validation ÊchouÊe pour {paths, plural, one {# un chemin} other {# plusieurs chemins}}", @@ -949,7 +947,7 @@ "unable_to_update_settings": "Impossible de mettre à jour les paramètres", "unable_to_update_timeline_display_status": "Impossible de mettre à jour le statut d'affichage de la vue chronologique", "unable_to_update_user": "Impossible de mettre à jour l'utilisateur", - "unable_to_upload_file": "Impossible d'envoyer le fichier" + "unable_to_upload_file": "Impossible de tÊlÊverser le fichier" }, "exif": "Exif", "exif_bottom_sheet_description": "Ajouter une description...", @@ -965,7 +963,7 @@ "expand_all": "Tout dÊvelopper", "experimental_settings_new_asset_list_subtitle": "En cours de dÊveloppement", "experimental_settings_new_asset_list_title": "Activer la grille de photos expÊrimentale", - "experimental_settings_subtitle": "Utilisez à vos dÊpends!", + "experimental_settings_subtitle": "Utilisez à vos dÊpends !", "experimental_settings_title": "ExpÊrimental", "expire_after": "Expire", "expired": "ExpirÊ", @@ -978,7 +976,7 @@ "external": "Externe", "external_libraries": "Bibliothèques externes", "external_network": "RÊseau externe", - "external_network_sheet_info": "Quand vous n'ÃĒtes pas connectÊ à votre rÊseau prÊfÊrÊ, l'application va tenter de se connecter aux adresses ci-dessous, en commençant par la première", + "external_network_sheet_info": "Quand vous n'ÃĒtes pas connectÊ(e) à votre rÊseau wifi prÊfÊrÊ, l'application va tenter de se connecter aux adresses ci-dessous, en commençant par la première", "face_unassigned": "Non attribuÊ", "failed": "Échec", "failed_to_load_assets": "Échec du chargement des ressources", @@ -996,6 +994,7 @@ "filetype": "Type de fichier", "filter": "Filtres", "filter_people": "Filtrer les personnes", + "filter_places": "Filtrer par lieu", "find_them_fast": "Pour les retrouver rapidement par leur nom", "fix_incorrect_match": "Corriger une association incorrecte", "folder": "Dossier", @@ -1005,12 +1004,12 @@ "forward": "Avant", "general": "GÊnÊral", "get_help": "Obtenir de l'aide", - "get_wifiname_error": "Impossible d'obtenir le nom du rÊseau Wi-Fi. Assurez-vous d'avoir donnÊ les permissions nÊcessaires à l'application et que vous ÃĒtes connectÊ à un rÊseau Wi-Fi.", + "get_wifiname_error": "Impossible d'obtenir le nom du rÊseau wifi. Assurez-vous d'avoir donnÊ les permissions nÊcessaires à l'application et que vous ÃĒtes connectÊ à un rÊseau wifi", "getting_started": "Commencer", "go_back": "Retour", "go_to_folder": "Dossier", "go_to_search": "Faire une recherche", - "grant_permission": "Accorder les permissions ", + "grant_permission": "Accorder les permissions", "group_albums_by": "Grouper les albums par...", "group_country": "Grouper par pays", "group_no": "Pas de groupe", @@ -1034,23 +1033,23 @@ "hide_person": "Masquer la personne", "hide_unnamed_people": "Cacher les personnes non nommÊes", "home_page_add_to_album_conflicts": "{added} ÊlÊments ajoutÊs à l'album {album}. Les ÊlÊments {failed} sont dÊjà dans l'album.", - "home_page_add_to_album_err_local": "Impossible d'ajouter des ÊlÊments locaux aux albums pour le moment, Êtape ignorÊe", + "home_page_add_to_album_err_local": "Impossible d'ajouter des mÊdias locaux aux albums, ils sont ignorÊs", "home_page_add_to_album_success": "{added} ÊlÊments ajoutÊs à l'album {album}.", - "home_page_album_err_partner": "Il n'est pas encore possible d'ajouter des ÊlÊments d'un partenaire à un album.", - "home_page_archive_err_local": "Impossible d'archiver les ressources locales pour l'instant, Êtape ignorÊe", - "home_page_archive_err_partner": "Impossible d'archiver les ÊlÊments d'un partenaire.", + "home_page_album_err_partner": "Impossible d'ajouter des mÊdias d'un partenaire à un album, ils sont ignorÊs", + "home_page_archive_err_local": "Impossible d'archiver les mÊdias locaux, ils sont ignorÊs", + "home_page_archive_err_partner": "Impossible d'archiver les mÊdias d'un partenaire, ils sont ignorÊs", "home_page_building_timeline": "Construction de la chronologie", - "home_page_delete_err_partner": "Ne peut pas supprimer les ÊlÊments d'un partenaire.", - "home_page_delete_remote_err_local": "Des ÊlÊments locaux sont dans la sÊlection de suppression à distance, ils sont donc ignorÊs.", - "home_page_favorite_err_local": "Impossible d'ajouter des ÊlÊments locaux aux favoris pour le moment, Êtape ignorÊe", - "home_page_favorite_err_partner": "Il n'est pas encore possible de mettre en favori les ÊlÊments d'un partenaire.", - "home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidÊos de cet ou ces albums.", - "home_page_share_err_local": "Impossible de partager par lien les mÊdias locaux, cette opÊration est donc ignorÊe.", - "home_page_upload_err_limit": "Limite de tÊlÊchargement de 30 ÊlÊments en mÃĒme temps, demande ignorÊe", + "home_page_delete_err_partner": "Impossible de supprimer les mÊdias d'un partenaire, ils sont ignorÊs", + "home_page_delete_remote_err_local": "Des mÊdias locaux sont dans la sÊlection de suppression à distance, ils sont ignorÊs", + "home_page_favorite_err_local": "Impossible d'ajouter des mÊdias locaux aux favoris, ils sont ignorÊs", + "home_page_favorite_err_partner": "Impossible de mettre en favori les mÊdias d'un partenaire, ils sont ignorÊs", + "home_page_first_time_notice": "Si c'est la première fois que vous utilisez l'application, veillez à choisir un ou plusieurs albums de sauvegarde afin que la chronologie puisse alimenter les photos et les vidÊos de cet ou ces albums", + "home_page_share_err_local": "Impossible de partager par lien les mÊdias locaux, ils sont ignorÊs", + "home_page_upload_err_limit": "Impossible de tÊlÊverser plus de 30 mÊdias en mÃĒme temps, demande ignorÊe", "host": "Hôte", "hour": "Heure", "ignore_icloud_photos": "Ignorer les photos iCloud", - "ignore_icloud_photos_description": "Les photos stockÊes sur iCloud ne sont pas enregistrÊes sur Immich", + "ignore_icloud_photos_description": "Les photos stockÊes sur iCloud ne sont pas tÊlÊversÊes sur le serveur Immich", "image": "Image", "image_alt_text_date": "{isVideo, select, true {Video} other {Image}} prise le {date}", "image_alt_text_date_1_person": "{isVideo, select, true {Video} other {Image}} prise avec {person1} le {date}", @@ -1123,8 +1122,8 @@ "loading_search_results_failed": "Chargement des rÊsultats ÊchouÊ", "local_network": "RÊseau local", "local_network_sheet_info": "L'application va se connecter au serveur via cette URL quand l'appareil est connectÊ à ce rÊseau Wi-Fi", - "location_permission": "Autorisation de localisation ", - "location_permission_content": "Afin de pouvoir changer d'adresse automatiquement, Immich doit avoir accès à la localisation prÊcise, afin d'accÊder au le nom du rÊseau Wi-Fi utilisÊ", + "location_permission": "Autorisation de localisation", + "location_permission_content": "Afin de pouvoir changer d'adresse automatiquement, Immich doit avoir accès à la localisation prÊcise, afin d'accÊder au nom du rÊseau wifi utilisÊ", "location_picker_choose_on_map": "SÊlectionner sur la carte", "location_picker_latitude_error": "Saisir une latitude correcte", "location_picker_latitude_hint": "Saisir la latitude ici", @@ -1135,8 +1134,8 @@ "logged_out_all_devices": "DÊconnectÊ de tous les appareils", "logged_out_device": "DÊconnectÊ de l'appareil", "login": "Connexion", - "login_disabled": "La connexion a ÊtÊ dÊsactivÊe ", - "login_form_api_exception": "Erreur de l'API. Veuillez vÊrifier l'URL du serveur et et rÊessayer.", + "login_disabled": "La connexion a ÊtÊ dÊsactivÊe", + "login_form_api_exception": "Erreur de l'API. Veuillez vÊrifier l'URL du serveur et rÊessayer.", "login_form_back_button_text": "Retour", "login_form_email_hint": "votrecourriel@email.com", "login_form_endpoint_hint": "http://adresse-ip-serveur:port", @@ -1179,12 +1178,12 @@ "map_cannot_get_user_location": "Impossible d'obtenir la localisation de l'utilisateur", "map_location_dialog_yes": "Oui", "map_location_picker_page_use_location": "Utiliser ma position", - "map_location_service_disabled_content": "Le service de localisation doit ÃĒtre activÊ pour afficher les ÊlÊments de votre emplacement actuel. Souhaitez-vous l'activer maintenant?", + "map_location_service_disabled_content": "Le service de localisation doit ÃĒtre activÊ pour afficher les mÊdias de votre emplacement actuel. Souhaitez-vous l'activer maintenant ?", "map_location_service_disabled_title": "Service de localisation dÊsactivÊ", "map_marker_for_images": "Marqueur de carte pour les images prises à {city}, {country}", "map_marker_with_image": "Marqueur de carte avec image", "map_no_assets_in_bounds": "Pas de photos dans cette zone", - "map_no_location_permission_content": "L'autorisation de localisation est nÊcessaire pour afficher les ÊlÊments de votre emplacement actuel. Souhaitez-vous l'autoriser maintenant?", + "map_no_location_permission_content": "L'autorisation de localisation est nÊcessaire pour afficher les mÊdias de votre emplacement actuel. Souhaitez-vous l'autoriser maintenant ?", "map_no_location_permission_title": "Permission de localisation refusÊe", "map_settings": "Paramètres de la carte", "map_settings_dark_mode": "Mode sombre", @@ -1198,6 +1197,9 @@ "map_settings_only_show_favorites": "Afficher uniquement les favoris", "map_settings_theme_settings": "Thème de la carte", "map_zoom_to_see_photos": "DÊzoomer pour voir les photos", + "mark_all_as_read": "Tout marquer comme lu", + "mark_as_read": "Marquer comme lu", + "marked_all_as_read": "Tout a ÊtÊ marquÊ comme lu", "matches": "Correspondances", "media_type": "Type de mÊdia", "memories": "Souvenirs", @@ -1224,14 +1226,16 @@ "month": "Mois", "monthly_title_text_date_format": "MMMM y", "more": "Plus", + "moved_to_archive": "{count, plural, one {# ÊlÊment dÊplacÊ} other {# ÊlÊments dÊplacÊs}} vers les archives", + "moved_to_library": "{count, plural, one {# ÊlÊment dÊplacÊ} other {# ÊlÊments dÊplacÊs}} vers la bibliothèque", "moved_to_trash": "DÊplacÊ dans la corbeille", - "multiselect_grid_edit_date_time_err_read_only": "Impossible de modifier la date d'un ÊlÊment d'actif en lecture seule.", - "multiselect_grid_edit_gps_err_read_only": "Impossible de modifier l'emplacement d'un ÊlÊment en lecture seule.", + "multiselect_grid_edit_date_time_err_read_only": "Impossible de modifier la date de mÊdias en lecture seule, ils sont ignorÊs", + "multiselect_grid_edit_gps_err_read_only": "Impossible de modifier l'emplacement de mÊdias en lecture seule, ils sont ignorÊs", "mute_memories": "Mettre en sourdine les souvenirs", "my_albums": "Mes albums", "name": "Nom", "name_or_nickname": "Nom ou surnom", - "networking_settings": "RÊseau ", + "networking_settings": "RÊseau", "networking_subtitle": "GÊrer les adresses du serveur", "never": "Jamais", "new_album": "Nouvel Album", @@ -1248,21 +1252,23 @@ "no_albums_with_name_yet": "Il semble que vous n'ayez pas encore d'albums avec ce nom.", "no_albums_yet": "Il semble que vous n'ayez pas encore d'album.", "no_archived_assets_message": "Archiver des photos et vidÊos pour les masquer dans votre bibliothèque", - "no_assets_message": "CLIQUER ICI POUR ENVOYER VOTRE PREMIÈRE PHOTO", + "no_assets_message": "CLIQUER ICI POUR TÉLÉVERSER VOTRE PREMIÈRE PHOTO", "no_assets_to_show": "Aucun ÊlÊment à afficher", "no_duplicates_found": "Aucun doublon n'a ÊtÊ trouvÊ.", "no_exif_info_available": "Aucune information exif disponible", - "no_explore_results_message": "Envoyez plus de photos pour explorer votre collection.", + "no_explore_results_message": "TÊlÊversez plus de photos pour explorer votre collection.", "no_favorites_message": "Ajouter des photos et vidÊos à vos favoris pour les retrouver plus rapidement", "no_libraries_message": "CrÊer une bibliothèque externe pour voir vos photos et vidÊos dans un autre espace de stockage", "no_name": "Pas de nom", + "no_notifications": "Pas de notification", + "no_people_found": "Aucune personne correspondante trouvÊe", "no_places": "Pas de lieu", "no_results": "Aucun rÊsultat", "no_results_description": "Essayez un synonyme ou un mot-clÊ plus gÊnÊral", "no_shared_albums_message": "CrÊer un album pour partager vos photos et vidÊos avec les personnes de votre rÊseau", "not_in_any_album": "Dans aucun album", "not_selected": "Non sÊlectionnÊ", - "note_apply_storage_label_to_previously_uploaded assets": "Note : Pour appliquer l'Êtiquette de stockage aux mÊdias dÊjà envoyÊs, lancer la", + "note_apply_storage_label_to_previously_uploaded assets": "Note : Pour appliquer l'Êtiquette de stockage aux mÊdias dÊjà tÊlÊversÊs, exÊcutez", "notes": "Notes", "notification_permission_dialog_content": "Pour activer les notifications, allez dans Paramètres et sÊlectionnez Autoriser.", "notification_permission_list_tile_content": "Accordez la permission d'activer les notifications.", @@ -1344,9 +1350,9 @@ "permission_onboarding_get_started": "Commencer", "permission_onboarding_go_to_settings": "AccÊder aux paramètres", "permission_onboarding_permission_denied": "Permission refusÊe. Pour utiliser Immich, accordez lautorisation pour les photos et vidÊos dans les Paramètres.", - "permission_onboarding_permission_granted": "Permission accordÊe! Vous ÃĒtes prÃĒts.", + "permission_onboarding_permission_granted": "Permission accordÊe ! Vous ÃĒtes prÃĒts.", "permission_onboarding_permission_limited": "Permission limitÊe. Pour permettre à Immich de sauvegarder et de gÊrer l'ensemble de votre bibliothèque, accordez l'autorisation pour les photos et vidÊos dans les Paramètres.", - "permission_onboarding_request": "Immich demande l'autorisation de visionner vos photos et vidÊo", + "permission_onboarding_request": "Immich nÊcessite l'autorisation d'accÊder à vos photos et vidÊos.", "person": "Personne", "person_birthdate": "NÊ(e) le {date}", "person_hidden": "{name}{hidden, select, true { (cachÊ)} other {}}", @@ -1431,6 +1437,8 @@ "recent_searches": "Recherches rÊcentes", "recently_added": "RÊcemment ajoutÊ", "recently_added_page_title": "RÊcemment ajoutÊ", + "recently_taken": "RÊcemment photographiÊ", + "recently_taken_page_title": "RÊcemment photographiÊ", "refresh": "Actualiser", "refresh_encoded_videos": "Actualiser les vidÊos encodÊes", "refresh_faces": "Actualiser les visages", @@ -1465,7 +1473,7 @@ "rename": "Renommer", "repair": "RÊparer", "repair_no_results_message": "Les fichiers non importÊs ou absents s'afficheront ici", - "replace_with_upload": "Remplacer par tÊlÊchargement", + "replace_with_upload": "Remplacer par tÊlÊversement", "repository": "DÊpôt", "require_password": "Demander le mot de passe", "require_user_to_change_password_on_first_login": "Demander à l'utilisateur de changer son mot de passe lors de sa première connexion", @@ -1481,7 +1489,7 @@ "restore_user": "Restaurer l'utilisateur", "restored_asset": "MÊdia restaurÊ", "resume": "Reprendre", - "retry_upload": "RÊessayer l'envoi", + "retry_upload": "RÊessayer le tÊlÊversement", "review_duplicates": "Consulter les doublons", "role": "Rôle", "role_editor": "Éditeur", @@ -1523,7 +1531,7 @@ "search_filter_people_title": "SÊlectionner une personne", "search_for": "Chercher", "search_for_existing_person": "Rechercher une personne existante", - "search_no_more_result": "\nPlus de rÊsultats", + "search_no_more_result": "Plus de rÊsultats", "search_no_people": "Aucune personne", "search_no_people_named": "Aucune personne nommÊe ÂĢ {name} Âģ", "search_no_result": "Aucun rÊsultat trouvÊ, essayez un autre terme de recherche ou une autre combinaison", @@ -1534,7 +1542,7 @@ "search_page_no_places": "Aucune information disponible sur la localisation", "search_page_screenshots": "Captures d'Êcran", "search_page_search_photos_videos": "Rechercher dans vos photos et vidÊos", - "search_page_selfies": "Selfies", + "search_page_selfies": "Autoportraits (Selfies)", "search_page_things": "Objets", "search_page_view_all_button": "Voir tout", "search_page_your_activity": "Votre activitÊ", @@ -1545,7 +1553,7 @@ "search_result_page_new_search_hint": "Nouvelle recherche", "search_settings": "Paramètres de recherche", "search_state": "Rechercher par Êtat/rÊgion...", - "search_suggestion_list_smart_search_hint_1": "La recherche intelligente est activÊe par dÊfaut. Pour rechercher des mÊtadonnÊes, utilisez la syntaxe suivante", + "search_suggestion_list_smart_search_hint_1": "La recherche intelligente est activÊe par dÊfaut. Pour rechercher des mÊtadonnÊes, utilisez la syntaxe suivante ", "search_suggestion_list_smart_search_hint_2": "m:votre-terme-de-recherche", "search_tags": "Recherche d'Êtiquettes...", "search_timezone": "Rechercher par fuseau horaire...", @@ -1565,6 +1573,7 @@ "select_keep_all": "Choisir de tout garder", "select_library_owner": "SÊlectionner le propriÊtaire de la bibliothèque", "select_new_face": "SÊlectionner un nouveau visage", + "select_person_to_tag": "SÊlectionner une personne à identifier", "select_photos": "SÊlectionner les photos", "select_trash_all": "Choisir de tout supprimer", "select_user_for_sharing_page_err_album": "Échec de la crÊation de l'album", @@ -1587,7 +1596,7 @@ "set_profile_picture": "DÊfinir la photo de profil", "set_slideshow_to_fullscreen": "Afficher le diaporama en plein Êcran", "setting_image_viewer_help": "Le visualiseur de dÊtails charge d'abord la petite miniature, puis l'aperçu de taille moyenne (s'il est activÊ), enfin l'original (s'il est activÊ).", - "setting_image_viewer_original_subtitle": "Activez cette option pour charger l'image en rÊsolution originale (volumineux!). DÊsactiver pour rÊduire l'utilisation des donnÊes (rÊseau et cache de l'appareil).", + "setting_image_viewer_original_subtitle": "Activez cette option pour charger l'image en rÊsolution originale (fichier volumineux !). DÊsactiver pour rÊduire l'utilisation des donnÊes (rÊseau et cache de l'appareil).", "setting_image_viewer_original_title": "Charger l'image originale", "setting_image_viewer_preview_subtitle": "Activer pour charger une image de rÊsolution moyenne. DÊsactiver pour charger directement l'original ou utiliser uniquement la miniature.", "setting_image_viewer_preview_title": "Charger l'image d'aperçu", @@ -1595,16 +1604,16 @@ "setting_languages_apply": "Appliquer", "setting_languages_subtitle": "Changer la langue de l'application", "setting_languages_title": "Langues", - "setting_notifications_notify_failures_grace_period": "Notifier les Êchecs de sauvegarde en arrière-plan : {}", + "setting_notifications_notify_failures_grace_period": "Notifier les Êchecs de la sauvegarde en arrière-plan : {}", "setting_notifications_notify_hours": "{} heures", "setting_notifications_notify_immediately": "immÊdiatement", "setting_notifications_notify_minutes": "{} minutes", "setting_notifications_notify_never": "jamais", "setting_notifications_notify_seconds": "{} secondes", - "setting_notifications_single_progress_subtitle": "Informations dÊtaillÊes sur la progression du transfert par ÊlÊment", + "setting_notifications_single_progress_subtitle": "Informations dÊtaillÊes sur la progression du tÊlÊversement par mÊdia", "setting_notifications_single_progress_title": "Afficher la progression du dÊtail de la sauvegarde en arrière-plan", "setting_notifications_subtitle": "Ajustez vos prÊfÊrences de notification", - "setting_notifications_total_progress_subtitle": "Progression globale du transfert (effectuÊ/total des ÊlÊments)", + "setting_notifications_total_progress_subtitle": "Progression globale du tÊlÊversement (effectuÊ/total des mÊdias)", "setting_notifications_total_progress_title": "Afficher la progression totale de la sauvegarde en arrière-plan", "setting_video_viewer_looping_title": "Boucle", "setting_video_viewer_original_video_subtitle": "Lors de la diffusion d'une vidÊo depuis le serveur, lisez l'original mÃĒme si un transcodage est disponible. Cela peut entraÃŽner de la mise en mÊmoire tampon. Les vidÊos disponibles localement sont lues en qualitÊ d'origine, quel que soit ce paramètre.", @@ -1618,7 +1627,7 @@ "share_dialog_preparing": "PrÊparation...", "shared": "PartagÊ", "shared_album_activities_input_disable": "Les commentaires sont dÊsactivÊs", - "shared_album_activity_remove_content": "Souhaitez-vous supprimer cette activitÊ?", + "shared_album_activity_remove_content": "Souhaitez-vous supprimer cette activitÊ ?", "shared_album_activity_remove_title": "Supprimer l'activitÊ", "shared_album_section_people_action_error": "Erreur lors de la suppression", "shared_album_section_people_action_leave": "Supprimer l'utilisateur de l'album", @@ -1628,9 +1637,9 @@ "shared_by_user": "PartagÊ par {user}", "shared_by_you": "PartagÊ par vous", "shared_from_partner": "Photos de {partner}", - "shared_intent_upload_button_progress_text": "{} / {} EnvoyÊs", + "shared_intent_upload_button_progress_text": "{} / {} TÊlÊversÊ", "shared_link_app_bar_title": "Liens partagÊs", - "shared_link_clipboard_copied_massage": "CopiÊ dans le presse-papier\n", + "shared_link_clipboard_copied_massage": "CopiÊ dans le presse-papier", "shared_link_clipboard_text": "Lien : {}\nMot de passe : {}", "shared_link_create_error": "Erreur pendant la crÊation du lien partagÊ", "shared_link_edit_description_hint": "Saisir la description du partage", @@ -1641,7 +1650,7 @@ "shared_link_edit_expire_after_option_minute": "1 minute", "shared_link_edit_expire_after_option_minutes": "{} minutes", "shared_link_edit_expire_after_option_months": "{} mois", - "shared_link_edit_expire_after_option_year": "{} annÊes", + "shared_link_edit_expire_after_option_year": "{} an", "shared_link_edit_password_hint": "Saisir le mot de passe de partage", "shared_link_edit_submit_button": "Mettre à jour le lien", "shared_link_error_server_url_fetch": "Impossible de rÊcupÊrer l'url du serveur", @@ -1738,8 +1747,8 @@ "swap_merge_direction": "Inverser la direction de fusion", "sync": "Synchroniser", "sync_albums": "Synchroniser dans des albums", - "sync_albums_manual_subtitle": "Synchroniser toutes les vidÊos et photos sauvegardÊes dans les albums sÊlectionnÊs", - "sync_upload_album_setting_subtitle": "CrÊer et sauvegarde vos photos et vidÊos dans les albums sÊlectionnÊs sur Immich", + "sync_albums_manual_subtitle": "Synchroniser toutes les vidÊos et photos tÊlÊversÊes dans les albums sÊlectionnÊs", + "sync_upload_album_setting_subtitle": "CrÊe et tÊlÊverse vos photos et vidÊos dans les albums sÊlectionnÊs sur Immich", "tag": "Étiquette", "tag_assets": "Étiqueter les mÊdias", "tag_created": "Étiquette crÊÊe : {tag}", @@ -1754,7 +1763,7 @@ "theme_selection": "SÊlection du thème", "theme_selection_description": "Ajuster automatiquement le thème clair ou sombre via les prÊfÊrences système", "theme_setting_asset_list_storage_indicator_title": "Afficher l'indicateur de stockage sur les tuiles des ÊlÊments", - "theme_setting_asset_list_tiles_per_row_title": "Nombre d'ÊlÊments par ligne ({})", + "theme_setting_asset_list_tiles_per_row_title": "Nombre de mÊdias par ligne ({})", "theme_setting_colorful_interface_subtitle": "Appliquer la couleur principale sur les surfaces d'arrière-plan.", "theme_setting_colorful_interface_title": "Interface colorÊe", "theme_setting_image_viewer_quality_subtitle": "Ajustez la qualitÊ de la visionneuse d'images dÊtaillÊes", @@ -1764,7 +1773,7 @@ "theme_setting_system_primary_color_title": "Utiliser la couleur du système", "theme_setting_system_theme_switch": "Automatique (suivre les paramètres du système)", "theme_setting_theme_subtitle": "Choisissez le thème de l'application", - "theme_setting_three_stage_loading_subtitle": "Le chargement en trois Êtapes peut amÊliorer les performances de chargement, mais entraÃŽne une augmentation significative de la charge du rÊseau.", + "theme_setting_three_stage_loading_subtitle": "Le chargement en trois Êtapes peut amÊliorer les performances de chargement, mais entraÃŽne une augmentation significative de la charge du rÊseau", "theme_setting_three_stage_loading_title": "Activer le chargement en trois Êtapes", "they_will_be_merged_together": "Elles seront fusionnÊes ensemble", "third_party_resources": "Ressources tierces", @@ -1788,8 +1797,8 @@ "trash_emptied": "Corbeille vidÊe", "trash_no_results_message": "Les photos et vidÊos supprimÊes s'afficheront ici.", "trash_page_delete_all": "Tout supprimer", - "trash_page_empty_trash_dialog_content": "Voulez-vous vider les ÊlÊments de la corbeille? Ces objets seront dÊfinitivement retirÊs d'Immich", - "trash_page_info": "Les ÊlÊments mis à la corbeille seront dÊfinitivement supprimÊs au bout de {} jours.", + "trash_page_empty_trash_dialog_content": "Voulez-vous vider les mÊdias de la corbeille ? Ces objets seront dÊfinitivement retirÊs d'Immich", + "trash_page_info": "Les mÊdias mis à la corbeille seront dÊfinitivement supprimÊs au bout de {} jours", "trash_page_no_assets": "Aucun ÊlÊment dans la corbeille", "trash_page_restore_all": "Tout restaurer", "trash_page_select_assets_btn": "SÊlectionner les ÊlÊments", @@ -1817,25 +1826,25 @@ "unstack": "DÊsempiler", "unstacked_assets_count": "{count, plural, one {# mÊdia dÊpilÊ} other {# mÊdias dÊpilÊs}}", "untracked_files": "Fichiers non suivis", - "untracked_files_decription": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent ÃĒtre le rÊsultat de dÊplacements ÊchouÊs, d'envois interrompus ou laissÊs pour compte à cause d'un bug", + "untracked_files_decription": "Ces fichiers ne sont pas suivis par l'application. Ils peuvent ÃĒtre le rÊsultat de dÊplacements ÊchouÊs, de tÊlÊversements interrompus ou abandonnÊs pour cause de bug", "up_next": "Suite", "updated_password": "Mot de passe mis à jour", - "upload": "Envoyer", - "upload_concurrency": "Envois simultanÊs", - "upload_dialog_info": "Voulez-vous sauvegarder la sÊlection vers le serveur?", - "upload_dialog_title": "TÊlÊcharger cet ÊlÊment ", - "upload_errors": "L'envoi s'est achevÊ avec {count, plural, one {# erreur} other {# erreurs}}. RafraÃŽchir la page pour voir les nouveaux mÊdias envoyÊs.", + "upload": "TÊlÊverser", + "upload_concurrency": "TÊlÊversements simultanÊs", + "upload_dialog_info": "Voulez-vous sauvegarder la sÊlection vers le serveur ?", + "upload_dialog_title": "TÊlÊverser le mÊdia", + "upload_errors": "Le tÊlÊversement s'est achevÊ avec {count, plural, one {# erreur} other {# erreurs}}. RafraÃŽchir la page pour voir les nouveaux mÊdias tÊlÊversÊs.", "upload_progress": "{remaining, number} restant(s) - {processed, number} traitÊ(s)/{total, number}", "upload_skipped_duplicates": "{count, plural, one {# doublon ignorÊ} other {# doublons ignorÊs}}", "upload_status_duplicates": "Doublons", "upload_status_errors": "Erreurs", - "upload_status_uploaded": "EnvoyÊ", - "upload_success": "Envoi rÊussi. RafraÃŽchir la page pour voir les nouveaux mÊdias envoyÊs.", - "upload_to_immich": "Envoyer vers Immich ({})", + "upload_status_uploaded": "TÊlÊversÊ", + "upload_success": "TÊlÊversement rÊussi. RafraÃŽchir la page pour voir les nouveaux mÊdias tÊlÊversÊs.", + "upload_to_immich": "TÊlÊverser vers Immich ({})", "uploading": "TÊlÊversement en cours", "url": "URL", "usage": "Utilisation", - "use_current_connection": "Utiliser le rÊseau actuel ", + "use_current_connection": "Utiliser le rÊseau actuel", "use_custom_date_range": "Utilisez une plage de date personnalisÊe à la place", "user": "Utilisateur", "user_id": "ID Utilisateur", @@ -1888,11 +1897,11 @@ "week": "Semaine", "welcome": "Bienvenue", "welcome_to_immich": "Bienvenue sur Immich", - "wifi_name": "Nom du rÊseau ", + "wifi_name": "Nom du rÊseau wifi", "year": "AnnÊe", "years_ago": "Il y a {years, plural, one {# an} other {# ans}}", "yes": "Oui", "you_dont_have_any_shared_links": "Vous n'avez aucun lien partagÊ", - "your_wifi_name": "Nom du rÊseau Wi-Fi ", + "your_wifi_name": "Nom du rÊseau wifi", "zoom_image": "Zoomer" } diff --git a/i18n/gl.json b/i18n/gl.json index d03294c778..498a986768 100644 --- a/i18n/gl.json +++ b/i18n/gl.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Rexistro automÃĄtico", "oauth_auto_register_description": "Rexistrar automaticamente novos usuarios despois de iniciar sesiÃŗn con OAuth", "oauth_button_text": "Texto do botÃŗn", - "oauth_client_id": "ID de cliente", - "oauth_client_secret": "Segredo do cliente", "oauth_enable_description": "Iniciar sesiÃŗn con OAuth", - "oauth_issuer_url": "URL do emisor", "oauth_mobile_redirect_uri": "URI de redirecciÃŗn mÃŗbil", "oauth_mobile_redirect_uri_override": "SubstituciÃŗn de URI de redirecciÃŗn mÃŗbil", "oauth_mobile_redirect_uri_override_description": "Activar cando o provedor OAuth non permite un URI mÃŗbil, como '{callback}'", - "oauth_profile_signing_algorithm": "Algoritmo de sinatura do perfil", - "oauth_profile_signing_algorithm_description": "Algoritmo usado para asinar o perfil do usuario.", - "oauth_scope": "Ámbito", "oauth_settings": "OAuth", "oauth_settings_description": "Xestionar a configuraciÃŗn de inicio de sesiÃŗn OAuth", "oauth_settings_more_details": "Para mÃĄis detalles sobre esta funciÃŗn, consulte a documentaciÃŗn.", - "oauth_signing_algorithm": "Algoritmo de sinatura", "oauth_storage_label_claim": "DeclaraciÃŗn de etiqueta de almacenamento", "oauth_storage_label_claim_description": "Establecer automaticamente a etiqueta de almacenamento do usuario ao valor desta declaraciÃŗn.", "oauth_storage_quota_claim": "DeclaraciÃŗn de cota de almacenamento", @@ -1889,11 +1882,11 @@ "week": "Semana", "welcome": "Benvido/a", "welcome_to_immich": "Benvido/a a Immich", - "wifi_name": "Nome da WiFi", + "wifi_name": "Nome da Wi-Fi", "year": "Ano", "years_ago": "Hai {years, plural, one {# ano} other {# anos}}", "yes": "Si", "you_dont_have_any_shared_links": "Non tes ningunha ligazÃŗn compartida", - "your_wifi_name": "O nome da tÃēa WiFi", + "your_wifi_name": "O nome da tÃēa Wi-Fi", "zoom_image": "Ampliar Imaxe" } diff --git a/i18n/he.json b/i18n/he.json index 927a43f020..1efe67b428 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -192,26 +192,22 @@ "oauth_auto_register": "רישום אוטומטי", "oauth_auto_register_description": "רשום אוטומטי×Ē ×ž×Š×Ēמשים חדשים לאחר כניסה ×ĸם OAuth", "oauth_button_text": "טקץט לח×Ļן", - "oauth_client_id": "מזהה לקוח", - "oauth_client_secret": "סוד לקוח", + "oauth_client_secret_description": "נדרש כאשר ץפק ה־OAuth אינו ×Ēומך ב־PKCE (מפ×Ēח הוכחה להחלפ×Ē ×§×•×“)", "oauth_enable_description": "ה×Ēחבר ×ĸם OAuth", - "oauth_issuer_url": "כ×Ēוב×Ē ××Ēר המנפיק", "oauth_mobile_redirect_uri": "URI להפניה מחדש בנייד", "oauth_mobile_redirect_uri_override": "×ĸקיפ×Ē URI להפניה מחדש בנייד", "oauth_mobile_redirect_uri_override_description": "אפ׊ר כאשר ץפק OAuth לא מאפ׊ר כ×Ēוב×Ē URI לנייד, כמו '{callback}'", - "oauth_profile_signing_algorithm": "אלגורי×Ēם ח×Ēימ×Ē ×¤×¨×•×¤×™×œ", - "oauth_profile_signing_algorithm_description": "אלגורי×Ēם המשמש לח×Ēימה ×ĸל פרופיל המש×Ēמ׊.", - "oauth_scope": "רמ×Ē ×”×¨×Š××”", "oauth_settings": "OAuth", "oauth_settings_description": "ניהול הגדרו×Ē ×”×Ēחברו×Ē ×ĸם OAuth", "oauth_settings_more_details": "למיד×ĸ × ×•×Ą×Ŗ אודו×Ē ×Ēכונה זו, בדוק א×Ē ×”×Ēי×ĸוד.", - "oauth_signing_algorithm": "אלגורי×Ēם ח×Ēימה", "oauth_storage_label_claim": "דריש×Ē ×Ēווי×Ē ××—×Ą×•×Ÿ", "oauth_storage_label_claim_description": "הגדר אוטומטי×Ē ××Ē ×Ēווי×Ē ×”××—×Ą×•×Ÿ של המש×Ēמ׊ ל×ĸרך של דרישה זו.", "oauth_storage_quota_claim": "דריש×Ē ×ž×›×Ą×Ē ××—×Ą×•×Ÿ", "oauth_storage_quota_claim_description": "הגדר אוטומטי×Ē ××Ē ×ž×›×Ą×Ē ×”××—×Ą×•×Ÿ של המש×Ēמ׊ ל×ĸרך של דרישה זו.", "oauth_storage_quota_default": "מכס×Ē ××—×Ą×•×Ÿ בריר×Ē ×ž×—×“×œ (GiB)", "oauth_storage_quota_default_description": "מכסה ב-GiB לשימוש כאשר לא מסופק×Ē ×“×¨×™×Š×” (הזן 0 ×ĸבור מכסה בל×Ēי מוגבל×Ē).", + "oauth_timeout": "הבקשה נכשלה – הזמן הק×Ļוב הס×Ēיים", + "oauth_timeout_description": "זמן ×§×Ļוב לבקשו×Ē (במילישניו×Ē)", "offline_paths": "× ×Ēיבים לא מקוונים", "offline_paths_description": "×Ēו×Ļאו×Ē ××œ×• ×ĸשויו×Ē ×œ×”×™×•×Ē ×ĸקב מחיקה ידני×Ē ×Š×œ קב×Ļים שאינם חלק מספרייה חי×Ļוני×Ē.", "password_enable_description": "ה×Ēחבר ×ĸם דוא\"ל וסיסמה", @@ -853,10 +849,12 @@ "failed_to_keep_this_delete_others": "הפ×ĸולה נכשלה לא ני×Ēן היה לשמור א×Ē ×”×Ēמונה הזו ולמחוק א×Ē ×Š××¨ ה×Ēמונו×Ē", "failed_to_load_asset": "ט×ĸינ×Ē ×”×Ēמונה נכשלה", "failed_to_load_assets": "ט×ĸינ×Ē ×”×Ēמונו×Ē × ×›×Š×œ×”", + "failed_to_load_notifications": "איר×ĸה שגיאה ב×ĸ×Ē ×˜×ĸינ×Ē ×”×”×Ēראו×Ē", "failed_to_load_people": "נכשל באחזור אנשים", "failed_to_remove_product_key": "הסר×Ē ×ž×¤×Ēח מו×Ļר נכשלה", "failed_to_stack_assets": "י×Ļיר×Ē ×ĸרימ×Ē ×Ēמונו×Ē × ×›×Š×œ×”", "failed_to_unstack_assets": "ביטול ×ĸרימ×Ē ×Ēמונו×Ē × ×›×Š×œ×”", + "failed_to_update_notification_status": "שגיאה ב×ĸדכון הה×Ēראה", "import_path_already_exists": "× ×Ēיב הייבוא הזה כבר קיים.", "incorrect_email_or_password": "דוא\"ל או סיסמה שגויים", "paths_validation_failed": "{paths, plural, one {× ×Ēיב # נכשל} other {# × ×Ēיבים נכשלו}} אימו×Ē", @@ -1177,7 +1175,7 @@ "map": "מפה", "map_assets_in_bound": "×Ēמונה {}", "map_assets_in_bounds": "{} ×Ēמונו×Ē", - "map_cannot_get_user_location": "לא ני×Ēן לקבל א×Ē ×ž×™×§×•× המש×Ēמ׊", + "map_cannot_get_user_location": "לא ני×Ēן לקבו×ĸ א×Ē ×ž×™×§×•× המש×Ēמ׊", "map_location_dialog_yes": "כן", "map_location_picker_page_use_location": "הש×Ēמ׊ במיקום הזה", "map_location_service_disabled_content": "שירו×Ē ×”×ž×™×§×•× ×Ļריך להיו×Ē ×ž×•×¤×ĸל כדי לה×Ļיג ×Ēמונו×Ē ×ž×”×ž×™×§×•× הנוכחי שלך. האם בר×Ļונך להפ×ĸיל או×Ēו ×ĸכשיו?", @@ -1199,6 +1197,9 @@ "map_settings_only_show_favorites": "ה×Ļג מו×ĸדפים בלבד", "map_settings_theme_settings": "×ĸרכ×Ē × ×•×Š× למפה", "map_zoom_to_see_photos": "הקטן א×Ē ×”×Ē×Ļוגה כדי לראו×Ē ×Ēמונו×Ē", + "mark_all_as_read": "סמן הכל כנקרא", + "mark_as_read": "סמן כנקרא", + "marked_all_as_read": "כל הה×Ēראו×Ē ×Ą×•×ž× ×• כנקראו", "matches": "ה×Ēאמו×Ē", "media_type": "סוג מדיה", "memories": "זכרונו×Ē", @@ -1257,6 +1258,8 @@ "no_favorites_message": "×”×•×Ą×Ŗ מו×ĸדפים כדי למ×Ļוא במהירו×Ē ××Ē ×”×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× הכי טובים שלך", "no_libraries_message": "×Ļור ספרייה חי×Ļוני×Ē ×›×“×™ לראו×Ē ××Ē ×”×Ēמונו×Ē ×•×”×Ą×¨×˜×•× ×™× שלך", "no_name": "אין ׊ם", + "no_notifications": "אין ה×Ēראו×Ē", + "no_people_found": "לא נמ×Ļאו אנשים ×Ēואמים", "no_places": "אין מקומו×Ē", "no_results": "אין ×Ēו×Ļאו×Ē", "no_results_description": "נסה להש×Ēמ׊ במילה נרדפ×Ē ××• במיל×Ē ×ž×¤×Ēח יו×Ēר כללי×Ē", @@ -1377,7 +1380,7 @@ "profile_drawer_app_logs": "יומן", "profile_drawer_client_out_of_date_major": "גרס×Ē ×”×™×™×Š×•× לנייד מיושנ×Ē. נא ל×ĸדכן לגרסה הראשי×Ē ×”××—×¨×•× ×”.", "profile_drawer_client_out_of_date_minor": "גרס×Ē ×”×™×™×Š×•× לנייד מיושנ×Ē. נא ל×ĸדכן לגרסה המשני×Ē ×”××—×¨×•× ×”.", - "profile_drawer_client_server_up_to_date": "הלקוח והשר×Ē ×”× מ×ĸודכנים", + "profile_drawer_client_server_up_to_date": "היישום והשר×Ē ×ž×ĸודכנים", "profile_drawer_github": "GitHub", "profile_drawer_server_out_of_date_major": "השר×Ē ××™× ×• מ×ĸודכן. נא ל×ĸדכן לגרסה הראשי×Ē ×”××—×¨×•× ×”.", "profile_drawer_server_out_of_date_minor": "השר×Ē ××™× ×• מ×ĸודכן. נא ל×ĸדכן לגרסה המשני×Ē ×”××—×¨×•× ×”.", @@ -1432,6 +1435,8 @@ "recent_searches": "חיפושים אחרונים", "recently_added": "× ×•×Ą×Ŗ לאחרונה", "recently_added_page_title": "× ×•×Ą×Ŗ לאחרונה", + "recently_taken": "×Ļולם לאחרונה", + "recently_taken_page_title": "×Ļולם לאחרונה", "refresh": "ר×ĸנן", "refresh_encoded_videos": "ר×ĸנן סרטונים מקודדים", "refresh_faces": "ר×ĸנן פנים", @@ -1566,6 +1571,7 @@ "select_keep_all": "בחר שמור הכל", "select_library_owner": "בחר א×Ē ×”×‘×ĸלים של הספרייה", "select_new_face": "בחר פנים חדשו×Ē", + "select_person_to_tag": "בחר אדם ל×Ēיוג", "select_photos": "בחר ×Ēמונו×Ē", "select_trash_all": "בחר ה×ĸבר הכל לאשפה", "select_user_for_sharing_page_err_album": "י×Ļיר×Ē ××œ×‘×•× נכשלה", @@ -1576,8 +1582,8 @@ "server_endpoint": "נקוד×Ē ×§×Ļה ׊ר×Ē", "server_info_box_app_version": "גרס×Ē ×™×™×Š×•×", "server_info_box_server_url": "כ×Ēוב×Ē ×Š×¨×Ē", - "server_offline": "׊ר×Ē ×œ× מקוון", - "server_online": "׊ר×Ē ×ž×§×•×•×Ÿ", + "server_offline": "השר×Ē ×ž× ×•×Ē×§", + "server_online": "החיבור לשר×Ē ×¤×ĸיל", "server_stats": "סטטיסטיקו×Ē ×Š×¨×Ē", "server_version": "גרס×Ē ×Š×¨×Ē", "set": "הגדר", @@ -1712,7 +1718,7 @@ "sort_people_by_similarity": "מיין אנשים לפי דמיון", "sort_recent": "×Ēמונה אחרונה ביו×Ēר", "sort_title": "כו×Ēר×Ē", - "source": "מקור", + "source": "קוד מקור", "stack": "×ĸרימה", "stack_duplicates": "×Ļור ×ĸרימ×Ē ×›×¤×™×œ×•×™×•×Ē", "stack_select_one_photo": "בחר ×Ēמונה ראשי×Ē ××—×Ē ×ĸבור ה×ĸרימה", @@ -1754,7 +1760,7 @@ "theme": "×ĸרכ×Ē × ×•×Š×", "theme_selection": "בחיר×Ē ×ĸרכ×Ē × ×•×Š×", "theme_selection_description": "הגדר אוטומטי×Ē ××Ē ×ĸרכ×Ē ×”× ×•×Š× לבהיר או כהה בה×Ēבסס ×ĸל ה×ĸדפ×Ē ×”×ž×ĸרכ×Ē ×Š×œ הדפדפן שלך", - "theme_setting_asset_list_storage_indicator_title": "ה×Ļג סטטוס אחסון ×ĸל גבי ה×Ēמונו×Ē", + "theme_setting_asset_list_storage_indicator_title": "ה×Ļג סטטוס גיבוי ×ĸל גבי ה×Ēמונו×Ē", "theme_setting_asset_list_tiles_per_row_title": "מספר ×Ēמונו×Ē ×‘×›×œ שורה ({})", "theme_setting_colorful_interface_subtitle": "החל א×Ē ×”×Ļב×ĸ ה×ĸיקרי למשטחי רק×ĸ.", "theme_setting_colorful_interface_title": "ממ׊ק ×Ļב×ĸוני", diff --git a/i18n/hi.json b/i18n/hi.json index 50c17d9e5d..8be95c4389 100644 --- a/i18n/hi.json +++ b/i18n/hi.json @@ -171,20 +171,13 @@ "oauth_auto_register": "ā¤‘ā¤ŸāĨ‹ ⤰⤜ā¤ŋ⤏āĨā¤Ÿā¤°", "oauth_auto_register_description": "OAuth ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤‡ā¤¨ ⤇⤍ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ā¤Ŧā¤žā¤Ļ ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ā¤¨ā¤ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤žā¤“⤂ ⤕āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ⤕⤰āĨ‡ā¤‚", "oauth_button_text": "⤟āĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤Ŧ⤟⤍", - "oauth_client_id": "⤗āĨā¤°ā¤žā¤šā¤• ID", - "oauth_client_secret": "⤗āĨā¤°ā¤žā¤šā¤• ⤗āĨā¤ĒāĨā¤¤", "oauth_enable_description": "OAuth ⤏āĨ‡ ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤕⤰āĨ‡ā¤‚", - "oauth_issuer_url": "ā¤œā¤žā¤°āĨ€ā¤•⤰āĨā¤¤ā¤ž URL", "oauth_mobile_redirect_uri": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ⤰āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ⤝āĨ‚ā¤†ā¤°ā¤†ā¤ˆ", "oauth_mobile_redirect_uri_override": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ⤰āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ⤝āĨ‚ā¤†ā¤°ā¤†ā¤ˆ ⤓ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą", "oauth_mobile_redirect_uri_override_description": "⤏⤕āĨā¤ˇā¤Ž ⤕⤰āĨ‡ā¤‚ ⤜ā¤Ŧ 'app.immitch:/' ā¤ā¤• ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ⤰āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ⤝āĨ‚ā¤†ā¤°ā¤†ā¤ˆ ā¤šāĨ‹āĨ¤", - "oauth_profile_signing_algorithm": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤ā¤˛āĨā¤—āĨ‹ā¤°ā¤ŋā¤ĨāĨā¤Ž", - "oauth_profile_signing_algorithm_description": "⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ē⤰ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤ā¤˛āĨā¤—āĨ‹ā¤°ā¤ŋā¤Ļā¤Ž ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", - "oauth_scope": "⤏āĨā¤•āĨ‹ā¤Ē", "oauth_settings": "⤓⤑ā¤Ĩ", "oauth_settings_description": "OAuth ⤞āĨ‰ā¤—ā¤ŋ⤍ ⤏āĨ‡ā¤Ÿā¤ŋ⤂⤗ ā¤ĒāĨā¤°ā¤Ŧ⤂⤧ā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚", "oauth_settings_more_details": "⤇⤏ ⤏āĨā¤ĩā¤ŋā¤§ā¤ž ⤕āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ⤅⤧ā¤ŋ⤕ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ⤕āĨ‡ ⤞ā¤ŋā¤, ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚ ā¤ĄāĨ‰ā¤•āĨā¤¸āĨ¤", - "oauth_signing_algorithm": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤ā¤˛āĨā¤—āĨ‹ā¤°ā¤ŋā¤ĨāĨā¤Ž", "oauth_storage_label_claim": "ā¤­ā¤‚ā¤Ąā¤žā¤°ā¤Ŗ ⤞āĨ‡ā¤Ŧ⤞ ā¤•ā¤ž ā¤Ļā¤žā¤ĩā¤ž", "oauth_storage_label_claim_description": "⤇⤏ ā¤Ļā¤žā¤ĩāĨ‡ ⤕āĨ‡ ā¤ŽāĨ‚⤞āĨā¤¯ ā¤Ē⤰ ⤉ā¤Ē⤝āĨ‹ā¤—⤕⤰āĨā¤¤ā¤ž ⤕āĨ‡ ā¤­ā¤‚ā¤Ąā¤žā¤°ā¤Ŗ ⤞āĨ‡ā¤Ŧ⤞ ⤕āĨ‹ ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤰āĨ‚ā¤Ē ⤏āĨ‡ ⤏āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚āĨ¤", "oauth_storage_quota_claim": "ā¤­ā¤‚ā¤Ąā¤žā¤°ā¤Ŗ ⤕āĨ‹ā¤Ÿā¤ž ā¤•ā¤ž ā¤Ļā¤žā¤ĩā¤ž", diff --git a/i18n/hr.json b/i18n/hr.json index a30de885cd..4566544b50 100644 --- a/i18n/hr.json +++ b/i18n/hr.json @@ -39,17 +39,17 @@ "authentication_settings_disable_all": "Jeste li sigurni da Åželite onemogućenit sve načine prijave? Prijava će biti potpuno onemogućena.", "authentication_settings_reenable": "Za ponovno uključivanje upotrijebite naredbu posluÅžitelja.", "background_task_job": "Pozadinski zadaci", - "backup_database": "Sigurnosna kopija baze podataka", + "backup_database": "Kreiraj sigurnosnu kopiju baze podataka", "backup_database_enable_description": "Omogućite sigurnosne kopije baze podataka", "backup_keep_last_amount": "Količina prethodnih sigurnosnih kopija za čuvanje", "backup_settings": "Postavke sigurnosne kopije", - "backup_settings_description": "Upravljanje postavkama sigurnosne kopije baze podataka", + "backup_settings_description": "Upravljajte postavkama izvoza baze podataka. Napomena: Ovi zadaci nisu nadzirani i nećete biti obavijeÅĄteni u slučaju neuspjeha.", "check_all": "Provjeri sve", "cleanup": "ČiÅĄÄ‡enje", "cleared_jobs": "Izbrisani poslovi za: {job}", "config_set_by_file": "Konfiguracija je trenutno postavljena konfiguracijskom datotekom", "confirm_delete_library": "Jeste li sigurni da Åželite izbrisati biblioteku {library}?", - "confirm_delete_library_assets": "Jeste li sigurni da Åželite izbrisati ovu biblioteku? Time će se izbrisati sva {count} sadrÅžana sredstva iz Immicha i ne moÅže se poniÅĄtiti. Datoteke će ostati na disku.", + "confirm_delete_library_assets": "Jeste li sigurni da Åželite izbrisati ovu biblioteku? Time će {count, plural, one {biti izbrisana # sadrÅžana stavka} few {biti izbrisane sve # sadrÅžane stavke} other {biti izbrisano svih # sadrÅžanih stavki}} iz Immicha i to se ne moÅže poniÅĄtiti. Datoteke će ostati na disku.", "confirm_email_below": "Za potvrdu upiÅĄite \"{email}\" ispod", "confirm_reprocess_all_faces": "Jeste li sigurni da Åželite ponovno obraditi sva lica? Ovo će također obrisati imenovane osobe.", "confirm_user_password_reset": "Jeste li sigurni da Åželite poniÅĄtiti lozinku korisnika {user}?", @@ -96,7 +96,7 @@ "job_settings": "Postavke posla", "job_settings_description": "Upravljajte istovremenoÅĄÄ‡u poslova", "job_status": "Status posla", - "jobs_delayed": "{jobCount, plural, other {# delayed}}", + "jobs_delayed": "{jobCount, plural, other {# odgođenih}}", "jobs_failed": "{jobCount, plural, other {# failed}}", "library_created": "Stvorena biblioteka: {library}", "library_deleted": "Biblioteka izbrisana", @@ -192,20 +192,13 @@ "oauth_auto_register": "Automatska registracija", "oauth_auto_register_description": "Automatski registrirajte nove korisnike nakon prijave s OAuth", "oauth_button_text": "Tekst gumba", - "oauth_client_id": "ID Klijenta", - "oauth_client_secret": "Tajna Klijenta", "oauth_enable_description": "Prijavite se putem OAutha", - "oauth_issuer_url": "URL Izdavatelja", "oauth_mobile_redirect_uri": "Mobilnog Preusmjeravanja URI", "oauth_mobile_redirect_uri_override": "Nadjačavanje URI-preusmjeravanja za mobilne uređaje", "oauth_mobile_redirect_uri_override_description": "Omogući kada pruÅžatelj OAuth ne dopuÅĄta mobilni URI, poput '{callback}'", - "oauth_profile_signing_algorithm": "Algoritam za potpisivanje profila", - "oauth_profile_signing_algorithm_description": "Algoritam koji se koristi za potpisivanje korisničkog profila.", - "oauth_scope": "Opseg", "oauth_settings": "OAuth", "oauth_settings_description": "Upravljanje postavkama za prijavu kroz OAuth", "oauth_settings_more_details": "Za viÅĄe pojedinosti o ovoj značajci pogledajte uputstva.", - "oauth_signing_algorithm": "Algoritam potpisivanja", "oauth_storage_label_claim": "PotraÅživanje oznake za pohranu", "oauth_storage_label_claim_description": "Automatski postavite korisničku oznaku za pohranu na vrijednost ovog zahtjeva.", "oauth_storage_quota_claim": "Zahtjev za kvotom pohrane", @@ -357,18 +350,18 @@ "user_password_reset_description": "Molimo dostavite privremenu lozinku korisniku i obavijestite ga da će morati promijeniti lozinku pri sljedećoj prijavi.", "user_restore_description": "Račun korisnika {user} bit će vraćen.", "user_restore_scheduled_removal": "Vrati korisnika - zakazano uklanjanje {date, date, long}", - "user_settings": "Korisničke Postavke", + "user_settings": "Korisničke postavke", "user_settings_description": "Upravljanje korisničkim postavkama", "user_successfully_removed": "Korisnik {email} je uspjeÅĄno uklonjen.", "version_check_enabled_description": "Omogući provjeru verzije", "version_check_implications": "Značajka provjere verzije oslanja se na periodičnu komunikaciju s github.com", - "version_check_settings": "Provjera Verzije", + "version_check_settings": "Provjera verzije", "version_check_settings_description": "Omogućite/onemogućite obavijest o novoj verziji", "video_conversion_job": "Transkodiranje videozapisa", "video_conversion_job_description": "Transkodiranje videozapisa za veću kompatibilnost s preglednicima i uređajima" }, "admin_email": "E-poÅĄta administratora", - "admin_password": "Admin Lozinka", + "admin_password": "Admin lozinka", "administration": "Administracija", "advanced": "Napredno", "advanced_settings_enable_alternate_media_filter_subtitle": "Koristite ovu opciju za filtriranje medija tijekom sinkronizacije na temelju alternativnih kriterija. PokuÅĄajte ovo samo ako imate problema s aplikacijom koja ne prepoznaje sve albume.", @@ -377,7 +370,7 @@ "advanced_settings_prefer_remote_subtitle": "Neki uređaji sporo učitavaju sličice s resursa na uređaju. Aktivirajte ovu postavku kako biste umjesto toga učitali slike s udaljenih izvora.", "advanced_settings_prefer_remote_title": "Preferiraj udaljene slike", "advanced_settings_proxy_headers_subtitle": "Definirajte zaglavlja posrednika koja Immich treba slati sa svakim mreÅžnim zahtjevom.", - "advanced_settings_proxy_headers_title": "Zaglavlja Posrednika", + "advanced_settings_proxy_headers_title": "Proxy zaglavlja", "advanced_settings_self_signed_ssl_subtitle": "Preskoči provjeru SSL certifikata za krajnju točku posluÅžitelja. Potrebno za samo-potpisane certifikate.", "advanced_settings_self_signed_ssl_title": "Dopusti samo-potpisane SSL certifikate", "advanced_settings_sync_remote_deletions_subtitle": "Automatski izbriÅĄi ili obnovi resurs na ovom uređaju kada se ta radnja izvrÅĄi na webu", @@ -385,9 +378,9 @@ "advanced_settings_tile_subtitle": "Postavke za napredne korisnike", "advanced_settings_troubleshooting_subtitle": "Omogući dodatne značajke za rjeÅĄavanje problema", "advanced_settings_troubleshooting_title": "RjeÅĄavanje problema", - "age_months": "Dob {months, plural, one {# month} other {# months}}", - "age_year_months": "Dob 1 godina, {months, plural, one {# month} other {# months}}", - "age_years": "{years, plural, other {Age #}}", + "age_months": "Dob {months, plural, one {# mjesec} other {# mjeseca}}", + "age_year_months": "Dob 1 godina, {months, plural, one {# mjesec} other {# mjeseca}}", + "age_years": "{years, plural, other {Dob #}}", "album_added": "Album dodan", "album_added_notification_setting_description": "Primite obavijest e-poÅĄtom kada ste dodani u dijeljeni album", "album_cover_updated": "Naslovnica albuma aÅžurirana", @@ -398,7 +391,7 @@ "album_info_updated": "Podaci o albumu aÅžurirani", "album_leave": "Napustiti album?", "album_leave_confirmation": "Jeste li sigurni da Åželite napustiti {album}?", - "album_name": "Naziv Albuma", + "album_name": "Naziv albuma", "album_options": "Opcije albuma", "album_remove_user": "Ukloni korisnika?", "album_remove_user_confirmation": "Jeste li sigurni da Åželite ukloniti {user}?", @@ -444,7 +437,7 @@ "archive": "Arhiva", "archive_or_unarchive_photo": "Arhivirajte ili dearhivirajte fotografiju", "archive_page_no_archived_assets": "Nema arhiviranih resursa", - "archive_page_title": "Arhiviraj {{}}", + "archive_page_title": "Arhiviraj ({})", "archive_size": "Veličina arhive", "archive_size_description": "Konfigurirajte veličinu arhive za preuzimanja (u GiB)", "archived": "Ahrivirano", @@ -501,7 +494,7 @@ "back_close_deselect": "Natrag, zatvorite ili poniÅĄtite odabir", "background_location_permission": "Dozvola za lokaciju u pozadini", "background_location_permission_content": "Kako bi prebacivao mreÅže dok radi u pozadini, Immich mora *uvijek* imati pristup preciznoj lokaciji kako bi aplikacija mogla pročitati naziv Wi-Fi mreÅže", - "backup_album_selection_page_albums_device": "Albumi na uređaju {{}}", + "backup_album_selection_page_albums_device": "Albumi na uređaju ({})", "backup_album_selection_page_albums_tap": "Dodirnite za uključivanje, dvostruki dodir za isključivanje", "backup_album_selection_page_assets_scatter": "Resursi mogu biti raspoređeni u viÅĄe albuma. Stoga, albumi mogu biti uključeni ili isključeni tijekom procesa sigurnosnog kopiranja.", "backup_album_selection_page_select_albums": "Odabrani albumi", @@ -579,29 +572,47 @@ "cache_settings_clear_cache_button_title": "BriÅĄe predmemoriju aplikacije. Ovo će značajno utjecati na performanse aplikacije dok se predmemorija ponovno ne izgradi.", "cache_settings_duplicated_assets_clear_button": "OČISTI", "cache_settings_duplicated_assets_subtitle": "Fotografije i videozapisi koje je aplikacija stavila na crnu listu", - "cache_settings_duplicated_assets_title": "Duplicirani Resursi ({})", + "cache_settings_duplicated_assets_title": "Duplicirani resursi ({})", "cache_settings_image_cache_size": "Veličina predmemorije slika ({} resursa)", "cache_settings_statistics_album": "Sličice biblioteke", "cache_settings_statistics_assets": "{} resursa ({})", "cache_settings_statistics_full": "Pune slike", + "cache_settings_statistics_shared": "Sličice dijeljenih albuma", + "cache_settings_statistics_thumbnail": "Sličice", + "cache_settings_statistics_title": "KoriÅĄtenje predmemorije", + "cache_settings_subtitle": "Upravljajte ponaÅĄanjem predmemorije mobilne aplikacije Immich", + "cache_settings_thumbnail_size": "Veličina predmemorije sličica ({} stavki)", + "cache_settings_tile_subtitle": "Upravljajte ponaÅĄanjem lokalne pohrane", + "cache_settings_tile_title": "Lokalna pohrana", + "cache_settings_title": "Postavke predmemorije", "camera": "Kamera", "camera_brand": "Marka kamere", "camera_model": "Model kamere", "cancel": "OtkaÅži", "cancel_search": "OtkaÅži pretragu", + "canceled": "Otkazano", "cannot_merge_people": "Nije moguće spojiti osobe", "cannot_undo_this_action": "Ne moÅžete poniÅĄtiti ovu radnju!", "cannot_update_the_description": "Nije moguće aÅžurirati opis", "change_date": "Promjena datuma", + "change_display_order": "Promijeni redoslijed prikaza", "change_expiration_time": "Promjena vremena isteka", "change_location": "Promjena lokacije", "change_name": "Promjena imena", "change_name_successfully": "Promijena imena uspjeÅĄna", "change_password": "Promjena Lozinke", "change_password_description": "Ovo je ili prvi put da se prijavljujete u sustav ili je poslan zahtjev za promjenom lozinke. Unesite novu lozinku ispod.", + "change_password_form_confirm_password": "Potvrdi lozinku", + "change_password_form_description": "Pozdrav {name},\n\nOvo je ili prvi put da se prijavljujete u sustav ili je zatraÅžena promjena vaÅĄe lozinke. Molimo unesite novu lozinku dolje.", + "change_password_form_new_password": "Nova lozinka", + "change_password_form_password_mismatch": "Lozinke se ne podudaraju", + "change_password_form_reenter_new_password": "Ponovno unesite novu lozinku", "change_your_password": "Promijenite lozinku", "changed_visibility_successfully": "Vidljivost je uspjeÅĄno promijenjena", "check_all": "Provjeri Sve", + "check_corrupt_asset_backup": "Provjeri oÅĄtećene sigurnosne kopije stavki", + "check_corrupt_asset_backup_button": "IzvrÅĄi provjeru", + "check_corrupt_asset_backup_description": "Pokrenite ovu provjeru samo putem Wi-Fi mreÅže i nakon ÅĄto su sve stavke sigurnosno kopirane. Postupak moÅže potrajati nekoliko minuta.", "check_logs": "Provjera Zapisa", "choose_matching_people_to_merge": "Odaberite odgovarajuće osobe za spajanje", "city": "Grad", @@ -610,6 +621,14 @@ "clear_all_recent_searches": "IzbriÅĄi sva nedavna pretraÅživanja", "clear_message": "Jasna poruka", "clear_value": "Očisti vrijednost", + "client_cert_dialog_msg_confirm": "U redu", + "client_cert_enter_password": "Unesite lozinku", + "client_cert_import": "Uvezi", + "client_cert_import_success_msg": "Klijentski certifikat je uvezen", + "client_cert_invalid_msg": "Neispravna datoteka certifikata ili pogreÅĄna lozinka", + "client_cert_remove_msg": "Klijentski certifikat je uklonjen", + "client_cert_subtitle": "PodrÅžava samo PKCS12 (.p12, .pfx) format. Uvoz/uklanjanje certifikata moguće je samo prije prijave", + "client_cert_title": "SSL klijentski certifikat", "clockwise": "U smjeru kazaljke na satu", "close": "Zatvori", "collapse": "SaÅžmi", @@ -620,15 +639,27 @@ "comment_options": "Opcije komentara", "comments_and_likes": "Komentari i lajkovi", "comments_are_disabled": "Komentari onemogućeni", + "common_create_new_album": "Kreiraj novi album", + "common_server_error": "Provjerite svoju mreÅžnu vezu, osigurajte da je posluÅžitelj dostupan i da su verzije aplikacije/posluÅžitelja kompatibilne.", + "completed": "DovrÅĄeno", "confirm": "Potvrdi", "confirm_admin_password": "Potvrdite lozinku administratora", - "confirm_delete_face": "Jeste li sigurni da Åželite izbrisati lice {name} iz knjiÅžnice materijala.", + "confirm_delete_face": "Jeste li sigurni da Åželite izbrisati lice {name} iz resursa?", "confirm_delete_shared_link": "Jeste li sigurni da Åželite izbrisati ovu zajedničku vezu?", "confirm_keep_this_delete_others": "Sva druga sredstva u nizu bit će izbrisana osim ovog sredstva. Jeste li sigurni da Åželite nastaviti?", "confirm_password": "Potvrdite lozinku", "contain": "SadrÅži", "context": "Kontekst", "continue": "Nastavi", + "control_bottom_app_bar_album_info_shared": "{} stavki ¡ Dijeljeno", + "control_bottom_app_bar_create_new_album": "Kreiraj novi album", + "control_bottom_app_bar_delete_from_immich": "IzbriÅĄi iz Immicha", + "control_bottom_app_bar_delete_from_local": "IzbriÅĄi s uređaja", + "control_bottom_app_bar_edit_location": "Uredi lokaciju", + "control_bottom_app_bar_edit_time": "Uredi datum i vrijeme", + "control_bottom_app_bar_share_link": "Podijeli poveznicu", + "control_bottom_app_bar_share_to": "Podijeli s...", + "control_bottom_app_bar_trash_from_immich": "Premjesti u smeće", "copied_image_to_clipboard": "Slika je kopirana u međuspremnik.", "copied_to_clipboard": "Kopirano u međuspremnik!", "copy_error": "GreÅĄka kopiranja", @@ -643,45 +674,71 @@ "covers": "Naslovnice", "create": "Kreiraj", "create_album": "Kreiraj album", + "create_album_page_untitled": "Bez naslova", "create_library": "Kreiraj Biblioteku", "create_link": "Kreiraj poveznicu", "create_link_to_share": "Izradite vezu za dijeljenje", "create_link_to_share_description": "Dopusti svakome s vezom da vidi odabrane fotografije", + "create_new": "KREIRAJ NOVO", "create_new_person": "Stvorite novu osobu", "create_new_person_hint": "Dodijelite odabrana sredstva novoj osobi", "create_new_user": "Kreiraj novog korisnika", + "create_shared_album_page_share_add_assets": "DODAJ STAVKE", + "create_shared_album_page_share_select_photos": "Odaberi fotografije", "create_tag": "Stvori oznaku", "create_tag_description": "Napravite novu oznaku. Za ugnijeŞđene oznake unesite punu putanju oznake uključujući kose crte.", "create_user": "Stvori korisnika", "created": "Stvoreno", + "crop": "ObreÅži", + "curated_object_page_title": "Stvari", "current_device": "Trenutačni uređaj", + "current_server_address": "Trenutna adresa posluÅžitelja", "custom_locale": "Prilagođena Lokalizacija", "custom_locale_description": "Formatiranje datuma i brojeva na temelju jezika i regije", + "daily_title_text_date": "E, MMM dd", + "daily_title_text_date_year": "E, MMM dd, yyyy", "dark": "Tamno", "date_after": "Datum nakon", "date_and_time": "Datum i Vrijeme", "date_before": "Datum prije", + "date_format": "E, LLL d, y â€ĸ h:mm a", "date_of_birth_saved": "Datum rođenja uspjeÅĄno spremljen", "date_range": "Razdoblje", "day": "Dan", "deduplicate_all": "Dedupliciraj Sve", + "deduplication_criteria_1": "Veličina slike u bajtovima", + "deduplication_criteria_2": "Broj EXIF podataka", + "deduplication_info": "Informacije o uklanjanju duplikata", + "deduplication_info_description": "Za automatski odabir stavki i masovno uklanjanje duplikata, uzimamo u obzir:", "default_locale": "Zadana lokalizacija", "default_locale_description": "Oblikujte datume i brojeve na temelju jezika preglednika", "delete": "IzbriÅĄi", "delete_album": "IzbriÅĄi album", "delete_api_key_prompt": "Jeste li sigurni da Åželite izbrisati ovaj API ključ?", + "delete_dialog_alert": "Ove stavke bit će trajno izbrisane iz Immicha i s vaÅĄeg uređaja", + "delete_dialog_alert_local": "Ove stavke bit će trajno uklonjene s vaÅĄeg uređaja, ali će i dalje biti dostupne na Immich posluÅžitelju", + "delete_dialog_alert_local_non_backed_up": "Neke od stavki nisu sigurnosno kopirane na Immich i bit će trajno uklonjene s vaÅĄeg uređaja", + "delete_dialog_alert_remote": "Ove stavke bit će trajno izbrisane s Immich posluÅžitelja", + "delete_dialog_ok_force": "IzbriÅĄi svejedno", + "delete_dialog_title": "Trajno izbriÅĄi", "delete_duplicates_confirmation": "Jeste li sigurni da Åželite trajno izbrisati ove duplikate?", + "delete_face": "IzbriÅĄi lice", "delete_key": "Ključ za brisanje", "delete_library": "IzbriÅĄi knjiÅžnicu", "delete_link": "IzbriÅĄi poveznicu", + "delete_local_dialog_ok_backed_up_only": "IzbriÅĄi samo sigurnosno kopirane", + "delete_local_dialog_ok_force": "IzbriÅĄi svejedno", "delete_others": "IzbriÅĄi druge", "delete_shared_link": "IzbriÅĄi dijeljenu poveznicu", + "delete_shared_link_dialog_title": "IzbriÅĄi dijeljenu poveznicu", "delete_tag": "IzbriÅĄi oznaku", "delete_tag_confirmation_prompt": "Jeste li sigurni da Åželite izbrisati oznaku {tagName}?", "delete_user": "IzbriÅĄi korisnika", "deleted_shared_link": "Izbrisana dijeljena poveznica", "deletes_missing_assets": "BriÅĄe sredstva koja nedostaju s diska", "description": "Opis", + "description_input_hint_text": "Dodaj opis...", + "description_input_submit_error": "PogreÅĄka pri aÅžuriranju opisa, provjerite zapisnik za viÅĄe detalja", "details": "Detalji", "direction": "Smjer", "disabled": "Onemogućeno", @@ -698,12 +755,26 @@ "documentation": "Dokumentacija", "done": "Gotovo", "download": "Preuzmi", + "download_canceled": "Preuzimanje otkazano", + "download_complete": "Preuzimanje zavrÅĄeno", + "download_enqueue": "Preuzimanje dodano u red", + "download_error": "PogreÅĄka pri preuzimanju", + "download_failed": "Preuzimanje nije uspjelo", + "download_filename": "datoteka: {}", + "download_finished": "Preuzimanje zavrÅĄeno", "download_include_embedded_motion_videos": "Ugrađeni videozapisi", "download_include_embedded_motion_videos_description": "Uključite videozapise ugrađene u fotografije s pokretom kao zasebnu datoteku", + "download_notfound": "Preuzimanje nije pronađeno", + "download_paused": "Preuzimanje pauzirano", "download_settings": "Preuzmi", "download_settings_description": "Upravljajte postavkama koje se odnose na preuzimanje sredstava", + "download_started": "Preuzimanje započeto", + "download_sucess": "Preuzimanje uspjeÅĄno", + "download_sucess_android": "Medij je preuzet u DCIM/Immich", + "download_waiting_to_retry": "Čeka se ponovni pokuÅĄaj", "downloading": "Preuzimanje", "downloading_asset_filename": "Preuzimanje materijala {filename}", + "downloading_media": "Preuzimanje medija", "drop_files_to_upload": "Ispustite datoteke bilo gdje za prijenos", "duplicates": "Duplikati", "duplicates_description": "RazrijeÅĄite svaku grupu tako da naznačite koji su duplikati, ako ih ima", @@ -720,6 +791,7 @@ "edit_key": "Ključ za uređivanje", "edit_link": "Uredi poveznicu", "edit_location": "Uredi lokaciju", + "edit_location_dialog_title": "Lokacija", "edit_name": "Uredi ime", "edit_people": "Uredi ljude", "edit_tag": "Uredi oznaku", @@ -732,19 +804,25 @@ "editor_crop_tool_h2_aspect_ratios": "Omjeri stranica", "editor_crop_tool_h2_rotation": "Rotacija", "email": "E-poÅĄta", + "empty_folder": "Ova mapa je prazna", "empty_trash": "Isprazni smeće", "empty_trash_confirmation": "Jeste li sigurni da Åželite isprazniti smeće? Time će se iz Immicha trajno ukloniti sva sredstva u otpadu.\nNe moÅžete poniÅĄtiti ovu radnju!", "enable": "Omogući", "enabled": "Omogućeno", "end_date": "Datum zavrÅĄetka", + "enqueued": "Dodano u red", + "enter_wifi_name": "Unesite naziv Wi-Fi mreÅže", "error": "GreÅĄka", + "error_change_sort_album": "Nije moguće promijeniti redoslijed albuma", + "error_delete_face": "PogreÅĄka pri brisanju lica sa stavke", "error_loading_image": "PogreÅĄka pri učitavanju slike", + "error_saving_image": "PogreÅĄka: {}", "error_title": "GreÅĄka - NeÅĄto je poÅĄlo krivo", "errors": { "cannot_navigate_next_asset": "Nije moguće prijeći na sljedeći materijal", "cannot_navigate_previous_asset": "Nije moguće prijeći na prethodni materijal", "cant_apply_changes": "Nije moguće primijeniti promjene", - "cant_change_activity": "Ne mogu {enabled, select, true {disable} druge {enable}} aktivnosti", + "cant_change_activity": "Ne moÅže se {enabled, select, true {onemogućiti} ostalo {omogućiti}} aktivnost", "cant_change_asset_favorite": "Nije moguće promijeniti favorita za sredstvo", "cant_change_metadata_assets_count": "Nije moguće promijeniti metapodatke {count, plural, one {# asset} other {# assets}}", "cant_get_faces": "Ne mogu dobiti lica", @@ -784,7 +862,7 @@ "unable_to_add_exclusion_pattern": "Nije moguće dodati uzorak izuzimanja", "unable_to_add_import_path": "Nije moguće dodati putanju uvoza", "unable_to_add_partners": "Nije moguće dodati partnere", - "unable_to_add_remove_archive": "Nije moguće {arhivirano, odabrati, istinito {ukloniti sredstvo iz} druge {dodati sredstvo u}} arhivu", + "unable_to_add_remove_archive": "Ne moÅže se {archived, select, true {ukloniti resurs iz} ostalo {dodati resurs u}} arhivu", "unable_to_add_remove_favorites": "Nije moguće {favorite, select, true {add asset to} other {remove asset from}} favorite", "unable_to_archive_unarchive": "Nije moguće {arhivirati, odabrati, istinito {arhivirati} ostalo {dearhivirati}}", "unable_to_change_album_user_role": "Nije moguće promijeniti ulogu korisnika albuma", @@ -867,8 +945,21 @@ "unable_to_upload_file": "Nije moguće učitati datoteku" }, "exif": "Exif", + "exif_bottom_sheet_description": "Dodaj opis...", + "exif_bottom_sheet_details": "DETALJI", + "exif_bottom_sheet_location": "LOKACIJA", + "exif_bottom_sheet_people": "OSOBE", + "exif_bottom_sheet_person_add_person": "Dodaj ime", + "exif_bottom_sheet_person_age": "Dob {}", + "exif_bottom_sheet_person_age_months": "Dob {} mjeseci", + "exif_bottom_sheet_person_age_year_months": "Dob 1 godina, {} mjeseci", + "exif_bottom_sheet_person_age_years": "Dob {}", "exit_slideshow": "Izađi iz projekcije slideova", "expand_all": "ProÅĄiri sve", + "experimental_settings_new_asset_list_subtitle": "Rad u tijeku", + "experimental_settings_new_asset_list_title": "Omogući eksperimentalnu mreÅžu fotografija", + "experimental_settings_subtitle": "Koristite na vlastitu odgovornost!", + "experimental_settings_title": "Eksperimentalno", "expire_after": "Istječe nakon", "expired": "Isteklo", "expires_date": "Ističe {date}", @@ -879,10 +970,16 @@ "extension": "ProÅĄirenje (Extension)", "external": "Vanjski", "external_libraries": "Vanjske Biblioteke", + "external_network": "Vanjska mreÅža", + "external_network_sheet_info": "Kada niste na Åželjenoj Wi-Fi mreÅži, aplikacija će se povezati s posluÅžiteljem putem prve dostupne URL adrese s popisa ispod, redom od vrha prema dnu", "face_unassigned": "Nedodijeljeno", + "failed": "NeuspjeÅĄno", + "failed_to_load_assets": "Neuspjelo učitavanje stavki", + "failed_to_load_folder": "Neuspjelo učitavanje mape", "favorite": "Omiljeno", "favorite_or_unfavorite_photo": "Omiljena ili neomiljena fotografija", "favorites": "Omiljene", + "favorites_page_no_favorites": "Nema pronađenih omiljenih stavki", "feature_photo_updated": "Istaknuta fotografija aÅžurirana", "features": "Značajke (Features)", "features_setting_description": "Upravljajte značajkama aplikacije", @@ -890,22 +987,39 @@ "file_name_or_extension": "Naziv ili ekstenzija datoteke", "filename": "Naziv datoteke", "filetype": "Vrsta datoteke", + "filter": "Filtar", "filter_people": "Filtrirajte ljude", + "filter_places": "Filtriraj mjesta", "find_them_fast": "Pronađite ih brzo po imenu pomoću pretraÅživanja", "fix_incorrect_match": "Ispravite netočno podudaranje", + "folder": "Mapa", + "folder_not_found": "Mapa nije pronađena", "folders": "Mape", "folders_feature_description": "Pregledavanje prikaza mape za fotografije i videozapise u sustavu datoteka", "forward": "Naprijed", "general": "Općenito", "get_help": "PotraÅžite pomoć", + "get_wifiname_error": "Nije moguće dohvatiti naziv Wi-Fi mreÅže. Provjerite imate li potrebna dopuÅĄtenja i jeste li povezani na Wi-Fi mreÅžu", "getting_started": "Početak Rada", "go_back": "Idi natrag", + "go_to_folder": "Idi u mapu", "go_to_search": "Idi na pretragu", + "grant_permission": "Dodijeli dopuÅĄtenje", "group_albums_by": "Grupiraj albume po...", + "group_country": "Grupiraj po zemlji", "group_no": "Nema grupiranja", "group_owner": "Grupiraj po vlasniku", + "group_places_by": "Grupiraj mjesta po...", "group_year": "Grupiraj po godini", + "haptic_feedback_switch": "Omogući haptičku povratnu informaciju", + "haptic_feedback_title": "Haptička povratna informacija", "has_quota": "Ima kvotu", + "header_settings_add_header_tip": "Dodaj zaglavlje", + "header_settings_field_validator_msg": "Vrijednost ne moÅže biti prazna", + "header_settings_header_name_input": "Naziv zaglavlja", + "header_settings_header_value_input": "Vrijednost zaglavlja", + "headers_settings_tile_subtitle": "Definirajte proxy zaglavlja koja aplikacija treba slati sa svakim mreÅžnim zahtjevom", + "headers_settings_tile_title": "Prilagođena proxy zaglavlja", "hi_user": "Bok {name} ({email})", "hide_all_people": "Sakrij sve ljude", "hide_gallery": "Sakrij galeriju", @@ -913,6 +1027,20 @@ "hide_password": "Sakrij lozinku", "hide_person": "Sakrij osobu", "hide_unnamed_people": "Sakrij neimenovane osobe", + "home_page_add_to_album_conflicts": "Dodano {added} stavki u album {album}. {failed} stavki je već u albumu.", + "home_page_add_to_album_err_local": "Lokalne stavke joÅĄ nije moguće dodati u albume, preskačem", + "home_page_add_to_album_success": "Dodano {added} stavki u album {album}.", + "home_page_album_err_partner": "JoÅĄ nije moguće dodati partnerske stavke u album, preskačem", + "home_page_archive_err_local": "Lokalne stavke joÅĄ nije moguće arhivirati, preskačem", + "home_page_archive_err_partner": "Partnerske stavke nije moguće arhivirati, preskačem", + "home_page_building_timeline": "Izrada vremenske crte", + "home_page_delete_err_partner": "Nije moguće izbrisati partnerske stavke, preskačem", + "home_page_delete_remote_err_local": "Lokalne stavke su u odabiru za udaljeno brisanje, preskačem", + "home_page_favorite_err_local": "Lokalne stavke joÅĄ nije moguće označiti kao omiljene, preskačem", + "home_page_favorite_err_partner": "Partnerske stavke joÅĄ nije moguće označiti kao omiljene, preskačem", + "home_page_first_time_notice": "Ako prvi put koristite aplikaciju, svakako odaberite album za sigurnosnu kopiju kako bi vremenska crta mogla prikazati fotografije i videozapise", + "home_page_share_err_local": "Lokalne stavke nije moguće dijeliti putem poveznice, preskačem", + "home_page_upload_err_limit": "Moguće je prenijeti najviÅĄe 30 stavki odjednom, preskačem", "host": "Domaćin", "hour": "Sat", "ignore_icloud_photos": "Ignoriraj iCloud fotografije", @@ -942,6 +1070,7 @@ "include_shared_albums": "Uključi dijeljene albume", "include_shared_partner_assets": "Uključite zajedničku imovinu partnera", "individual_share": "Pojedinačni udio", + "individual_shares": "Pojedinačna dijeljenja", "info": "Informacije", "interval": { "day_at_onepm": "Svaki dan u 13 sati", @@ -949,6 +1078,8 @@ "night_at_midnight": "Svaku večer u ponoć", "night_at_twoam": "Svake noći u 2 ujutro" }, + "invalid_date": "Neispravan datum", + "invalid_date_format": "Neispravan format datuma", "invite_people": "Pozovite ljude", "invite_to_album": "Pozovi u album", "items_count": "{count, plural, one {# datoteka} other {# datoteke}}", @@ -964,10 +1095,17 @@ "latest_version": "Najnovija verzija", "latitude": "Zemljopisna ÅĄirina", "leave": "Izađi", + "lens_model": "Model objektiva", "let_others_respond": "Dozvoli da drugi odgovore", "level": "Razina", "library": "Biblioteka", "library_options": "Mogućnosti biblioteke", + "library_page_device_albums": "Albumi na uređaju", + "library_page_new_album": "Novi album", + "library_page_sort_asset_count": "Broj resursa", + "library_page_sort_created": "Datum kreiranja", + "library_page_sort_last_modified": "Zadnja izmjena", + "library_page_sort_title": "Naslov albuma", "light": "Svjetlo", "like_deleted": "Like izbrisan", "link_motion_video": "PoveÅžite videozapis pokreta", @@ -977,12 +1115,42 @@ "list": "Popis", "loading": "Učitavanje", "loading_search_results_failed": "Učitavanje rezultata pretraÅživanja nije uspjelo", + "local_network": "Lokalna mreÅža", + "local_network_sheet_info": "Aplikacija će se povezati s posluÅžiteljem putem ovog URL-a kada koristi određenu Wi-Fi mreÅžu", + "location_permission": "Dozvola za lokaciju", + "location_permission_content": "Kako bi koristio značajku automatskog prebacivanja, Immich treba dozvolu za preciznu lokaciju kako bi mogao očitati naziv trenutne Wi-Fi mreÅže", + "location_picker_choose_on_map": "Odaberi na karti", + "location_picker_latitude_error": "Unesite valjanu geografsku ÅĄirinu", + "location_picker_latitude_hint": "Unesite ovdje svoju geografsku ÅĄirinu", + "location_picker_longitude_error": "Unesite valjanu geografsku duÅžinu", + "location_picker_longitude_hint": "Unesite ovdje svoju geografsku duÅžinu", "log_out": "Odjavi se", "log_out_all_devices": "Odjava sa svih uređaja", "logged_out_all_devices": "Odjavljeni su svi uređaji", "logged_out_device": "Odjavljen uređaj", "login": "Prijava", + "login_disabled": "Prijava je onemogućena", + "login_form_api_exception": "API iznimka. Provjerite URL posluÅžitelja i pokuÅĄajte ponovno.", + "login_form_back_button_text": "Nazad", + "login_form_email_hint": "vasaemaiadresal@email.com", + "login_form_endpoint_hint": "http://your-server-ip:port", + "login_form_endpoint_url": "URL krajnje točke posluÅžitelja", + "login_form_err_http": "Molimo navedite http:// ili https://", + "login_form_err_invalid_email": "NevaÅžeća e-mail adresa", + "login_form_err_invalid_url": "NevaÅžeći URL", + "login_form_err_leading_whitespace": "Početni razmak", + "login_form_err_trailing_whitespace": "ZavrÅĄni razmak", + "login_form_failed_get_oauth_server_config": "PogreÅĄka pri prijavi putem OAuth-a, provjerite URL posluÅžitelja", + "login_form_failed_get_oauth_server_disable": "OAuth mogućnost nije dostupna na ovom posluÅžitelju", + "login_form_failed_login": "PogreÅĄka pri prijavi, provjerite URL posluÅžitelja, e-mail i lozinku", + "login_form_handshake_exception": "DoÅĄlo je do greÅĄke u uspostavi veze s posluÅžiteljem. Omogućite podrÅĄku za samopotpisane certifikate u postavkama ako koristite takav certifikat.", + "login_form_password_hint": "lozinka", + "login_form_save_login": "Ostani prijavljen", + "login_form_server_empty": "Unesite URL posluÅžitelja.", + "login_form_server_error": "Nije moguće povezivanje s posluÅžiteljem.", "login_has_been_disabled": "Prijava je onemogućena.", + "login_password_changed_error": "DoÅĄlo je do pogreÅĄke pri aÅžuriranju lozinke", + "login_password_changed_success": "Lozinka je uspjeÅĄno aÅžurirana", "logout_all_device_confirmation": "Jeste li sigurni da Åželite odjaviti sve uređaje?", "logout_this_device_confirmation": "Jeste li sigurni da se Åželite odjaviti s ovog uređaja?", "longitude": "Zemljopisna duÅžina", @@ -990,6 +1158,7 @@ "loop_videos": "Ponavljajte videozapise", "loop_videos_description": "Omogućite automatsko ponavljanje videozapisa u pregledniku detalja.", "main_branch_warning": "Koristite razvojnu verziju; strogo preporučamo koriÅĄtenje izdane verzije!", + "main_menu": "Glavni izbornik", "make": "Proizvođač", "manage_shared_links": "Upravljanje dijeljenim vezama", "manage_sharing_with_partners": "Upravljajte dijeljenjem s partnerima", @@ -999,13 +1168,40 @@ "manage_your_devices": "Upravljajte uređajima na kojima ste prijavljeni", "manage_your_oauth_connection": "Upravljajte svojom OAuth vezom", "map": "Karta", + "map_assets_in_bound": "{} fotografija", + "map_assets_in_bounds": "{} fotografija", + "map_cannot_get_user_location": "Nije moguće dohvatiti lokaciju korisnika", + "map_location_dialog_yes": "Da", + "map_location_picker_page_use_location": "Koristi ovu lokaciju", + "map_location_service_disabled_content": "Usluga lokacije mora biti omogućena za prikaz stavki s vaÅĄe trenutne lokacije. ÅŊelite li je sada omogućiti?", + "map_location_service_disabled_title": "Usluga lokacije onemogućena", "map_marker_for_images": "Oznaka karte za slike snimljene u {city}, {country}", "map_marker_with_image": "Oznaka karte sa slikom", + "map_no_assets_in_bounds": "Nema fotografija u ovom području", + "map_no_location_permission_content": "Potrebno je dopuÅĄtenje za lokaciju kako bi se prikazale stavke s vaÅĄe trenutne lokacije. ÅŊelite li ga sada omogućiti?", + "map_no_location_permission_title": "DopuÅĄtenje za lokaciju odbijeno", "map_settings": "Postavke karte", + "map_settings_dark_mode": "Tamni način rada", + "map_settings_date_range_option_day": "Posljednja 24 sata", + "map_settings_date_range_option_days": "Posljednjih {} dana", + "map_settings_date_range_option_year": "ProÅĄla godina", + "map_settings_date_range_option_years": "Posljednjih {} godina", + "map_settings_dialog_title": "Postavke karte", + "map_settings_include_show_archived": "Uključi arhivirane", + "map_settings_include_show_partners": "Uključi partnere", + "map_settings_only_show_favorites": "PrikaÅži samo omiljene", + "map_settings_theme_settings": "Tema karte", + "map_zoom_to_see_photos": "Umanjite prikaz za pregled fotografija", "matches": "Podudaranja", "media_type": "Vrsta medija", "memories": "Sjećanja", + "memories_all_caught_up": "Sve ste pregledali", + "memories_check_back_tomorrow": "Provjerite ponovno sutra za viÅĄe uspomena", "memories_setting_description": "Upravljajte onim ÅĄto vidite u svojim sjećanjima", + "memories_start_over": "Započni iznova", + "memories_swipe_to_close": "Prijeđite prstom prema gore za zatvaranje", + "memories_year_ago": "Prije godinu dana", + "memories_years_ago": "Prije {} godina", "memory": "Memorija", "memory_lane_title": "Traka sjećanja {title}", "menu": "Izbornik", @@ -1020,11 +1216,17 @@ "missing": "Nedostaje", "model": "Model", "month": "Mjesec", + "monthly_title_text_date_format": "MMMM y", "more": "ViÅĄe", "moved_to_trash": "PremjeÅĄteno u smeće", + "multiselect_grid_edit_date_time_err_read_only": "Nije moguće urediti datum stavki samo za čitanje, preskačem", + "multiselect_grid_edit_gps_err_read_only": "Nije moguće urediti lokaciju stavki samo za čitanje, preskačem", + "mute_memories": "Isključi uspomene", "my_albums": "Moji albumi", "name": "Ime", "name_or_nickname": "Ime ili nadimak", + "networking_settings": "UmreÅžavanje", + "networking_subtitle": "Upravljajte postavkama krajnje točke posluÅžitelja", "never": "Nikada", "new_album": "Novi Album", "new_api_key": "Novi API ključ", @@ -1041,6 +1243,7 @@ "no_albums_yet": "Čini se da joÅĄ nemate nijedan album.", "no_archived_assets_message": "Arhivirajte fotografije i videozapise kako biste ih sakrili iz prikaza fotografija", "no_assets_message": "KLIKNITE DA PRENESETE SVOJU PRVU FOTOGRAFIJU", + "no_assets_to_show": "Nema stavki za prikaz", "no_duplicates_found": "Nisu pronađeni duplikati.", "no_exif_info_available": "Nema dostupnih exif podataka", "no_explore_results_message": "Prenesite viÅĄe fotografija da istraÅžite svoju zbirku.", @@ -1052,8 +1255,13 @@ "no_results_description": "PokuÅĄajte sa sinonimom ili općenitijom ključnom riječi", "no_shared_albums_message": "Stvorite album za dijeljenje fotografija i videozapisa s osobama u svojoj mreÅži", "not_in_any_album": "Ni u jednom albumu", + "not_selected": "Nije odabrano", "note_apply_storage_label_to_previously_uploaded assets": "Napomena: Da biste primijenili Oznaku za skladiÅĄtenje na prethodno prenesena sredstva, pokrenite", "notes": "BiljeÅĄke", + "notification_permission_dialog_content": "Da biste omogućili obavijesti, idite u Postavke i odaberite dopusti.", + "notification_permission_list_tile_content": "Dodijelite dopuÅĄtenje za omogućavanje obavijesti.", + "notification_permission_list_tile_enable_button": "Omogući obavijesti", + "notification_permission_list_tile_title": "DopuÅĄtenje za obavijesti", "notification_toggle_setting_description": "Omogući obavijesti putem e-poÅĄte", "notifications": "Obavijesti", "notifications_setting_description": "Upravljanje obavijestima", @@ -1064,6 +1272,7 @@ "offline_paths_description": "Ovi rezultati mogu biti posljedica ručnog brisanja datoteka koje nisu dio vanjske biblioteke.", "ok": "Ok", "oldest_first": "Prvo najstarije", + "on_this_device": "Na ovom uređaju", "onboarding": "Uključivanje (Onboarding)", "onboarding_privacy_description": "Sljedeće (neobavezne) značajke oslanjaju se na vanjske usluge i mogu se onemogućiti u bilo kojem trenutku u postavkama administracije.", "onboarding_theme_description": "Odaberite temu boja za svoj primjer. To moÅžete kasnije promijeniti u postavkama.", @@ -1071,6 +1280,7 @@ "onboarding_welcome_user": "Dobro doÅĄli, {user}", "online": "Dostupan (Online)", "only_favorites": "Samo omiljeno", + "open": "Otvori", "open_in_map_view": "Otvori u prikazu karte", "open_in_openstreetmap": "Otvori u OpenStreetMap", "open_the_search_filters": "Otvorite filtre pretraÅživanja", @@ -1087,6 +1297,14 @@ "partner_can_access": "{partner} moÅže pristupiti", "partner_can_access_assets": "Sve vaÅĄe fotografije i videi osim onih u arhivi i smeću", "partner_can_access_location": "Mjesto otkuda je slika otkinuta", + "partner_list_user_photos": "{user} fotografije", + "partner_list_view_all": "PrikaÅži sve", + "partner_page_empty_message": "VaÅĄe fotografije joÅĄ nisu podijeljene ni s jednim partnerom.", + "partner_page_no_more_users": "Nema viÅĄe korisnika za dodavanje", + "partner_page_partner_add_failed": "Nije uspjelo dodavanje partnera", + "partner_page_select_partner": "Odaberi partnera", + "partner_page_shared_to_title": "Podijeljeno s", + "partner_page_stop_sharing_content": "{} viÅĄe neće moći pristupiti vaÅĄim fotografijama.", "partner_sharing": "Dijeljenje s partnerom", "partners": "Partneri", "password": "Zaporka", @@ -1115,7 +1333,16 @@ "permanently_delete_assets_prompt": "Da li ste sigurni da Åželite trajni izbrisati {count, plural, one {ovu datoteku?} other {ove # datoteke?}}Ovo cˁe ih također ukloniti {count, plural, one {iz njihovog} other {iz njihovih}} albuma.", "permanently_deleted_asset": "Trajno izbrisano sredstvo", "permanently_deleted_assets_count": "Trajno izbrisano {count, plural, one {# datoteka} other {# datoteke}}", + "permission_onboarding_back": "Natrag", + "permission_onboarding_continue_anyway": "Nastavi svejedno", + "permission_onboarding_get_started": "Započni", + "permission_onboarding_go_to_settings": "Idi u postavke", + "permission_onboarding_permission_denied": "DopuÅĄtenje odbijeno. Za koriÅĄtenje Immicha, dodijelite dopuÅĄtenja za fotografije i videozapise u Postavkama.", + "permission_onboarding_permission_granted": "DopuÅĄtenje dodijeljeno! Sve je spremno.", + "permission_onboarding_permission_limited": "DopuÅĄtenje ograničeno. Da biste Immichu dopustili sigurnosno kopiranje i upravljanje cijelom galerijom, dodijelite dopuÅĄtenja za fotografije i videozapise u Postavkama.", + "permission_onboarding_request": "Immich zahtijeva dopuÅĄtenje za pregled vaÅĄih fotografija i videozapisa.", "person": "Osoba", + "person_birthdate": "Rođen/a {date}", "person_hidden": "{name}{hidden, select, true { (skriveno)} other {}}", "photo_shared_all_users": "Čini se da ste svoje fotografije podijelili sa svim korisnicima ili nemate nijednog korisnika s kojim biste ih podijelili.", "photos": "Fotografije", @@ -1125,11 +1352,14 @@ "pick_a_location": "Odaberite lokaciju", "place": "Mjesto", "places": "Mjesta", + "places_count": "{count, plural, =1 {{count, number} Mjesto} few {{count, number} Mjesta} other {{count, number} Mjesta}}", "play": "Pokreni", "play_memories": "Pokreni sjećanja", "play_motion_photo": "Reproduciraj Pokretnu fotografiju", "play_or_pause_video": "Reproducirajte ili pauzirajte video", "port": "Port", + "preferences_settings_subtitle": "Upravljajte postavkama aplikacije", + "preferences_settings_title": "Postavke", "preset": "Unaprijed postavljeno", "preview": "Pregled", "previous": "Prethodno", @@ -1137,6 +1367,13 @@ "previous_or_next_photo": "Prethodna ili sljedeća fotografija", "primary": "Primarna (Primary)", "privacy": "Privatnost", + "profile_drawer_app_logs": "Zapisnici", + "profile_drawer_client_out_of_date_major": "Mobilna aplikacija je zastarjela. AÅžurirajte na najnoviju glavnu verziju.", + "profile_drawer_client_out_of_date_minor": "Mobilna aplikacija je zastarjela. AÅžurirajte na najnoviju manju verziju.", + "profile_drawer_client_server_up_to_date": "Klijent i posluÅžitelj su aÅžurirani", + "profile_drawer_github": "GitHub", + "profile_drawer_server_out_of_date_major": "PosluÅžitelj je zastario. AÅžurirajte na najnoviju glavnu verziju.", + "profile_drawer_server_out_of_date_minor": "PosluÅžitelj je zastario. AÅžurirajte na najnoviju manju verziju.", "profile_image_of_user": "Profilna slika korisnika {user}", "profile_picture_set": "Profilna slika postavljena.", "public_album": "Javni album", @@ -1184,7 +1421,12 @@ "reassigned_assets_to_new_person": "Ponovo dodijeljeno {count, plural, one {# datoteka} other {# datoteke}} novoj osobi", "reassing_hint": "Dodijelite odabrane datoteke postojećoj osobi", "recent": "Nedavno", + "recent-albums": "Nedavni albumi", "recent_searches": "Nedavne pretrage", + "recently_added": "Nedavno dodano", + "recently_added_page_title": "Nedavno dodano", + "recently_taken": "Nedavno snimljeno", + "recently_taken_page_title": "Nedavno snimljeno", "refresh": "OsvjeÅži", "refresh_encoded_videos": "OsvjeÅžite kodirane videozapise", "refresh_faces": "OsvjeÅžite lica", @@ -1205,11 +1447,16 @@ "remove_from_album": "Ukloni iz albuma", "remove_from_favorites": "Ukloni iz favorita", "remove_from_shared_link": "Ukloni iz dijeljene poveznice", + "remove_memory": "Ukloni uspomenu", + "remove_photo_from_memory": "Ukloni fotografiju iz ove uspomene", + "remove_url": "Ukloni URL", "remove_user": "Ukloni korisnika", "removed_api_key": "Uklonjen API ključ: {name}", "removed_from_archive": "Uklonjeno iz arhive", "removed_from_favorites": "Uklonjeno iz favorita", "removed_from_favorites_count": "{count, plural, other {Uklonjeno #}} iz omiljenih", + "removed_memory": "Uklonjena uspomena", + "removed_photo_from_memory": "Uklonjena fotografija iz uspomene", "removed_tagged_assets": "Uklonjena oznaka iz {count, plural, one {# datoteke} other {# datoteka}}", "rename": "Preimenuj", "repair": "Popravi", @@ -1218,6 +1465,7 @@ "repository": "SpremiÅĄte (Repository)", "require_password": "Zahtijevaj lozinku", "require_user_to_change_password_on_first_login": "Zahtijevajte od korisnika promjenu lozinke pri prvoj prijavi", + "rescan": "Ponovno skeniraj", "reset": "Reset", "reset_password": "Resetiraj lozinku", "reset_people_visibility": "PoniÅĄti vidljivost ljudi", @@ -1235,10 +1483,12 @@ "role_editor": "Urednik", "role_viewer": "Gledatelj", "save": "Spremi", + "save_to_gallery": "Spremi u galeriju", "saved_api_key": "Spremljen API ključ", "saved_profile": "Spremljen profil", "saved_settings": "Spremljene postavke", "say_something": "Reci neÅĄto", + "scaffold_body_error_occurred": "DoÅĄlo je do pogreÅĄke", "scan_all_libraries": "Skeniraj sve KnjiÅžnice", "scan_library": "Skeniraj", "scan_settings": "Postavke skeniranja", @@ -1246,20 +1496,53 @@ "search": "PretraÅživanje", "search_albums": "TraÅži albume", "search_by_context": "PretraÅživanje po kontekstu", + "search_by_description": "PretraÅži po opisu", + "search_by_description_example": "Planinarenje u Sapi", "search_by_filename": "PretraÅžujte prema nazivu datoteke ili ekstenziji", "search_by_filename_example": "npr. IMG_1234.JPG ili PNG", "search_camera_make": "PretraÅžite marku kamere...", "search_camera_model": "PretraÅžite model kamere...", "search_city": "PretraÅžite grad...", "search_country": "PretraÅžite drÅžavu...", + "search_filter_apply": "Primijeni filtar", + "search_filter_camera_title": "Odaberi vrstu kamere", + "search_filter_date": "Datum", + "search_filter_date_interval": "{start} do {end}", + "search_filter_date_title": "Odaberi raspon datuma", + "search_filter_display_option_not_in_album": "Nije u albumu", + "search_filter_display_options": "Opcije prikaza", + "search_filter_filename": "PretraÅži po nazivu datoteke", + "search_filter_location": "Lokacija", + "search_filter_location_title": "Odaberi lokaciju", + "search_filter_media_type": "Vrsta medija", + "search_filter_media_type_title": "Odaberi vrstu medija", + "search_filter_people_title": "Odaberi osobe", + "search_for": "TraÅži", "search_for_existing_person": "PotraÅžite postojeću osobu", + "search_no_more_result": "Nema viÅĄe rezultata", "search_no_people": "Nema ljudi", "search_no_people_named": "Nema osoba s imenom \"{name}\"", + "search_no_result": "Nema rezultata, pokuÅĄajte s drugim pojmom za pretraÅživanje ili kombinacijom", "search_options": "Opcije pretraÅživanja", + "search_page_categories": "Kategorije", + "search_page_motion_photos": "Pokretne fotografije", + "search_page_no_objects": "Nema dostupnih informacija o objektima", + "search_page_no_places": "Nema dostupnih informacija o mjestima", + "search_page_screenshots": "Snimke zaslona", + "search_page_search_photos_videos": "PretraÅžite svoje fotografije i videozapise", + "search_page_selfies": "Selfiji", + "search_page_things": "Stvari", + "search_page_view_all_button": "PrikaÅži sve", + "search_page_your_activity": "VaÅĄa aktivnost", + "search_page_your_map": "VaÅĄa karta", "search_people": "TraÅži ljude", "search_places": "TraÅži mjesta", + "search_rating": "PretraÅži po ocjeni...", + "search_result_page_new_search_hint": "Nova pretraga", "search_settings": "Postavke pretraÅživanja", "search_state": "DrÅžava pretraÅživanja...", + "search_suggestion_list_smart_search_hint_1": "Pametna pretraga je omogućena prema zadanim postavkama, za pretraÅživanje metapodataka koristite sintaksu ", + "search_suggestion_list_smart_search_hint_2": "m:vaÅĄ-pojam-pretrage", "search_tags": "TraÅži oznake...", "search_timezone": "PretraÅži vremenske zone", "search_type": "Vrsta pretraÅživanja", @@ -1267,43 +1550,125 @@ "searching_locales": "TraÅženje lokaliteta...", "second": "Drugi", "see_all_people": "Vidi sve ljude", + "select": "Odaberi", "select_album_cover": "Odaberite omot albuma", "select_all": "Odaberi sve", "select_all_duplicates": "Odaberi sve duplikate", - "select_avatar_color": "", + "select_avatar_color": "Odaberi boju avatara", "select_face": "Odaberi lice", - "select_featured_photo": "", - "select_keep_all": "", - "select_library_owner": "", - "select_new_face": "", - "select_photos": "", - "select_trash_all": "", + "select_featured_photo": "Odaberi istaknutu fotografiju", + "select_from_computer": "Odaberi s računala", + "select_keep_all": "Odaberi zadrÅži sve", + "select_library_owner": "Odaberi vlasnika knjiÅžnice", + "select_new_face": "Odaberi novo lice", + "select_photos": "Odaberi fotografije", + "select_trash_all": "Odaberi izbriÅĄi sve", + "select_user_for_sharing_page_err_album": "Nije uspjelo kreiranje albuma", "selected": "Odabrano", - "send_message": "", + "selected_count": "{count, plural, =1 {# odabran} few {# odabrana} other {# odabranih}}", + "send_message": "PoÅĄalji poruku", "send_welcome_email": "PoÅĄalji email dobrodoÅĄlice", + "server_endpoint": "Krajnja točka posluÅžitelja", + "server_info_box_app_version": "Verzija aplikacije", + "server_info_box_server_url": "URL posluÅžitelja", "server_offline": "Server izvan mreÅže", "server_online": "Server na mreÅži", "server_stats": "Statistike servera", "server_version": "Verzija servera", "set": "Postavi", - "set_as_album_cover": "", + "set_as_album_cover": "Postavi kao naslovnicu albuma", + "set_as_featured_photo": "Postavi kao istaknutu fotografiju", "set_as_profile_picture": "Postavi kao profilnu sliku", "set_date_of_birth": "Postavi datum rođenja", "set_profile_picture": "Postavi profilnu sliku", - "set_slideshow_to_fullscreen": "", + "set_slideshow_to_fullscreen": "Postavi prezentaciju na cijeli zaslon", + "setting_image_viewer_help": "Preglednik detalja prvo učitava malu sličicu, zatim učitava pregled srednje veličine (ako je omogućen), te na kraju učitava original (ako je omogućen).", + "setting_image_viewer_original_subtitle": "Omogućite za učitavanje originalne slike pune rezolucije (velika!). Onemogućite za smanjenje potroÅĄnje podataka (i mreÅžne i na predmemoriji uređaja).", + "setting_image_viewer_original_title": "Učitaj originalnu sliku", + "setting_image_viewer_preview_subtitle": "Omogućite za učitavanje slike srednje rezolucije. Onemogućite za izravno učitavanje originala ili koriÅĄtenje samo sličice.", + "setting_image_viewer_preview_title": "Učitaj sliku za pregled", + "setting_image_viewer_title": "Slike", + "setting_languages_apply": "Primijeni", + "setting_languages_subtitle": "Promijeni jezik aplikacije", + "setting_languages_title": "Jezici", + "setting_notifications_notify_failures_grace_period": "Obavijesti o neuspjehu sigurnosnog kopiranja u pozadini: {}", + "setting_notifications_notify_hours": "{} sati", + "setting_notifications_notify_immediately": "odmah", + "setting_notifications_notify_minutes": "{} minuta", + "setting_notifications_notify_never": "nikad", + "setting_notifications_notify_seconds": "{} sekundi", + "setting_notifications_single_progress_subtitle": "Detaljne informacije o napretku prijenosa po stavci", + "setting_notifications_single_progress_title": "PrikaÅži detaljni napredak sigurnosnog kopiranja u pozadini", + "setting_notifications_subtitle": "Prilagodite postavke obavijesti", + "setting_notifications_total_progress_subtitle": "Ukupni napredak prijenosa (zavrÅĄeno/ukupno stavki)", + "setting_notifications_total_progress_title": "PrikaÅži ukupni napredak sigurnosnog kopiranja u pozadini", + "setting_video_viewer_looping_title": "Ponavljanje", + "setting_video_viewer_original_video_subtitle": "Prilikom strujanja videozapisa s posluÅžitelja, reproducirajte original čak i kada je dostupna transkodirana verzija. MoÅže doći do međuspremanja. Videozapisi dostupni lokalno reproduciraju se u originalnoj kvaliteti bez obzira na ovu postavku.", + "setting_video_viewer_original_video_title": "Forsiraj originalni videozapis", "settings": "Postavke", + "settings_require_restart": "Ponovno pokrenite Immich da biste primijenili ovu postavku", "settings_saved": "Postavke su spremljene", "share": "Podijeli", + "share_add_photos": "Dodaj fotografije", + "share_assets_selected": "{} odabrano", + "share_dialog_preparing": "Priprema...", "shared": "Podijeljeno", + "shared_album_activities_input_disable": "Komentiranje je onemogućeno", + "shared_album_activity_remove_content": "ÅŊelite li izbrisati ovu aktivnost?", + "shared_album_activity_remove_title": "IzbriÅĄi aktivnost", + "shared_album_section_people_action_error": "PogreÅĄka pri napuÅĄtanju/uklanjanju iz albuma", + "shared_album_section_people_action_leave": "Ukloni korisnika iz albuma", + "shared_album_section_people_action_remove_user": "Ukloni korisnika iz albuma", + "shared_album_section_people_title": "OSOBE", "shared_by": "Podijelio", "shared_by_user": "Podijelio {user}", "shared_by_you": "Podijelili vi", "shared_from_partner": "Fotografije od {partner}", - "shared_links": "", - "shared_with_partner": "", - "sharing": "", - "sharing_sidebar_description": "", - "show_album_options": "", + "shared_intent_upload_button_progress_text": "{} / {} Preneseno", + "shared_link_app_bar_title": "Dijeljene poveznice", + "shared_link_clipboard_copied_massage": "Kopirano u međuspremnik", + "shared_link_clipboard_text": "Poveznica: {}\nLozinka: {}", + "shared_link_create_error": "PogreÅĄka pri kreiranju dijeljene poveznice", + "shared_link_edit_description_hint": "Unesite opis dijeljenja", + "shared_link_edit_expire_after_option_day": "1 dan", + "shared_link_edit_expire_after_option_days": "{} dana", + "shared_link_edit_expire_after_option_hour": "1 sat", + "shared_link_edit_expire_after_option_hours": "{} sati", + "shared_link_edit_expire_after_option_minute": "1 minuta", + "shared_link_edit_expire_after_option_minutes": "{} minuta", + "shared_link_edit_expire_after_option_months": "{} mjeseci", + "shared_link_edit_expire_after_option_year": "{} godina", + "shared_link_edit_password_hint": "Unesite lozinku za dijeljenje", + "shared_link_edit_submit_button": "AÅžuriraj poveznicu", + "shared_link_error_server_url_fetch": "Nije moguće dohvatiti URL posluÅžitelja", + "shared_link_expires_day": "Istječe za {} dan", + "shared_link_expires_days": "Istječe za {} dana", + "shared_link_expires_hour": "Istječe za {} sat", + "shared_link_expires_hours": "Istječe za {} sati", + "shared_link_expires_minute": "Istječe za {} minutu", + "shared_link_expires_minutes": "Istječe za {} minuta", + "shared_link_expires_never": "Istječe ∞", + "shared_link_expires_second": "Istječe za {} sekundu", + "shared_link_expires_seconds": "Istječe za {} sekundi", + "shared_link_individual_shared": "Pojedinačno podijeljeno", + "shared_link_info_chip_metadata": "EXIF", + "shared_link_manage_links": "Upravljanje dijeljenim poveznicama", + "shared_link_options": "Opcije dijeljene poveznice", + "shared_links": "Dijeljene poveznice", + "shared_links_description": "Podijelite fotografije i videozapise putem poveznice", + "shared_photos_and_videos_count": "{assetCount, plural, =1 {# podijeljena fotografija ili videozapis.} few {# podijeljene fotografije i videozapisa.} other {# podijeljenih fotografija i videozapisa.}}", + "shared_with_me": "Podijeljeno sa mnom", + "shared_with_partner": "Podijeljeno s {partner}", + "sharing": "Dijeljenje", + "sharing_enter_password": "Molimo unesite lozinku za pregled ove stranice.", + "sharing_page_album": "Dijeljeni albumi", + "sharing_page_description": "Kreirajte dijeljene albume za dijeljenje fotografija i videozapisa s ljudima u vaÅĄoj mreÅži.", + "sharing_page_empty_list": "PRAZAN POPIS", + "sharing_sidebar_description": "PrikaÅži poveznicu na Dijeljenje u bočnoj traci", + "sharing_silver_appbar_create_shared_album": "Novi dijeljeni album", + "sharing_silver_appbar_share_partner": "Podijeli s partnerom", + "shift_to_permanent_delete": "pritisnite ⇧ za trajno brisanje stavke", + "show_album_options": "PrikaÅži opcije albuma", "show_albums": "PrikaÅži albume", "show_all_people": "PrikaÅži sve osobe", "show_and_hide_people": "PrikaÅži i sakrij osobe", @@ -1311,105 +1676,219 @@ "show_gallery": "PrikaÅži galeriju", "show_hidden_people": "PrikaÅži skrivene osobe", "show_in_timeline": "PrikaÅži na vremenskoj crti", - "show_in_timeline_setting_description": "", - "show_keyboard_shortcuts": "", - "show_metadata": "", - "show_or_hide_info": "", - "show_password": "", - "show_person_options": "", - "show_progress_bar": "", - "show_search_options": "", - "shuffle": "", - "sign_out": "", - "sign_up": "", - "size": "", - "skip_to_content": "", - "slideshow": "", - "slideshow_settings": "", - "sort_albums_by": "", - "stack": "", - "stack_selected_photos": "", - "stacktrace": "", - "start": "", - "start_date": "", - "state": "", - "status": "", - "stop_motion_photo": "", - "stop_photo_sharing": "", - "stop_photo_sharing_description": "", - "stop_sharing_photos_with_user": "", - "storage": "", - "storage_label": "", - "storage_usage": "", - "submit": "", + "show_in_timeline_setting_description": "PrikaÅži fotografije i videozapise ovog korisnika na vaÅĄoj vremenskoj crti", + "show_keyboard_shortcuts": "PrikaÅži tipkovničke prečace", + "show_metadata": "PrikaÅži metapodatke", + "show_or_hide_info": "PrikaÅži ili sakrij informacije", + "show_password": "PrikaÅži lozinku", + "show_person_options": "PrikaÅži opcije osobe", + "show_progress_bar": "PrikaÅži traku napretka", + "show_search_options": "PrikaÅži opcije pretraÅživanja", + "show_shared_links": "PrikaÅži dijeljene poveznice", + "show_slideshow_transition": "PrikaÅži prijelaz prezentacije", + "show_supporter_badge": "Značka podrÅžavatelja", + "show_supporter_badge_description": "PrikaÅži značku podrÅžavatelja", + "shuffle": "Nasumični redoslijed", + "sidebar": "Bočna traka", + "sidebar_display_description": "PrikaÅži poveznicu na prikaz u bočnoj traci", + "sign_out": "Odjava", + "sign_up": "Registriraj se", + "size": "Veličina", + "skip_to_content": "Preskoči na sadrÅžaj", + "skip_to_folders": "Preskoči na mape", + "skip_to_tags": "Preskoči na oznake", + "slideshow": "Prezentacija", + "slideshow_settings": "Postavke prezentacije", + "sort_albums_by": "Sortiraj albume po...", + "sort_created": "Datum kreiranja", + "sort_items": "Broj stavki", + "sort_modified": "Datum izmjene", + "sort_oldest": "Najstarija fotografija", + "sort_people_by_similarity": "Sortiraj osobe po sličnosti", + "sort_recent": "Najnovija fotografija", + "sort_title": "Naslov", + "source": "Izvor", + "stack": "SloÅži", + "stack_duplicates": "SloÅži duplikate", + "stack_select_one_photo": "Odaberi jednu glavnu fotografiju za slaganje", + "stack_selected_photos": "SloÅži odabrane fotografije", + "stacked_assets_count": "SloÅženo {count, plural, =1 {# stavka} few {# stavke} other {# stavki}}", + "stacktrace": "Pracenje stoga", + "start": "Početak", + "start_date": "Datum početka", + "state": "Stanje", + "status": "Status", + "stop_motion_photo": "Zaustavi pokretnu fotografiju", + "stop_photo_sharing": "Prestati dijeliti svoje fotografije?", + "stop_photo_sharing_description": "{partner} viÅĄe neće moći pristupiti vaÅĄim fotografijama.", + "stop_sharing_photos_with_user": "Prestani dijeliti svoje fotografije s ovim korisnikom", + "storage": "Prostor za pohranu", + "storage_label": "Oznaka pohrane", + "storage_usage": "{used} od {available} iskoriÅĄteno", + "submit": "PoÅĄalji", "suggestions": "Prijedlozi", "sunrise_on_the_beach": "Sunrise on the beach", - "swap_merge_direction": "", + "support": "PodrÅĄka", + "support_and_feedback": "PodrÅĄka i povratne informacije", + "support_third_party_description": "VaÅĄa Immich instalacija je pakirana od strane treće strane. Problemi koje doÅživljavate mogu biti uzrokovani tim paketom, stoga vas molimo da probleme prvo prijavite njima putem poveznica u nastavku.", + "swap_merge_direction": "Zamijeni smjer spajanja", "sync": "Sink.", - "template": "", + "sync_albums": "Sinkroniziraj albume", + "sync_albums_manual_subtitle": "Sinkroniziraj sve prenesene videozapise i fotografije u odabrane albume za sigurnosnu kopiju", + "sync_upload_album_setting_subtitle": "Kreiraj i prenesi svoje fotografije i videozapise u odabrane albume na Immichu", + "tag": "Oznaka", + "tag_assets": "Označi stavke", + "tag_created": "Kreirana oznaka: {tag}", + "tag_feature_description": "Pregledavanje fotografija i videozapisa grupiranih po logičkim temama oznaka", + "tag_not_found_question": "Nije moguće pronaći oznaku? Napravite novu oznaku.", + "tag_people": "Označi osobe", + "tag_updated": "AÅžurirana oznaka: {tag}", + "tagged_assets": "Označena {count, plural, =1 {# stavka} few {# stavke} other {# stavki}}", + "tags": "Oznake", + "template": "PredloÅžak", "theme": "Tema", "theme_selection": "Izbor teme", "theme_selection_description": "Automatski postavite temu na svijetlu ili tamnu ovisno o postavkama sustava vaÅĄeg preglednika", + "theme_setting_asset_list_storage_indicator_title": "PrikaÅži indikator pohrane na pločicama stavki", + "theme_setting_asset_list_tiles_per_row_title": "Broj stavki po retku ({})", + "theme_setting_colorful_interface_subtitle": "Primijeni primarnu boju na pozadinske povrÅĄine.", + "theme_setting_colorful_interface_title": "Å areno sučelje", + "theme_setting_image_viewer_quality_subtitle": "Prilagodite kvalitetu preglednika detalja slike", + "theme_setting_image_viewer_quality_title": "Kvaliteta preglednika slika", + "theme_setting_primary_color_subtitle": "Odaberite boju za primarne radnje i naglaske.", + "theme_setting_primary_color_title": "Primarna boja", + "theme_setting_system_primary_color_title": "Koristi boju sustava", + "theme_setting_system_theme_switch": "Automatski (Prati postavke sustava)", + "theme_setting_theme_subtitle": "Odaberite postavku teme aplikacije", + "theme_setting_three_stage_loading_subtitle": "Trostupanjsko učitavanje moÅže poboljÅĄati performanse učitavanja, ali uzrokuje znatno veće opterećenje mreÅže", + "theme_setting_three_stage_loading_title": "Omogući trostupanjsko učitavanje", "they_will_be_merged_together": "Oni ću biti spojeni zajedno", + "third_party_resources": "Resursi trećih strana", "time_based_memories": "Uspomene temeljene na vremenu", + "timeline": "Vremenska crta", "timezone": "Vremenska zona", "to_archive": "Arhivaj", "to_change_password": "Promjeni lozinku", "to_favorite": "Omiljeni", "to_login": "Prijava", + "to_parent": "Idi na roditelja", "to_trash": "Smeće", "toggle_settings": "Uključi/isključi postavke", "toggle_theme": "Promjeni temu", + "total": "Ukupno", "total_usage": "Ukupna upotreba", "trash": "Smeće", "trash_all": "Stavi sve u smeće", + "trash_count": "Smeće {count, number}", + "trash_delete_asset": "Premjesti u smeće / IzbriÅĄi stavku", + "trash_emptied": "IspraÅžnjeno smeće", "trash_no_results_message": "Ovdje će se prikazati bačene fotografije i videozapisi.", + "trash_page_delete_all": "IzbriÅĄi sve", + "trash_page_empty_trash_dialog_content": "ÅŊelite li isprazniti svoje stavke u smeću? Ove stavke bit će trajno uklonjene iz Immicha", + "trash_page_info": "Stavke u smeću bit će trajno izbrisane nakon {} dana", + "trash_page_no_assets": "Nema stavki u smeću", + "trash_page_restore_all": "Vrati sve", + "trash_page_select_assets_btn": "Odaberi stavke", + "trash_page_title": "Smeće ({})", "trashed_items_will_be_permanently_deleted_after": "Stavke bačene u smeće trajno će se izbrisati nakon {days, plural, one {# day} other {# days}}.", "type": "Vrsta", - "unarchive": "", - "unfavorite": "", - "unhide_person": "", - "unknown": "", - "unknown_year": "", - "unlimited": "", - "unlink_oauth": "", - "unlinked_oauth_account": "", - "unselect_all": "", - "unstack": "", - "untracked_files": "", - "untracked_files_decription": "", - "up_next": "", - "updated_password": "", - "upload": "", - "upload_concurrency": "", - "url": "", - "usage": "", - "user": "", - "user_id": "", - "user_usage_detail": "", + "unarchive": "PoniÅĄti arhiviranje", + "unarchived_count": "{count, plural, =1 {PoniÅĄteno arhiviranje #} few {PoniÅĄteno arhiviranje #} other {PoniÅĄteno arhiviranje #}}", + "unfavorite": "Ukloni iz omiljenih", + "unhide_person": "PrikaÅži osobu", + "unknown": "Nepoznato", + "unknown_country": "Nepoznata drÅžava", + "unknown_year": "Nepoznata godina", + "unlimited": "Neograničeno", + "unlink_motion_video": "OdpoveÅži pokretni videozapis", + "unlink_oauth": "OdpoveÅži OAuth", + "unlinked_oauth_account": "Odpovezan OAuth račun", + "unmute_memories": "Uključi uspomene", + "unnamed_album": "Album bez imena", + "unnamed_album_delete_confirmation": "Jeste li sigurni da Åželite izbrisati ovaj album?", + "unnamed_share": "Dijeljenje bez imena", + "unsaved_change": "Nespremljena promjena", + "unselect_all": "PoniÅĄti odabir svih", + "unselect_all_duplicates": "PoniÅĄti odabir svih duplikata", + "unstack": "Razdvoji", + "unstacked_assets_count": "Razdvojena {count, plural, =1 {# stavka} few {# stavke} other {# stavki}}", + "untracked_files": "Datoteke bez praćenja", + "untracked_files_decription": "Ove datoteke nisu praćene od strane aplikacije. Mogu biti rezultat neuspjelih premjeÅĄtanja, prekinutih prijenosa ili su ostale zbog greÅĄke", + "up_next": "Sljedeće", + "updated_password": "Lozinka aÅžurirana", + "upload": "Prijenos", + "upload_concurrency": "Istovremeni prijenosi", + "upload_dialog_info": "ÅŊelite li sigurnosno kopirati odabranu stavku(e) na posluÅžitelj?", + "upload_dialog_title": "Prenesi stavku", + "upload_errors": "Prijenos zavrÅĄen s {count, plural, =1 {# greÅĄkom} few {# greÅĄke} other {# greÅĄaka}}, osvjeÅžite stranicu da biste vidjeli nove prenesene stavke.", + "upload_progress": "Preostalo {remaining, number} - Obrađeno {processed, number}/{total, number}", + "upload_skipped_duplicates": "Preskočena {count, plural, =1 {# duplicirana stavka} few {# duplicirane stavke} other {# dupliciranih stavki}}", + "upload_status_duplicates": "Duplikati", + "upload_status_errors": "GreÅĄke", + "upload_status_uploaded": "Preneseno", + "upload_success": "Prijenos uspjeÅĄan, osvjeÅžite stranicu da biste vidjeli nove prenesene stavke.", + "upload_to_immich": "Prenesi na Immich ({})", + "uploading": "Prijenos u tijeku", + "url": "URL", + "usage": "KoriÅĄtenje", + "use_current_connection": "koristi trenutnu vezu", + "use_custom_date_range": "Koristi prilagođeni raspon datuma", + "user": "Korisnik", + "user_id": "ID korisnika", + "user_liked": "{user} je označio/la sviđa mi se {type, select, photo {ovu fotografiju} video {ovaj videozapis} asset {ovu stavku} other {to}}", + "user_purchase_settings": "Kupnja", + "user_purchase_settings_description": "Upravljajte svojom kupnjom", + "user_role_set": "Postavi {user} kao {role}", + "user_usage_detail": "Detalji koriÅĄtenja korisnika", "user_usage_stats": "Statistika koriÅĄtenja računa", "user_usage_stats_description": "Pregledajte statistiku koriÅĄtenja računa", - "username": "", - "users": "", - "utilities": "", - "validate": "", - "variables": "", - "version": "", - "video": "", - "video_hover_setting": "", - "video_hover_setting_description": "", - "videos": "", - "videos_count": "", - "view_all": "", - "view_all_users": "", - "view_links": "", - "view_next_asset": "", - "view_previous_asset": "", - "waiting": "", - "week": "", - "welcome_to_immich": "", - "year": "", - "yes": "", - "you_dont_have_any_shared_links": "", - "zoom_image": "" + "username": "Korisničko ime", + "users": "Korisnici", + "utilities": "Alati", + "validate": "Provjeri valjanost", + "validate_endpoint_error": "Molimo unesite valjanu URL adresu", + "variables": "Varijable", + "version": "Verzija", + "version_announcement_closing": "VaÅĄ prijatelj, Alex", + "version_announcement_message": "Bok! Dostupna je nova verzija Immicha. Odvojite malo vremena da pročitate biljeÅĄke o izdanju kako biste bili sigurni da je vaÅĄe postavljanje aÅžurno kako biste spriječili bilo kakve pogreÅĄne konfiguracije, pogotovo ako koristite WatchTower ili bilo koji mehanizam koji automatski upravlja aÅžuriranjem vaÅĄe instance Immicha.", + "version_announcement_overlay_release_notes": "napomene o izdanju", + "version_announcement_overlay_text_1": "Bok prijatelju, dostupno je novo izdanje", + "version_announcement_overlay_text_2": "molimo odvojite vrijeme da posjetite ", + "version_announcement_overlay_text_3": " i osigurajte da su vaÅĄe postavke docker-compose i .env aÅžurirane kako biste spriječili pogreÅĄne konfiguracije, posebno ako koristite WatchTower ili bilo koji mehanizam koji automatski aÅžurira vaÅĄu posluÅžiteljsku aplikaciju.", + "version_announcement_overlay_title": "Dostupna je nova verzija posluÅžitelja 🎉", + "version_history": "Povijest verzija", + "version_history_item": "Instalirana verzija {version} dana {date}", + "video": "Videozapis", + "video_hover_setting": "Reproduciraj sličicu videozapisa pri prelasku miÅĄem", + "video_hover_setting_description": "Reproduciraj sličicu videozapisa kada miÅĄ prelazi preko stavke. Čak i kada je onemogućeno, reprodukcija se moÅže pokrenuti prelaskom miÅĄa preko ikone za reprodukciju.", + "videos": "Videozapisi", + "videos_count": "{count, plural, =1 {# Videozapis} few {# Videozapisa} other {# Videozapisa}}", + "view": "Prikaz", + "view_album": "PrikaÅži album", + "view_all": "PrikaÅži sve", + "view_all_users": "PrikaÅži sve korisnike", + "view_in_timeline": "PrikaÅži na vremenskoj crti", + "view_link": "PrikaÅži poveznicu", + "view_links": "PrikaÅži poveznice", + "view_name": "Prikaz", + "view_next_asset": "PrikaÅži sljedeću stavku", + "view_previous_asset": "PrikaÅži prethodnu stavku", + "view_qr_code": "PrikaÅži QR kod", + "view_stack": "PrikaÅži sloÅžene", + "viewer_remove_from_stack": "Ukloni iz sloÅženih", + "viewer_stack_use_as_main_asset": "Koristi kao glavnu stavku", + "viewer_unstack": "Razdvoji", + "visibility_changed": "Vidljivost promijenjena za {count, plural, =1 {# osobu} few {# osobe} other {# osoba}}", + "waiting": "Čekanje", + "warning": "Upozorenje", + "week": "Tjedan", + "welcome": "DobrodoÅĄli", + "welcome_to_immich": "DobrodoÅĄli u Immich", + "wifi_name": "Naziv Wi-Fi mreÅže", + "year": "Godina", + "years_ago": "prije {years, plural, =1 {# godinu} few {# godine} other {# godina}}", + "yes": "Da", + "you_dont_have_any_shared_links": "Nemate nijednu dijeljenu poveznicu", + "your_wifi_name": "Naziv vaÅĄe Wi-Fi mreÅže", + "zoom_image": "Povećaj sliku" } diff --git a/i18n/hu.json b/i18n/hu.json index 88ce6033f8..b3de1ac19d 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Automatikus regisztrÃĄciÃŗ", "oauth_auto_register_description": "Új felhasznÃĄlÃŗk automatikus regisztrÃĄlÃĄsa az OAuth hasznÃĄlatÃĄval tÃļrtÊnő bejelentkezÊs utÃĄn", "oauth_button_text": "Gomb szÃļvege", - "oauth_client_id": "Kliens ID", - "oauth_client_secret": "Kliens Titok", "oauth_enable_description": "BejelentkezÊs OAuth hasznÃĄlatÃĄval", - "oauth_issuer_url": "KibocsÃĄtÃŗ URL", "oauth_mobile_redirect_uri": "Mobil ÃĄtirÃĄnyítÃĄsi URI", "oauth_mobile_redirect_uri_override": "Mobil ÃĄtirÃĄnyítÃĄsi URI felÃŧlírÃĄs", "oauth_mobile_redirect_uri_override_description": "EngedÊlyezd, ha az OAuth szolgÃĄltatÃŗ tiltja a mobil URI-t, mint pÊldÃĄul '{callback}'", - "oauth_profile_signing_algorithm": "Profil alÃĄÃ­rÃŗ algoritmus", - "oauth_profile_signing_algorithm_description": "A felhasznÃĄlÃŗi profil alÃĄÃ­rÃĄsÃĄhoz hasznÃĄlt algoritmus.", - "oauth_scope": "HatÃŗkÃļr", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth bejelentkezÊsi beÃĄllítÃĄsok kezelÊse", "oauth_settings_more_details": "Erről a funkciÃŗrÃŗl tovÃĄbbi informÃĄciÃŗt a dokumentÃĄciÃŗban talÃĄlsz.", - "oauth_signing_algorithm": "AlÃĄÃ­rÃĄs algoritmusa", "oauth_storage_label_claim": "TÃĄrhely címke igÊnylÊs", "oauth_storage_label_claim_description": "A felhasznÃĄlÃŗ tÃĄrhely címkÊjÊnek automatikus beÃĄllítÃĄsa az igÊnyeltre.", "oauth_storage_quota_claim": "TÃĄrhelykvÃŗta igÊnylÊse", diff --git a/i18n/hy.json b/i18n/hy.json index 000fcaa2e1..34f0f05119 100644 --- a/i18n/hy.json +++ b/i18n/hy.json @@ -1,23 +1,24 @@ { + "about": "Õ„ÕĄÕŊÕĢÕļ", "account": "", "account_settings": "", "acknowledge": "", - "action": "", + "action": "ÔŗÕ¸Ö€ÕŽÕ¸Õ˛Õ¸Ö‚ÕŠÕĩուÕļ", "actions": "", "active": "", "activity": "", - "add": "", + "add": "ÔąÕžÕĨÕŦÕĄÖÕļÕĨÕŦ", "add_a_description": "", - "add_a_location": "", - "add_a_name": "", + "add_a_location": "ÔąÕžÕĨÕŦÕĄÖÕļÕĨÕŦ ÕŋÕĨÕ˛", + "add_a_name": "ÔąÕžÕĨÕŦÕĄÖÕļÕĨÕŦ ÕĄÕļուÕļ", "add_a_title": "", "add_exclusion_pattern": "", "add_import_path": "", - "add_location": "", + "add_location": "ÔąÕžÕĨÕŦÕĄÖÕļÕĨÕŦ ÕŋÕĨÕ˛", "add_more_users": "", "add_partner": "", "add_path": "", - "add_photos": "", + "add_photos": "ÔąÕžÕĨÕŦÕĄÖÕļÕĨÕŦ ÕļÕ¯ÕĄÖ€ÕļÕĨր", "add_to": "", "add_to_album": "", "add_to_shared_album": "", @@ -136,17 +137,12 @@ "oauth_auto_register": "", "oauth_auto_register_description": "", "oauth_button_text": "", - "oauth_client_id": "", - "oauth_client_secret": "", "oauth_enable_description": "", - "oauth_issuer_url": "", "oauth_mobile_redirect_uri": "", "oauth_mobile_redirect_uri_override": "", "oauth_mobile_redirect_uri_override_description": "", - "oauth_scope": "", "oauth_settings": "", "oauth_settings_description": "", - "oauth_signing_algorithm": "", "oauth_storage_label_claim": "", "oauth_storage_label_claim_description": "", "oauth_storage_quota_claim": "", @@ -295,7 +291,10 @@ "asset_offline": "", "assets": "", "authorized_devices": "", - "back": "", + "back": "ՀÕĨÕŋ", + "backup_all": "Ô˛Õ¸ÕŦոր", + "backup_controller_page_background_battery_info_link": "ՑուÕĩց Õŋուր ÕĢÕļÕšÕēÕĨÕŊ", + "backup_controller_page_background_battery_info_ok": "ÔŧÕĄÕž", "backward": "", "blurred_background": "", "camera": "", @@ -307,8 +306,8 @@ "cannot_update_the_description": "", "change_date": "", "change_expiration_time": "", - "change_location": "", - "change_name": "", + "change_location": "ՓոխÕĨÕŦ ÕŋÕĨÕ˛Õ¨", + "change_name": "ՓոխÕĨÕŦ ÕĄÕļուÕļ", "change_name_successfully": "", "change_password": "", "change_your_password": "", @@ -316,13 +315,15 @@ "check_all": "", "check_logs": "", "choose_matching_people_to_merge": "", - "city": "", + "city": "Õ”ÕĄÕ˛ÕĄÖ„", "clear": "", "clear_all": "", "clear_message": "", "clear_value": "", + "client_cert_dialog_msg_confirm": "ÔŧÕĄÕž", "close": "", "collapse_all": "", + "color": "ÔŗÕ¸Ö‚ÕĩÕļ", "color_theme": "", "comment_options": "", "comments_are_disabled": "", @@ -333,6 +334,7 @@ "contain": "", "context": "", "continue": "", + "control_bottom_app_bar_edit_location": "ՓոխÕĨÕŦ ՏÕĨÕ˛Õ¨", "copied_image_to_clipboard": "", "copied_to_clipboard": "", "copy_error": "", @@ -342,7 +344,7 @@ "copy_link_to_clipboard": "", "copy_password": "", "copy_to_clipboard": "", - "country": "", + "country": "ÔĩրկÕĢր", "cover": "", "covers": "", "create": "", @@ -350,19 +352,22 @@ "create_library": "", "create_link": "", "create_link_to_share": "", - "create_new_person": "", + "create_new": "ՍՏÔĩÕ‚ÔžÔĩÔŧ ՆՈՐ", + "create_new_person": "ՍÕŋÕĨÕ˛ÕŽÕĨÕŦ Õļոր ÕĄÕļÕą", "create_new_user": "", + "create_shared_album_page_share_select_photos": "Ô¸ÕļÕŋրÕĨ Õ†Õ¯ÕĄÖ€ÕļÕĨր", "create_user": "", "created": "", + "curated_object_page_title": "Ô˛ÕĄÕļÕĨր", "current_device": "", "custom_locale": "", "custom_locale_description": "", - "dark": "", + "dark": "Õ„Õ¸Ö‚ÕŠ", "date_after": "", "date_and_time": "", "date_before": "", "date_range": "", - "day": "", + "day": "Օր", "default_locale": "", "default_locale_description": "", "delete": "", @@ -401,7 +406,7 @@ "edit_import_paths": "", "edit_key": "", "edit_link": "", - "edit_location": "", + "edit_location": "ՓոխÕĨÕŦ ÕŋÕĨÕ˛Õ¨", "edit_name": "", "edit_people": "", "edit_title": "", @@ -484,6 +489,9 @@ "unable_to_update_timeline_display_status": "", "unable_to_update_user": "" }, + "exif_bottom_sheet_person_add_person": "ÔąÕžÕĨÕŦÕĄÖÕļÕĨÕŦ ÕĄÕļուÕļ", + "exif_bottom_sheet_person_age": "ÕÕĄÖ€ÕĢք {}", + "exif_bottom_sheet_person_age_years": "ÕÕĄÖ€ÕĢք {}", "exit_slideshow": "", "expand_all": "", "expire_after": "", @@ -513,6 +521,7 @@ "go_to_search": "", "group_albums_by": "", "has_quota": "", + "hi_user": "Ô˛ÕĄÖ€ÕĨւ {name} ({email})", "hide_gallery": "", "hide_password": "", "hide_person": "", @@ -570,6 +579,8 @@ "manage_your_devices": "", "manage_your_oauth_connection": "", "map": "", + "map_assets_in_bound": "{} ÕļÕ¯ÕĄÖ€", + "map_assets_in_bounds": "{} ÕļÕ¯ÕĄÖ€ÕļÕĨր", "map_marker_with_image": "", "map_settings": "", "matches": "", @@ -636,6 +647,7 @@ "partner_can_access": "", "partner_can_access_assets": "", "partner_can_access_location": "", + "partner_list_user_photos": "{}-ÕĢÕļ ÕļÕ¯ÕĄÖ€ÕļÕĨրը", "partner_sharing": "", "partners": "", "password": "", @@ -659,7 +671,7 @@ "permanent_deletion_warning_setting_description": "", "permanently_delete": "", "permanently_deleted_asset": "", - "photos": "", + "photos": "Õ†Õ¯ÕĄÖ€ÕļÕĨր", "photos_count": "", "photos_from_previous_years": "", "pick_a_location": "", @@ -707,21 +719,28 @@ "retry_upload": "", "review_duplicates": "", "role": "", - "save": "", + "save": "ÕŠÕĄÕ°ÕĨ", "saved_api_key": "", "saved_profile": "", "saved_settings": "", "say_something": "", "scan_all_libraries": "", + "scan_library": "Õ†ÕĄÕĩÕĨ", "scan_settings": "", - "search": "", + "search": "ՓÕļÕŋրÕĨ", "search_albums": "", "search_by_context": "", "search_camera_make": "", "search_camera_model": "", - "search_city": "", + "search_city": "ՈրոÕļÕĨ Ö„ÕĄÕ˛ÕĄÖ„â€Ļ", "search_country": "", + "search_filter_date": "ÔąÕ´ÕŊÕĄÕŠÕĢÕž", + "search_filter_date_interval": "{start} Õ´ÕĢÕļÕšÕĨւ {end}", + "search_filter_location": "ՏÕĨÕ˛", + "search_filter_location_title": "Ô¸ÕļÕŋրÕĨ ÕŋÕĨÕ˛", "search_for_existing_person": "", + "search_no_people": "ÕˆÕš Õ´ÕĢ ÕĄÕļÕą", + "search_page_motion_photos": "Õ‡ÕĄÖ€ÕĒÕžÕ¸Õ˛ Õ†Õ¯ÕĄÖ€ÕļÕĨր", "search_people": "", "search_places": "", "search_state": "", @@ -738,7 +757,7 @@ "select_keep_all": "", "select_library_owner": "", "select_new_face": "", - "select_photos": "", + "select_photos": "Ô¸ÕļÕŋրÕĨ ÕļÕ¯ÕĄÖ€ÕļÕĨր", "select_trash_all": "", "selected": "", "send_message": "", @@ -750,13 +769,24 @@ "set_date_of_birth": "", "set_profile_picture": "", "set_slideshow_to_fullscreen": "", + "setting_notifications_notify_never": "ÕĨրÕĸÕĨք", + "setting_notifications_notify_seconds": "{} ÕžÕĄÕĩրկÕĩÕĄÕļ", "settings": "", "settings_saved": "", "share": "", + "share_add_photos": "ÔąÕžÕĨÕŦÕĄÖÕļÕĨÕŦ ÕļÕ¯ÕĄÖ€ÕļÕĨր", "shared": "", "shared_by": "", "shared_by_you": "", "shared_from_partner": "", + "shared_link_edit_expire_after_option_day": "1 օր", + "shared_link_edit_expire_after_option_days": "{} օր", + "shared_link_edit_expire_after_option_hour": "1 ÕĒÕĄÕ´", + "shared_link_edit_expire_after_option_hours": "{} ÕĒÕĄÕ´", + "shared_link_edit_expire_after_option_minute": "1 րոÕēÕĨ", + "shared_link_edit_expire_after_option_minutes": "{} րոÕēÕĨ", + "shared_link_edit_expire_after_option_months": "{} ÕĄÕ´ÕĢÕŊ", + "shared_link_edit_expire_after_option_year": "{} ÕŋÕĄÖ€ÕĢ", "shared_links": "", "shared_photos_and_videos_count": "", "shared_with_partner": "", @@ -784,6 +814,8 @@ "slideshow": "", "slideshow_settings": "", "sort_albums_by": "", + "sort_oldest": "ÔąÕ´ÕĨÕļÕĄÕ°ÕĢÕļ ÕļÕ¯ÕĄÖ€Õ¨", + "sort_recent": "ÔąÕ´ÕĨÕļÕĄÕļոր ÕļÕ¯ÕĄÖ€Õ¨", "stack": "", "stack_selected_photos": "", "stacktrace": "", @@ -808,22 +840,25 @@ "theme_selection": "", "theme_selection_description": "", "time_based_memories": "", - "timezone": "", + "timezone": "ÔēÕĄÕ´ÕĄÕĩÕĢÕļ ÕŖÕ¸ÕŋÕĢ", "to_archive": "", "to_favorite": "", + "to_trash": "ÔąÕ˛Õĸ", "toggle_settings": "", "toggle_theme": "", "total_usage": "", - "trash": "", + "trash": "ÔąÕ˛Õĸ", "trash_all": "", "trash_no_results_message": "", + "trash_page_title": "ÔąÕ˛Õĸ ({})", "trashed_items_will_be_permanently_deleted_after": "", - "type": "", + "type": "ՏÕĨÕŊÕĄÕ¯", "unarchive": "", "unfavorite": "", "unhide_person": "", - "unknown": "", - "unknown_year": "", + "unknown": "ÔąÕļÕ°ÕĄÕĩÕŋ", + "unknown_country": "ÔąÕļÕ°ÕĄÕĩÕŋ ÔĩրկÕĢր", + "unknown_year": "ÔąÕļÕ°ÕĄÕĩÕŋ ÕÕĄÖ€ÕĢ", "unlimited": "", "unlink_oauth": "", "unlinked_oauth_account": "", @@ -835,6 +870,7 @@ "updated_password": "", "upload": "", "upload_concurrency": "", + "upload_status_errors": "ÕÕ­ÕĄÕŦÕļÕĨր", "url": "", "usage": "", "user": "", @@ -846,6 +882,7 @@ "validate": "", "variables": "", "version": "", + "version_announcement_closing": "Քո Õ¨ÕļÕ¯ÕĨրը՝ ÔąÕŦÕĨքÕŊÕ¨", "video": "", "video_hover_setting": "", "video_hover_setting_description": "", @@ -857,11 +894,11 @@ "view_next_asset": "", "view_previous_asset": "", "waiting": "", - "week": "", - "welcome": "", + "week": "Õ‡ÕĄÕĸÕĄÕŠ", + "welcome": "Ô˛ÕĄÖ€ÕĢ ÕŖÕĄÕŦուÕŊÕŋ", "welcome_to_immich": "", - "year": "", - "yes": "", + "year": "ÕÕĄÖ€ÕĢ", + "yes": "ÔąÕĩÕ¸", "you_dont_have_any_shared_links": "", "zoom_image": "" } diff --git a/i18n/id.json b/i18n/id.json index 1d500654dc..a75ef00991 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -192,26 +192,22 @@ "oauth_auto_register": "Pendaftaran otomatis", "oauth_auto_register_description": "Daftar pengguna baru secara otomatis setelah log masuk dengan OAuth", "oauth_button_text": "Teks tombol", - "oauth_client_id": "ID Klien", - "oauth_client_secret": "Rahasia Klien", + "oauth_client_secret_description": "Diperlukan jika PKCE (Proof Key for Code Exchange) tidak didukung oleh penyedia OAuth", "oauth_enable_description": "Log masuk dengan OAuth", - "oauth_issuer_url": "URL Penerbit", "oauth_mobile_redirect_uri": "URI pengalihan ponsel", "oauth_mobile_redirect_uri_override": "Penimpaan URI penerusan ponsel", "oauth_mobile_redirect_uri_override_description": "Aktifkan ketika provider OAuth tidak mengizinkan tautan mobile, seperti '{callback}'", - "oauth_profile_signing_algorithm": "Algoritma penandatanganan profil", - "oauth_profile_signing_algorithm_description": "Algoritma yang digunakan untuk menandatangani profil pengguna.", - "oauth_scope": "Cakupan", "oauth_settings": "OAuth", "oauth_settings_description": "Kelola pengaturan log masuk OAuth", "oauth_settings_more_details": "Untuk detail lanjut tentang fitur ini, lihat docs.", - "oauth_signing_algorithm": "Algoritma penandatanganan", "oauth_storage_label_claim": "Klaim label penyimpanan", "oauth_storage_label_claim_description": "Atur label penyimpanan pengguna menjadi nilai klaim ini secara otomatis.", "oauth_storage_quota_claim": "Klaim kuota penyimpanan", "oauth_storage_quota_claim_description": "Atur kuota penyimpanan pengguna menjadi nilai klaim ini secara otomatis.", "oauth_storage_quota_default": "Kuota penyimpanan bawaan (GiB)", "oauth_storage_quota_default_description": "Kuota dalam GiB untuk digunakan ketika tidak ada klaim yang disediakan (Masukkan 0 untuk kuota tidak terbatas).", + "oauth_timeout": "Waktu Permintaan Habis", + "oauth_timeout_description": "Waktu habis untuk permintaan dalam milidetik", "offline_paths": "Jalur Luring", "offline_paths_description": "Hasil ini dapat terjadi karena penghapusan berkas manual yang tidak menjadi bagian dari pustaka eksternal.", "password_enable_description": "Masuk dengan surel dan kata sandi", @@ -374,7 +370,7 @@ "advanced_settings_enable_alternate_media_filter_subtitle": "Gunakan opsi ini untuk menyaring media saat sinkronisasi berdasarkan kriteria alternatif. Hanya coba ini dengan aplikasi mendeteksi semua album.", "advanced_settings_enable_alternate_media_filter_title": "[EKSPERIMENTAL] Gunakan saringan sinkronisasi album perangkat alternatif", "advanced_settings_log_level_title": "Tingkat log: {}", - "advanced_settings_prefer_remote_subtitle": "Beberapa perangkat tidak dapat memuat thumbnail dengan cepat.\nMenyalakan ini akan memuat thumbnail dari server.", + "advanced_settings_prefer_remote_subtitle": "Beberapa perangkat tidak dapat memuat gambar kecil dengan cepat. Menyalakan ini akan memuat gambar kecil dari server.", "advanced_settings_prefer_remote_title": "Prefer remote images", "advanced_settings_proxy_headers_subtitle": "Define proxy headers Immich should send with each network request", "advanced_settings_proxy_headers_title": "Proxy Headers", @@ -481,18 +477,18 @@ "assets_added_to_album_count": "Ditambahkan {count, plural, one {# aset} other {# aset}} ke album", "assets_added_to_name_count": "Ditambahkan {count, plural, one {# aset} other {# aset}} ke {hasName, select, true {{name}} other {album baru}}", "assets_count": "{count, plural, one {# aset} other {# aset}}", - "assets_deleted_permanently": "{} asset dihapus secara permanen", - "assets_deleted_permanently_from_server": "{} asset(s) deleted permanently from the Immich server", + "assets_deleted_permanently": "{} aset dihapus secara permanen", + "assets_deleted_permanently_from_server": "{} aset dihapus secara permanen dari server Immich", "assets_moved_to_trash_count": "Dipindahkan {count, plural, one {# aset} other {# aset}} ke sampah", "assets_permanently_deleted_count": "{count, plural, one {# aset} other {# aset}} dihapus secara permanen", "assets_removed_count": "{count, plural, one {# aset} other {# aset}} dihapus", - "assets_removed_permanently_from_device": "{} asset(s) removed permanently from your device", + "assets_removed_permanently_from_device": "{} aset dihapus secara permanen dari perangkat Anda", "assets_restore_confirmation": "Apakah Anda yakin ingin memulihkan semua aset yang dibuang? Anda tidak dapat mengurungkan tindakan ini! Perlu diingat bahwa aset luring tidak dapat dipulihkan.", "assets_restored_count": "{count, plural, one {# aset} other {# aset}} dipulihkan", - "assets_restored_successfully": "{} asset(s) restored successfully", - "assets_trashed": "{} asset(s) trashed", + "assets_restored_successfully": "{} aset berhasil dipulihkan", + "assets_trashed": "{} aset dipindahkan ke sampah", "assets_trashed_count": "{count, plural, one {# aset} other {# aset}} dibuang ke sampah", - "assets_trashed_from_server": "{} asset(s) trashed from the Immich server", + "assets_trashed_from_server": "{} aset dipindahkan ke sampah dari server Immich", "assets_were_part_of_album_count": "{count, plural, one {Aset telah} other {Aset telah}} menjadi bagian dari album", "authorized_devices": "Perangkat Terautentikasi", "automatic_endpoint_switching_subtitle": "Connect locally over designated Wi-Fi when available and use alternative connections elsewhere", @@ -501,19 +497,19 @@ "back_close_deselect": "Kembali, tutup, atau batalkan pemilihan", "background_location_permission": "Background location permission", "background_location_permission_content": "In order to switch networks when running in the background, Immich must *always* have precise location access so the app can read the Wi-Fi network's name", - "backup_album_selection_page_albums_device": "Album perangkat ({})", + "backup_album_selection_page_albums_device": "Album di perangkat ({})", "backup_album_selection_page_albums_tap": "Sentuh untuk memilih, sentuh 2x untuk mengecualikan", "backup_album_selection_page_assets_scatter": "Aset dapat tersebar dalam banyak album. Sehingga album dapat dipilih atau dikecualikan saat proses pencadangan.", "backup_album_selection_page_select_albums": "Pilih album", - "backup_album_selection_page_selection_info": "Album terpilih: ", + "backup_album_selection_page_selection_info": "Info Pilihan", "backup_album_selection_page_total_assets": "Total aset unik", "backup_all": "Semua", - "backup_background_service_backup_failed_message": "Gagal mencadangkan aset. Mencoba lagi...", - "backup_background_service_connection_failed_message": "Koneksi ke server gagal. Mencoba ulang...", + "backup_background_service_backup_failed_message": "Gagal mencadangkan aset. Mencoba lagiâ€Ļ", + "backup_background_service_connection_failed_message": "Koneksi ke server gagal. Mencoba ulangâ€Ļ", "backup_background_service_current_upload_notification": "Mengunggah {}", - "backup_background_service_default_notification": "Memeriksa aset baru...", + "backup_background_service_default_notification": "Memeriksa aset baruâ€Ļ", "backup_background_service_error_title": "Backup error", - "backup_background_service_in_progress_notification": "Mencadangkan asetmu...", + "backup_background_service_in_progress_notification": "Mencadangkan asetmuâ€Ļ", "backup_background_service_upload_failure_notification": "Gagal mengunggah {}", "backup_controller_page_albums": "Cadangkan album", "backup_controller_page_background_app_refresh_disabled_content": "Enable background app refresh in Settings > General > Background App Refresh in order to use background backup.", @@ -525,13 +521,13 @@ "backup_controller_page_background_battery_info_title": "Optimisasi baterai", "backup_controller_page_background_charging": "Hanya saat mengisi daya", "backup_controller_page_background_configure_error": "Gagal mengatur layanan latar belakang", - "backup_controller_page_background_delay": "Tunda cadangkan aset baru: {}", + "backup_controller_page_background_delay": "Tunda pencadangan aset baru: {}", "backup_controller_page_background_description": "Aktifkan layanan latar belakang untuk mencadangkan aset baru secara otomatis tanpa perlu membuka app", "backup_controller_page_background_is_off": "Pencadangan otomatis di latar belakang nonaktif", "backup_controller_page_background_is_on": "Pencadangan otomatis di latar belakang aktif", "backup_controller_page_background_turn_off": "Matikan layanan latar belakang", "backup_controller_page_background_turn_on": "Nyalakan layanan latar belakang", - "backup_controller_page_background_wifi": "Hanya melalui WiFi", + "backup_controller_page_background_wifi": "Hanya melalui Wi-Fi", "backup_controller_page_backup": "Cadangkan", "backup_controller_page_backup_selected": "Terpilih: ", "backup_controller_page_backup_sub": "Foto dan video yang dicadangkan", @@ -549,7 +545,7 @@ "backup_controller_page_start_backup": "Mulai Cadangkan", "backup_controller_page_status_off": "Pencadangan otomatis di latar depan nonaktif", "backup_controller_page_status_on": "Pencadangan otomatis di latar depan aktif", - "backup_controller_page_storage_format": "{} dari {} terpakai", + "backup_controller_page_storage_format": "{} dari {} digunakan", "backup_controller_page_to_backup": "Album untuk dicadangkan", "backup_controller_page_total_sub": "Semua foto dan video unik dari album terpilih", "backup_controller_page_turn_off": "Nonaktifkan pencadangan latar depan", @@ -574,13 +570,13 @@ "bulk_keep_duplicates_confirmation": "Apakah Anda yakin ingin menyimpan {count, plural, one {# aset duplikat} other {# aset duplikat}}? Ini akan menyelesaikan semua kelompok duplikat tanpa menghapus apa pun.", "bulk_trash_duplicates_confirmation": "Apakah Anda yakin ingin membuang {count, plural, one {# aset duplikat} other {# aset duplikat}} secara bersamaan? Ini akan menyimpan aset terbesar dari setiap kelompok dan membuang semua duplikat lainnya.", "buy": "Beli Immich", - "cache_settings_album_thumbnails": "Library page thumbnails ({} assets)", + "cache_settings_album_thumbnails": "Thumbnail halaman pustaka ({} aset)", "cache_settings_clear_cache_button": "Hapus cache", "cache_settings_clear_cache_button_title": "Membersihkan cache aplikasi. Performa aplikasi akan terpengaruh hingga cache dibuat kembali.", "cache_settings_duplicated_assets_clear_button": "BERSIHKAN", "cache_settings_duplicated_assets_subtitle": "Photos and videos that are black listed by the app", - "cache_settings_duplicated_assets_title": "Aset Ganda ({})", - "cache_settings_image_cache_size": "Image cache size ({} assets)", + "cache_settings_duplicated_assets_title": "Aset Duplikat ({})", + "cache_settings_image_cache_size": "Ukuran cache gambar ({} aset)", "cache_settings_statistics_album": "Pustaka thumbnail", "cache_settings_statistics_assets": "{} aset ({})", "cache_settings_statistics_full": "Full images", @@ -610,7 +606,7 @@ "change_password": "Ubah Kata Sandi", "change_password_description": "Ini merupakan pertama kali Anda masuk ke sistem atau ada permintaan untuk mengubah kata sandi Anda. Silakan masukkan kata sandi baru di bawah.", "change_password_form_confirm_password": "Konfirmasi Sandi", - "change_password_form_description": "Halo {name},\n\nIni pertama kali anda masuk ke dalam sistem atau terdapat permintaan penggantian password.\nHarap masukkan password baru.", + "change_password_form_description": "Halo {name},\n\nIni pertama kali anda masuk ke dalam sistem atau terdapat permintaan penggantian kata sandi. Harap masukkan password baru.", "change_password_form_new_password": "Sandi Baru", "change_password_form_password_mismatch": "Sandi tidak cocok", "change_password_form_reenter_new_password": "Masukkan Ulang Sandi Baru", @@ -818,7 +814,7 @@ "enabled": "Diaktifkan", "end_date": "Tanggal akhir", "enqueued": "Enqueued", - "enter_wifi_name": "Enter WiFi name", + "enter_wifi_name": "Masukkan nama Wi-Fi", "error": "Eror", "error_change_sort_album": "Failed to change album sort order", "error_delete_face": "Terjadi kesalahan menghapus wajah dari aset", @@ -958,7 +954,7 @@ "exif_bottom_sheet_people": "ORANG", "exif_bottom_sheet_person_add_person": "Tambah nama", "exif_bottom_sheet_person_age": "Umur {}", - "exif_bottom_sheet_person_age_months": "Umur {} months", + "exif_bottom_sheet_person_age_months": "Umur {} bulan", "exif_bottom_sheet_person_age_year_months": "Umur 1 tahun, {} bulan", "exif_bottom_sheet_person_age_years": "Umur {}", "exit_slideshow": "Keluar dari Salindia", @@ -978,7 +974,7 @@ "external": "Eksternal", "external_libraries": "Pustaka Eksternal", "external_network": "External network", - "external_network_sheet_info": "When not on the preferred Wi-Fi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom", + "external_network_sheet_info": "Ketika tidak berada di jaringan Wi-Fi yang disukai, aplikasi akan terhubung ke server melalui URL pertama di bawah ini yang dapat dijangkaunya, mulai dari atas ke bawah", "face_unassigned": "Tidak ada nama", "failed": "Failed", "failed_to_load_assets": "Gagal memuat aset", @@ -1045,7 +1041,7 @@ "home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping", "home_page_favorite_err_local": "Can not favorite local assets yet, skipping", "home_page_favorite_err_partner": "Can not favorite partner assets yet, skipping", - "home_page_first_time_notice": "Jika ini pertama kali Anda menggunakan aplikasi, pastikan untuk memilik album untuk dicadangkan agar linimasa anda terisi oleh foto dan video dalam album.", + "home_page_first_time_notice": "Jika ini pertama kali Anda menggunakan aplikasi, pastikan untuk memiliki album untuk dicadangkan agar lini masa anda terisi oleh foto dan video dalam album", "home_page_share_err_local": "Can not share local assets via link, skipping", "home_page_upload_err_limit": "Hanya dapat mengunggah maksimal 30 aset dalam satu waktu, melewatkan", "host": "Hos", @@ -1125,7 +1121,7 @@ "local_network": "Local network", "local_network_sheet_info": "The app will connect to the server through this URL when using the specified Wi-Fi network", "location_permission": "Location permission", - "location_permission_content": "In order to use the auto-switching feature, Immich needs precise location permission so it can read the current WiFi network's name", + "location_permission_content": "Untuk menggunakan fitur pengalihan otomatis, Immich memerlukan izin lokasi yang akurat agar dapat membaca nama jaringan Wi-Fi saat ini", "location_picker_choose_on_map": "Pilih di peta", "location_picker_latitude_error": "Masukkan lintang yang sah", "location_picker_latitude_hint": "Masukkan lintang di sini", @@ -1149,7 +1145,7 @@ "login_form_err_trailing_whitespace": "Trailing whitespace", "login_form_failed_get_oauth_server_config": "Gagal logging menggunakan OAuth, periksa URL server", "login_form_failed_get_oauth_server_disable": "Fitur OAuth tidak tersedia di server ini", - "login_form_failed_login": "Login gagal. Periksa URL server, email dan password.", + "login_form_failed_login": "Login gagal, periksa URL server, email dan kata sandi", "login_form_handshake_exception": "There was an Handshake Exception with the server. Enable self-signed certificate support in the settings if you are using a self-signed certificate.", "login_form_password_hint": "sandi", "login_form_save_login": "Ingat saya", @@ -1548,7 +1544,7 @@ "search_result_page_new_search_hint": "Pencarian Baru", "search_settings": "Pengaturan pencarian", "search_state": "Cari negara bagian...", - "search_suggestion_list_smart_search_hint_1": "Penelusuran cerdas aktif secara bawaan. Untuk menelusuri metadata, gunakan sintaks", + "search_suggestion_list_smart_search_hint_1": "Penelusuran cerdas aktif secara bawaan. Untuk menelusuri metadata, gunakan sintaks ", "search_suggestion_list_smart_search_hint_2": "m:penelusuran-kamu", "search_tags": "Cari tag...", "search_timezone": "Cari zona waktu...", @@ -1598,7 +1594,7 @@ "setting_languages_apply": "Terapkan", "setting_languages_subtitle": "Change the app's language", "setting_languages_title": "Bahasa", - "setting_notifications_notify_failures_grace_period": "Notify background backup failures: {}", + "setting_notifications_notify_failures_grace_period": "Beritahu kegagalan cadangan latar belakang: {}", "setting_notifications_notify_hours": "{} jam", "setting_notifications_notify_immediately": "segera", "setting_notifications_notify_minutes": "{} menit", @@ -1617,7 +1613,7 @@ "settings_saved": "Pengaturan disimpan", "share": "Bagikan", "share_add_photos": "Tambah foto", - "share_assets_selected": "{} terpilih", + "share_assets_selected": "{} dipilih", "share_dialog_preparing": "Menyiapkan...", "shared": "Dibagikan", "shared_album_activities_input_disable": "Comment is disabled", @@ -1631,10 +1627,10 @@ "shared_by_user": "Dibagikan oleh {user}", "shared_by_you": "Dibagikan oleh Anda", "shared_from_partner": "Foto dari {partner}", - "shared_intent_upload_button_progress_text": "{} / {} Uploaded", + "shared_intent_upload_button_progress_text": "{} / {} Diunggah", "shared_link_app_bar_title": "Link Berbagi", "shared_link_clipboard_copied_massage": "Tersalin ke papan klip", - "shared_link_clipboard_text": "Tautan: {}\nSandi: {}", + "shared_link_clipboard_text": "Tautan: {}\nKata Sandi: {}", "shared_link_create_error": "Terjadi kesalahan saat membuat link berbagi", "shared_link_edit_description_hint": "Masukkan deskripsi link", "shared_link_edit_expire_after_option_day": "1 hari", @@ -1834,7 +1830,7 @@ "upload_status_errors": "Eror", "upload_status_uploaded": "Diunggah", "upload_success": "Pengunggahan berhasil, muat ulang laman untuk melihat aset terunggah yang baru.", - "upload_to_immich": "Upload to Immich ({})", + "upload_to_immich": "Unggah ke Immich ({})", "uploading": "Uploading", "url": "URL", "usage": "Penggunaan", @@ -1891,11 +1887,11 @@ "week": "Pekan", "welcome": "Selamat datang", "welcome_to_immich": "Selamat datang di Immich", - "wifi_name": "WiFi Name", + "wifi_name": "Nama Wi-Fi", "year": "Tahun", "years_ago": "{years, plural, one {# tahun} other {# tahun}} yang lalu", "yes": "Ya", "you_dont_have_any_shared_links": "Anda tidak memiliki tautan terbagi", - "your_wifi_name": "Your WiFi name", + "your_wifi_name": "Nama Wi-Fi Anda", "zoom_image": "Perbesar Gambar" } diff --git a/i18n/it.json b/i18n/it.json index 987ad34d2d..550f14beb9 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -39,11 +39,11 @@ "authentication_settings_disable_all": "Sei sicuro di voler disabilitare tutte le modalità di accesso? Il login verrà disabilitato completamente.", "authentication_settings_reenable": "Per ri-abilitare, utilizza un Comando Server.", "background_task_job": "Attività in Background", - "backup_database": "Database di Backup", + "backup_database": "Crea Dump Database", "backup_database_enable_description": "Abilita i backup del database", - "backup_keep_last_amount": "Quantità di backup precedenti da mantenere", - "backup_settings": "Impostazioni di backup", - "backup_settings_description": "Gestisci le impostazioni dei backup", + "backup_keep_last_amount": "Numero di backup da mantenere", + "backup_settings": "Impostazioni Dump database", + "backup_settings_description": "Gestisci le impostazioni dei backup. Nota: Questi jobs non sono monitorati e non riceverai notifiche in caso di errore.", "check_all": "Controlla Tutto", "cleanup": "Pulisci", "cleared_jobs": "Cancellati i processi per: {job}", @@ -192,26 +192,21 @@ "oauth_auto_register": "Registrazione automatica", "oauth_auto_register_description": "Automaticamente registra nuovi utenti dopo il login OAuth", "oauth_button_text": "Testo pulsante", - "oauth_client_id": "ID Cliente", - "oauth_client_secret": "Chiave segreta client", + "oauth_client_secret_description": "Richiesto se PKCE (Proof Key for Code Exchange) non è supportato dal provider OAuth", "oauth_enable_description": "Login con OAuth", - "oauth_issuer_url": "URL emittente", "oauth_mobile_redirect_uri": "URI reindirizzamento mobile", "oauth_mobile_redirect_uri_override": "Sovrascrivi URI reindirizzamento cellulare", "oauth_mobile_redirect_uri_override_description": "Abilita quando il gestore OAuth non consente un URL come '{callback}'", - "oauth_profile_signing_algorithm": "Algoritmo firma profilo", - "oauth_profile_signing_algorithm_description": "L'algoritmo usato per firmare il profilo utente.", - "oauth_scope": "Ambito di autorizzazione", "oauth_settings": "OAuth", "oauth_settings_description": "Gestisci impostazioni di login OAuth", "oauth_settings_more_details": "Per piÚ dettagli riguardo a questa funzionalità, consulta la documentazione.", - "oauth_signing_algorithm": "Algoritmo di firma", "oauth_storage_label_claim": "Dichiarazione di ambito(claim) etichetta archiviazione", "oauth_storage_label_claim_description": "Imposta automaticamente l'etichetta dell'archiviazione dell'utente al valore di questa dichiarazione di ambito(claim).", "oauth_storage_quota_claim": "Dichiarazione di ambito(claim) limite archiviazione", "oauth_storage_quota_claim_description": "Imposta automaticamente il limite di archiviazione dell'utente in base al valore di questa dichiarazione di ambito(claim).", "oauth_storage_quota_default": "Limite predefinito di archiviazione (GiB)", "oauth_storage_quota_default_description": "Limite in GiB da usare quanto nessuna dichiarazione di ambito(claim) è stata fornita (Inserisci 0 per archiviazione illimitata).", + "oauth_timeout": "", "offline_paths": "Percorsi offline", "offline_paths_description": "Questi risultati potrebbero essere dovuti all'eliminazione manuale di file che non fanno parte di una libreria esterna.", "password_enable_description": "Login con email e password", @@ -481,12 +476,12 @@ "assets_added_to_album_count": "{count, plural, one {# asset aggiunto} other {# asset aggiunti}} all'album", "assets_added_to_name_count": "Aggiunti {count, plural, one {# asset} other {# assets}} a {hasName, select, true {{name}} other {new album}}", "assets_count": "{count, plural, other {# asset}}", - "assets_deleted_permanently": "{} elementi rimossi definitivamente", - "assets_deleted_permanently_from_server": "{} elementi rimossi definitivamente dal server Immich", + "assets_deleted_permanently": "{} elementi cancellati definitivamente", + "assets_deleted_permanently_from_server": "{} elementi cancellati definitivamente dal server Immich", "assets_moved_to_trash_count": "{count, plural, one {# asset spostato} other {# asset spostati}} nel cestino", "assets_permanently_deleted_count": "{count, plural, one {# asset cancellato} other {# asset cancellati}} definitivamente", "assets_removed_count": "{count, plural, one {# asset rimosso} other {# asset rimossi}}", - "assets_removed_permanently_from_device": "{} elementi rimossi definitivamente dal tuo dispositivo", + "assets_removed_permanently_from_device": "{} elementi cancellati definitivamente dal tuo dispositivo", "assets_restore_confirmation": "Sei sicuro di voler ripristinare tutti gli asset cancellati? Non puoi annullare questa azione! Tieni presente che eventuali risorse offline NON possono essere ripristinate in questo modo.", "assets_restored_count": "{count, plural, one {# asset ripristinato} other {# asset ripristinati}}", "assets_restored_successfully": "{} elementi ripristinati", @@ -531,7 +526,7 @@ "backup_controller_page_background_is_on": "Backup automatico attivo", "backup_controller_page_background_turn_off": "Disabilita servizi in background", "backup_controller_page_background_turn_on": "Abilita servizi in background", - "backup_controller_page_background_wifi": "Solo su WiFi", + "backup_controller_page_background_wifi": "Solo Wi-Fi", "backup_controller_page_backup": "Backup", "backup_controller_page_backup_selected": "Selezionati: ", "backup_controller_page_backup_sub": "Foto e video caricati", @@ -853,10 +848,12 @@ "failed_to_keep_this_delete_others": "Impossibile conservare questa risorsa ed eliminare le altre risorse", "failed_to_load_asset": "Errore durante il caricamento della risorsa", "failed_to_load_assets": "Errore durante il caricamento delle risorse", + "failed_to_load_notifications": "Errore nel caricamento delle notifiche", "failed_to_load_people": "Caricamento delle persone non riuscito", "failed_to_remove_product_key": "Rimozione del codice del prodotto fallita", "failed_to_stack_assets": "Errore durante il raggruppamento degli assets", "failed_to_unstack_assets": "Errore durante la separazione degli assets", + "failed_to_update_notification_status": "Aggiornamento stato notifiche fallito", "import_path_already_exists": "Questo percorso di importazione già esiste.", "incorrect_email_or_password": "Email o password non corretta", "paths_validation_failed": "{paths, plural, one {# percorso} other {# percorsi}} hanno fallito la validazione", @@ -1125,7 +1122,7 @@ "local_network": "Rete locale", "local_network_sheet_info": "L'app si collegherà al server tramite questo URL quando è in uso la rete Wi-Fi specificata", "location_permission": "Permesso di localizzazione", - "location_permission_content": "Per usare la funzione di cambio automatico, Immich necessita del permesso di localizzazione precisa cosÃŦ da poter leggere il nome della rete Wi-Fi in uso", + "location_permission_content": "Per usare la funzione di cambio automatico, Immich necessita del permesso di localizzazione cosÃŦ da poter leggere il nome della rete Wi-Fi in uso", "location_picker_choose_on_map": "Scegli una mappa", "location_picker_latitude_error": "Inserisci una latitudine valida", "location_picker_latitude_hint": "Inserisci la tua latitudine qui", @@ -1199,6 +1196,9 @@ "map_settings_only_show_favorites": "Mostra solo preferiti", "map_settings_theme_settings": "Tema della mappa", "map_zoom_to_see_photos": "Riduci lo zoom per vedere le foto", + "mark_all_as_read": "Segna tutto come letto", + "mark_as_read": "Segna come letto", + "marked_all_as_read": "Segnato tutto come letto", "matches": "Corrispondenze", "media_type": "Tipo Media", "memories": "Ricordi", @@ -1225,6 +1225,7 @@ "month": "Mese", "monthly_title_text_date_format": "MMMM y", "more": "Di piÚ", + "moved_to_archive": "", "moved_to_trash": "Spostato nel cestino", "multiselect_grid_edit_date_time_err_read_only": "Non puoi modificare la data di risorse in sola lettura, azione ignorata", "multiselect_grid_edit_gps_err_read_only": "Non puoi modificare la posizione di risorse in sola lettura, azione ignorata", @@ -1257,6 +1258,8 @@ "no_favorites_message": "Aggiungi preferiti per trovare facilmente le tue migliori foto e video", "no_libraries_message": "Crea una libreria esterna per vedere le tue foto e i tuoi video", "no_name": "Nessun nome", + "no_notifications": "Nessuna notifica", + "no_people_found": "Nessuna persona trovata", "no_places": "Nessun posto", "no_results": "Nessun risultato", "no_results_description": "Prova ad usare un sinonimo oppure una parola chiave piÚ generica", @@ -1432,6 +1435,8 @@ "recent_searches": "Ricerche recenti", "recently_added": "Aggiunti recentemente", "recently_added_page_title": "Aggiunti di recente", + "recently_taken": "Scattate di recente", + "recently_taken_page_title": "Scattate di Recente", "refresh": "Aggiorna", "refresh_encoded_videos": "Ricarica video codificati", "refresh_faces": "Aggiorna facce", @@ -1566,6 +1571,7 @@ "select_keep_all": "Seleziona mantieni tutto", "select_library_owner": "Seleziona proprietario libreria", "select_new_face": "Seleziona nuovo volto", + "select_person_to_tag": "Seleziona una persona da taggare", "select_photos": "Seleziona foto", "select_trash_all": "Seleziona cestina tutto", "select_user_for_sharing_page_err_album": "Impossibile nel creare l'album", @@ -1629,7 +1635,7 @@ "shared_by_user": "Condiviso da {user}", "shared_by_you": "Condiviso da te", "shared_from_partner": "Foto da {partner}", - "shared_intent_upload_button_progress_text": "{} / {} Inviati", + "shared_intent_upload_button_progress_text": "{} / {} Caricati", "shared_link_app_bar_title": "Link condivisi", "shared_link_clipboard_copied_massage": "Copiato negli appunti", "shared_link_clipboard_text": "Link: {}\nPassword: {}", @@ -1646,9 +1652,9 @@ "shared_link_edit_password_hint": "Inserire la password di condivisione", "shared_link_edit_submit_button": "Aggiorna link", "shared_link_error_server_url_fetch": "Non è possibile trovare l'indirizzo del server", - "shared_link_expires_day": "Scade tra {} giorno", + "shared_link_expires_day": "Scade tra {} giorni", "shared_link_expires_days": "Scade tra {} giorni", - "shared_link_expires_hour": "Scade tra {} ora", + "shared_link_expires_hour": "Scade tra {} ore", "shared_link_expires_hours": "Scade tra {} ore", "shared_link_expires_minute": "Scade tra {} minuto", "shared_link_expires_minutes": "Scade tra {} minuti", @@ -1832,7 +1838,7 @@ "upload_status_errors": "Errori", "upload_status_uploaded": "Caricato", "upload_success": "Caricamento completato con successo, aggiorna la pagina per vedere i nuovi asset caricati.", - "upload_to_immich": "Invio ad Immich ({})", + "upload_to_immich": "Carica su Immich ({})", "uploading": "Caricamento", "url": "URL", "usage": "Utilizzo", @@ -1889,7 +1895,7 @@ "week": "Settimana", "welcome": "Benvenuto", "welcome_to_immich": "Benvenuto in Immich", - "wifi_name": "Nome della rete Wi-Fi", + "wifi_name": "Nome rete Wi-Fi", "year": "Anno", "years_ago": "{years, plural, one {# anno} other {# anni}} fa", "yes": "Si", diff --git a/i18n/ja.json b/i18n/ja.json index eb6b355615..2d0585f00c 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -1,5 +1,5 @@ { - "about": "ã‚ĸプãƒĒãĢついãĻ", + "about": "こぎã‚ĸプãƒĒãĢついãĻ", "account": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆ", "account_settings": "ã‚ĸã‚Ģã‚Ļãƒŗãƒˆč¨­åŽš", "acknowledge": "äē†č§Ŗ", @@ -28,7 +28,7 @@ "add_to_album_bottom_sheet_already_exists": "{album}ãĢčŋŊ加済ãŋ", "add_to_shared_album": "å…ąæœ‰ã‚ĸãƒĢバムãĢčŋŊ加", "add_url": "URLをčŋŊ加", - "added_to_archive": "ã‚ĸãƒŧã‚ĢイブãĢčŋŊ加済", + "added_to_archive": "ã‚ĸãƒŧã‚ĢイブãĢしぞした", "added_to_favorites": "お気ãĢå…ĨりãĢčŋŊ加済", "added_to_favorites_count": "{count, number} 枚ぎį”ģ像をお気ãĢå…ĨりãĢčŋŊ加済", "admin": { @@ -39,11 +39,11 @@ "authentication_settings_disable_all": "æœŦåŊ“ãĢ全ãĻãŽãƒ­ã‚°ã‚¤ãƒŗæ–šæŗ•ã‚’į„ĄåŠšãĢしぞすか? ãƒ­ã‚°ã‚¤ãƒŗã¯åŽŒå…¨ãĢį„ĄåŠšãĢãĒりぞす。", "authentication_settings_reenable": "å†ãŗæœ‰åŠšãĢするãĢは、ã‚ĩãƒŧバãƒŧã‚ŗãƒžãƒŗãƒ‰ã‚’äŊŋį”¨ã—ãĻください。", "background_task_job": "バックグナã‚Ļãƒŗãƒ‰ã‚ŋ゚ク", - "backup_database": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸップ", - "backup_database_enable_description": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸップを有劚ãĢする", + "backup_database": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸップをäŊœæˆ", + "backup_database_enable_description": "デãƒŧã‚ŋベãƒŧ゚バックã‚ĸップぎäŊœæˆã‚’有劚ãĢする", "backup_keep_last_amount": "過åŽģぎバックã‚ĸップぎäŋæŒæ•°", - "backup_settings": "バックã‚ĸãƒƒãƒ—č¨­åŽš", - "backup_settings_description": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸãƒƒãƒ—č¨­åŽšãŽįŽĄį†", + "backup_settings": "デãƒŧã‚ŋベãƒŧ゚バックã‚ĸップäŊœæˆãŽč¨­åޚ", + "backup_settings_description": "デãƒŧã‚ŋベãƒŧ゚ぎバックã‚ĸップäŊœæˆč¨­åŽšãŽįŽĄį† (こぎジョブはãƒĸニã‚ŋãƒĒãƒŗã‚°ã•ã‚Œãžã›ã‚“ã—ã€å¤ąæ•—ãŒį™ēį”Ÿã—ãĻもあãĒたãĢ通įŸĨãŒčĄŒãã“ã¨ã¯ã‚ã‚Šãžã›ã‚“)", "check_all": "すずãĻを選択", "cleanup": "クãƒĒãƒŧãƒŗã‚ĸップ", "cleared_jobs": "{job}ぎジョブをクãƒĒã‚ĸしぞした", @@ -72,6 +72,7 @@ "image_format_description": "WebPはJPEGã‚ˆã‚Šã‚‚ãƒ•ã‚Ąã‚¤ãƒĢã‚ĩイã‚ēãŒå°ã•ã„ã§ã™ãŒã€ã‚¨ãƒŗã‚ŗãƒŧドãĢ時間がかかりぞす。", "image_fullsize_description": "į”ģåƒã‚’æ‹Ąå¤§ã™ã‚‹æ™‚ãĢäŊŋã‚ã‚Œã‚‹ãƒĄã‚ŋデãƒŧã‚ŋを取り除いた原寸大į”ģ像", "image_fullsize_enabled": "原寸大į”ģåƒį”Ÿæˆã‚’æœ‰åŠšãĢする", + "image_fullsize_enabled_description": "Webã§čĄ¨į¤ēãŒé›Ŗã—ã„ã¨ã•ã‚Œã‚‹į”ģ像フりãƒŧマットãĢ寞しãĻ原寸大į”ģåƒã‚’į”Ÿæˆã™ã‚‹ã€‚", "image_fullsize_quality_description": "1から100ぞで原寸大į”ģ像ぎčŗĒです。éĢ˜ã„ãģã†ãŒã„ã„ãŒãƒ•ã‚Ąã‚¤ãƒĢが大きくãĒりぞす。", "image_fullsize_title": "原寸大į”ģåƒč¨­åŽš", "image_prefer_embedded_preview": "埋めčžŧãŋプãƒŦビãƒĨãƒŧをå„Ē先", @@ -191,20 +192,13 @@ "oauth_auto_register": "č‡Ē動į™ģ錞", "oauth_auto_register_description": "OAuthでã‚ĩã‚¤ãƒŗã‚¤ãƒŗã—ãŸã‚ã¨ã€č‡Ēå‹•įš„ãĢ新čĻãƒĻãƒŧã‚ļãƒŧをį™ģéŒ˛ã™ã‚‹", "oauth_button_text": "ボã‚ŋãƒŗãƒ†ã‚­ã‚šãƒˆ", - "oauth_client_id": "クナイã‚ĸãƒŗãƒˆID", - "oauth_client_secret": "クナイã‚ĸãƒŗãƒˆ ã‚ˇãƒŧクãƒŦット", "oauth_enable_description": "OAuthã§ãƒ­ã‚°ã‚¤ãƒŗ", - "oauth_issuer_url": "į™ēčĄŒå…ƒURL", "oauth_mobile_redirect_uri": "ãƒĸバイãƒĢᔍãƒĒダイãƒŦクトURI", "oauth_mobile_redirect_uri_override": "ãƒĸバイãƒĢᔍãƒĒダイãƒŦクトURIīŧˆä¸Šæ›¸ãīŧ‰", "oauth_mobile_redirect_uri_override_description": "'{callback}'ãĒお、ãƒĸバイãƒĢURIがOAuthプロバイダãƒŧãĢã‚ˆãŖãĻč¨ąå¯ã•ã‚ŒãĻいãĒい場合ãĢ有劚ãĢしãĻください", - "oauth_profile_signing_algorithm": "ãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢぎįŊ˛åã‚ĸãƒĢゴãƒĒã‚ēム", - "oauth_profile_signing_algorithm_description": "ãƒĻãƒŧã‚ļãƒŧãƒ—ãƒ­ãƒ•ã‚Ąã‚¤ãƒĢをįŊ˛åã™ã‚‹ãŽãĢäŊŋį”¨ã™ã‚‹ã‚ĸãƒĢゴãƒĒã‚ēム。", - "oauth_scope": "ã‚šã‚ŗãƒŧプ", "oauth_settings": "OAuth", "oauth_settings_description": "OAuthãƒ­ã‚°ã‚¤ãƒŗč¨­åŽšã‚’įŽĄį†ã—ãžã™", "oauth_settings_more_details": "こぎ抟čƒŊãŽčŠŗį´°ãĢついãĻは、ドキãƒĨãƒĄãƒŗãƒˆã‚’å‚į…§ã—ãĻください。", - "oauth_signing_algorithm": "įŊ˛åã‚ĸãƒĢゴãƒĒã‚ēム", "oauth_storage_label_claim": "゚トãƒŦãƒŧジナベãƒĢ クãƒŦãƒŧム", "oauth_storage_label_claim_description": "ãƒĻãƒŧã‚ļãƒŧぎ゚トãƒŦãƒŧジナベãƒĢを、こぎクãƒŦãƒŧムぎ値ãĢč‡Ēå‹•įš„ãĢč¨­åŽšã—ãžã™ã€‚", "oauth_storage_quota_claim": "゚トãƒŦãƒŧジクりãƒŧã‚ŋ クãƒŦãƒŧム", @@ -370,6 +364,8 @@ "admin_password": "įŽĄį†č€…ãƒ‘ã‚šãƒ¯ãƒŧド", "administration": "įŽĄį†", "advanced": "čŠŗį´°č¨­åŽš", + "advanced_settings_enable_alternate_media_filter_subtitle": "åˆĨぎåŸēæē–ãĢåž“ãŖãĻãƒĄãƒ‡ã‚Ŗã‚ĸãƒ•ã‚Ąã‚¤ãƒĢãĢãƒ•ã‚ŖãƒĢã‚ŋãƒŧをかけãĻã€åŒæœŸã‚’čĄŒã„ãžã™ã€‚ã‚ĸプãƒĒがすずãĻぎã‚ĸãƒĢバムをčĒ­ãŋčžŧんでくれãĒい場合ãĢぎãŋ、こぎ抟čƒŊをčŠĻしãĻください。", + "advanced_settings_enable_alternate_media_filter_title": "[čŠĻ鍓運ᔍ] åˆĨぎデバイ゚ぎã‚ĸãƒĢãƒãƒ åŒæœŸãƒ•ã‚ŖãƒĢã‚ŋãƒŧをäŊŋį”¨ã™ã‚‹", "advanced_settings_log_level_title": "ログãƒŦベãƒĢ: {}", "advanced_settings_prefer_remote_subtitle": "デバイ゚ãĢã‚ˆãŖãĻは、デバイ゚上ãĢあるã‚ĩムネイãƒĢぎロãƒŧドãĢ非常ãĢ時間がかかることがありぞす。こぎã‚Ēãƒ—ã‚ˇãƒ§ãƒŗã‚’ãĢ有劚ãĢするäē‹ãĢより、ã‚ĩãƒŧバãƒŧã‹ã‚‰į›´æŽĨį”ģ像をロãƒŧドすることが可čƒŊです。", "advanced_settings_prefer_remote_title": "ãƒĒãƒĸãƒŧトをå„Ē先する", @@ -377,6 +373,8 @@ "advanced_settings_proxy_headers_title": "ãƒ—ãƒ­ã‚­ã‚ˇãƒ˜ãƒƒãƒ€", "advanced_settings_self_signed_ssl_subtitle": "SSLぎチェックを゚キップする。č‡ĒåˇąįŊ˛åč¨ŧ明書がåŋ…čĻã§ã™ã€‚", "advanced_settings_self_signed_ssl_title": "č‡ĒåˇąįŊ˛åč¨ŧæ˜Žæ›¸ã‚’č¨ąå¯ã™ã‚‹", + "advanced_settings_sync_remote_deletions_subtitle": "Webでこぎ操äŊœã‚’čĄŒãŖãŸéš›ãĢ、č‡Ēå‹•įš„ãĢこぎデバイ゚上からåŊ“čОã‚ĸã‚ģットを削除ぞたは垊元する", + "advanced_settings_sync_remote_deletions_title": "ãƒĒãƒĸãƒŧト削除ぎ同期 [čŠĻ鍓運ᔍ]", "advanced_settings_tile_subtitle": "čŋŊ加ãƒĻãƒŧã‚ļãƒŧč¨­åŽš", "advanced_settings_troubleshooting_subtitle": "トナブãƒĢã‚ˇãƒĨãƒŧãƒ†ã‚Ŗãƒŗã‚°į”¨ãŽčŠŗį´°č¨­åŽšã‚’ã‚ĒãƒŗãĢする", "advanced_settings_troubleshooting_title": "トナブãƒĢã‚ˇãƒĨãƒŧãƒ†ã‚Ŗãƒŗã‚°", @@ -399,8 +397,8 @@ "album_remove_user_confirmation": "æœŦåŊ“ãĢ{user}を削除しぞすか?", "album_share_no_users": "こぎã‚ĸãƒĢバムを全ãĻぎãƒĻãƒŧã‚ļãƒŧã¨å…ąæœ‰ã—ãŸã‹ã€å…ąæœ‰ã™ã‚‹ãƒĻãƒŧã‚ļãƒŧがいãĒいようです。", "album_thumbnail_card_item": "1枚", - "album_thumbnail_card_items": "{}枚", - "album_thumbnail_card_shared": "å…ąæœ‰æ¸ˆãŋ", + "album_thumbnail_card_items": "{}é …į›Ž", + "album_thumbnail_card_shared": " ¡ å…ąæœ‰æ¸ˆãŋ", "album_thumbnail_shared_by": "{}ãŒå…ąæœ‰ä¸­", "album_updated": "ã‚ĸãƒĢバム更新", "album_updated_setting_description": "å…ąæœ‰ã‚ĸãƒĢバムãĢ新しいã‚ĸã‚ģットがčŋŊ加されたとき通įŸĨを受け取る", @@ -431,18 +429,18 @@ "api_key_description": "こぎ値は一回ぎãŋ襨į¤ēされぞす。 ã‚Ļã‚Ŗãƒŗãƒ‰ã‚Ļを閉じる前ãĢåŋ…ãšã‚ŗãƒ”ãƒŧしãĻください。", "api_key_empty": "APIキãƒŧ名はįŠēį™ŊãĢできぞせん", "api_keys": "APIキãƒŧ", - "app_bar_signout_dialog_content": " ã‚ĩã‚¤ãƒŗã‚ĸã‚ĻトしぞすかīŧŸ", + "app_bar_signout_dialog_content": "ã‚ĩã‚¤ãƒŗã‚ĸã‚ĻトしぞすかīŧŸ", "app_bar_signout_dialog_ok": "はい", - "app_bar_signout_dialog_title": " ã‚ĩã‚¤ãƒŗã‚ĸã‚Ļト", + "app_bar_signout_dialog_title": "ã‚ĩã‚¤ãƒŗã‚ĸã‚Ļト", "app_settings": "ã‚ĸプãƒĒč¨­åŽš", "appears_in": "これらãĢåĢぞれぞす", "archive": "ã‚ĸãƒŧã‚Ģイブ", "archive_or_unarchive_photo": "å†™įœŸã‚’ã‚ĸãƒŧã‚Ģイブぞたはã‚ĸãƒŧã‚Ģã‚¤ãƒ–č§Ŗé™¤", - "archive_page_no_archived_assets": "ã‚ĸãƒŧã‚Ģイブ済ãŋãŽå†™įœŸãžãŸã¯ãƒ“ãƒ‡ã‚Ēがありぞせん", - "archive_page_title": "ã‚ĸãƒŧã‚Ģイブ({})", + "archive_page_no_archived_assets": "ã‚ĸãƒŧã‚Ģã‚¤ãƒ–ã—ãŸå†™įœŸãžãŸã¯ãƒ“ãƒ‡ã‚Ēがありぞせん", + "archive_page_title": "ã‚ĸãƒŧã‚Ģイブ ({})", "archive_size": "ã‚ĸãƒŧã‚Ģイブã‚ĩイã‚ē", "archive_size_description": "ダã‚Ļãƒŗãƒ­ãƒŧドぎã‚ĸãƒŧã‚Ģイブ ã‚ĩイã‚ēã‚’č¨­åŽš(GiB 単äŊ)", - "archived": "ã‚ĸãƒŧã‚Ģイブ済ãŋ", + "archived": "ã‚ĸãƒŧã‚Ģイブ", "archived_count": "ã‚ĸãƒŧã‚Ģイブされた{count, plural, other {#å€‹ãŽé …į›Ž}}", "are_these_the_same_person": "これらは同じäēēį‰Šã§ã™ã‹?", "are_you_sure_to_do_this": "æœŦåŊ“ãĢã“ã‚Œã‚’čĄŒã„ãžã™ã‹?", @@ -478,10 +476,10 @@ "assets_count": "{count, plural, one {#個} other {#個}}ぎã‚ĸã‚ģット", "assets_deleted_permanently": "{}é …į›Žã‚’åŽŒå…¨ãĢ削除しぞした", "assets_deleted_permanently_from_server": "ã‚ĩãƒŧバãƒŧ上ぎ{}é …į›Žã‚’åŽŒå…¨ãĢ削除しぞした", - "assets_moved_to_trash_count": "{count, plural, one {#個} other {#個}}ぎã‚ĸã‚ģットをごãŋįŽąãĢį§ģ動しぞした", + "assets_moved_to_trash_count": "{count, plural, one {#é …į›Ž} other {#é …į›Ž}}ã‚’ã‚´ãƒŸįŽąãĢį§ģ動しぞした", "assets_permanently_deleted_count": "{count, plural, one {#個} other {#個}}ぎã‚ĸã‚ģットを厌全ãĢ削除しぞした", - "assets_removed_count": "{count, plural, one {#個} other {#個}}ぎã‚ĸã‚ģットを削除しぞした", - "assets_removed_permanently_from_device": "į̝æœĢから{}é …į›Žã‚’åŽŒå…¨ãĢ削除しぞした", + "assets_removed_count": "{count, plural, one {#é …į›Ž} other {#é …į›Ž}}を削除しぞした", + "assets_removed_permanently_from_device": "デバイ゚から{}é …į›Žã‚’åŽŒå…¨ãĢ削除しぞした", "assets_restore_confirmation": "ごãŋįŽąãŽã‚ĸã‚ģットをすずãĻ垊元しãĻもよろしいですか? こぎ操äŊœã‚’å…ƒãĢæˆģすことはできぞせん! ã‚Ēãƒ•ãƒŠã‚¤ãƒŗãŽã‚ĸã‚ģãƒƒãƒˆã¯ã“ãŽæ–šæŗ•ã§ã¯åžŠå…ƒã§ããžã›ã‚“ã€‚", "assets_restored_count": "{count, plural, one {#個} other {#個}}ぎã‚ĸã‚ģットを垊元しぞした", "assets_restored_successfully": "{}é …į›Žã‚’åžŠå…ƒã—ãžã—ãŸ", @@ -496,7 +494,7 @@ "back_close_deselect": "æˆģã‚‹ã€é–‰ã˜ã‚‹ã€é¸æŠžč§Ŗé™¤", "background_location_permission": "バックグナã‚Ļãƒŗãƒ‰äŊįŊŽæƒ…å ąã‚ĸクã‚ģ゚", "background_location_permission_content": "æ­Ŗå¸¸ãĢWi-Fiぎ名前(SSID)ã‚’į˛åž—ã™ã‚‹ãĢはã‚ĸプãƒĒが常ãĢčŠŗį´°ãĒäŊįŊŽæƒ…å ąãĢã‚ĸクã‚ģ゚できるåŋ…čĻãŒã‚ã‚Šãžã™", - "backup_album_selection_page_albums_device": "į̝æœĢ上ぎã‚ĸãƒĢバム数: {}", + "backup_album_selection_page_albums_device": "デバイ゚上ぎã‚ĸãƒĢバム数: {}", "backup_album_selection_page_albums_tap": "ã‚ŋップで選択、ダブãƒĢã‚ŋップで除外", "backup_album_selection_page_assets_scatter": "ã‚ĸãƒĢバムを選択ãƒģ除外しãĻバックã‚ĸãƒƒãƒ—ã™ã‚‹å†™įœŸã‚’é¸ãļ (åŒã˜å†™įœŸãŒč¤‡æ•°ãŽã‚ĸãƒĢバムãĢį™ģéŒ˛ã•ã‚ŒãĻいることがあるため)", "backup_album_selection_page_select_albums": "ã‚ĸãƒĢバムを選択", @@ -520,7 +518,7 @@ "backup_controller_page_background_battery_info_title": "バッテãƒĒãƒŧぎ最遊化", "backup_controller_page_background_charging": "充é›ģ中ぎãŋ", "backup_controller_page_background_configure_error": "バックグナã‚Ļãƒŗãƒ‰ã‚ĩãƒŧãƒ“ã‚šãŽč¨­åŽšãĢå¤ąæ•—", - "backup_controller_page_background_delay": "æ–°ã—ã„å†™įœŸãŽãƒãƒƒã‚¯ã‚ĸップ遅åģļ: {}", + "backup_controller_page_background_delay": "æ–°ã—ã„é …į›ŽãŽãƒãƒƒã‚¯ã‚ĸップ開始ぞで垅つ時間: {}", "backup_controller_page_background_description": "ã‚ĸプãƒĒを開いãĻいãĒいときもバックã‚ĸãƒƒãƒ—ã‚’čĄŒã„ãžã™", "backup_controller_page_background_is_off": "ãƒãƒƒã‚¯ã‚°ãƒŠãƒŗãƒ‰ã‚ĩãƒŧビ゚がã‚ĒフãĢãĒãŖãĻいぞす", "backup_controller_page_background_is_on": "ãƒãƒƒã‚¯ã‚°ãƒŠãƒŗãƒ‰ã‚ĩãƒŧビ゚がã‚ĒãƒŗãĢãĒãŖãĻいぞす", @@ -530,7 +528,7 @@ "backup_controller_page_backup": "バックã‚ĸップ", "backup_controller_page_backup_selected": "選択中:", "backup_controller_page_backup_sub": "バックã‚ĸãƒƒãƒ—ã•ã‚ŒãŸå†™įœŸã¨å‹•į”ģぎ数", - "backup_controller_page_created": "{} äŊœæˆ", + "backup_controller_page_created": "äŊœæˆæ—Ĩ: {}", "backup_controller_page_desc_backup": "ã‚ĸプãƒĒを開いãĻいるときãĢå†™įœŸã¨å‹•į”ģをバックã‚ĸップしぞす", "backup_controller_page_excluded": "除外中ぎã‚ĸãƒĢバム:", "backup_controller_page_failed": "å¤ąæ•—: ({})", @@ -544,7 +542,7 @@ "backup_controller_page_start_backup": "バックã‚ĸップ開始", "backup_controller_page_status_off": "バックã‚ĸップがã‚ĒフãĢãĒãŖãĻいぞす", "backup_controller_page_status_on": "バックã‚ĸップがã‚ĒãƒŗãĢãĒãŖãĻいぞす", - "backup_controller_page_storage_format": "äŊŋį”¨æ¸ˆãŋ({}) - 全äŊ“({})", + "backup_controller_page_storage_format": "äŊŋᔍ䏭: {} / {}", "backup_controller_page_to_backup": "バックã‚ĸップされるã‚ĸãƒĢバム", "backup_controller_page_total_sub": "選択されたã‚ĸãƒĢãƒãƒ ãŽå†™įœŸã¨å‹•į”ģぎ数", "backup_controller_page_turn_off": "バックã‚ĸップをã‚ĒフãĢする", @@ -574,16 +572,16 @@ "cache_settings_clear_cache_button_title": "ã‚­ãƒŖãƒƒã‚ˇãƒĨを削除 (ã‚­ãƒŖãƒƒã‚ˇãƒĨãŒå†į”Ÿæˆã•ã‚Œã‚‹ãžã§ã€ã‚ĸプãƒĒぎパフりãƒŧãƒžãƒŗã‚šãŒč‘—ã—ãäŊŽä¸‹ã—ぞす)", "cache_settings_duplicated_assets_clear_button": "クãƒĒã‚ĸ", "cache_settings_duplicated_assets_subtitle": "ã‚ĩãƒŧバãƒŧãĢã‚ĸップロãƒŧド済ãŋとčĒč­˜ã•ã‚ŒãŸå†™įœŸã‚„å‹•į”ģぎ数", - "cache_settings_duplicated_assets_title": "{}é …į›ŽãŽé‡č¤‡", - "cache_settings_image_cache_size": "ã‚­ãƒŖãƒƒã‚ˇãƒĨぎã‚ĩイã‚ē ({}枚)", + "cache_settings_duplicated_assets_title": "é‡č¤‡ã—ãŸé …į›Žæ•°: ({})", + "cache_settings_image_cache_size": "į”ģåƒã‚­ãƒŖãƒƒã‚ˇãƒĨぎã‚ĩイã‚ē ({}é …į›Ž)", "cache_settings_statistics_album": "ナイブナãƒĒぎã‚ĩムネイãƒĢ", - "cache_settings_statistics_assets": "{}枚 ({}枚中)", + "cache_settings_statistics_assets": "{}é …į›Ž ({}é …į›Žä¸­)", "cache_settings_statistics_full": "フãƒĢį”ģ像", "cache_settings_statistics_shared": "å…ąæœ‰ã‚ĸãƒĢバムぎã‚ĩムネイãƒĢ", "cache_settings_statistics_thumbnail": "ã‚ĩムネイãƒĢ", "cache_settings_statistics_title": "ã‚­ãƒŖãƒƒã‚ˇãƒĨ", "cache_settings_subtitle": "ã‚­ãƒŖãƒƒã‚ˇãƒĨぎ動äŊœã‚’変更する", - "cache_settings_thumbnail_size": "ã‚ĩムネイãƒĢãŽã‚­ãƒŖãƒƒã‚ˇãƒĨぎã‚ĩイã‚ē ({}枚)", + "cache_settings_thumbnail_size": "ã‚ĩムネイãƒĢãŽã‚­ãƒŖãƒƒã‚ˇãƒĨぎã‚ĩイã‚ē ({}é …į›Ž)", "cache_settings_tile_subtitle": "ロãƒŧã‚ĢãƒĢ゚トãƒŦãƒŧジぎ挙動をįĸēčĒã™ã‚‹", "cache_settings_tile_title": "ロãƒŧã‚ĢãƒĢ゚トãƒŦãƒŧジ", "cache_settings_title": "ã‚­ãƒŖãƒƒã‚ˇãƒĨãŽč¨­åŽš", @@ -592,12 +590,12 @@ "camera_model": "ã‚ĢãƒĄãƒŠãƒĸデãƒĢ", "cancel": "ã‚­ãƒŖãƒŗã‚ģãƒĢ", "cancel_search": "検į´ĸã‚’ã‚­ãƒŖãƒŗã‚ģãƒĢ", - "canceled": "Canceled", + "canceled": "ã‚­ãƒŖãƒŗã‚ģãƒĢされぞした", "cannot_merge_people": "äēēį‰Šã‚’įĩąåˆã§ããžã›ã‚“", "cannot_undo_this_action": "こぎ操äŊœã¯å…ƒãĢæˆģせぞせんīŧ", "cannot_update_the_description": "čĒŦ明を更新できぞせん", "change_date": "æ—Ĩ時を変更", - "change_display_order": "Change display order", + "change_display_order": "襨į¤ē順を変更", "change_expiration_time": "有劚期限を変更", "change_location": "場所を変更", "change_name": "名前を変更", @@ -643,7 +641,7 @@ "comments_are_disabled": "ã‚ŗãƒĄãƒŗãƒˆã¯į„ĄåŠšåŒ–ã•ã‚ŒãĻいぞす", "common_create_new_album": "ã‚ĸãƒĢバムをäŊœæˆ", "common_server_error": "ネットワãƒŧクæŽĨįļšã‚’įĸēčĒã—ã€ã‚ĩãƒŧバãƒŧがæŽĨįļšã§ãã‚‹įŠļ態ãĢあるかįĸēčĒã—ãĻください。ã‚ĸプãƒĒとã‚ĩãƒŧバãƒŧぎバãƒŧã‚¸ãƒ§ãƒŗãŒä¸€č‡´ã—ãĻいるかもįĸēčĒã—ãĻください。", - "completed": "Completed", + "completed": "厌äē†", "confirm": "įĸēčĒ", "confirm_admin_password": "įŽĄį†č€…ãƒ‘ã‚šãƒ¯ãƒŧドをįĸēčĒ", "confirm_delete_face": "æœŦåŊ“ãĢ『{name}ã€ãŽéĄ”ã‚’ã‚ĸã‚ģットから削除しぞすか?", @@ -653,13 +651,13 @@ "contain": "収める", "context": "įŠļæŗ", "continue": "įļšã‘ã‚‹", - "control_bottom_app_bar_album_info_shared": "{}枚 ¡ å…ąæœ‰æ¸ˆ", + "control_bottom_app_bar_album_info_shared": "{}é …į›Ž ¡ å…ąæœ‰ä¸­", "control_bottom_app_bar_create_new_album": "ã‚ĸãƒĢバムをäŊœæˆ", "control_bottom_app_bar_delete_from_immich": "Immichから削除", "control_bottom_app_bar_delete_from_local": "į̝æœĢ上から削除", "control_bottom_app_bar_edit_location": "äŊįŊŽæƒ…å ąã‚’įˇ¨é›†", "control_bottom_app_bar_edit_time": "æ—Ĩ時を変更", - "control_bottom_app_bar_share_link": "Share Link", + "control_bottom_app_bar_share_link": "å…ąæœ‰ãƒĒãƒŗã‚¯", "control_bottom_app_bar_share_to": "æŦĄãŽãƒĻãƒŧã‚ļãƒŧãĢå…ąæœ‰: ", "control_bottom_app_bar_trash_from_immich": "ã‚´ãƒŸįŽąãĢå…Ĩれる", "copied_image_to_clipboard": "į”ģ像をクãƒĒップボãƒŧドãĢã‚ŗãƒ”ãƒŧしぞした。", @@ -718,8 +716,8 @@ "delete_album": "ã‚ĸãƒĢバムを削除", "delete_api_key_prompt": "æœŦåŊ“ãĢこぎAPI キãƒŧを削除しぞすか?", "delete_dialog_alert": "ã‚ĩãƒŧバãƒŧã¨ãƒ‡ãƒã‚¤ã‚šãŽä¸Ąæ–šã‹ã‚‰æ°¸äš…įš„ãĢ削除されぞすīŧ", - "delete_dialog_alert_local": "é¸æŠžã•ã‚ŒãŸé …į›Žã¯ãƒ‡ãƒã‚¤ã‚šã‹ã‚‰å‰Šé™¤ã•ã‚Œãžã™ãŒã€ImmichãĢは掋りぞす", - "delete_dialog_alert_local_non_backed_up": "é¸æŠžã•ã‚ŒãŸé …į›ŽãŽã†ãĄã€ImmichãĢバックã‚ĸップされãĻいãĒã„į‰ŠãŒåĢぞれãĻいぞす。デバイ゚からも厌全ãĢ削除されぞす。", + "delete_dialog_alert_local": "é¸æŠžã•ã‚ŒãŸé …į›Žã¯ãƒ‡ãƒã‚¤ã‚šã‹ã‚‰å‰Šé™¤ã•ã‚Œãžã™ãŒã€ã‚ĩãƒŧバãƒŧãĢは掋りぞす", + "delete_dialog_alert_local_non_backed_up": "é¸æŠžã•ã‚ŒãŸé …į›ŽãŽä¸­ãĢ、ã‚ĩãƒŧバãƒŧãĢバックã‚ĸップされãĻいãĒã„į‰ŠãŒåĢぞれãĻいぞす。そぎため、デバイ゚から厌全ãĢ削除されぞす。", "delete_dialog_alert_remote": "é¸æŠžã•ã‚ŒãŸé …į›Žã¯Immichから永䚅ãĢ削除されぞす", "delete_dialog_ok_force": "削除しぞす", "delete_dialog_title": "æ°¸äš…įš„ãĢ削除", @@ -806,16 +804,16 @@ "editor_crop_tool_h2_aspect_ratios": "ã‚ĸ゚ペクト比", "editor_crop_tool_h2_rotation": "回čģĸ", "email": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚", - "empty_folder": "This folder is empty", + "empty_folder": "こぎフりãƒĢダãƒŧはįŠēです", "empty_trash": "ã‚ŗãƒŸįŽąã‚’įŠēãĢする", "empty_trash_confirmation": "æœŦåŊ“ãĢã‚´ãƒŸįŽąã‚’įŠēãĢしぞすか? これãĢã‚ˆã‚Šã€ã‚´ãƒŸįŽąå†…ãŽã™ãšãĻぎã‚ĸã‚ģットが Immich から永䚅ãĢ削除されぞす。\nこぎ操äŊœã‚’å…ƒãĢæˆģすことはできぞせん!", "enable": "有劚化", "enabled": "有劚", "end_date": "įĩ‚ä熿—Ĩ", - "enqueued": "Enqueued", + "enqueued": "順į•Ēåž…ãĄä¸­", "enter_wifi_name": "Wi-Fiぎ名前(SSID)をå…Ĩ力", "error": "エナãƒŧ", - "error_change_sort_album": "Failed to change album sort order", + "error_change_sort_album": "ã‚ĸãƒĢãƒãƒ ãŽčĄ¨į¤ē順ぎ変更ãĢå¤ąæ•—ã—ãžã—ãŸ", "error_delete_face": "ã‚ĸã‚ģãƒƒãƒˆã‹ã‚‰éĄ”ãŽå‰Šé™¤ãŒã§ããžã›ã‚“ã§ã—ãŸ", "error_loading_image": "į”ģ像ぎčĒ­ãŋčžŧãŋエナãƒŧ", "error_saving_image": "エナãƒŧ: {}", @@ -848,10 +846,12 @@ "failed_to_keep_this_delete_others": "ãģかぎã‚ĸã‚ģットを削除できぞせんでした", "failed_to_load_asset": "ã‚ĸã‚ģットをčĒ­ãŋčžŧめぞせんでした", "failed_to_load_assets": "ã‚ĸã‚ģットをčĒ­ãŋčžŧめぞせんでした", + "failed_to_load_notifications": "通įŸĨぎčĒ­ãŋčžŧãŋãĢå¤ąæ•—ã—ãžã—ãŸ", "failed_to_load_people": "äēēį‰Šã‚’čĒ­ãŋčžŧめぞせんでした", "failed_to_remove_product_key": "プロダクトキãƒŧを削除できぞせんでした", "failed_to_stack_assets": "ã‚ĸã‚ģットを゚ã‚ŋックできぞせんでした", "failed_to_unstack_assets": "ã‚ĸã‚ģットを゚ã‚ŋãƒƒã‚¯ã‹ã‚‰č§Ŗé™¤ã™ã‚‹ã“ã¨ãŒã§ããžã›ã‚“ã§ã—ãŸ", + "failed_to_update_notification_status": "通įŸĨ゚テãƒŧã‚ŋ゚ぎ更新ãĢå¤ąæ•—ã—ãžã—ãŸ", "import_path_already_exists": "ã“ãŽã‚¤ãƒŗãƒãƒŧトパ゚はæ—ĸãĢ存在しぞす。", "incorrect_email_or_password": "ãƒĄãƒŧãƒĢã‚ĸドãƒŦ゚ぞたはパ゚ワãƒŧãƒ‰ãŒé–“é•ãŖãĻいぞす", "paths_validation_failed": "{paths, plural, one {#個} other {#個}}ぎパ゚ぎ検č¨ŧãĢå¤ąæ•—ã—ãžã—ãŸ", @@ -952,10 +952,10 @@ "exif_bottom_sheet_location": "æ’ŽåŊąå ´æ‰€", "exif_bottom_sheet_people": "äēēį‰Š", "exif_bottom_sheet_person_add_person": "名前をčŋŊ加", - "exif_bottom_sheet_person_age": "Age {}", - "exif_bottom_sheet_person_age_months": "Age {} months", - "exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months", - "exif_bottom_sheet_person_age_years": "Age {}", + "exif_bottom_sheet_person_age": "{}æ­ŗ", + "exif_bottom_sheet_person_age_months": "į”ŸåžŒ{}ãƒļ月", + "exif_bottom_sheet_person_age_year_months": "1æ­ŗ{}ãƒļ月", + "exif_bottom_sheet_person_age_years": "{}æ­ŗ", "exit_slideshow": "ã‚šãƒŠã‚¤ãƒ‰ã‚ˇãƒ§ãƒŧをįĩ‚わる", "expand_all": "全ãĻåą•é–‹", "experimental_settings_new_asset_list_subtitle": "čŖŊäŊœé€”中 (WIP)", @@ -975,9 +975,9 @@ "external_network": "外部ぎネットワãƒŧク", "external_network_sheet_info": "指厚されたWi-FiãĢįš‹ãŒãŖãĻいãĒい時ã‚ĸプãƒĒはã‚ĩãƒŧバãƒŧへぎæŽĨįļšã‚’指厚されたURLã§čĄŒã„ãžã™ã€‚å„Ē先順äŊã¯ä¸Šã‹ã‚‰ä¸‹ã§ã™", "face_unassigned": "æœĒå‰˛ã‚ŠåŊ“ãĻ", - "failed": "Failed", + "failed": "å¤ąæ•—", "failed_to_load_assets": "ã‚ĸã‚ģットぎロãƒŧドãĢå¤ąæ•—ã—ãžã—ãŸ", - "failed_to_load_folder": "Failed to load folder", + "failed_to_load_folder": "フりãƒĢダãƒŧぎčĒ­ãŋčžŧãŋãĢå¤ąæ•—", "favorite": "お気ãĢå…Ĩり", "favorite_or_unfavorite_photo": "å†™įœŸã‚’ãŠæ°—ãĢå…Ĩりぞたはお気ãĢå…Ĩã‚Šč§Ŗé™¤", "favorites": "お気ãĢå…Ĩり", @@ -991,10 +991,11 @@ "filetype": "ãƒ•ã‚Ąã‚¤ãƒĢã‚ŋイプ", "filter": "ãƒ•ã‚ŖãƒĢã‚ŋãƒŧ", "filter_people": "äēēį‰Šã‚’įĩžã‚Ščžŧãŋ", + "filter_places": "å ´æ‰€ã‚’ãƒ•ã‚ŖãƒĢã‚ŋãƒŧ", "find_them_fast": "名前で検į´ĸしãĻį´ æ—Šãį™ēčĻ‹", "fix_incorrect_match": "é–“é•ãŖãŸä¸€č‡´ã‚’äŋŽæ­Ŗ", - "folder": "Folder", - "folder_not_found": "Folder not found", + "folder": "フりãƒĢダãƒŧ", + "folder_not_found": "フりãƒĢダãƒŧがčĻ‹ã¤ã‹ã‚Šãžã›ã‚“ã§ã—ãŸ", "folders": "フりãƒĢダ", "folders_feature_description": "ãƒ•ã‚Ąã‚¤ãƒĢã‚ˇã‚šãƒ†ãƒ ä¸ŠãŽå†™įœŸã¨å‹•į”ģぎフりãƒĢダビãƒĨãƒŧã‚’é–˛čĻ§ã™ã‚‹", "forward": "前へ", @@ -1071,7 +1072,7 @@ "include_shared_albums": "å…ąæœ‰ã‚ĸãƒĢバムをåĢめる", "include_shared_partner_assets": "パãƒŧトナãƒŧãŒã‚ˇã‚§ã‚ĸしたã‚ĸã‚ģットをåĢめる", "individual_share": "1æžšãŽå…ąæœ‰", - "individual_shares": "個äēēãŽå…ąæœ‰", + "individual_shares": "1æžšãšã¤ãŽå…ąæœ‰", "info": "æƒ…å ą", "interval": { "day_at_onepm": "毎æ—Ĩ午垌1時", @@ -1169,8 +1170,8 @@ "manage_your_devices": "ãƒ­ã‚°ã‚¤ãƒŗãƒ‡ãƒã‚¤ã‚šã‚’įŽĄį†ã—ãžã™", "manage_your_oauth_connection": "OAuthæŽĨįļšã‚’įŽĄį†ã—ãžã™", "map": "åœ°å›ŗ", - "map_assets_in_bound": "{}é …į›Ž", - "map_assets_in_bounds": "{}é …į›Ž", + "map_assets_in_bound": "{}枚", + "map_assets_in_bounds": "{}枚", "map_cannot_get_user_location": "äŊįŊŽæƒ…å ąãŒã‚˛ãƒƒãƒˆã§ããžã›ã‚“", "map_location_dialog_yes": "はい", "map_location_picker_page_use_location": "こぎäŊįŊŽæƒ…å ąã‚’äŊŋう", @@ -1193,6 +1194,9 @@ "map_settings_only_show_favorites": "お気ãĢå…Ĩりぎãŋã‚’čĄ¨į¤ē", "map_settings_theme_settings": "åœ°å›ŗãŽčĻ‹ãŸį›Ž", "map_zoom_to_see_photos": "å†™įœŸã‚’čĻ‹ã‚‹ãĢはã‚ēãƒŧムã‚ĸã‚Ļト", + "mark_all_as_read": "すずãĻæ—ĸčĒ­ãĢする", + "mark_as_read": "æ—ĸčĒ­ãĢする", + "marked_all_as_read": "すずãĻæ—ĸčĒ­ãĢしぞした", "matches": "マッチ", "media_type": "ãƒĄãƒ‡ã‚Ŗã‚ĸã‚ŋイプ", "memories": "ãƒĄãƒĸãƒĒãƒŧ", @@ -1251,12 +1255,13 @@ "no_favorites_message": "お気ãĢå…ĨりãĢčŋŊ加すると最éĢ˜ãŽå†™įœŸã‚„å‹•į”ģをすぐãĢčĻ‹ã¤ã‘ã‚‰ã‚Œãžã™", "no_libraries_message": "あãĒãŸãŽå†™įœŸã‚„å‹•į”ģã‚’čĄ¨į¤ēするためぎ外部ナイブナãƒĒをäŊœæˆã—ぞしょう", "no_name": "名前ãĒし", + "no_notifications": "通įŸĨãĒし", "no_places": "場所ãĒし", "no_results": "įĩæžœãŒã‚りぞせん", "no_results_description": "åŒįžŠčĒžã‚„ã‚ˆã‚Šä¸€čˆŦįš„ãĒキãƒŧワãƒŧドをčŠĻしãĻください", "no_shared_albums_message": "ã‚ĸãƒĢバムをäŊœæˆã—ãĻå†™įœŸã‚„å‹•į”ģã‚’å…ąæœ‰ã—ãžã—ã‚‡ã†", "not_in_any_album": "おぎã‚ĸãƒĢバムãĢもå…ĨãŖãĻいãĒい", - "not_selected": "Not selected", + "not_selected": "選択ãĒし", "note_apply_storage_label_to_previously_uploaded assets": "æŗ¨æ„: äģĨ前ãĢã‚ĸップロãƒŧドしたã‚ĸã‚ģットãĢ゚トãƒŦãƒŧジナベãƒĢã‚’éŠį”¨ã™ã‚‹ãĢはäģĨä¸‹ã‚’åŽŸčĄŒã—ãĻください", "notes": "æŗ¨æ„", "notification_permission_dialog_content": "通įŸĨã‚’č¨ąå¯ã™ã‚‹ãĢã¯č¨­åŽšã‚’é–‹ã„ãĻã‚ĒãƒŗãĢしãĻください", @@ -1281,6 +1286,7 @@ "onboarding_welcome_user": "ようこそ、{user} さん", "online": "ã‚ĒãƒŗãƒŠã‚¤ãƒŗ", "only_favorites": "お気ãĢå…Ĩりぎãŋ", + "open": "開く", "open_in_map_view": "åœ°å›ŗčĄ¨į¤ēでčĻ‹ã‚‹", "open_in_openstreetmap": "OpenStreetMapで開く", "open_the_search_filters": "検į´ĸãƒ•ã‚ŖãƒĢã‚ŋを開く", @@ -1304,7 +1310,7 @@ "partner_page_partner_add_failed": "パãƒŧトナãƒŧぎčŋŊ加ãĢå¤ąæ•—", "partner_page_select_partner": "パãƒŧトナãƒŧを選択", "partner_page_shared_to_title": "æŦĄãŽãƒĻãƒŧã‚ļãƒŧã¨å…ąæœ‰ã—ãžã™: ", - "partner_page_stop_sharing_content": "{}ã¯å†™įœŸã¸ã‚ĸクã‚ģ゚できãĒくãĒりぞす", + "partner_page_stop_sharing_content": "{}はäģŠåžŒã‚ãĒãŸãŽå†™įœŸã¸ã‚ĸクã‚ģ゚できãĒくãĒりぞす", "partner_sharing": "パãƒŧãƒˆãƒŠã¨ãŽå…ąæœ‰", "partners": "パãƒŧトナãƒŧ", "password": "パ゚ワãƒŧド", @@ -1425,6 +1431,8 @@ "recent_searches": "最čŋ‘ぎ検į´ĸ", "recently_added": "最čŋ‘čŋŊåŠ ã•ã‚ŒãŸé …į›Ž", "recently_added_page_title": "最čŋ‘", + "recently_taken": "最čŋ‘撎られたもぎ", + "recently_taken_page_title": "最čŋ‘ぎ撎åŊą", "refresh": "更新", "refresh_encoded_videos": "ã‚¨ãƒŗã‚ŗãƒŧドされた動į”ģを更新", "refresh_faces": "顔čĒč­˜ã‚’æ›´æ–°", @@ -1450,12 +1458,12 @@ "remove_url": "URLぎ削除", "remove_user": "ãƒĻãƒŧã‚ļãƒŧを削除", "removed_api_key": "削除されたAPI キãƒŧ: {name}", - "removed_from_archive": "ã‚ĸãƒŧã‚Ģイブから削除されぞした", - "removed_from_favorites": "お気ãĢå…Ĩりから削除しぞした", - "removed_from_favorites_count": "{count, plural, other {#é …į›Ž}}お気ãĢå…Ĩりから削除しぞした", + "removed_from_archive": "ã‚ĸãƒŧã‚Ģイブから外しぞした", + "removed_from_favorites": "お気ãĢå…Ĩりを外しぞした", + "removed_from_favorites_count": "{count, plural, other {#é …į›Ž}}をお気ãĢå…Ĩりから外しぞした", "removed_memory": "å‰Šé™¤ã•ã‚ŒãŸãƒĄãƒĸãƒĒãƒŧ", "removed_photo_from_memory": "ãƒĄãƒĸãƒĒãƒŧã‹ã‚‰å‰Šé™¤ã•ã‚ŒãŸå†™įœŸ", - "removed_tagged_assets": "{count, plural, one {#個ぎã‚ĸã‚ģット} other {#個ぎã‚ĸã‚ģット}}からã‚ŋグを削除しぞした", + "removed_tagged_assets": "{count, plural, one {#é …į›Ž} other {#é …į›Ž}}からã‚ŋグを外しぞした", "rename": "ãƒĒネãƒŧム", "repair": "äŋŽåžŠ", "repair_no_results_message": "čŋŊčˇĄã•ã‚ŒãĻいãĒã„ãƒ•ã‚Ąã‚¤ãƒĢや存在しãĒã„ãƒ•ã‚Ąã‚¤ãƒĢがここãĢ襨į¤ēされぞす", @@ -1509,7 +1517,7 @@ "search_filter_date_title": "æ’ŽåŊ࿜Ÿé–“を選択", "search_filter_display_option_not_in_album": "ã‚ĸãƒĢバムãĢありぞせん", "search_filter_display_options": "襨į¤ēã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ", - "search_filter_filename": "Search by file name", + "search_filter_filename": "ãƒ•ã‚Ąã‚¤ãƒĢ名で検į´ĸ", "search_filter_location": "場所", "search_filter_location_title": "場所を選択", "search_filter_media_type": "ãƒĄãƒ‡ã‚Ŗã‚ĸãŽį¨ŽéĄž", @@ -1517,17 +1525,17 @@ "search_filter_people_title": "äēēį‰Šã‚’é¸æŠž", "search_for": "検į´ĸ", "search_for_existing_person": "æ—ĸ存ぎäēēį‰Šã‚’æ¤œį´ĸ", - "search_no_more_result": "No more results", + "search_no_more_result": "検į´ĸįĩæžœäģĨ上", "search_no_people": "äēēį‰ŠãŒã„ãžã›ã‚“", "search_no_people_named": "「{name}」という名前ぎäēēį‰ŠãŒã„ãžã›ã‚“", - "search_no_result": "No results found, try a different search term or combination", + "search_no_result": "検į´ĸįĩæžœãĒし", "search_options": "検į´ĸã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ", "search_page_categories": "ã‚ĢテゴãƒĒ", "search_page_motion_photos": "ãƒĸãƒŧã‚ˇãƒ§ãƒŗãƒ•ã‚Šãƒˆ", "search_page_no_objects": "čĸĢ写äŊ“ãĢé–ĸするデãƒŧã‚ŋがãĒし", "search_page_no_places": "場所ãĢé–ĸするデãƒŧã‚ŋãĒし", "search_page_screenshots": "゚クãƒĒãƒŧãƒŗã‚ˇãƒ§ãƒƒãƒˆ", - "search_page_search_photos_videos": "Search for your photos and videos", + "search_page_search_photos_videos": "å†™įœŸã‚„å‹•į”ģを検į´ĸ", "search_page_selfies": "č‡Ē撎り", "search_page_things": "čĸĢ写äŊ“", "search_page_view_all_button": "すずãĻ襨į¤ē", @@ -1589,7 +1597,7 @@ "setting_languages_apply": "éŠį”¨ã™ã‚‹", "setting_languages_subtitle": "ã‚ĸプãƒĒãŽč¨€čĒžã‚’å¤‰æ›´ã™ã‚‹", "setting_languages_title": "言čĒž", - "setting_notifications_notify_failures_grace_period": "バックã‚ĸãƒƒãƒ—å¤ąæ•—ãŽé€šįŸĨ: {}", + "setting_notifications_notify_failures_grace_period": "バックグナã‚Ļãƒŗãƒ‰ãƒãƒƒã‚¯ã‚ĸãƒƒãƒ—å¤ąæ•—ãŽé€šįŸĨ: {}", "setting_notifications_notify_hours": "{}時間垌", "setting_notifications_notify_immediately": "すぐãĢčĄŒã†", "setting_notifications_notify_minutes": "{}分垌", @@ -1601,14 +1609,14 @@ "setting_notifications_total_progress_subtitle": "ã‚ĸップロãƒŧãƒ‰ãŽé€˛čĄŒįŠļæŗ (厌ä熿¸ˆãŋ/全äŊ“æžšæ•°)", "setting_notifications_total_progress_title": "全äŊ“ぎバックã‚ĸãƒƒãƒ—ãŽé€˛čĄŒįŠļæŗã‚’čĄ¨į¤ē", "setting_video_viewer_looping_title": "ãƒĢãƒŧプ中", - "setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.", - "setting_video_viewer_original_video_title": "Force original video", + "setting_video_viewer_original_video_subtitle": "動į”ģを゚トãƒĒãƒŧãƒŸãƒŗã‚°ã™ã‚‹éš›ãĢã€ãƒˆãƒŠãƒŗã‚šã‚ŗãƒŧドされた動į”ģが存在しãĻいãĻも、あえãĻã‚ĒãƒĒジナãƒĢį”ģčŗĒぎ動į”ģã‚’å†į”Ÿã—ãžã™ã€‚ã‚šãƒˆãƒĒãƒŧãƒŸãƒŗã‚°ãĢåž…ãĄæ™‚é–“ãŒį”Ÿã˜ã‚‹ã‹ã‚‚ã—ã‚Œãžã›ã‚“ã€‚ãĒお、デバイ゚上ãĢäŋå­˜ã•れãĻいる動į”ģã¯ã“ãŽč¨­åŽšãŽæœ‰į„ĄãĢé–ĸわらず、ã‚ĒãƒĒジナãƒĢį”ģčŗĒぎ動į”ģã‚’å†į”Ÿã—ãžã™ã€‚", + "setting_video_viewer_original_video_title": "常ãĢã‚ĒãƒĒジナãƒĢį”ģčŗĒぎ動į”ģã‚’å†į”Ÿã™ã‚‹", "settings": "č¨­åŽš", "settings_require_restart": "Immichを再čĩˇå‹•しãĻč¨­åŽšã‚’éŠį”¨ã—ãĻください", "settings_saved": "č¨­åŽšãŒäŋå­˜ã•れぞした", "share": "å…ąæœ‰", "share_add_photos": "å†™įœŸã‚’čŋŊ加", - "share_assets_selected": "{}選択されぞした", + "share_assets_selected": "{}選択中", "share_dialog_preparing": "æē–備中", "shared": "å…ąæœ‰æ¸ˆãŋ", "shared_album_activities_input_disable": "ã‚ŗãƒĄãƒŗãƒˆã¯ã‚ĒフãĢãĒãŖãĻぞす", @@ -1622,7 +1630,7 @@ "shared_by_user": "{user} ãĢã‚ˆã‚Šå…ąæœ‰", "shared_by_you": "あãĒたãĢã‚ˆã‚Šå…ąæœ‰", "shared_from_partner": "{partner} ãĢã‚ˆã‚‹å†™įœŸ", - "shared_intent_upload_button_progress_text": "{} / {} Uploaded", + "shared_intent_upload_button_progress_text": "{} / {} ã‚ĸップロãƒŧド厌äē†", "shared_link_app_bar_title": "å…ąæœ‰ãƒĒãƒŗã‚¯", "shared_link_clipboard_copied_massage": "クãƒĒップボãƒŧドãĢã‚ŗãƒ”ãƒŧしぞした", "shared_link_clipboard_text": "ãƒĒãƒŗã‚¯: {}\nパ゚ワãƒŧド: {}", @@ -1639,16 +1647,16 @@ "shared_link_edit_password_hint": "å…ąæœ‰ãƒ‘ã‚šãƒ¯ãƒŧドをå…Ĩ力する", "shared_link_edit_submit_button": "ãƒĒãƒŗã‚¯ã‚’ã‚ĸップデãƒŧトする", "shared_link_error_server_url_fetch": "ã‚ĩãƒŧバãƒŧぎURLを取垗できぞせん", - "shared_link_expires_day": "{}æ—Ĩで切れぞす", - "shared_link_expires_days": "{}æ—Ĩで切れぞす", - "shared_link_expires_hour": "{}時間で切れぞす", - "shared_link_expires_hours": "{}時間で切れぞす", - "shared_link_expires_minute": "{}分で切れぞす", - "shared_link_expires_minutes": "{}分で切れぞす", + "shared_link_expires_day": "{}æ—Ĩ垌ãĢ有劚期限切れ", + "shared_link_expires_days": "{}æ—Ĩ垌ãĢ有劚期限切れ", + "shared_link_expires_hour": "{}時間垌ãĢ有劚期限切れ", + "shared_link_expires_hours": "{}時間垌ãĢ有劚期限切れ", + "shared_link_expires_minute": "{}分垌ãĢ有劚期限切れ", + "shared_link_expires_minutes": "{}分垌ãĢ有劚期限切れ", "shared_link_expires_never": "有劚期限はありぞせん", - "shared_link_expires_second": "{}į§’ã§åˆ‡ã‚Œãžã™", - "shared_link_expires_seconds": "{}į§’ã§åˆ‡ã‚Œãžã™", - "shared_link_individual_shared": "個äēēå…ąæœ‰", + "shared_link_expires_second": "{}į§’åžŒãĢ有劚期限切れ", + "shared_link_expires_seconds": "{}į§’åžŒãĢ有劚期限切れ", + "shared_link_individual_shared": "1æžšãšã¤å…ąæœ‰ã•ã‚ŒãĻいぞす", "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "å…ąæœ‰æ¸ˆãŋぎãƒĒãƒŗã‚¯ã‚’įŽĄį†", "shared_link_options": "å…ąæœ‰ãƒĒãƒŗã‚¯ãŽã‚Ēãƒ—ã‚ˇãƒ§ãƒŗ", @@ -1748,7 +1756,7 @@ "theme_selection": "テãƒŧマ選択", "theme_selection_description": "ブナã‚Ļã‚ļãŽã‚ˇã‚šãƒ†ãƒ č¨­åŽšãĢåŸēãĨいãĻテãƒŧãƒžã‚’æ˜Žč‰˛ãžãŸã¯æš—č‰˛ãĢč‡Ēå‹•įš„ãĢč¨­åŽšã—ãžã™", "theme_setting_asset_list_storage_indicator_title": "゚トãƒŦãƒŧジãĢé–ĸã™ã‚‹æƒ…å ąã‚’čĄ¨į¤ē", - "theme_setting_asset_list_tiles_per_row_title": "ä¸€åˆ—ã”ã¨ãŽčĄ¨į¤ē枚数: {}", + "theme_setting_asset_list_tiles_per_row_title": "ä¸€čĄŒã”ã¨ãŽčĄ¨į¤ē枚数: {}", "theme_setting_colorful_interface_subtitle": "ã‚ĸクã‚ģãƒŗãƒˆã‚Ģナãƒŧã‚’čƒŒæ™¯ãĢもäŊŋį”¨ã™ã‚‹", "theme_setting_colorful_interface_title": "ã‚ĢナフãƒĢãĒUI", "theme_setting_image_viewer_quality_subtitle": "į”ģ像ビãƒĨãƒŧぎį”ģčŗĒãŽč¨­åŽš", @@ -1787,11 +1795,11 @@ "trash_page_no_assets": "ã‚´ãƒŸįŽąã¯įŠēです", "trash_page_restore_all": "すずãĻ垊元", "trash_page_select_assets_btn": "é …į›Žã‚’é¸æŠž", - "trash_page_title": "削除({})", + "trash_page_title": "ã‚´ãƒŸįŽą ({})", "trashed_items_will_be_permanently_deleted_after": "ã‚´ãƒŸįŽąãĢå…Ĩれられたã‚ĸイテムは{days, plural, one {#æ—Ĩ} other {#æ—Ĩ}}垌ãĢ厌全ãĢ削除されぞす。", "type": "ã‚ŋイプ", "unarchive": "ã‚ĸãƒŧã‚Ģã‚¤ãƒ–ã‚’č§Ŗé™¤", - "unarchived_count": "{count, plural, other {#枚ã‚ĸãƒŧã‚Ģイブしぞした}}", + "unarchived_count": "{count, plural, other {#枚ã‚ĸãƒŧã‚Ģã‚¤ãƒ–ã‚’č§Ŗé™¤ã—ãžã—ãŸ}}", "unfavorite": "お気ãĢå…Ĩりから外す", "unhide_person": "äēēį‰ŠãŽéžčĄ¨į¤ēã‚’č§Ŗé™¤", "unknown": "不明", @@ -1825,8 +1833,8 @@ "upload_status_errors": "エナãƒŧ", "upload_status_uploaded": "ã‚ĸップロãƒŧド済", "upload_success": "ã‚ĸップロãƒŧド成功、新しくã‚ĸップロãƒŧドされたã‚ĸã‚ģットをčĻ‹ã‚‹ãĢはペãƒŧジを更新しãĻください。", - "upload_to_immich": "Upload to Immich ({})", - "uploading": "Uploading", + "upload_to_immich": "ImmichãĢã‚ĸップロãƒŧド ({})", + "uploading": "ã‚ĸップロãƒŧド中", "url": "URL", "usage": "äŊŋį”¨åŽšé‡", "use_current_connection": "įžåœ¨ãŽæŽĨįƒ…å ąã‚’äŊŋᔍ", diff --git a/i18n/ka.json b/i18n/ka.json index b07dcfe6fa..8a9aadb4c0 100644 --- a/i18n/ka.json +++ b/i18n/ka.json @@ -59,7 +59,6 @@ "logging_settings": "áƒŸáƒŖáƒ áƒœáƒáƒšáƒ˜", "map_settings": "áƒ áƒŖáƒ™áƒ", "migration_job": "მიგრაáƒĒია", - "oauth_scope": "დიაპაზონი", "oauth_settings": "OAuth", "template_email_preview": "მინიაáƒĸáƒŖáƒ áƒ", "transcoding_acceleration_vaapi": "VAAPI", diff --git a/i18n/kmr.json b/i18n/kmr.json index 1a7e7bff41..fc39e7b6cf 100644 --- a/i18n/kmr.json +++ b/i18n/kmr.json @@ -141,17 +141,12 @@ "oauth_auto_register": "", "oauth_auto_register_description": "", "oauth_button_text": "", - "oauth_client_id": "", - "oauth_client_secret": "", "oauth_enable_description": "", - "oauth_issuer_url": "", "oauth_mobile_redirect_uri": "", "oauth_mobile_redirect_uri_override": "", "oauth_mobile_redirect_uri_override_description": "", - "oauth_scope": "", "oauth_settings": "", "oauth_settings_description": "", - "oauth_signing_algorithm": "", "oauth_storage_label_claim": "", "oauth_storage_label_claim_description": "", "oauth_storage_quota_claim": "", diff --git a/i18n/kn.json b/i18n/kn.json index 0967ef424b..388f06704c 100644 --- a/i18n/kn.json +++ b/i18n/kn.json @@ -1 +1,26 @@ -{} +{ + "about": "➕⺁➰ā˛ŋ➤⺁", + "account": "ā˛–ā˛žā˛¤āŗ†", + "account_settings": "ā˛–ā˛žā˛¤āŗ† ā˛¸āŗ†ā˛Ÿāŗā˛Ÿā˛ŋā˛‚ā˛—āŗâ€Œā˛—ā˛ŗāŗ", + "acknowledge": "➅➂➗⺀➕➰ā˛ŋ➏ā˛ŋ", + "action": "ā˛•ā˛žā˛°āŗā˛¯", + "action_common_update": "➍ā˛ĩ⺀➕➰ā˛ŋ➏ā˛ŋ", + "actions": "ā˛•āŗā˛°ā˛ŋ➝⺆➗➺⺁", + "active": "ā˛¸ā˛•āŗā˛°ā˛ŋ➝", + "activity": "➚➟⺁ā˛ĩ➟ā˛ŋ➕⺆", + "add": "➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_a_description": "ā˛ĩā˛ŋā˛ĩā˛°ā˛Ŗāŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_a_location": "ā˛¸āŗā˛Ĩ➺ā˛ĩā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_a_name": "ā˛šāŗ†ā˛¸ā˛°ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_a_title": "ā˛ļāŗ€ā˛°āŗā˛ˇā˛ŋā˛•āŗ†ā˛¯ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_endpoint": "ā˛Žā˛‚ā˛Ąāŗâ€Œā˛Ēā˛žā˛¯ā˛ŋā˛‚ā˛Ÿāŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_exclusion_pattern": "ā˛šāŗŠā˛°ā˛—ā˛ŋā˛Ąāŗā˛ĩā˛ŋ➕⺆ ā˛Žā˛žā˛Ļ➰ā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_import_path": "ā˛†ā˛Žā˛Ļ⺁ ā˛Žā˛žā˛°āŗā˛—ā˛ĩā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_location": "ā˛¸āŗā˛Ĩ➺ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_more_users": "ā˛šāŗ†ā˛šāŗā˛šā˛ŋ➍ ā˛Ŧ➺➕⺆ā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_partner": "ā˛Ēā˛žā˛˛āŗā˛Ļā˛žā˛°ā˛°ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_path": "ā˛šā˛žā˛Ļā˛ŋā˛¯ā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_photos": "ā˛Ģāŗ‹ā˛Ÿāŗ‹ā˛—ā˛ŗā˛¨āŗā˛¨āŗ ➏⺇➰ā˛ŋ➏ā˛ŋ", + "add_to": "➏⺇➰ā˛ŋ➏ā˛ŋâ€Ļ", + "add_to_album": "ā˛†ā˛˛āŗā˛Ŧā˛Žāŗâ€Œā˛—āŗ† ➏⺇➰ā˛ŋ➏ā˛ŋ" +} diff --git a/i18n/ko.json b/i18n/ko.json index 03db17c396..52a094c784 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -43,7 +43,7 @@ "backup_database_enable_description": "ë°ė´í„°ë˛ ė´ėŠ¤ 덤프 í™œė„ąí™”", "backup_keep_last_amount": "ëŗ´ę´€í•  ė´ė „ ë¤í”„ė˜ 눘", "backup_settings": "ë°ė´í„°ë˛ ė´ėŠ¤ 덤프 네렕", - "backup_settings_description": "ë°ė´í„°ë˛ ė´ėŠ¤ 덤프 ė„¤ė •ė„ 관ëĻŦ합니다. 및溠: ė´ ėž‘ė—…ë“¤ė€ ëĒ¨ë‹ˆí„°ë§ë˜ė§€ ė•Šėœŧ늰, ė‹¤íŒ¨ ė‹œ ė•ŒëĻŧė„ ë°›ė§€ ė•ŠėŠĩ니다.", + "backup_settings_description": "ë°ė´í„°ë˛ ė´ėŠ¤ 덤프 ė„¤ė •ė„ 관ëĻŦ합니다. 및溠: ė´ ėž‘ė—…ė€ ė§„í–‰ 및 ė‹¤íŒ¨ ė—Ŧëļ€ëĨŧ í™•ė¸í•  눘 ė—†ėŠĩ니다.", "check_all": "ëĒ¨ë‘ í™•ė¸", "cleanup": "ė •ëĻŦ", "cleared_jobs": "ėž‘ė—… ė¤‘ë‹¨: {job}", @@ -70,7 +70,7 @@ "forcing_refresh_library_files": "ëĒ¨ë“  ëŧė´ë¸ŒëŸŦëĻŦ 파ėŧ ę°•ė œ ėƒˆëĄœęŗ ėš¨ 뤑...", "image_format": "í˜•ė‹", "image_format_description": "WebP는 JPEGëŗ´ë‹¤ 파ėŧ íŦ기가 ėž‘ė§€ë§Œ, ė¸ėŊ”ë”Šė— 더 ë§Žė€ ė‹œę°„ė´ ė†Œėš”ëŠë‹ˆë‹¤.", - "image_fullsize_description": "확대 ëŗ´ę¸° ė‹œ ė‚ŦėšŠë˜ëŠ”, ëŠ”íƒ€ë°ė´í„°ę°€ ė—†ëŠ” 렄랴 íŦ기 ė´ë¯¸ė§€", + "image_fullsize_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ 렄랴 íŦ기 ė´ë¯¸ė§€ëĄœ, 확대 ëŗ´ę¸° ė‹œ ė‚ŦėšŠëŠë‹ˆë‹¤.", "image_fullsize_enabled": "렄랴 íŦ기 ė´ë¯¸ė§€ ėƒė„ą í™œė„ąí™”", "image_fullsize_enabled_description": "ė›šė— ė í•Ší•˜ė§€ ė•Šė€ í˜•ė‹ė¸ ę˛Ŋ뚰 렄랴 íŦ기 ė´ë¯¸ė§€ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤. \"내ėžĨ 미ëĻŦëŗ´ę¸° ėš°ė„  ė‚ŦėšŠ\"ė´ í™œė„ąí™”ë˜ė–´ ėžˆėœŧ늴, ëŗ€í™˜ ė—†ė´ 내ėžĨ된 미ëĻŦëŗ´ę¸°ëĨŧ 그대로 ė‚ŦėšŠí•Šë‹ˆë‹¤. JPEGęŗŧ ę°™ė€ ė›š ėšœí™”ė ė¸ í˜•ė‹ė—ëŠ” 똁í–Ĩė„ ėŖŧė§€ ė•ŠėŠĩ니다.", "image_fullsize_quality_description": "렄랴 íŦ기 ė´ë¯¸ė§€ė˜ í’ˆė§ˆ (1~100). ėˆĢėžę°€ ë†’ė„ėˆ˜ëĄ í’ˆė§ˆė´ ėĸ‹ė§€ë§Œ 파ėŧ íŦ기도 ėģ¤ė§‘니다.", @@ -79,7 +79,7 @@ "image_prefer_embedded_preview_setting_description": "RAW ė‚Ŧ맄뗐 íŦ함된 내ėžĨ 미ëĻŦëŗ´ę¸°ëĨŧ ė´ë¯¸ė§€ 래ëĻŦ ė‹œ ėž…ë Ĩėœŧ로 ė‚ŦėšŠí•Šë‹ˆë‹¤(ė‚ŦėšŠ 가ëŠĨ한 ę˛Ŋėš°ė— 한함). ė´ ë°Šė‹ė€ ėŧëļ€ ė´ë¯¸ė§€ė—ė„œ 더 ė •í™•í•œ ėƒ‰ėƒė„ ė–ģė„ 눘 ėžˆė§€ë§Œ, 미ëĻŦëŗ´ę¸°ė˜ í’ˆė§ˆė€ ėš´ëŠ”ëŧ뗐 따ëŧ 다ëĨ´ëа ė••ėļ•ėœŧ로 ė¸í•œ í’ˆė§ˆ ė €í•˜ę°€ 나타날 눘 ėžˆėŠĩ니다.", "image_prefer_wide_gamut": "ę´‘ėƒ‰ė—­ ėš°ė„  ė‚ŦėšŠ", "image_prefer_wide_gamut_setting_description": "ė„Ŧ네ėŧ뗐 Display P3 ėƒ‰ė—­ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤. ę´‘ėƒ‰ė—­ ė´ë¯¸ė§€ëĨŧ ëŗ´ë‹¤ ėƒėƒí•˜ę˛Œ 표현할 눘 ėžˆė§€ë§Œ, ęĩŦ형 브ëŧėš°ė €ë‚˜ ėžĨėš˜ė—ė„œëŠ” 다ëĨ´ę˛Œ ëŗ´ėŧ 눘 ėžˆėŠĩ니다. sRGB ė´ë¯¸ė§€ė˜ ę˛Ŋ뚰 ėƒ‰ėƒ ė™œęŗĄė„ ë°Šė§€í•˜ę¸° ėœ„í•´ 그대로 ėœ ė§€ëŠë‹ˆë‹¤.", - "image_preview_description": "단ėŧ 항ëĒŠė„ ëŗ´ęą°ë‚˜ 揰溄 학ėŠĩ뗐 ė‚ŦėšŠë˜ëŠ”, ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ 뤑氄 íŦ기 ė´ë¯¸ė§€", + "image_preview_description": "ëŠ”íƒ€ë°ė´í„°ę°€ ė œęą°ëœ 뤑氄 íŦ기 ė´ë¯¸ė§€ëĄœ, 단ėŧ 항ëĒŠė„ ëŗ´ęą°ë‚˜ 揰溄 학ėŠĩ뗐 ė‚ŦėšŠëŠë‹ˆë‹¤.", "image_preview_quality_description": "미ëĻŦëŗ´ę¸° í’ˆė§ˆ (1~100). ėˆĢėžę°€ ë†’ė„ėˆ˜ëĄ í’ˆė§ˆė´ ėĸ‹ė•„ė§€ė§€ë§Œ, 파ėŧ íŦ기가 ėģ¤ė§€ęŗ  ė•ą ë°˜ė‘ ė†ë„ę°€ ëŠë ¤ė§ˆ 눘 ėžˆėŠĩ니다. 너ëŦ´ 낮게 ė„¤ė •í•˜ëŠ´ 揰溄 학ėŠĩ í’ˆė§ˆė— 똁í–Ĩė„ 뤄 눘 ėžˆėŠĩ니다.", "image_preview_title": "미ëĻŦëŗ´ę¸° 네렕", "image_quality": "í’ˆė§ˆ", @@ -118,7 +118,7 @@ "machine_learning_duplicate_detection": "뤑ëŗĩ 氐맀", "machine_learning_duplicate_detection_enabled": "뤑ëŗĩ 氐맀 í™œė„ąí™”", "machine_learning_duplicate_detection_enabled_description": "ëš„í™œė„ąí™”ëœ ę˛Ŋėš°ė—ë„ ė™„ė „ížˆ 동ėŧ한 항ëĒŠė€ 뤑ëŗĩ ė œęą°ëŠë‹ˆë‹¤.", - "machine_learning_duplicate_detection_setting_description": "CLIP ėž„ë˛ ë”Šė„ ė‚ŦėšŠí•˜ė—Ŧ ëš„ėŠˇí•œ 항ëĒŠ ė°žę¸°", + "machine_learning_duplicate_detection_setting_description": "CLIP ėž„ë˛ ë”Šė„ ė‚ŦėšŠí•˜ė—Ŧ 뤑ëŗĩ 가ëŠĨė„ąė´ ë†’ė€ 항ëĒŠ ė°žę¸°", "machine_learning_enabled": "揰溄 학ėŠĩ í™œė„ąí™”", "machine_learning_enabled_description": "ëš„í™œė„ąí™”ëœ ę˛Ŋ뚰 ė•„ëž˜ 네렕 ė—Ŧëļ€ė™€ ę´€ęŗ„ė—†ė´ ëĒ¨ë“  揰溄 학ėŠĩ 기ëŠĨė´ ëš„í™œė„ąí™”ëŠë‹ˆë‹¤.", "machine_learning_facial_recognition": "ė–ŧęĩ´ ė¸ė‹", @@ -138,7 +138,7 @@ "machine_learning_settings": "揰溄 학ėŠĩ 네렕", "machine_learning_settings_description": "揰溄 학ėŠĩ 기ëŠĨ 및 네렕 관ëĻŦ", "machine_learning_smart_search": "ėŠ¤ë§ˆíŠ¸ ę˛€ėƒ‰", - "machine_learning_smart_search_description": "CLIP ėž„ë˛ ë”Šėœŧ로 ėžė—°ė–´ëĨŧ ė‚ŦėšŠí•˜ė—Ŧ ė´ë¯¸ė§€ ę˛€ėƒ‰", + "machine_learning_smart_search_description": "CLIP ėž„ë˛ ë”Šė„ ė‚ŦėšŠí•œ ë‚´ėšŠ 기반 ė´ë¯¸ė§€ ę˛€ėƒ‰", "machine_learning_smart_search_enabled": "ėŠ¤ë§ˆíŠ¸ ę˛€ėƒ‰ í™œė„ąí™”", "machine_learning_smart_search_enabled_description": "ëš„í™œė„ąí™”ëœ ę˛Ŋ뚰 ėŠ¤ë§ˆíŠ¸ ę˛€ėƒ‰ė„ ėœ„í•œ ė´ë¯¸ė§€ 래ëĻŦëĨŧ ė§„í–‰í•˜ė§€ ė•ŠėŠĩ니다.", "machine_learning_url_description": "揰溄 학ėŠĩ ė„œë˛„ė˜ URLė„ ėž…ë Ĩ합니다. URLė´ ė—ŦëŸŦ ę°œė¸ ę˛Ŋ뚰 ė˛Ģ ë˛ˆė§¸ ė„œë˛„ëļ€í„° ë§ˆė§€ë§‰ęšŒė§€ ė„ąęŗĩ렁ėœŧ로 ė‘ë‹ĩ할 ë•ŒęšŒė§€ 한 ë˛ˆė— í•˜ë‚˜ė”Š ėˆœė„œëŒ€ëĄœ ėš”ė˛­ė„ ė‹œë„í•Šë‹ˆë‹¤. ė‘ë‹ĩí•˜ė§€ ė•ŠëŠ” ė„œë˛„ëŠ” ë‹¤ė‹œ ė‚ŦėšŠ 가ëŠĨ할 ë•ŒęšŒė§€ ėŧė‹œė ėœŧ로 ė œė™¸ëŠë‹ˆë‹¤.", @@ -192,26 +192,22 @@ "oauth_auto_register": "ėžë™ ę°€ėž…", "oauth_auto_register_description": "OAuth로 냈 ė‚ŦėšŠėžę°€ ëĄœęˇ¸ė¸í•˜ëŠ” ę˛Ŋ뚰 ėžë™ėœŧ로 ę°€ėž…", "oauth_button_text": "버íŠŧ í…ėŠ¤íŠ¸", - "oauth_client_id": "클ëŧė´ė–¸íŠ¸ ID", - "oauth_client_secret": "클ëŧė´ė–¸íŠ¸ ė‹œíŦëĻŋ", + "oauth_client_secret_description": "OAuth 렜ęŗĩėžę°€ PKCE(Proof Key for Code Exchange)ëĨŧ ė§€ė›í•˜ė§€ ė•ŠëŠ” ę˛Ŋ뚰 í•„ėš”í•Šë‹ˆë‹¤.", "oauth_enable_description": "OAuth ëĄœęˇ¸ė¸", - "oauth_issuer_url": "ë°œę¸‰ėž URL", "oauth_mobile_redirect_uri": "ëĒ¨ë°”ėŧ ëĻŦë‹¤ė´ë ‰íŠ¸ URI", "oauth_mobile_redirect_uri_override": "ëĒ¨ë°”ėŧ ëĻŦë‹¤ė´ë ‰íŠ¸ URI ėžŦė •ė˜", "oauth_mobile_redirect_uri_override_description": "OAuth ęŗĩę¸‰ėžę°€ '{callback}'ęŗŧ ę°™ė€ ëĒ¨ë°”ėŧ URIëĨŧ 렜ęŗĩí•˜ė§€ ė•ŠëŠ” ę˛Ŋ뚰 í™œė„ąí™”í•˜ė„¸ėš”.", - "oauth_profile_signing_algorithm": "ė‚ŦėšŠėž ė •ëŗ´ ė„œëĒ… ė•Œęŗ ëĻŦėϘ", - "oauth_profile_signing_algorithm_description": "ė‚ŦėšŠėž ė •ëŗ´ ė„œëDž뗐 ė‚ŦėšŠë˜ëŠ” ė•Œęŗ ëĻŦėĻ˜ė„ ė„ íƒí•Šë‹ˆë‹¤.", - "oauth_scope": "늤ėŊ”프", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth ëĄœęˇ¸ė¸ 네렕 관ëĻŦ", "oauth_settings_more_details": "ė´ 기ëŠĨ뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ ëŦ¸ė„œëĨŧ ė°¸ėĄ°í•˜ė„¸ėš”.", - "oauth_signing_algorithm": "ė„œëĒ… ė•Œęŗ ëĻŦėϘ", "oauth_storage_label_claim": "ėŠ¤í† ëĻŦė§€ ë ˆė´ë¸” ė„ íƒ", "oauth_storage_label_claim_description": "ėŠ¤í† ëĻŦė§€ ë ˆė´ë¸”ė„ ė‚ŦėšŠėžę°€ ėž…ë Ĩ한 값ėœŧ로 ėžë™ ė„¤ė •í•Šë‹ˆë‹¤.", "oauth_storage_quota_claim": "ėŠ¤í† ëĻŦė§€ 할당량 ė„ íƒ", "oauth_storage_quota_claim_description": "ėŠ¤í† ëĻŦė§€ í• ë‹šëŸ‰ė„ ė‚ŦėšŠėžę°€ ėž…ë Ĩ한 값ėœŧ로 ėžë™ ė„¤ė •í•Šë‹ˆë‹¤.", "oauth_storage_quota_default": "ėŠ¤í† ëĻŦė§€ 할당량 ę¸°ëŗ¸ę°’ (GiB)", "oauth_storage_quota_default_description": "ėž…ë Ĩí•˜ė§€ ė•Šė€ ę˛Ŋ뚰 ė‚ŦėšŠí•  GiB ë‹¨ėœ„ė˜ ę¸°ëŗ¸ 할당량 (ëŦ´ė œí•œ í• ë‹šëŸ‰ė˜ ę˛Ŋ뚰 0 ėž…ë Ĩ)", + "oauth_timeout": "ėš”ė˛­ íƒ€ėž„ė•„ė›ƒ", + "oauth_timeout_description": "ėš”ė˛­ íƒ€ėž„ė•„ė›ƒ (밀ëĻŦ봈 ë‹¨ėœ„)", "offline_paths": "누ëŊ된 파ėŧ", "offline_paths_description": "뙏ëļ€ ëŧė´ë¸ŒëŸŦëĻŦė˜ 항ëĒŠė´ ė•„ë‹Œ 파ėŧė„ ėˆ˜ë™ėœŧ로 ė‚­ė œí•œ ę˛Ŋ뚰 ë°œėƒí•  눘 ėžˆėŠĩ니다.", "password_enable_description": "ė´ëŠ”ėŧęŗŧ 비밀번호로 ëĄœęˇ¸ė¸", @@ -222,20 +218,20 @@ "quota_size_gib": "할당량 (GiB)", "refreshing_all_libraries": "ëĒ¨ë“  ëŧė´ë¸ŒëŸŦëĻŦ ë‹¤ė‹œ 늤ėē” ė¤‘...", "registration": "관ëĻŦėž ęŗ„ė • ėƒė„ą", - "registration_description": "ė˛Ģ ë˛ˆė§¸ëĄœ ėƒė„ąë˜ëŠ” ė‚ŦėšŠėžëŠ” 관ëĻŦėž ęļŒí•œė„ ëļ€ė—Ŧ받ėœŧ늰, 관ëĻŦ 및 ė‚ŦėšŠėž ėƒė„ąė´ 가ëŠĨ합니다.", + "registration_description": "ë‹šė‹ ė€ ė˛Ģ ë˛ˆė§¸ ė‚ŦėšŠėžė´ëŠ° 관ëĻŦėž ęļŒí•œė´ ėžë™ėœŧ로 ëļ€ė—Ŧ됩니다. 관ëĻŦ ėž‘ė—…ęŗŧ ė‚ŦėšŠėž ėƒė„ąė´ 가ëŠĨ합니다.", "repair_all": "ëĒ¨ë‘ 눘ëĻŦ", "repair_matched_items": "항ëĒŠ {count, plural, one {#氜} other {#氜}}가 ėŧėš˜í•Šë‹ˆë‹¤.", "repaired_items": "항ëĒŠ {count, plural, one {#氜} other {#氜}}ëĨŧ ëŗĩęĩŦ했ėŠĩ니다.", "require_password_change_on_login": "ė˛Ģ ëĄœęˇ¸ė¸ ė‹œ 비밀번호 ëŗ€ę˛Ŋ ėš”ęĩŦ", "reset_settings_to_default": "ė„¤ė •ė„ ę¸°ëŗ¸ę°’ėœŧ로 ëŗĩ뛐", - "reset_settings_to_recent_saved": "ë§ˆė§€ë§‰ėœŧ로 ė €ėžĨ된 네렕ėœŧ로 ëŗĩ뛐", + "reset_settings_to_recent_saved": "ë§ˆė§€ë§‰ėœŧ로 ė €ėžĨ된 네렕 ëŗĩ뛐", "scanning_library": "ëŧė´ë¸ŒëŸŦëĻŦ 늤ėē” ė¤‘", "search_jobs": "ėž‘ė—… ę˛€ėƒ‰â€Ļ", "send_welcome_email": "í™˜ė˜ ė´ëŠ”ėŧ ė „ė†Ą", "server_external_domain_settings": "뙏ëļ€ ë„ëŠ”ė¸", "server_external_domain_settings_description": "ęŗĩ氜 ęŗĩ뜠 링íŦ뗐 ė‚ŦėšŠí•  ë„ëŠ”ė¸ (http(s):// íŦ함)", "server_public_users": "ëĒ¨ë“  ė‚ŦėšŠėž", - "server_public_users_description": "ęŗĩ뜠 ė•¨ë˛”ė— ė‚ŦėšŠėžëĨŧ ėļ”가할 ę˛Ŋ뚰 ëĒ¨ë“  ė‚ŦėšŠėž(ė´ëĻ„, ė´ëŠ”ėŧ)가 ë‚˜ė—´ëŠë‹ˆë‹¤. ëš„í™œė„ąí™” 할 ę˛Ŋ뚰, 관ëĻŦėžë§Œė´ ė‚ŦėšŠėž ëĒŠëĄė„ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다.", + "server_public_users_description": "ęŗĩ뜠 ė•¨ë˛”ė— ė‚ŦėšŠėžëĨŧ ėļ”가할 때 ëĒ¨ë“  ė‚ŦėšŠėžė˜ ė´ëĻ„ęŗŧ ė´ëŠ”ėŧė„ ëĒŠëĄė— í‘œė‹œí•Šë‹ˆë‹¤. ëš„í™œė„ąí™”ëœ ę˛Ŋ뚰 관ëĻŦėžė¸ ę˛Ŋėš°ė—ë§Œ ė‚ŦėšŠėž ëĒŠëĄė´ í‘œė‹œëŠë‹ˆë‹¤.", "server_settings": "ė„œë˛„ 네렕", "server_settings_description": "ė„œë˛„ 네렕 관ëĻŦ", "server_welcome_message": "í™˜ė˜ ëŠ”ė‹œė§€", @@ -251,7 +247,7 @@ "storage_template_hash_verification_enabled_description": "í•´ė‹œ 검ėĻė„ í™œė„ąí™”í•Šë‹ˆë‹¤. ė´ ė„¤ė •ė˜ 결ęŗŧëĨŧ í™•ė‹¤ížˆ ė´í•´í•˜ė§€ ė•ŠëŠ” 한 ëš„í™œė„ąí™”í•˜ė§€ ë§ˆė„¸ėš”.", "storage_template_migration": "ėŠ¤í† ëĻŦė§€ 템플ëĻŋ ë§ˆė´ęˇ¸ë ˆė´ė…˜", "storage_template_migration_description": "ė´ė „ė— ė—…ëĄœë“œëœ 항ëĒŠė— 현ėžŦ {template} ė ėšŠ", - "storage_template_migration_info": "ėŠ¤í† ëĻŦė§€ 템플ëĻŋė€ ëĒ¨ë“  확ėžĨėžëĨŧ ė†ŒëŦ¸ėžëĄœ ëŗ€í™˜í•Šë‹ˆë‹¤. 템플ëĻŋ ëŗ€ę˛Ŋ ė‚Ŧí•­ė€ ėƒˆëĄœ ė—…ëĄœë“œí•œ 항ëĒŠė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. ę¸°ėĄ´ė— ė—…ëĄœë“œëœ 항ëĒŠė— ė ėšŠí•˜ë ¤ëŠ´ {job}ė„ ė‹¤í–‰í•˜ė„¸ėš”.", + "storage_template_migration_info": "ėŠ¤í† ëĻŦė§€ 템플ëĻŋė€ ëĒ¨ë“  확ėžĨėžëĨŧ ė†ŒëŦ¸ėžëĄœ ëŗ€í™˜í•˜ëŠ°, ëŗ€ę˛Ŋ ė‚Ŧí•­ė€ ėƒˆëĄœ ė—…ëĄœë“œí•œ 항ëĒŠė—ë§Œ ė ėšŠëŠë‹ˆë‹¤. ę¸°ėĄ´ė— ė—…ëĄœë“œëœ 항ëĒŠė— ė ėšŠí•˜ë ¤ëŠ´ {job}ė„ ė‹¤í–‰í•˜ė„¸ėš”.", "storage_template_migration_job": "ėŠ¤í† ëĻŦė§€ 템플ëĻŋ ë§ˆė´ęˇ¸ë ˆė´ė…˜ ėž‘ė—…", "storage_template_more_details": "ė´ 기ëŠĨ뗐 대한 ėžė„¸í•œ ë‚´ėšŠė€ ėŠ¤í† ëĻŦė§€ 템플ëĻŋ 및 네ëĒ…ė„ ė°¸ėĄ°í•˜ė„¸ėš”.", "storage_template_onboarding_description": "ė´ 기ëŠĨė„ í™œė„ąí™”í•˜ëŠ´ ė‚ŦėšŠėž ė •ė˜ 템플ëĻŋė„ ė‚ŦėšŠí•˜ė—Ŧ 파ėŧė„ ėžë™ėœŧ로 ė •ëĻŦ할 눘 ėžˆėŠĩ니다. ė•ˆė •ė„ą ëŦ¸ė œëĄœ ė¸í•´ 해당 기ëŠĨė€ ę¸°ëŗ¸ė ėœŧ로 ëš„í™œė„ąí™”ë˜ė–´ ėžˆėŠĩ니다. ėžė„¸í•œ ë‚´ėšŠė€ ëŦ¸ė„œëĨŧ ė°¸ėĄ°í•˜ė„¸ėš”.", @@ -261,14 +257,14 @@ "storage_template_user_label": "ė‚ŦėšŠėžė˜ ėŠ¤í† ëĻŦė§€ ë ˆė´ë¸”: {label}", "system_settings": "ė‹œėŠ¤í…œ 네렕", "tag_cleanup_job": "태그 ė •ëĻŦ", - "template_email_available_tags": "템플ëĻŋė—ė„œ ë‹¤ėŒ ëŗ€ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: {tags}", + "template_email_available_tags": "템플ëĻŋ뗐 ë‹¤ėŒ ëŗ€ėˆ˜ëĨŧ ė‚ŦėšŠí•  눘 ėžˆėŠĩ니다: {tags}", "template_email_if_empty": "ëš„ė–´ ėžˆëŠ” ę˛Ŋ뚰 ę¸°ëŗ¸ 템플ëĻŋė´ ė‚ŦėšŠëŠë‹ˆë‹¤.", - "template_email_invite_album": "ė•¨ë˛” ė´ˆëŒ€ 템플ëĻŋ", + "template_email_invite_album": "ė•¨ë˛” ė´ˆëŒ€ėžĨ 템플ëĻŋ", "template_email_preview": "미ëĻŦëŗ´ę¸°", "template_email_settings": "ė´ëŠ”ėŧ 템플ëĻŋ", "template_email_settings_description": "ė‚ŦėšŠėž ė •ė˜ ė´ëŠ”ėŧ 템플ëĻŋ 관ëĻŦ", - "template_email_update_album": "ė•¨ë˛” 템플ëĻŋ ė—…ë°ė´íŠ¸", - "template_email_welcome": "ė›°ėģ´ ëŠ”ėŧ 템플ëĻŋ", + "template_email_update_album": "ė•¨ë˛” ė—…ë°ė´íŠ¸ ė•ˆë‚´ 템플ëĻŋ", + "template_email_welcome": "í™˜ė˜ 메ėŧ 템플ëĻŋ", "template_settings": "ė•ŒëĻŧ 템플ëĻŋ", "template_settings_description": "ė•ŒëĻŧė„ ėœ„í•œ ė‚ŦėšŠėž 맀렕 템플ëĻŋė„ 관ëĻŦ합니다.", "theme_custom_css_settings": "ė‚ŦėšŠėž ė •ė˜ CSS", @@ -340,18 +336,18 @@ "transcoding_video_codec": "ë™ė˜ėƒ ėŊ”덱", "transcoding_video_codec_description": "VP9는 íš¨ėœ¨ė ė´ęŗ  ė›š í˜¸í™˜ė„ąė´ ë†’ė§€ë§Œ íŠ¸ëžœėŠ¤ėŊ”ë”Šė— ë‹¤ė†Œ 긴 ė‹œę°„ė´ ė†Œėš”ëŠë‹ˆë‹¤. HEVC는 ė„ąëŠĨė€ ëš„ėŠˇí•˜ë‚˜ ė›š í˜¸í™˜ė„ąė´ 낮ėŠĩ니다. H.264는 í˜¸í™˜ė„ąė´ 가ėžĨ ë†’ė§€ë§Œ ė¸ėŊ”딊된 파ėŧ íŦ기가 íŦęŗ , AV1ė€ 가ėžĨ íš¨ėœ¨ė ė´ë‚˜ ė˜¤ëž˜ëœ ę¸°ę¸°ė™€ė˜ í˜¸í™˜ė„ąė´ 낮ėŠĩ니다.", "trash_enabled_description": "íœ´ė§€í†ĩ í™œė„ąí™”", - "trash_number_of_days": "ė‚­ė œ ëŗ´ëĨ˜ 기간", - "trash_number_of_days_description": "íœ´ė§€í†ĩėœŧ로 ė´ë™ëœ 항ëĒŠė˜ ė‚­ė œ ëŗ´ëĨ˜ 기간", + "trash_number_of_days": "ė‚­ė œ 뜠똈 기간", + "trash_number_of_days_description": "íœ´ė§€í†ĩėœŧ로 ė´ë™ëœ 항ëĒŠė˜ ė‚­ė œ 뜠똈 기간", "trash_settings": "íœ´ė§€í†ĩ 네렕", "trash_settings_description": "íœ´ė§€í†ĩ 네렕 관ëĻŦ", "untracked_files": "ėļ”ė ë˜ė§€ ė•ŠëŠ” 파ėŧ", "untracked_files_description": "ė• í”ŒëĻŦėŧ€ė´ė…˜ė—ė„œ ėļ”ė ë˜ė§€ ė•ŠëŠ” 파ėŧ ëĒŠëĄėž…ë‹ˆë‹¤. ė´ë™ ė‹¤íŒ¨, ė—…ëĄœë“œ ė¤‘ë‹¨ 또는 버그로 ė¸í•´ ë°œėƒí•  눘 ėžˆėŠĩ니다.", "user_cleanup_job": "ė‚ŦėšŠėž ė •ëĻŦ", "user_delete_delay": "{user}ë‹˜ė´ ė—…ëĄœë“œí•œ 항ëĒŠė´ {delay, plural, one {#ėŧ} other {#ėŧ}} 후 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤.", - "user_delete_delay_settings": "ė‚­ė œ ëŗ´ëĨ˜ 기간", - "user_delete_delay_settings_description": "ė‚ŦėšŠėžëĨŧ 똁ęĩŦ렁ėœŧ로 ė‚­ė œí•˜ę¸° ė „ ëŗ´ëĨ˜ ę¸°ę°„ė„ ė„¤ė •í•Šë‹ˆë‹¤. ė‚ŦėšŠėž ė‚­ė œëŠ” 매ėŧ ë°¤ ėžė •, ëŗ´ëĨ˜ ę¸°ę°„ė´ ė§€ë‚œ ė‚ŦėšŠėžëĨŧ í™•ė¸í•œ 후 ė§„í–‰ëŠë‹ˆë‹¤. ëŗ€ę˛Ŋ ė‚Ŧí•­ė€ ë‹¤ėŒ ėž‘ė—…ëļ€í„° ė ėšŠëŠë‹ˆë‹¤.", + "user_delete_delay_settings": "ė‚­ė œ 뜠똈 기간", + "user_delete_delay_settings_description": "ė‚ŦėšŠėž ęŗ„ė •ęŗŧ 항ëĒŠė´ ė™„ė „ížˆ ė‚­ė œë˜ę¸°ęšŒė§€ė˜ 뜠똈 기간(ėŧ)ė„ ė„¤ė •í•Šë‹ˆë‹¤. ė‚ŦėšŠėž ė‚­ė œ ėž‘ė—…ė€ 매ėŧ ėžė •ė— ė‹¤í–‰ë˜ė–´ ė‚­ė œ ëŒ€ėƒ ė—Ŧëļ€ëĨŧ í™•ė¸í•Šë‹ˆë‹¤. ė´ ė„¤ė •ė˜ ëŗ€ę˛Ŋ ė‚Ŧí•­ė€ ë‹¤ėŒ ėž‘ė—… ė‹¤í–‰ ė‹œ ë°˜ė˜ëŠë‹ˆë‹¤.", "user_delete_immediately": "{user}ë‹˜ė´ ė—…ëĄœë“œí•œ 항ëĒŠė´ 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤.", - "user_delete_immediately_checkbox": "ëŗ´ëĨ˜ 기간 ė—†ė´ ėĻ‰ė‹œ ė‚­ė œ", + "user_delete_immediately_checkbox": "뜠똈 기간 ė—†ė´ ėĻ‰ė‹œ ė‚­ė œ", "user_management": "ė‚ŦėšŠėž 관ëĻŦ", "user_password_has_been_reset": "ė‚ŦėšŠėžė˜ 비밀번호가 ė´ˆę¸°í™”ë˜ė—ˆėŠĩ니다:", "user_password_reset_description": "ė´ 비밀번호ëĨŧ 해당 ė‚ŦėšŠėžė—ę˛Œ ė•Œë ¤ėŖŧė„¸ėš”. ėž„ė‹œ 비밀번호로 ëĄœęˇ¸ė¸í•œ 뒤 비밀번호ëĨŧ ë°˜ë“œė‹œ ëŗ€ę˛Ŋ해ė•ŧ 합니다.", @@ -442,7 +438,7 @@ "app_settings": "ė•ą 네렕", "appears_in": "ë‹¤ėŒ ė•¨ë˛”ė— íŦ함됨", "archive": "ëŗ´ę´€í•¨", - "archive_or_unarchive_photo": "ëŗ´ę´€í•¨ėœŧ로 ė´ë™ 또는 ė œęą°", + "archive_or_unarchive_photo": "ëŗ´ę´€ 래ëĻŦ 또는 í•´ė œ", "archive_page_no_archived_assets": "ëŗ´ę´€ëœ 항ëĒŠ ė—†ėŒ", "archive_page_title": "ëŗ´ę´€í•¨ ({})", "archive_size": "ė••ėļ• íŒŒėŧ íŦ기", @@ -492,7 +488,7 @@ "assets_restored_successfully": "항ëĒŠ {}氜ëĨŧ ëŗĩė›í–ˆėŠĩ니다.", "assets_trashed": "íœ´ė§€í†ĩėœŧ로 항ëĒŠ {}氜 ė´ë™ë¨", "assets_trashed_count": "íœ´ė§€í†ĩėœŧ로 항ëĒŠ {count, plural, one {#氜} other {#氜}} ė´ë™ë¨", - "assets_trashed_from_server": "íœ´ė§€í†ĩėœŧ로 ė„œë˛„ė— ėžˆëŠ” 항ëĒŠ {}개가 ė´ë™ë˜ė—ˆėŠĩ니다.", + "assets_trashed_from_server": "ė„œë˛„ė— ėžˆëŠ” 항ëĒŠ {}개가 íœ´ė§€í†ĩėœŧ로 ė´ë™ë˜ė—ˆėŠĩ니다.", "assets_were_part_of_album_count": "ė•¨ë˛”ė— ė´ë¯¸ ėĄ´ėžŦ하는 {count, plural, one {항ëĒŠ} other {항ëĒŠ}}ėž…ë‹ˆë‹¤.", "authorized_devices": "ė¸ėĻëœ 기기", "automatic_endpoint_switching_subtitle": "ė§€ė •ëœ Wi-Fi가 ė‚ŦėšŠ 가ëŠĨ한 ę˛Ŋ뚰 내ëļ€ë§ė„ í†ĩ해 ė—°ę˛°í•˜ęŗ , ęˇ¸ë ‡ė§€ ė•Šėœŧ늴 다ëĨ¸ 뗰枰 ë°Šė‹ė„ ė‚ŦėšŠí•Šë‹ˆë‹¤.", @@ -570,16 +566,16 @@ "bugs_and_feature_requests": "버그 ė œëŗ´ & 기ëŠĨ ėš”ė˛­", "build": "빌드", "build_image": "빌드 ė´ë¯¸ė§€", - "bulk_delete_duplicates_confirmation": "ëš„ėŠˇí•œ 항ëĒŠ {count, plural, one {#氜} other {#氜}}ëĨŧ ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까? íŦ기가 가ėžĨ 큰 항ëĒŠė„ ė œė™¸í•œ ë‚˜ë¨¸ė§€ 항ëĒŠë“¤ė´ 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤. ė´ ėž‘ė—…ė€ 되돌ëĻ´ 눘 ė—†ėŠĩ니다!", - "bulk_keep_duplicates_confirmation": "ëš„ėŠˇí•œ 항ëĒŠ {count, plural, one {#氜} other {#氜}}ëĨŧ ėœ ė§€í•˜ė‹œę˛ ėŠĩ니까? 파ėŧė„ ė‚­ė œí•˜ė§€ ė•Šęŗ  í™•ė¸ëœ 것ėœŧ로 판단합니다.", - "bulk_trash_duplicates_confirmation": "ëš„ėŠˇí•œ 항ëĒŠ {count, plural, one {#氜} other {#氜}}ëĨŧ íœ´ė§€í†ĩėœŧ로 ė´ë™í•˜ė‹œę˛ ėŠĩ니까? íŦ기가 가ėžĨ 큰 항ëĒŠė„ ė œė™¸í•œ ë‚˜ë¨¸ė§€ 항ëĒŠë“¤ė´ ëĒ¨ë‘ íœ´ė§€í†ĩėœŧ로 ė´ë™ëŠë‹ˆë‹¤.", + "bulk_delete_duplicates_confirmation": "뤑ëŗĩ된 항ëĒŠ {count, plural, one {#氜ëĨŧ} other {#氜ëĨŧ}} ėŧ괄 ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까? 각 ęˇ¸ëŖšė—ė„œ 가ėžĨ 큰 항ëĒŠë§Œ ë‚¨ę¸°ęŗ  ë‚˜ë¨¸ė§€ 뤑ëŗĩ 항ëĒŠė„ 똁ęĩŦ렁ėœŧ로 ė‚­ė œí•Šë‹ˆë‹¤. ė´ ėž‘ė—…ė€ 되돌ëĻ´ 눘 ė—†ėŠĩ니다!", + "bulk_keep_duplicates_confirmation": "뤑ëŗĩ된 항ëĒŠ {count, plural, one {#氜ëĨŧ} other {#氜ëĨŧ}} 그대로 ėœ ė§€í•˜ė‹œę˛ ėŠĩ니까? ė´ ėž‘ė—…ė€ ė–´ë–¤ 항ëĒŠë„ ė‚­ė œí•˜ė§€ ė•Šęŗ , ëĒ¨ë“  뤑ëŗĩ ęˇ¸ëŖšė„ í™•ė¸í•œ 것ėœŧ로 래ëĻŦ합니다.", + "bulk_trash_duplicates_confirmation": "뤑ëŗĩ된 항ëĒŠ {count, plural, one {#氜ëĨŧ} other {#氜ëĨŧ}} ėŧ괄 íœ´ė§€í†ĩėœŧ로 ė´ë™í•˜ė‹œę˛ ėŠĩ니까? ė´ ėž‘ė—…ė€ 각 ęˇ¸ëŖšė—ė„œ 가ėžĨ 큰 항ëĒŠë§Œ ë‚¨ę¸°ęŗ  ë‚˜ë¨¸ė§€ 뤑ëŗĩ 항ëĒŠė„ íœ´ė§€í†ĩėœŧ로 ė´ë™í•Šë‹ˆë‹¤.", "buy": "Immich ęĩŦ매", - "cache_settings_album_thumbnails": "ëŧė´ë¸ŒëŸŦëĻŦ ė„Ŧ네ėŧ ({})", + "cache_settings_album_thumbnails": "ëŧė´ë¸ŒëŸŦëĻŦ íŽ˜ė´ė§€ ė„Ŧ네ėŧ ({})", "cache_settings_clear_cache_button": "ėēė‹œ ė§€ėš°ę¸°", "cache_settings_clear_cache_button_title": "ė•ą ėēė‹œëĨŧ ė§€ė›ë‹ˆë‹¤. ė´ ėž‘ė—…ė€ ėēė‹œę°€ ë‹¤ė‹œ ėƒė„ąë  ë•ŒęšŒė§€ ė•ą ė„ąëŠĨ뗐 ėƒë‹ší•œ 똁í–Ĩė„ ë¯¸ėš  눘 ėžˆėŠĩ니다.", "cache_settings_duplicated_assets_clear_button": "ė§€ėš°ę¸°", "cache_settings_duplicated_assets_subtitle": "ė—…ëĄœë“œë˜ė§€ ė•ŠëŠ” ė‚Ŧė§„ 및 ë™ė˜ėƒ", - "cache_settings_duplicated_assets_title": "뤑ëŗĩ 항ëĒŠ ({}氜)", + "cache_settings_duplicated_assets_title": "뤑ëŗĩ 항ëĒŠ ({})", "cache_settings_image_cache_size": "ė´ë¯¸ė§€ ėēė‹œ íŦ기 ({})", "cache_settings_statistics_album": "ëŧė´ë¸ŒëŸŦëĻŦ ė„Ŧ네ėŧ", "cache_settings_statistics_assets": "항ëĒŠ {}氜 ({})", @@ -728,7 +724,7 @@ "delete_dialog_alert_remote": "ė´ 항ëĒŠë“¤ė´ Immich ė„œë˛„ė—ė„œ 똁ęĩŦ렁ėœŧ로 ė‚­ė œëŠë‹ˆë‹¤.", "delete_dialog_ok_force": "ëŦ´ė‹œí•˜ęŗ  ė‚­ė œ", "delete_dialog_title": "똁ęĩŦ렁ėœŧ로 ė‚­ė œ", - "delete_duplicates_confirmation": "ëš„ėŠˇí•œ 항ëĒŠë“¤ė„ 똁ęĩŦ렁ėœŧ로 ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까?", + "delete_duplicates_confirmation": "ė´ 뤑ëŗĩ 항ëĒŠë“¤ė„ 똁ęĩŦ렁ėœŧ로 ė‚­ė œí•˜ė‹œę˛ ėŠĩ니까?", "delete_face": "ė–ŧęĩ´ ė‚­ė œ", "delete_key": "키 ė‚­ė œ", "delete_library": "ëŧė´ë¸ŒëŸŦëĻŦ ė‚­ė œ", @@ -783,8 +779,8 @@ "downloading_asset_filename": "{filename} ë‹¤ėš´ëĄœë“œ 뤑...", "downloading_media": "ë¯¸ë””ė–´ ë‹¤ėš´ëĄœë“œ 뤑", "drop_files_to_upload": "ė•„ëŦ´ ęŗŗė—ë‚˜ 파ėŧė„ 드롭하ė—Ŧ ė—…ëĄœë“œ", - "duplicates": "ëš„ėŠˇí•œ 항ëĒŠ", - "duplicates_description": "ëš„ėŠˇí•œ 항ëĒŠë“¤ė„ í™•ė¸í•˜ęŗ , ėœ ė§€í•˜ęą°ë‚˜ ė‚­ė œí•  항ëĒŠ ė„ íƒ", + "duplicates": "뤑ëŗĩ 항ëĒŠ", + "duplicates_description": "각 ęˇ¸ëŖšė—ė„œ 뤑ëŗĩ된 항ëĒŠė„ í™•ė¸í•˜ęŗ  ė‚­ė œí•  항ëĒŠė„ ė„ íƒí•˜ė„¸ėš”.", "duration": "기간", "edit": "íŽ¸ė§‘", "edit_album": "ė•¨ë˛” ėˆ˜ė •", @@ -818,7 +814,7 @@ "enabled": "í™œė„ąí™”ë¨", "end_date": "ėĸ…ëŖŒėŧ", "enqueued": "ëŒ€ę¸°ė—´ė— ėļ”가됨", - "enter_wifi_name": "Enter WiFi name", + "enter_wifi_name": "Wi-Fi ė´ëĻ„ ėž…ë Ĩ", "error": "똤ëĨ˜", "error_change_sort_album": "ė•¨ë˛” í‘œė‹œ ėˆœė„œ ëŗ€ę˛Ŋ ė‹¤íŒ¨", "error_delete_face": "ė–ŧęĩ´ ė‚­ė œ 뤑 똤ëĨ˜ę°€ ë°œėƒí–ˆėŠĩ니다.", @@ -853,10 +849,12 @@ "failed_to_keep_this_delete_others": "ė´ 항ëĒŠė„ ėœ ė§€í•˜ęŗ  다ëĨ¸ 항ëĒŠė„ ė‚­ė œí•˜ė§€ ëĒģ했ėŠĩ니다.", "failed_to_load_asset": "항ëĒŠ 로드 ė‹¤íŒ¨", "failed_to_load_assets": "항ëĒŠ 로드 ė‹¤íŒ¨", + "failed_to_load_notifications": "ė•ŒëĻŧ 로드 ė‹¤íŒ¨", "failed_to_load_people": "ė¸ëŦŧ 로드 ė‹¤íŒ¨", "failed_to_remove_product_key": "ė œí’ˆ 키ëĨŧ ė œęą°í•˜ė§€ ëĒģ했ėŠĩ니다.", "failed_to_stack_assets": "ėŠ¤íƒė„ ë§Œë“¤ė§€ ëĒģ했ėŠĩ니다.", "failed_to_unstack_assets": "ėŠ¤íƒė„ í•´ė œí•˜ė§€ ëĒģ했ėŠĩ니다.", + "failed_to_update_notification_status": "ė•ŒëĻŧ ėƒíƒœ ė—…ë°ė´íŠ¸ ė‹¤íŒ¨", "import_path_already_exists": "ė´ 氀렏ė˜Ŧ ę˛Ŋ로는 ė´ë¯¸ ėĄ´ėžŦ합니다.", "incorrect_email_or_password": "ėž˜ëĒģ된 ė´ëŠ”ėŧ 또는 비밀번호", "paths_validation_failed": "ę˛Ŋ로 {paths, plural, one {#氜} other {#氜}}ëĨŧ 검ėĻí•˜ė§€ ëĒģ했ėŠĩ니다.", @@ -924,7 +922,7 @@ "unable_to_remove_reaction": "ë°˜ė‘ė„ ė œęą°í•  눘 ė—†ėŠĩ니다.", "unable_to_repair_items": "항ëĒŠė„ 눘ëĻŦ할 눘 ė—†ėŠĩ니다.", "unable_to_reset_password": "비밀번호ëĨŧ ė´ˆę¸°í™”í•  눘 ė—†ėŠĩ니다.", - "unable_to_resolve_duplicate": "ëš„ėŠˇí•œ 항ëĒŠė„ 래ëĻŦ할 눘 ė—†ėŠĩ니다.", + "unable_to_resolve_duplicate": "뤑ëŗĩ된 항ëĒŠė„ 래ëĻŦ할 눘 ė—†ėŠĩ니다.", "unable_to_restore_assets": "항ëĒŠė„ ëŗĩė›í•  눘 ė—†ėŠĩ니다.", "unable_to_restore_trash": "íœ´ė§€í†ĩė—ė„œ 항ëĒŠė„ ëŗĩė›í•  눘 ė—†ėŒ", "unable_to_restore_user": "ė‚ŦėšŠėž ė‚­ė œëĨŧ ėˇ¨ė†Œí•  눘 ė—†ėŠĩ니다.", @@ -978,7 +976,7 @@ "external": "뙏ëļ€", "external_libraries": "뙏ëļ€ ëŧė´ë¸ŒëŸŦëĻŦ", "external_network": "뙏ëļ€ ë„¤íŠ¸ė›ŒíŦ", - "external_network_sheet_info": "When not on the preferred WiFi network, the app will connect to the server through the first of the below URLs it can reach, starting from top to bottom", + "external_network_sheet_info": "ė„ í˜¸í•˜ëŠ” Wi-Fi ë„¤íŠ¸ė›ŒíŦ뗐 ė—°ę˛°ë˜ė–´ ėžˆė§€ ė•Šė€ ę˛Ŋ뚰, ė•ąė€ ė•„ëž˜ė— ë‚˜ė—´ëœ URL 뤑 뗰枰 가ëŠĨ한 ė˛Ģ ë˛ˆė§¸ ėŖŧė†ŒëĨŧ ėœ„ė—ė„œëļ€í„° ėˆœė„œëŒ€ëĄœ ė‚ŦėšŠí•Šë‹ˆë‹¤.", "face_unassigned": "ė•Œ 눘 ė—†ėŒ", "failed": "ė‹¤íŒ¨í•¨", "failed_to_load_assets": "항ëĒŠ 로드 ė‹¤íŒ¨", @@ -1002,7 +1000,7 @@ "folder": "폴더", "folder_not_found": "폴더ëĨŧ ė°žė„ 눘 ė—†ėŒ", "folders": "폴더", - "folders_feature_description": "파ėŧ ė‹œėŠ¤í…œė˜ ė‚Ŧė§„ 및 ë™ė˜ėƒė„ 폴더 뷰로 íƒėƒ‰", + "folders_feature_description": "파ėŧ ė‹œėŠ¤í…œė— ėžˆëŠ” ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ 폴더 ëŗ´ę¸°ëĄœ íƒėƒ‰", "forward": "ė•žėœŧ로", "general": "ėŧ반", "get_help": "ë„ė›€ ėš”ė˛­", @@ -1025,7 +1023,7 @@ "header_settings_field_validator_msg": "ę°’ė€ ëš„ė›Œë‘˜ 눘 ė—†ėŠĩ니다.", "header_settings_header_name_input": "헤더 ė´ëĻ„", "header_settings_header_value_input": "헤더 값", - "headers_settings_tile_subtitle": "ė•ąė´ 각 ë„¤íŠ¸ė›ŒíŦ ėš”ė˛­ė— 함ęģ˜ ė „ė†Ąí•  í”„ëĄė‹œ 헤더ëĨŧ ė •ė˜í•Šë‹ˆë‹¤.", + "headers_settings_tile_subtitle": "ë„¤íŠ¸ė›ŒíŦ ėš”ė˛­ė— 함ęģ˜ ė „ė†Ąí•  í”„ëĄė‹œ 헤더ëĨŧ ė •ė˜í•Šë‹ˆë‹¤.", "headers_settings_tile_title": "ė‚ŦėšŠėž ė •ė˜ í”„ëĄė‹œ 헤더", "hi_user": "ė•ˆë…•í•˜ė„¸ėš” {name}님, ({email})", "hide_all_people": "ëĒ¨ë“  ė¸ëŦŧ 눍揰揰", @@ -1045,13 +1043,13 @@ "home_page_delete_remote_err_local": "ė„œë˛„ė—ė„œ ė‚­ė œëœ 항ëĒŠėž…ë‹ˆë‹¤. 건너뜁니다.", "home_page_favorite_err_local": "ę¸°ę¸°ė˜ 항ëĒŠė€ ėĻę˛¨ė°žę¸°ė— ėļ”가할 눘 ė—†ėŠĩ니다. 건너뜁니다.", "home_page_favorite_err_partner": "íŒŒíŠ¸ë„ˆė˜ 항ëĒŠė€ ėĻę˛¨ė°žę¸°ė— ėļ”가할 눘 ė—†ėŠĩ니다. 건너뜁니다.", - "home_page_first_time_notice": "ė•ąė„ ė˛˜ėŒ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, íƒ€ėž„ëŧė¸ė— ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė´ í‘œė‹œë  눘 ėžˆë„ëĄ ë°ąė—… ė•¨ë˛”ė„ ė„ íƒí•´ėŖŧė„¸ėš”.", + "home_page_first_time_notice": "ė•ąė„ ė˛˜ėŒ ė‚ŦėšŠí•˜ëŠ” ę˛Ŋ뚰, 揰揰뗐 ėžˆëŠ” ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ íƒ€ėž„ëŧė¸ė— í‘œė‹œí•˜ęŗ  ë°ąė—…í•˜ë ¤ëŠ´ ë°ąė—…í•  ė•¨ë˛”ė„ ė„ íƒí•˜ė„¸ėš”.", "home_page_share_err_local": "ę¸°ę¸°ė—ë§Œ ė €ėžĨ된 항ëĒŠė€ 링íŦ로 ęŗĩėœ í•  눘 뗆떴 건너뜁니다.", "home_page_upload_err_limit": "한 ë˛ˆė— ėĩœëŒ€ 30ę°œė˜ 항ëĒŠë§Œ ė—…ëĄœë“œí•  눘 ėžˆėŠĩ니다.", "host": "í˜¸ėŠ¤íŠ¸", "hour": "ė‹œę°„", "ignore_icloud_photos": "iCloud ė‚Ŧė§„ ė œė™¸", - "ignore_icloud_photos_description": "iCloud뗐 ė €ėžĨ된 ė‚Ŧė§„ė€ Immich ė„œë˛„ëĄœ ė—…ëĄœë“œë˜ė§€ ė•ŠėŠĩ니다.", + "ignore_icloud_photos_description": "iCloud뗐 ė €ėžĨ된 ė‚Ŧė§„ė´ Immich뗐 ė—…ëĄœë“œë˜ė§€ ė•ŠėŠĩ니다.", "image": "ė´ë¯¸ė§€", "image_alt_text_date": "{date} ė´Ŧė˜í•œ {isVideo, select, true {ë™ė˜ėƒ} other {ė‚Ŧė§„}}", "image_alt_text_date_1_person": "{date} {person1}님ęŗŧ 함ęģ˜í•œ {isVideo, select, true {ë™ė˜ėƒ} other {ė‚Ŧė§„}}", @@ -1199,6 +1197,9 @@ "map_settings_only_show_favorites": "ėĻę˛¨ė°žę¸°ë§Œ í‘œė‹œ", "map_settings_theme_settings": "ė§€ë„ 테마", "map_zoom_to_see_photos": "ėļ•ė†Œí•˜ė—Ŧ ė‚Ŧė§„ ëŗ´ę¸°", + "mark_all_as_read": "ëĒ¨ë‘ ėŊėŒėœŧ로 í‘œė‹œ", + "mark_as_read": "ėŊėŒėœŧ로 í‘œė‹œ", + "marked_all_as_read": "ëĒ¨ë‘ ėŊė€ 것ėœŧ로 í‘œė‹œí–ˆėŠĩ니다.", "matches": "ėŧėš˜", "media_type": "ë¯¸ë””ė–´ ėĸ…ëĨ˜", "memories": "ėļ”ė–ĩ", @@ -1225,6 +1226,8 @@ "month": "ė›”", "monthly_title_text_date_format": "yyyy년 Mė›”", "more": "ë”ëŗ´ę¸°", + "moved_to_archive": "ëŗ´ę´€í•¨ėœŧ로 항ëĒŠ {count, plural, one {#氜} other {#氜}} ė´ë™ë¨", + "moved_to_library": "ëŧė´ë¸ŒëŸŦëĻŦ로 항ëĒŠ {count, plural, one {#氜} other {#氜}} ė´ë™ë¨", "moved_to_trash": "íœ´ė§€í†ĩėœŧ로 ė´ë™ë˜ė—ˆėŠĩ니다.", "multiselect_grid_edit_date_time_err_read_only": "ėŊ기 ė „ėšŠ 항ëĒŠė˜ ë‚ ė§œëŠ” ëŗ€ę˛Ŋ할 눘 ė—†ėŠĩ니다. 건너뜁니다.", "multiselect_grid_edit_gps_err_read_only": "ėŊ기 ė „ėšŠ 항ëĒŠė˜ ėœ„ėš˜ëŠ” ëŗ€ę˛Ŋ할 눘 ė—†ėŠĩ니다. 건너뜁니다.", @@ -1232,7 +1235,7 @@ "my_albums": "내 ė•¨ë˛”", "name": "ė´ëĻ„", "name_or_nickname": "ė´ëĻ„ 또는 ë‹‰ë„¤ėž„", - "networking_settings": "ë„¤íŠ¸ė›Œí‚š", + "networking_settings": "뗰枰", "networking_subtitle": "ė„œë˛„ ė—”ë“œíŦė¸íŠ¸ 네렕 관ëĻŦ", "never": "ė—†ėŒ", "new_album": "냈 ė•¨ë˛”", @@ -1251,12 +1254,14 @@ "no_archived_assets_message": "ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ ëŗ´ę´€í•¨ėœŧ로 ė´ë™í•˜ė—Ŧ ëĒŠëĄė—ė„œ 눍揰揰", "no_assets_message": "ė—Ŧ기ëĨŧ 클ëĻ­í•˜ė—Ŧ ė˛Ģ ė‚Ŧė§„ė„ ė—…ëĄœë“œí•˜ė„¸ėš”.", "no_assets_to_show": "í‘œė‹œí•  항ëĒŠ ė—†ėŒ", - "no_duplicates_found": "ëš„ėŠˇí•œ 항ëĒŠė„ ė°žė„ 눘 ė—†ėŠĩ니다.", + "no_duplicates_found": "뤑ëŗĩ된 항ëĒŠė´ ė—†ėŠĩ니다.", "no_exif_info_available": "EXIF ė •ëŗ´ ė—†ėŒ", "no_explore_results_message": "더 ë§Žė€ ė‚Ŧė§„ė„ ė—…ëĄœë“œí•˜ė—Ŧ íƒėƒ‰ 기ëŠĨė„ ė‚ŦėšŠí•˜ė„¸ėš”.", "no_favorites_message": "ėĻę˛¨ė°žę¸°ė— ėĸ‹ė•„하는 ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ ėļ”ę°€í•˜ę¸°", "no_libraries_message": "뙏ëļ€ ëŧė´ë¸ŒëŸŦëĻŦëĨŧ ėƒė„ąí•˜ė—Ŧ ę¸°ėĄ´ ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ í™•ė¸í•˜ė„¸ėš”.", "no_name": "ė´ëĻ„ ė—†ėŒ", + "no_notifications": "ė•ŒëĻŧ ė—†ėŒ", + "no_people_found": "ėŧėš˜í•˜ëŠ” ė¸ëŦŧ ė—†ėŒ", "no_places": "ėžĨė†Œ ė—†ėŒ", "no_results": "결ęŗŧ가 ė—†ėŠĩ니다.", "no_results_description": "ë™ė˜ė–´ 또는 더 ėŧë°˜ė ė¸ ë‹¨ė–´ëĨŧ ė‚ŦėšŠí•´ ëŗ´ė„¸ėš”.", @@ -1331,7 +1336,7 @@ "pending": "ė§„í–‰ 뤑", "people": "ė¸ëŦŧ", "people_edits_count": "ė¸ëŦŧ {count, plural, one {#ëĒ…} other {#ëĒ…}}ė„ ėˆ˜ė •í–ˆėŠĩ니다.", - "people_feature_description": "ė‚Ŧė§„ 및 ë™ė˜ėƒė„ ė¸ëŦŧ ęˇ¸ëŖšëŗ„ëĄœ íƒėƒ‰", + "people_feature_description": "ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ ė¸ëŦŧ ęˇ¸ëŖšëŗ„ëĄœ íƒėƒ‰", "people_sidebar_description": "ė‚Ŧė´ë“œë°”ė— ė¸ëŦŧ 링íŦ í‘œė‹œ", "permanent_deletion_warning": "똁ęĩŦ ė‚­ė œ ę˛Ŋęŗ ", "permanent_deletion_warning_setting_description": "항ëĒŠė„ 똁ęĩŦ렁ėœŧ로 ė‚­ė œí•˜ę¸° ė „ ę˛Ŋęŗ  ëŠ”ė‹œė§€ í‘œė‹œ", @@ -1363,15 +1368,15 @@ "play": "ėžŦėƒ", "play_memories": "ėļ”ė–ĩ ėžŦėƒ", "play_motion_photo": "ëĒ¨ė…˜ íŦ토 ėžŦėƒ", - "play_or_pause_video": "ë™ė˜ėƒ ėžŦėƒ, ėŧė‹œ ė •ė§€", + "play_or_pause_video": "ë™ė˜ėƒ ėžŦėƒ/ėŧė‹œ ė •ė§€", "port": "íŦ트", - "preferences_settings_subtitle": "Manage the app's preferences", - "preferences_settings_title": "네렕", + "preferences_settings_subtitle": "ė•ą 네렕 관ëĻŦ", + "preferences_settings_title": "ę°œė¸ 네렕", "preset": "ė‚Ŧė „ 네렕", "preview": "미ëĻŦ ëŗ´ę¸°", "previous": "ė´ė „", "previous_memory": "ė´ė „ ėļ”ė–ĩ", - "previous_or_next_photo": "ė´ė „ 또는 ë‹¤ėŒ ė´ë¯¸ė§€ëĄœ", + "previous_or_next_photo": "ė´ė „/ë‹¤ėŒ ė‚Ŧė§„ėœŧ로", "primary": "ėŖŧėš”", "privacy": "ę°œė¸ ė •ëŗ´", "profile_drawer_app_logs": "로그", @@ -1432,7 +1437,8 @@ "recent_searches": "ėĩœęˇŧ ę˛€ėƒ‰", "recently_added": "ėĩœęˇŧ ėļ”ę°€", "recently_added_page_title": "ėĩœęˇŧ ėļ”ę°€", - "recently_taken": "ėĩœęˇŧ ė´Ŧė˜ë¨", + "recently_taken": "ėĩœęˇŧ 항ëĒŠ", + "recently_taken_page_title": "ėĩœęˇŧ ė´Ŧė˜ë¨", "refresh": "ėƒˆëĄœęŗ ėš¨", "refresh_encoded_videos": "ë™ė˜ėƒ ėžŦė¸ėŊ”딊", "refresh_faces": "ė–ŧęĩ´ ėƒˆëĄœęŗ ėš¨", @@ -1476,15 +1482,15 @@ "reset_password": "비밀번호 ėžŦ네렕", "reset_people_visibility": "ė¸ëŦŧ í‘œė‹œ ė—Ŧëļ€ ė´ˆę¸°í™”", "reset_to_default": "ę¸°ëŗ¸ę°’ėœŧ로 ëŗĩ뛐", - "resolve_duplicates": "ëš„ėŠˇí•œ 항ëĒŠ í™•ė¸", - "resolved_all_duplicates": "ëš„ėŠˇí•œ 항ëĒŠė„ ëĒ¨ë‘ í™•ė¸í–ˆėŠĩ니다.", + "resolve_duplicates": "뤑ëŗĩ된 항ëĒŠ í™•ė¸", + "resolved_all_duplicates": "뤑ëŗĩ된 항ëĒŠė„ ëĒ¨ë‘ 래ëĻŦ했ėŠĩ니다.", "restore": "ëŗĩ뛐", "restore_all": "ëĒ¨ë‘ ëŗĩ뛐", "restore_user": "ė‚ŦėšŠėž ëŗĩ뛐", "restored_asset": "항ëĒŠė´ ëŗĩė›ë˜ė—ˆėŠĩ니다.", "resume": "ėžŦ氜", "retry_upload": "ë‹¤ė‹œ ė‹œë„", - "review_duplicates": "ëš„ėŠˇí•œ 항ëĒŠ í™•ė¸", + "review_duplicates": "뤑ëŗĩ된 항ëĒŠ í™•ė¸", "role": "ė—­í• ", "role_editor": "íŽ¸ė§‘ėž", "role_viewer": "ëˇ°ė–´", @@ -1503,7 +1509,7 @@ "search_albums": "ė•¨ë˛” ę˛€ėƒ‰", "search_by_context": "ë‚´ėšŠ ę˛€ėƒ‰", "search_by_description": "네ëĒ…ėœŧ로 ę˛€ėƒ‰", - "search_by_description_example": "ė„¤ė•…ė‚°ė—ė„œ ėĻę¸°ëŠ” í•˜ė´í‚š", + "search_by_description_example": "ë™í•´ė•ˆė—ė„œ ë§žė´í•˜ëŠ” ėƒˆí•´ ėŧėļœ", "search_by_filename": "파ėŧëĒ… 또는 확ėžĨėžëĄœ ę˛€ėƒ‰", "search_by_filename_example": "ė˜ˆė‹œ: IMG_1234.JPG or PNG", "search_camera_make": "ėš´ëŠ”ëŧ ė œėĄ°ė‚Ŧ ę˛€ėƒ‰...", @@ -1528,14 +1534,14 @@ "search_no_more_result": "ë”ė´ėƒ 결ęŗŧ ė—†ėŒ", "search_no_people": "ė¸ëŦŧė´ ė—†ėŠĩ니다.", "search_no_people_named": "\"{name}\" ė¸ëŦŧė„ ė°žė„ 눘 ė—†ėŒ", - "search_no_result": "No results found, try a different search term or combination", + "search_no_result": "ę˛€ėƒ‰ 결ęŗŧ가 ė—†ėŠĩ니다. 다ëĨ¸ ę˛€ėƒ‰ė–´ë‚˜ ėĄ°í•Šėœŧ로 ë‹¤ė‹œ ė‹œë„í•´ ëŗ´ė„¸ėš”.", "search_options": "ę˛€ėƒ‰ ė˜ĩė…˜", "search_page_categories": "ëļ„ëĨ˜", "search_page_motion_photos": "ëĒ¨ė…˜ íŦ토", "search_page_no_objects": "ė‚ŦėšŠ 가ëŠĨ한 ė‚ŦëŦŧ ė •ëŗ´ ė—†ėŒ", "search_page_no_places": "ė‚ŦėšŠ 가ëŠĨ한 ėœ„ėš˜ ė •ëŗ´ ė—†ėŒ", "search_page_screenshots": "늤íŦëϰ냎", - "search_page_search_photos_videos": "ė‚Ŧė§„ 및 ë™ė˜ėƒė„ ę˛€ėƒ‰í•˜ė„¸ėš”", + "search_page_search_photos_videos": "ė‚Ŧė§„ 및 ë™ė˜ėƒ ę˛€ėƒ‰", "search_page_selfies": "ė…€í”ŧ", "search_page_things": "ė‚ŦëŦŧ", "search_page_view_all_button": "ëĒ¨ë‘ ëŗ´ę¸°", @@ -1567,6 +1573,7 @@ "select_keep_all": "ëĒ¨ë‘ ėœ ė§€", "select_library_owner": "ëŧė´ë¸ŒëŸŦëĻŦ ė†Œėœ ėž ė„ íƒ", "select_new_face": "냈 ė–ŧęĩ´ ė„ íƒ", + "select_person_to_tag": "태그할 ė¸ëŦŧė„ ė„ íƒí•˜ė„¸ėš”.", "select_photos": "ė‚Ŧė§„ ė„ íƒ", "select_trash_all": "ëĒ¨ë‘ ė‚­ė œ", "select_user_for_sharing_page_err_album": "ė•¨ë˛”ė„ ėƒė„ąí•˜ė§€ ëĒģ했ėŠĩ니다.", @@ -1598,9 +1605,9 @@ "setting_languages_subtitle": "ė•ą 떏떴 ëŗ€ę˛Ŋ", "setting_languages_title": "떏떴", "setting_notifications_notify_failures_grace_period": "밹꡸ëŧėš´ë“œ ë°ąė—… ė‹¤íŒ¨ ė•ŒëĻŧ: {}", - "setting_notifications_notify_hours": "{}ė‹œę°„ 후", + "setting_notifications_notify_hours": "{}ė‹œę°„", "setting_notifications_notify_immediately": "ėĻ‰ė‹œ", - "setting_notifications_notify_minutes": "{}ëļ„ í›„", + "setting_notifications_notify_minutes": "{}ëļ„", "setting_notifications_notify_never": "ė•ŒëĻŦė§€ ė•ŠėŒ", "setting_notifications_notify_seconds": "{}봈", "setting_notifications_single_progress_subtitle": "ę°œëŗ„ 항ëĒŠė˜ ėƒė„¸ ė—…ëĄœë“œ ė •ëŗ´ í‘œė‹œ", @@ -1609,7 +1616,7 @@ "setting_notifications_total_progress_subtitle": "렄랴 ė—…ëĄœë“œ ė§„í–‰ëĨ  (ė™„ëŖŒ/렄랴)", "setting_notifications_total_progress_title": "밹꡸ëŧėš´ë“œ ë°ąė—… 렄랴 ė§„í–‰ëĨ  í‘œė‹œ", "setting_video_viewer_looping_title": "반ëŗĩ", - "setting_video_viewer_original_video_subtitle": "When streaming a video from the server, play the original even when a transcode is available. May lead to buffering. Videos available locally are played in original quality regardless of this setting.", + "setting_video_viewer_original_video_subtitle": "ė„œë˛„ė—ė„œ ë™ė˜ėƒė„ ėŠ¤íŠ¸ëĻŦ밍할 때, íŠ¸ëžœėŠ¤ėŊ”딊된 ë˛„ė „ė´ ėžˆë”ëŧ도 ė›ëŗ¸ė„ ėžŦėƒí•Šë‹ˆë‹¤. ė´ëĄœ ė¸í•´ 버íŧë§ė´ ë°œėƒí•  눘 ėžˆėŠĩ니다. 揰揰뗐 ėžˆëŠ” ë™ė˜ėƒė€ ė´ 네렕ęŗŧ ę´€ęŗ„ė—†ė´ í•­ėƒ ė›ëŗ¸ í™”ė§ˆëĄœ ėžŦėƒëŠë‹ˆë‹¤.", "setting_video_viewer_original_video_title": "ė›ëŗ¸ ë™ė˜ėƒ ę°•ė œ ė‚ŦėšŠ", "settings": "네렕", "settings_require_restart": "ė„¤ė •ė„ ė ėšŠí•˜ë ¤ëŠ´ ImmichëĨŧ ë‹¤ė‹œ ė‹œėž‘í•˜ė„¸ėš”.", @@ -1668,7 +1675,7 @@ "sharing": "ęŗĩ뜠", "sharing_enter_password": "ė´ íŽ˜ė´ė§€ëĨŧ ëŗ´ë ¤ëŠ´ 비밀번호ëĨŧ ėž…ë Ĩí•˜ė„¸ėš”.", "sharing_page_album": "ęŗĩ뜠 ė•¨ë˛”", - "sharing_page_description": "ęŗĩ뜠 ė•¨ë˛”ė„ ë§Œë“¤ė–´ ėŖŧëŗ€ ė‚Ŧ람들ęŗŧ ė‚Ŧė§„ 및 ë™ė˜ėƒė„ ęŗĩėœ í•˜ė„¸ėš”.", + "sharing_page_description": "ęŗĩ뜠 ė•¨ë˛”ė„ ë§Œë“¤ė–´ ėŖŧëŗ€ ė‚ŦëžŒë“¤ė—ę˛Œ ė‚Ŧė§„ęŗŧ ë™ė˜ėƒė„ ęŗĩėœ í•˜ė„¸ėš”.", "sharing_page_empty_list": "ęŗĩ뜠 ė•¨ë˛” ė—†ėŒ", "sharing_sidebar_description": "ė‚Ŧė´ë“œë°”ė— ęŗĩ뜠 링íŦ í‘œė‹œ", "sharing_silver_appbar_create_shared_album": "ęŗĩ뜠 ė•¨ë˛” ėƒė„ą", @@ -1715,7 +1722,7 @@ "sort_title": "렜ëĒŠ", "source": "ė†ŒėŠ¤", "stack": "ėŠ¤íƒ", - "stack_duplicates": "ëš„ėŠˇí•œ 항ëĒŠ ėŠ¤íƒ", + "stack_duplicates": "뤑ëŗĩ된 항ëĒŠ ėŠ¤íƒ", "stack_select_one_photo": "ėŠ¤íƒė˜ 대표 ė‚Ŧė§„ ė„ íƒ", "stack_selected_photos": "ė„ íƒí•œ ė´ë¯¸ė§€ ėŠ¤íƒ", "stacked_assets_count": "항ëĒŠ {count, plural, one {#氜} other {#氜}} ėŠ¤íƒë¨", @@ -1733,7 +1740,7 @@ "storage_usage": "{available} 뤑 {used} ė‚ŦėšŠ", "submit": "í™•ė¸", "suggestions": "ėļ”ė˛œ", - "sunrise_on_the_beach": "ë™í•´ė•ˆė—ė„œ ë§žė´í•˜ëŠ” ėƒˆí•´ ėŧėļœ", + "sunrise_on_the_beach": "ė´ë¯¸ė§€ė— ėĄ´ėžŦ하는 ė‚ŦëŦŧ ę˛€ėƒ‰", "support": "맀뛐", "support_and_feedback": "맀뛐 & ė œė•ˆ", "support_third_party_description": "Immich가 ė„œë“œíŒŒí‹° íŒ¨í‚¤ė§€ëĄœ ė„¤ėš˜ ë˜ė—ˆėŠĩ니다. 링íŦëĨŧ 눌ëŸŦ ë¨ŧė € íŒ¨í‚¤ė§€ ëŦ¸ė œė¸ė§€ í™•ė¸í•´ ëŗ´ė„¸ėš”.", @@ -1745,7 +1752,7 @@ "tag": "태그", "tag_assets": "항ëĒŠ 태그", "tag_created": "태그 ėƒė„ąë¨: {tag}", - "tag_feature_description": "ė‚Ŧė§„ 및 ë™ė˜ėƒė„ ėŖŧė œëŗ„ ęˇ¸ëŖší™”ëœ 태그로 íƒėƒ‰", + "tag_feature_description": "태그 ėŖŧė œëŗ„ëĄœ ęˇ¸ëŖší™”ëœ ė‚Ŧė§„ęŗŧ ë™ė˜ėƒ íƒėƒ‰", "tag_not_found_question": "태그ëĨŧ ė°žė„ 눘 ė—†ë‚˜ėš”? 냈 태그ëĨŧ ėƒė„ąí•˜ė„¸ėš”.", "tag_people": "ė¸ëŦŧ 태그", "tag_updated": "태그 ė—…ë°ė´íŠ¸ë¨: {tag}", @@ -1755,7 +1762,7 @@ "theme": "테마", "theme_selection": "테마 네렕", "theme_selection_description": "브ëŧėš°ė € 및 ė‹œėŠ¤í…œ ę¸°ëŗ¸ 네렕뗐 따ëŧ ëŧė´íŠ¸ ëĒ¨ë“œė™€ 다íŦ ëĒ¨ë“œëĨŧ ėžë™ėœŧ로 네렕", - "theme_setting_asset_list_storage_indicator_title": "항ëĒŠė— ėŠ¤í† ëĻŦė§€ 동기화 ė—Ŧëļ€ í‘œė‹œ", + "theme_setting_asset_list_storage_indicator_title": "타ėŧ뗐 ė„œë˛„ 동기화 ėƒíƒœ í‘œė‹œ", "theme_setting_asset_list_tiles_per_row_title": "한 뤄뗐 í‘œė‹œí•  항ëĒŠ 눘 ({})", "theme_setting_colorful_interface_subtitle": "ë°°ę˛Ŋ뗐 대표 ėƒ‰ėƒė„ ė ėšŠí•Šë‹ˆë‹¤.", "theme_setting_colorful_interface_title": "미려한 ė¸í„°íŽ˜ė´ėŠ¤", @@ -1781,7 +1788,7 @@ "to_trash": "ė‚­ė œ", "toggle_settings": "네렕 ëŗ€ę˛Ŋ", "toggle_theme": "다íŦ ëĒ¨ë“œ ė‚ŦėšŠ", - "total": "í•Šęŗ„", + "total": "렄랴", "total_usage": "ė´ ė‚ŦėšŠëŸ‰", "trash": "íœ´ė§€í†ĩ", "trash_all": "ëĒ¨ë‘ ė‚­ė œ", @@ -1890,7 +1897,7 @@ "week": "ėŖŧ", "welcome": "í™˜ė˜í•Šë‹ˆë‹¤", "welcome_to_immich": "í™˜ė˜í•Šë‹ˆë‹¤", - "wifi_name": "WiFi Name", + "wifi_name": "W-Fi ė´ëĻ„", "year": "년", "years_ago": "{years, plural, one {#년} other {#년}} ė „", "yes": "네", diff --git a/i18n/lt.json b/i18n/lt.json index 450152bc74..b279d88f08 100644 --- a/i18n/lt.json +++ b/i18n/lt.json @@ -182,20 +182,13 @@ "oauth_auto_register": "Automatinis registravimas", "oauth_auto_register_description": "AutomatiÅĄkai uÅžregistruoti naujus naudotojus po prisijungimo per OAuth", "oauth_button_text": "Mygtuko tekstas", - "oauth_client_id": "Kliento ID", - "oauth_client_secret": "Kliento paslaptis", "oauth_enable_description": "Prisijungti su OAuth", - "oauth_issuer_url": "Teikėjo URL", "oauth_mobile_redirect_uri": "Mobiliojo peradresavimo URI", "oauth_mobile_redirect_uri_override": "Mobiliojo peradresavimo URI pakeitimas", "oauth_mobile_redirect_uri_override_description": "ÄŽjunkite, kai OAuth teikėjas nepalaiko mobiliojo URI, tokio kaip '{callback}'", - "oauth_profile_signing_algorithm": "Profilio registracijos algoritmas", - "oauth_profile_signing_algorithm_description": "Algoritmas naudojamas vartotojo profilio registracijai.", - "oauth_scope": "Apimtis", "oauth_settings": "OAuth", "oauth_settings_description": "Tvarkyti OAuth prisijungimo nustatymus", "oauth_settings_more_details": "Detaliau apie ÅĄią funkciją galite paskaityti dokumentacijoje.", - "oauth_signing_algorithm": "", "oauth_storage_label_claim": "", "oauth_storage_label_claim_description": "", "oauth_storage_quota_claim": "", diff --git a/i18n/lv.json b/i18n/lv.json index c9002b559c..6dfb9cdb67 100644 --- a/i18n/lv.json +++ b/i18n/lv.json @@ -150,19 +150,12 @@ "oauth_auto_register": "", "oauth_auto_register_description": "", "oauth_button_text": "Pogas teksts", - "oauth_client_id": "Klienta ID", - "oauth_client_secret": "Klienta noslēpums", "oauth_enable_description": "Pieslēgties ar OAuth", - "oauth_issuer_url": "", "oauth_mobile_redirect_uri": "", "oauth_mobile_redirect_uri_override": "", "oauth_mobile_redirect_uri_override_description": "", - "oauth_profile_signing_algorithm": "Profila parakstÄĢÅĄanas algoritms", - "oauth_profile_signing_algorithm_description": "Lietotāja profila parakstÄĢÅĄanai izmantotais algoritms.", - "oauth_scope": "", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth pieteikÅĄanās iestatÄĢjumu pārvaldÄĢba", - "oauth_signing_algorithm": "ParakstÄĢÅĄanas algoritms", "oauth_storage_label_claim": "", "oauth_storage_label_claim_description": "", "oauth_storage_quota_claim": "", @@ -203,8 +196,9 @@ "theme_custom_css_settings_description": "", "theme_settings": "", "theme_settings_description": "Immich tÄĢmekÄŧa saskarnes pielāgojumu pārvaldÄĢba", + "thumbnail_generation_job": "SÄĢktēlu ÄŖenerÄ“ÅĄana", "thumbnail_generation_job_description": "", - "transcoding_acceleration_api": "", + "transcoding_acceleration_api": "PaātrinÄÅĄanas API", "transcoding_acceleration_api_description": "", "transcoding_acceleration_nvenc": "NVENC (nepiecieÅĄams NVIDIA GPU)", "transcoding_acceleration_qsv": "Quick Sync (nepiecieÅĄams 7. paaudzes vai jaunāks Intel procesors)", @@ -214,10 +208,11 @@ "transcoding_accepted_audio_codecs_description": "", "transcoding_accepted_video_codecs": "", "transcoding_accepted_video_codecs_description": "", - "transcoding_advanced_options_description": "", + "transcoding_advanced_options_description": "Lielākajai daÄŧai lietotāju nevajadzētu mainÄĢt ÅĄÄĢs opcijas", "transcoding_audio_codec": "Audio kodeks", "transcoding_audio_codec_description": "", "transcoding_bitrate_description": "", + "transcoding_codecs_learn_more": "Lai uzzinātu vairāk par ÅĄeit lietoto terminoloÄŖiju, skatiet FFmpeg dokumentāciju par H.264 kodeku, HEVC kodeku un VP9 kodeku.", "transcoding_constant_quality_mode": "", "transcoding_constant_quality_mode_description": "", "transcoding_constant_rate_factor": "", diff --git a/i18n/mk.json b/i18n/mk.json index 658ab9453e..829fceaed3 100644 --- a/i18n/mk.json +++ b/i18n/mk.json @@ -71,12 +71,7 @@ "oauth_auto_launch": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚ŅĐēĐž СаĐŋĐžŅ‡ĐŊŅƒĐ˛Đ°ŅšĐĩ", "oauth_auto_register": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚ŅĐēа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Đ°", "oauth_button_text": "ĐĸĐĩĐēҁ҂ ĐŊа ĐēĐžĐŋ҇Đĩ", - "oauth_client_id": "КĐģиĐĩĐŊ҂ҁĐēи ID", - "oauth_client_secret": "КĐģиĐĩĐŊ҂ҁĐēа Ņ‚Đ°Ņ˜ĐŊа", - "oauth_issuer_url": "URL ĐŊа Đ¸ĐˇĐ´Đ°Đ˛Đ°Ņ‡", - "oauth_scope": "ОĐŋҁĐĩĐŗ", "oauth_settings": "OAuth", - "oauth_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đ°Đŧ Са ĐŋĐžŅ‚ĐŋĐ¸ŅˆŅƒĐ˛Đ°ŅšĐĩ", "offline_paths": "ĐžŅ„ĐģĐ°Ņ˜ĐŊ ĐŋĐ°Ņ‚ĐĩĐēи", "password_settings": "ĐĐ°Ņ˜Đ°Đ˛Đ° ŅĐž ĐģОСиĐŊĐēа", "repair_all": "ПоĐŋŅ€Đ°Đ˛Đ¸ ĐŗĐ¸ ŅĐ¸Ņ‚Đĩ", diff --git a/i18n/ml.json b/i18n/ml.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/i18n/ml.json @@ -0,0 +1 @@ +{} diff --git a/i18n/mn.json b/i18n/mn.json index c91a670846..f539c64813 100644 --- a/i18n/mn.json +++ b/i18n/mn.json @@ -119,17 +119,12 @@ "oauth_auto_register": "", "oauth_auto_register_description": "", "oauth_button_text": "", - "oauth_client_id": "", - "oauth_client_secret": "", "oauth_enable_description": "", - "oauth_issuer_url": "", "oauth_mobile_redirect_uri": "", "oauth_mobile_redirect_uri_override": "", "oauth_mobile_redirect_uri_override_description": "", - "oauth_scope": "", "oauth_settings": "", "oauth_settings_description": "", - "oauth_signing_algorithm": "", "oauth_storage_label_claim": "", "oauth_storage_label_claim_description": "", "oauth_storage_quota_claim": "", diff --git a/i18n/ms.json b/i18n/ms.json index 5409b0e306..d5af40720d 100644 --- a/i18n/ms.json +++ b/i18n/ms.json @@ -22,6 +22,7 @@ "add_photos": "Tambah gambar", "add_to": "Tambah keâ€Ļ", "add_to_album": "Tambah ke album", + "add_to_album_bottom_sheet_already_exists": "Sudah ada di {album}", "add_to_shared_album": "Tambah ke album yang dikongsi", "add_url": "Tambah URL", "added_to_archive": "Tambah ke arkib", @@ -185,20 +186,13 @@ "oauth_auto_register": "Daftar secara automatik", "oauth_auto_register_description": "Daftar secara automatik pengguna-pengguna baharu selepas mendaftar masuk dengan OAuth", "oauth_button_text": "Teks butang", - "oauth_client_id": "ID Pelanggan", - "oauth_client_secret": "Rahsia Pelanggan", "oauth_enable_description": "Log masuk dengan OAuth", - "oauth_issuer_url": "URL Pengeluar", "oauth_mobile_redirect_uri": "URI ubah hala mudah alih", "oauth_mobile_redirect_uri_override": "Penggantian URI ubah hala mudah alih", "oauth_mobile_redirect_uri_override_description": "Aktifkan apabila pembekal OAuth tidak membenarkan URI mudah alih, seperti '{callback}'", - "oauth_profile_signing_algorithm": "Algoritma tandatangan profil", - "oauth_profile_signing_algorithm_description": "Algoritma digunakan untuk menandatangani profil pengguna.", - "oauth_scope": "Skop", "oauth_settings": "OAuth", "oauth_settings_description": "Urus tetapan-tetapan log masuk OAuth", "oauth_settings_more_details": "Untuk maklumat lanjut tentang ciri ini, rujuk ke dokumen.", - "oauth_signing_algorithm": "Tandatangan algoritma", "oauth_storage_label_claim": "Tuntutan label storan", "oauth_storage_label_claim_description": "Tetapkan label storan pengguna secara automatik kepada nilai tuntutan ini.", "oauth_storage_quota_claim": "Tuntutan kuota storan", diff --git a/i18n/nb_NO.json b/i18n/nb_NO.json index 0995b81cc5..1291f0dfef 100644 --- a/i18n/nb_NO.json +++ b/i18n/nb_NO.json @@ -192,26 +192,21 @@ "oauth_auto_register": "Automatisk registrering", "oauth_auto_register_description": "Registrer automatisk nye brukere etter innlogging med OAuth", "oauth_button_text": "Knappetekst", - "oauth_client_id": "Klient-ID", - "oauth_client_secret": "Klient hemmelighet", "oauth_enable_description": "Logg inn med OAuth", - "oauth_issuer_url": "Utgiverens URL", "oauth_mobile_redirect_uri": "Mobil omdirigerings-URI", "oauth_mobile_redirect_uri_override": "Mobil omdirigerings-URI overstyring", "oauth_mobile_redirect_uri_override_description": "Aktiver nÃĨr OAuth-leverandøren ikke tillater en mobil URI, som '{callback}'", - "oauth_profile_signing_algorithm": "Profilsigneringsalgoritme", - "oauth_profile_signing_algorithm_description": "Algoritme brukt for ÃĨ signere brukerprofilen.", - "oauth_scope": "Omfang", "oauth_settings": "OAuth", "oauth_settings_description": "Administrer innstillinger for OAuth-innlogging", "oauth_settings_more_details": "For mer informasjon om denne funksjonen, se dokumentasjonen.", - "oauth_signing_algorithm": "Signeringsalgoritme", "oauth_storage_label_claim": "Lagringsetikettkrav", "oauth_storage_label_claim_description": "Sett automatisk brukerens lagringsetikett til verdien av dette kravet.", "oauth_storage_quota_claim": "Lagringskvotekrav", "oauth_storage_quota_claim_description": "Sett automatisk brukerens lagringskvote til verdien av dette kravet.", "oauth_storage_quota_default": "Standard lagringskvote (GiB)", "oauth_storage_quota_default_description": "Kvote i GiB som skal brukes nÃĨr ingen krav er oppgitt (Skriv 0 for ubegrenset kvote).", + "oauth_timeout": "Forespørselen tok for lang tid", + "oauth_timeout_description": "Tidsavbrudd for forespørsel i millisekunder", "offline_paths": "Frakoblede filstier", "offline_paths_description": "Disse resultatene kan skyldes manuell sletting av filer som ikke er en del av et eksternt bibliotek.", "password_enable_description": "Logg inn med e-post og passord", @@ -376,7 +371,7 @@ "advanced_settings_log_level_title": "LoggnivÃĨ: {}", "advanced_settings_prefer_remote_subtitle": "Noen enheter er veldige trege til ÃĨ hente mikrobilder fra enheten. Aktiver denne innstillingen for ÃĨ hente de eksternt istedenfor.", "advanced_settings_prefer_remote_title": "Foretrekk eksterne bilder", - "advanced_settings_proxy_headers_subtitle": "Definer proxy headere som Immich skal benytte ved enhver nettverksrequest ", + "advanced_settings_proxy_headers_subtitle": "Definer proxy headere som Immich skal benytte ved enhver nettverksrequest", "advanced_settings_proxy_headers_title": "Proxy headere", "advanced_settings_self_signed_ssl_subtitle": "Hopper over SSL sertifikatverifikasjon for server-endepunkt. PÃĨkrevet for selvsignerte sertifikater.", "advanced_settings_self_signed_ssl_title": "Tillat selvsignerte SSL sertifikater", @@ -469,7 +464,7 @@ "asset_list_settings_title": "Fotorutenett", "asset_offline": "Fil utilgjengelig", "asset_offline_description": "Dette elementet er offline. Immich kan ikke aksessere dets lokasjon. Vennlist pÃĨse at elementet er tilgijengelig og skann sÃĨ biblioteket pÃĨ nytt.", - "asset_restored_successfully": "{} objekt(er) Gjenopprettet", + "asset_restored_successfully": "Objekt(er) gjenopprettet", "asset_skipped": "Hoppet over", "asset_skipped_in_trash": "I søppelbøtten", "asset_uploaded": "Lastet opp", @@ -481,8 +476,8 @@ "assets_added_to_album_count": "Lagt til {count, plural, one {# asset} other {# assets}} i album", "assets_added_to_name_count": "Lagt til {count, plural, one {# asset} other {# assets}} i {hasName, select, true {{name}} other {new album}}", "assets_count": "{count, plural, one {# fil} other {# filer}}", - "assets_deleted_permanently": "{} objekt(er) Slettet permanent", - "assets_deleted_permanently_from_server": "{} objekt(er) slettet permanent fra Immich serveren", + "assets_deleted_permanently": "{} objekt(er) slettet permanent", + "assets_deleted_permanently_from_server": "{} objekt(er) slettet permanent fra Immich-serveren", "assets_moved_to_trash_count": "Flyttet {count, plural, one {# asset} other {# assets}} til søppel", "assets_permanently_deleted_count": "Permanent slettet {count, plural, one {# asset} other {# assets}}", "assets_removed_count": "Slettet {count, plural, one {# asset} other {# assets}}", @@ -508,12 +503,12 @@ "backup_album_selection_page_selection_info": "Valginformasjon", "backup_album_selection_page_total_assets": "Totalt antall unike objekter", "backup_all": "Alle", - "backup_background_service_backup_failed_message": "Sikkerhetskopiering av objekter feilet. Prøver pÃĨ nytt ...", - "backup_background_service_connection_failed_message": "Tilkobling til server feilet. Prøver pÃĨ nytt ...", + "backup_background_service_backup_failed_message": "Sikkerhetskopiering av objekter feilet. Prøver pÃĨ nyttâ€Ļ", + "backup_background_service_connection_failed_message": "Tilkobling til server feilet. Prøver pÃĨ nyttâ€Ļ", "backup_background_service_current_upload_notification": "Laster opp {}", - "backup_background_service_default_notification": "Ser etter nye objekter ...", + "backup_background_service_default_notification": "Ser etter nye objekterâ€Ļ", "backup_background_service_error_title": "Sikkerhetskopieringsfeil", - "backup_background_service_in_progress_notification": "Sikkerhetskopierer objekter ...", + "backup_background_service_in_progress_notification": "Sikkerhetskopierer objekterâ€Ļ", "backup_background_service_upload_failure_notification": "Opplasting feilet {}", "backup_controller_page_albums": "Sikkerhetskopier albumer", "backup_controller_page_background_app_refresh_disabled_content": "Aktiver bakgrunnsoppdatering i Innstillinger > Generelt > Bakgrunnsoppdatering for ÃĨ bruke sikkerhetskopiering i bakgrunnen.", @@ -531,7 +526,7 @@ "backup_controller_page_background_is_on": "Automatisk sikkerhetskopiering i bakgrunnen er aktivert", "backup_controller_page_background_turn_off": "Skru av bakgrunnstjenesten", "backup_controller_page_background_turn_on": "Skru pÃĨ bakgrunnstjenesten", - "backup_controller_page_background_wifi": "Kun pÃĨ WiFi", + "backup_controller_page_background_wifi": "Kun pÃĨ Wi-Fi", "backup_controller_page_backup": "Sikkerhetskopier", "backup_controller_page_backup_selected": "Valgte: ", "backup_controller_page_backup_sub": "Opplastede bilder og videoer", @@ -619,7 +614,7 @@ "check_all": "Sjekk alle", "check_corrupt_asset_backup": "Sjekk etter korrupte backupobjekter", "check_corrupt_asset_backup_button": "Utfør sjekk", - "check_corrupt_asset_backup_description": "Kjør denne sjekken kun over Wi-Fi og nÃĨr alle objekter har blitt lastet opp.\nDenne sjekken kan ta noen minutter.", + "check_corrupt_asset_backup_description": "Kjør denne sjekken kun over Wi-Fi og nÃĨr alle objekter har blitt lastet opp. Denne sjekken kan ta noen minutter.", "check_logs": "Sjekk Logger", "choose_matching_people_to_merge": "Velg personer som skal slÃĨs sammen", "city": "By", @@ -634,7 +629,7 @@ "client_cert_import_success_msg": "Klient sertifikat er importert", "client_cert_invalid_msg": "Ugyldig sertifikat eller feil passord", "client_cert_remove_msg": "Klient sertifikat er fjernet", - "client_cert_subtitle": "Støtter kun PKCS12 (.p12, .pfx) formater. Importering/Fjerning av sertifikater er kun mulig før innlogging.", + "client_cert_subtitle": "Støtter kun PKCS12 (.p12, .pfx) formater. Importering/Fjerning av sertifikater er kun mulig før innlogging", "client_cert_title": "SSL Klient sertifikat", "clockwise": "Med urviseren", "close": "Lukk", @@ -664,7 +659,7 @@ "control_bottom_app_bar_delete_from_local": "Slett fra enhet", "control_bottom_app_bar_edit_location": "Endre lokasjon", "control_bottom_app_bar_edit_time": "Endre Dato og tid", - "control_bottom_app_bar_share_link": "Share Link", + "control_bottom_app_bar_share_link": "Del Lenke", "control_bottom_app_bar_share_to": "Del til", "control_bottom_app_bar_trash_from_immich": "Flytt til søppelkasse", "copied_image_to_clipboard": "Bildet er kopiert til utklippstavlen.", @@ -702,13 +697,13 @@ "current_server_address": "NÃĨvÃĻrende serveradresse", "custom_locale": "Tilpasset lokalisering", "custom_locale_description": "Formater datoer og tall basert pÃĨ sprÃĨk og region", - "daily_title_text_date": "E, MMM dd", - "daily_title_text_date_year": "E, MMM dd, yyyy", + "daily_title_text_date": "E MMM. dd", + "daily_title_text_date_year": "E MMM. dddd, yyyy", "dark": "Mørk", "date_after": "Dato etter", "date_and_time": "Dato og tid", "date_before": "Dato før", - "date_format": "E, LLL d, y â€ĸ h:mm a", + "date_format": "d LLL. E y â€ĸ hh:mm", "date_of_birth_saved": "Fødselsdatoen ble lagret vellykket", "date_range": "DatoomrÃĨde", "day": "Dag", @@ -811,7 +806,7 @@ "editor_crop_tool_h2_aspect_ratios": "Sideforhold", "editor_crop_tool_h2_rotation": "Rotasjon", "email": "E-postadresse", - "empty_folder": "This folder is empty", + "empty_folder": "Denne mappen er tom", "empty_trash": "Tøm papirkurv", "empty_trash_confirmation": "Er du sikker pÃĨ at du vil tømme søppelbøtta? Dette vil slette alle filene i søppelbøtta permanent fra Immich.\nDu kan ikke angre denne handlingen!", "enable": "Aktivere", @@ -957,10 +952,10 @@ "exif_bottom_sheet_location": "PLASSERING", "exif_bottom_sheet_people": "MENNESKER", "exif_bottom_sheet_person_add_person": "Legg til navn", - "exif_bottom_sheet_person_age": "Age {}", - "exif_bottom_sheet_person_age_months": "Age {} months", - "exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months", - "exif_bottom_sheet_person_age_years": "Age {}", + "exif_bottom_sheet_person_age": "Alder {}", + "exif_bottom_sheet_person_age_months": "Alder {} mÃĨneder", + "exif_bottom_sheet_person_age_year_months": "Alder 1 ÃĨr, {} mÃĨneder", + "exif_bottom_sheet_person_age_years": "Alder {}", "exit_slideshow": "Avslutt lysbildefremvisning", "expand_all": "Utvid alle", "experimental_settings_new_asset_list_subtitle": "Under utvikling", @@ -982,7 +977,7 @@ "face_unassigned": "Ikke tilordnet", "failed": "Feilet", "failed_to_load_assets": "Feilet med ÃĨ laste fil", - "failed_to_load_folder": "Failed to load folder", + "failed_to_load_folder": "Kunne ikke laste inn mappe", "favorite": "Favoritt", "favorite_or_unfavorite_photo": "Merk som favoritt eller fjern som favoritt", "favorites": "Favoritter", @@ -999,8 +994,8 @@ "filter_places": "Filtrer steder", "find_them_fast": "Finn dem raskt ved søking av navn", "fix_incorrect_match": "Fiks feilaktig match", - "folder": "Folder", - "folder_not_found": "Folder not found", + "folder": "Mappe", + "folder_not_found": "Fant ikke mappe", "folders": "Mapper", "folders_feature_description": "Utforsker mappe visning for bilder og videoer pÃĨ fil systemet", "forward": "Fremover", @@ -1045,7 +1040,7 @@ "home_page_delete_remote_err_local": "Lokale objekter i fjernslettingsvalgene, hopper over", "home_page_favorite_err_local": "Kan ikke sette favoritt pÃĨ lokale objekter enda, hopper over", "home_page_favorite_err_partner": "Kan ikke merke partnerobjekter som favoritt enda, hopper over", - "home_page_first_time_notice": "Hvis dette er første gangen du benytter appen, velg et album (eller flere) for sikkerhetskopiering, slik at tidslinjen kan fylles med dine bilder og videoer.", + "home_page_first_time_notice": "Hvis dette er første gangen du benytter appen, velg et album (eller flere) for sikkerhetskopiering, slik at tidslinjen kan fylles med dine bilder og videoer", "home_page_share_err_local": "Kan ikke dele lokale objekter via link, hopper over", "home_page_upload_err_limit": "Maksimalt 30 objekter kan lastes opp om gangen, hopper over", "host": "Vert", @@ -1266,7 +1261,7 @@ "note_apply_storage_label_to_previously_uploaded assets": "Merk: For ÃĨ bruke lagringsetiketten pÃĨ tidligere opplastede filer, kjør", "notes": "Notater", "notification_permission_dialog_content": "For ÃĨ aktivere notifikasjoner, gÃĨ til Innstillinger og velg tillat.", - "notification_permission_list_tile_content": "Gi tilgang for ÃĨ aktivere notifikasjoner", + "notification_permission_list_tile_content": "Gi tilgang for ÃĨ aktivere notifikasjoner.", "notification_permission_list_tile_enable_button": "Aktiver notifikasjoner", "notification_permission_list_tile_title": "Notifikasjonstilgang", "notification_toggle_setting_description": "Aktiver e-postvarsler", @@ -1347,7 +1342,7 @@ "permission_onboarding_permission_denied": "Tilgang avvist. For ÃĨ bruke Immich, tillat ÃĨ vise bilde og videoer i Innstillinger.", "permission_onboarding_permission_granted": "Tilgang gitt! Du er i gang.", "permission_onboarding_permission_limited": "Begrenset tilgang. For ÃĨ la Immich sikkerhetskopiere og hÃĨndtere galleriet, tillatt bilde- og video-tilgang i Innstillinger.", - "permission_onboarding_request": "Immich trenger tilgang til ÃĨ se dine bilder og videoer", + "permission_onboarding_request": "Immich trenger tilgang til ÃĨ se dine bilder og videoer.", "person": "Person", "person_birthdate": "Født den {date}", "person_hidden": "{name}{hidden, select, true { (skjult)} other {}}", @@ -1433,7 +1428,7 @@ "recently_added": "Nylig lagt til", "recently_added_page_title": "Nylig lagt til", "recently_taken": "Nylig tatt", - "recently_taken_page_title": "Nylig tatt", + "recently_taken_page_title": "Nylig Tatt", "refresh": "Oppdater", "refresh_encoded_videos": "Oppdater kodete videoer", "refresh_faces": "Oppdater ansikter", @@ -1758,7 +1753,7 @@ "theme_selection_description": "Automatisk sett tema til lys eller mørk basert pÃĨ nettleserens systeminnstilling", "theme_setting_asset_list_storage_indicator_title": "Vis lagringsindiaktor pÃĨ objekter i fotorutenettet", "theme_setting_asset_list_tiles_per_row_title": "Antall objekter per rad ({})", - "theme_setting_colorful_interface_subtitle": "Angi primÃĻrfarge til bakgrunner", + "theme_setting_colorful_interface_subtitle": "Angi primÃĻrfarge til bakgrunner.", "theme_setting_colorful_interface_title": "Fargefullt grensesnitt", "theme_setting_image_viewer_quality_subtitle": "Juster kvaliteten pÃĨ bilder i detaljvisning", "theme_setting_image_viewer_quality_title": "Kvalitet pÃĨ bildevisning", @@ -1891,7 +1886,7 @@ "week": "Uke", "welcome": "Velkommen", "welcome_to_immich": "Velkommen til Immich", - "wifi_name": "Wi-Fi navn", + "wifi_name": "Wi-Fi Navn", "year": "År", "years_ago": "{years, plural, one {# ÃĨr} other {# ÃĨr}} siden", "yes": "Ja", diff --git a/i18n/nl.json b/i18n/nl.json index 99fb554d5a..8a8f82cf33 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Automatisch registreren", "oauth_auto_register_description": "Nieuwe gebruikers automatisch registreren na inloggen met OAuth", "oauth_button_text": "Button tekst", - "oauth_client_id": "Client ID", - "oauth_client_secret": "Client secret", "oauth_enable_description": "Inloggen met OAuth", - "oauth_issuer_url": "Uitgever URL", "oauth_mobile_redirect_uri": "Omleidings URI voor mobiel", "oauth_mobile_redirect_uri_override": "Omleidings URI voor mobiele app overschrijven", "oauth_mobile_redirect_uri_override_description": "Inschakelen wanneer de OAuth-provider geen mobiele URI toestaat, zoals '{callback}'", - "oauth_profile_signing_algorithm": "Algoritme voor profielondertekening", - "oauth_profile_signing_algorithm_description": "Algoritme voor het ondertekenen van het gebruikersprofiel.", - "oauth_scope": "Scope", "oauth_settings": "OAuth", "oauth_settings_description": "Beheer OAuth inloginstellingen", "oauth_settings_more_details": "Raadpleeg de documentatie voor meer informatie over deze functie.", - "oauth_signing_algorithm": "Signing algoritme", "oauth_storage_label_claim": "Claim voor opslaglabel", "oauth_storage_label_claim_description": "Stel het opslaglabel van de gebruiker automatisch in op de waarde van deze claim.", "oauth_storage_quota_claim": "Claim voor opslaglimiet", diff --git a/i18n/nn.json b/i18n/nn.json index 5fd9caa232..cb4fcdfc16 100644 --- a/i18n/nn.json +++ b/i18n/nn.json @@ -14,6 +14,7 @@ "add_a_location": "Legg til ein stad", "add_a_name": "Legg til eit namn", "add_a_title": "Legg til ein tittel", + "add_endpoint": "Legg til endepunkt", "add_exclusion_pattern": "Legg til unnlatingsmønster", "add_import_path": "Legg til sti for importering", "add_location": "Legg til stad", @@ -23,6 +24,8 @@ "add_photos": "Legg til bilete", "add_to": "Legg tilâ€Ļ", "add_to_album": "Legg til album", + "add_to_album_bottom_sheet_added": "Lagt til i {album}", + "add_to_album_bottom_sheet_already_exists": "Allereie i {album}", "add_to_shared_album": "Legg til delt album", "add_url": "Legg til URL", "added_to_archive": "Lagt til arkiv", @@ -36,12 +39,13 @@ "authentication_settings_disable_all": "Er du sikker at du ynskjer ÃĨ gjera alle innloggingsmetodar uverksame? Innlogging vil bli heilt uverksam.", "authentication_settings_reenable": "For ÃĨ aktivere pÃĨ nytt, bruk ein Server Command.", "background_task_job": "Bakgrunnsjobbar", - "backup_database": "Sikkerheistkopier database", - "backup_database_enable_description": "Aktiver sikkerheitskopiering av database", - "backup_keep_last_amount": "Antal sikkerheitskopiar ÃĨ behalde", - "backup_settings": "Sikkerheitskopi-innstillingar", - "backup_settings_description": "Handsam innstillingar for sikkerheitskopiering av database", + "backup_database": "Lag tryggingskopi av database", + "backup_database_enable_description": "Aktiver tryggingskopiering av database", + "backup_keep_last_amount": "Antal tryggingskopiar ÃĨ behalde", + "backup_settings": "Tryggingskopi-innstillingar", + "backup_settings_description": "Handter innstillingar for tryggingskopiering av database. Merk: Desse jobbane vert ikkje overvaka, og du fÃĨr inga varsling ved feil.", "check_all": "Sjekk alle", + "cleanup": "Opprydding", "cleared_jobs": "Rydda jobbar for: {job}", "config_set_by_file": "Oppsettet blir sett av ei oppsettfil", "confirm_delete_library": "Er du sikker at du vil slette biblioteket {library}?", diff --git a/i18n/pl.json b/i18n/pl.json index eb48a69e51..f45865e89d 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -39,11 +39,11 @@ "authentication_settings_disable_all": "Czy jesteś pewny, Åŧe chcesz wyłączyć wszystkie metody logowania? Logowanie będzie całkowicie wyłączone.", "authentication_settings_reenable": "Aby ponownie włączyć, uÅŧyj Polecenia serwera.", "background_task_job": "Zadania w Tle", - "backup_database": "Kopia zapasowa bazy danych", - "backup_database_enable_description": "Włącz kopię zapasową bazy danych", - "backup_keep_last_amount": "Ile poprzednich kopii zapasowych przechowywać", - "backup_settings": "Ustawienia kopii zapasowej", - "backup_settings_description": "Zarządzaj ustawieniami kopii zapasowej bazy danych", + "backup_database": "UtwÃŗrz Zrzut Bazy Danych", + "backup_database_enable_description": "Włącz zrzuty bazy danych", + "backup_keep_last_amount": "Ile poprzednich zrzutÃŗw przechowywać", + "backup_settings": "Ustawienia zrzutu bazy danych", + "backup_settings_description": "Zarządzanie ustawieniami zrzutu bazy danych. Uwaga: Te zadania nie są monitorowane i nie otrzymasz powiadomienia o niepowodzeniu.", "check_all": "Zaznacz Wszystko", "cleanup": "Czyszczenie", "cleared_jobs": "Usunięto zadania dla: {job}", @@ -192,26 +192,22 @@ "oauth_auto_register": "Automatyczna rejestracja", "oauth_auto_register_description": "Automatycznie rejestruj nowych uÅŧytkownikÃŗw po zalogowaniu się za pomocą protokołu OAuth", "oauth_button_text": "Tekst na przycisku", - "oauth_client_id": "Client ID", - "oauth_client_secret": "Sekret klienta", + "oauth_client_secret_description": "Wymagane jeÅŧeli PKCE (Proof Key for Code Exchange) nie jest wspierane przez dostawcę OAuth", "oauth_enable_description": "Loguj się za pomocą OAuth", - "oauth_issuer_url": "Adres URL wydawcy", "oauth_mobile_redirect_uri": "Mobilny adres zwrotny", "oauth_mobile_redirect_uri_override": "Zapasowy URI przekierowania mobilnego", "oauth_mobile_redirect_uri_override_description": "Włącz, gdy dostawca OAuth nie pozwala na mobilne identyfikatory URI typu '{callback}'", - "oauth_profile_signing_algorithm": "Algorytm logowania do profilu", - "oauth_profile_signing_algorithm_description": "Algorytm uÅŧywany podczas logowania do profilu uÅŧytkownika.", - "oauth_scope": "Zakres", "oauth_settings": "OAuth", "oauth_settings_description": "Zarządzaj ustawieniami logowania OAuth", "oauth_settings_more_details": "Więcej informacji o tej funkcji znajdziesz w dokumentacji.", - "oauth_signing_algorithm": "Algorytm podpisywania", "oauth_storage_label_claim": "Roszczenie dotyczące etykiety przechowywania", "oauth_storage_label_claim_description": "Automatycznie ustaw etykietę przechowywania uÅŧytkownika na podaną niÅŧej wartość.", "oauth_storage_quota_claim": "Ilość miejsca w magazynie", "oauth_storage_quota_claim_description": "Automatycznie ustaw ilość miejsca w magazynie na podaną niÅŧej wartość.", "oauth_storage_quota_default": "Domyślna ilość miejsca w magazynie (GiB)", "oauth_storage_quota_default_description": "Limit w GiB do wykorzystania, gdy nie podano Åŧadnej wartości (wpisz 0, aby wyłączyć limit).", + "oauth_timeout": "Upłynął czas Åŧądania", + "oauth_timeout_description": "Limit czasu Åŧądania (w milisekundach)", "offline_paths": "ŚcieÅŧki Offline", "offline_paths_description": "Wyniki te mogą wynikać z ręcznego usunięcia plikÃŗw, ktÃŗre nie są częścią biblioteki zewnętrznej.", "password_enable_description": "Zaloguj uÅŧywając e-mail i hasła", @@ -371,13 +367,17 @@ "admin_password": "Hasło Administratora", "administration": "Administracja", "advanced": "Zaawansowane", - "advanced_settings_log_level_title": "Poziom dziennika: {}", + "advanced_settings_enable_alternate_media_filter_subtitle": "UÅŧyj tej opcji do filtrowania mediÃŗw podczas synchronizacji alternatywnych kryteriÃŗw. UÅŧywaj tylko wtedy gdy aplikacja ma problemy z wykrywaniem wszystkich albumÃŗw.", + "advanced_settings_enable_alternate_media_filter_title": "[EKSPERYMENTALNE] UÅŧyj alternatywnego filtra synchronizacji albumu", + "advanced_settings_log_level_title": "Poziom szczegÃŗÅ‚owości dziennika: {name}", "advanced_settings_prefer_remote_subtitle": "NiektÃŗre urządzenia bardzo wolno ładują miniatury z zasobÃŗw na urządzeniu. Aktywuj to ustawienie, aby ładować zdalne obrazy.", "advanced_settings_prefer_remote_title": "Preferuj obrazy zdalne", "advanced_settings_proxy_headers_subtitle": "Zdefiniuj nagÅ‚Ãŗwki proxy, ktÃŗre Immich powinien wysyłać z kaÅŧdym Åŧądaniem sieciowym", "advanced_settings_proxy_headers_title": "NagÅ‚Ãŗwki proxy", "advanced_settings_self_signed_ssl_subtitle": "Pomija weryfikację certyfikatu SSL dla punktu końcowego serwera. Wymagane w przypadku certyfikatÃŗw z podpisem własnym.", "advanced_settings_self_signed_ssl_title": "Zezwalaj na certyfikaty SSL z podpisem własnym", + "advanced_settings_sync_remote_deletions_subtitle": "Automatycznie usuń lub przywrÃŗÄ‡ zasÃŗb na tym urządzeniu po wykonaniu tej czynności w interfejsie webowym", + "advanced_settings_sync_remote_deletions_title": "Synchronizuj zdalne usunięcia [EKSPERYMENTALNE]", "advanced_settings_tile_subtitle": "Zaawansowane ustawienia uÅŧytkownika", "advanced_settings_troubleshooting_subtitle": "Włącz dodatkowe funkcje rozwiązywania problemÃŗw", "advanced_settings_troubleshooting_title": "Rozwiązywanie problemÃŗw", @@ -400,9 +400,9 @@ "album_remove_user_confirmation": "Na pewno chcesz usunąć {user}?", "album_share_no_users": "Wygląda na to, Åŧe ten album albo udostępniono wszystkim uÅŧytkownikom, albo nie ma komu go udostępnić.", "album_thumbnail_card_item": "1 pozycja", - "album_thumbnail_card_items": "{} pozycje", - "album_thumbnail_card_shared": "Udostępniony", - "album_thumbnail_shared_by": "Udostępnione przez {}", + "album_thumbnail_card_items": "{album_thumbnail_card_items} pozycje", + "album_thumbnail_card_shared": " ¡ Udostępniony", + "album_thumbnail_shared_by": "Udostępnione przez {album_thumbnail_shared_by}", "album_updated": "Album zaktualizowany", "album_updated_setting_description": "Otrzymaj powiadomienie e-mail, gdy do udostępnionego Ci albumu zostaną dodane nowe zasoby", "album_user_left": "Opuszczono {album}", @@ -440,7 +440,7 @@ "archive": "Archiwum", "archive_or_unarchive_photo": "Dodaj lub usuń zasÃŗb z archiwum", "archive_page_no_archived_assets": "Nie znaleziono zarchiwizowanych zasobÃŗw", - "archive_page_title": "Archiwum ({})", + "archive_page_title": "Archiwum ({archive_page_title})", "archive_size": "Rozmiar archiwum", "archive_size_description": "Podziel pobierane pliki na więcej niÅŧ jedno archiwum, jeÅŧeli rozmiar archiwum przekroczy tę wartość w GiB", "archived": "Zarchiwizowane", @@ -473,22 +473,22 @@ "asset_viewer_settings_subtitle": "Zarządzaj ustawieniami przeglądarki galerii", "asset_viewer_settings_title": "Przeglądarka zasobÃŗw", "assets": "Zasoby", - "assets_added_count": "Dodano {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}}", - "assets_added_to_album_count": "Dodano {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}} do albumu", - "assets_added_to_name_count": "Dodano {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}} do {hasName, select, true {{name}} other {new album}}", - "assets_count": "{count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}}", - "assets_deleted_permanently": "{} zasoby trwale usunięto", - "assets_deleted_permanently_from_server": "{} zasoby zostały trwale usunięte z serwera Immich", - "assets_moved_to_trash_count": "Przeniesiono {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}} do kosza", - "assets_permanently_deleted_count": "Trwale usunięto {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}}", - "assets_removed_count": "Usunięto {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}}", - "assets_removed_permanently_from_device": "{} zasoby zostały trwale usunięte z Twojego urządzenia", + "assets_added_count": "Dodano {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}}", + "assets_added_to_album_count": "Dodano {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}} do albumu", + "assets_added_to_name_count": "Dodano {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}} do {hasName, select, true {{name}} other {new album}}", + "assets_count": "{count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}}", + "assets_deleted_permanently": "{count, plural, one {# zasÃŗb został trwale usunięty} few {# zasoby zostały trwale usunięte} other {# zasobÃŗw zostało trwale usuniętych}}", + "assets_deleted_permanently_from_server": "{count, plural, one {# zasÃŗb został trwale usunięty} few {# zasoby zostały trwale usunięte} other {# zasobÃŗw zostało trwale usuniętych}} z serwera Immich", + "assets_moved_to_trash_count": "Przeniesiono {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}} do kosza", + "assets_permanently_deleted_count": "Trwale usunięto {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}}", + "assets_removed_count": "Usunięto {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}}", + "assets_removed_permanently_from_device": "{count, plural, one {# zasÃŗb został trwale usunięty} few {# zasoby zostały trwale usunięte} other {# zasobÃŗw zostało trwale usuniętych}} z Twojego urządzenia", "assets_restore_confirmation": "Na pewno chcesz przywrÃŗcić wszystkie zasoby z kosza? Nie da się tego cofnąć! NaleÅŧy pamiętać, Åŧe w ten sposÃŗb nie moÅŧna przywrÃŗcić zasobÃŗw offline.", - "assets_restored_count": "PrzywrÃŗcono {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}}", - "assets_restored_successfully": "{} zasoby pomyślnie przywrÃŗcono", - "assets_trashed": "{} zasoby zostały usunięte", - "assets_trashed_count": "Wrzucono do kosza {count, plural, one {# zasÃŗb} few {# zasoby} many {# zasobÃŗw} other {# zasobÃŗw}}", - "assets_trashed_from_server": "{} zasoby usunięte z serwera Immich", + "assets_restored_count": "PrzywrÃŗcono {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}}", + "assets_restored_successfully": "{count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}} pomyślnie przywrÃŗcono", + "assets_trashed": "{count, plural, one {# zasÃŗb został wrzucony} few {# zasoby zostały wrzucone} other {# zasobÃŗw zostało wrzucone}} do kosza", + "assets_trashed_count": "Wrzucono do kosza {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}}", + "assets_trashed_from_server": "{count, plural, one {# zasÃŗb usunięty} few {# zasoby usunięte} other {# zasobÃŗw usuniętych}} z serwera Immich", "assets_were_part_of_album_count": "{count, plural, one {ZasÃŗb był} few {Zasoby były} many {ZasobÃŗw było} other {ZasobÃŗw było}} juÅŧ częścią albumu", "authorized_devices": "UpowaÅŧnione Urządzenia", "automatic_endpoint_switching_subtitle": "Połącz się lokalnie przez wyznaczoną sieć Wi-Fi, jeśli jest dostępna, i korzystaj z alternatywnych połączeń gdzie indziej", @@ -497,21 +497,21 @@ "back_close_deselect": "WrÃŗÄ‡, zamknij lub odznacz", "background_location_permission": "Uprawnienia do lokalizacji w tle", "background_location_permission_content": "Aby mÃŗc przełączać sieć podczas pracy w tle, Immich musi *zawsze* mieć dostęp do dokładnej lokalizacji, aby aplikacja mogła odczytać nazwę sieci Wi-Fi", - "backup_album_selection_page_albums_device": "Albumy na urządzeniu ({})", + "backup_album_selection_page_albums_device": "Albumy na urządzeniu ({number})", "backup_album_selection_page_albums_tap": "Stuknij, aby włączyć, stuknij dwukrotnie, aby wykluczyć", "backup_album_selection_page_assets_scatter": "Pliki mogą być rozproszone w wielu albumach. Dzięki temu albumy mogą być włączane lub wyłączane podczas procesu tworzenia kopii zapasowej.", "backup_album_selection_page_select_albums": "Zaznacz albumy", "backup_album_selection_page_selection_info": "Info o wyborze", "backup_album_selection_page_total_assets": "Łącznie unikalnych plikÃŗw", "backup_all": "Wszystkie", - "backup_background_service_backup_failed_message": "Nie udało się wykonać kopii zapasowej zasobÃŗw. PrÃŗbuję ponownie...", - "backup_background_service_connection_failed_message": "Nie udało się połączyć z serwerem. PrÃŗbuję ponownie...", - "backup_background_service_current_upload_notification": "Wysyłanie {}", - "backup_background_service_default_notification": "Sprawdzanie nowych zasobÃŗw...", + "backup_background_service_backup_failed_message": "Nie udało się wykonać kopii zapasowej zasobÃŗw. Ponowna prÃŗbaâ€Ļ", + "backup_background_service_connection_failed_message": "Nie udało się połączyć z serwerem. Ponowna prÃŗbaâ€Ļ", + "backup_background_service_current_upload_notification": "Wysyłanie {backup_background_service_current_upload_notification}", + "backup_background_service_default_notification": "Sprawdzanie nowych zasobÃŗwâ€Ļ", "backup_background_service_error_title": "Błąd kopii zapasowej", - "backup_background_service_in_progress_notification": "Tworzę kopię twoich zasobÃŗw...", - "backup_background_service_upload_failure_notification": "Nie udało się przesłać {}", - "backup_controller_page_albums": "Backup AlbumÃŗw", + "backup_background_service_in_progress_notification": "Tworzenie kopii zapasowej twoich zasobÃŗwâ€Ļ", + "backup_background_service_upload_failure_notification": "Błąd przesyłania {backup_background_service_upload_failure_notification}", + "backup_controller_page_albums": "Kopia Zapasowa albumÃŗw", "backup_controller_page_background_app_refresh_disabled_content": "Włącz odświeÅŧanie aplikacji w tle w Ustawienia > OgÃŗlne > OdświeÅŧanie aplikacji w tle, aby mÃŗc korzystać z kopii zapasowej w tle.", "backup_controller_page_background_app_refresh_disabled_title": "OdświeÅŧanie aplikacji w tle wyłączone", "backup_controller_page_background_app_refresh_enable_button_text": "PrzejdÅē do ustawień", @@ -521,21 +521,21 @@ "backup_controller_page_background_battery_info_title": "Optymalizacja Baterii", "backup_controller_page_background_charging": "Tylko podczas ładowania", "backup_controller_page_background_configure_error": "Nie udało się skonfigurować usługi w tle", - "backup_controller_page_background_delay": "OpÃŗÅēnij tworzenie kopii zapasowych nowych zasobÃŗw: {}", + "backup_controller_page_background_delay": "OpÃŗÅēnienie tworzenia kopii zapasowych nowych zasobÃŗw: {backup_controller_page_background_delay}", "backup_controller_page_background_description": "Włącz usługę w tle, aby automatycznie tworzyć kopie zapasowe wszelkich nowych zasobÃŗw bez konieczności otwierania aplikacji", "backup_controller_page_background_is_off": "Automatyczna kopia zapasowa w tle jest wyłączona", "backup_controller_page_background_is_on": "Automatyczna kopia zapasowa w tle jest włączona", "backup_controller_page_background_turn_off": "Wyłącz usługę w tle", "backup_controller_page_background_turn_on": "Włącz usługę w tle", - "backup_controller_page_background_wifi": "Tylko na WiFi", + "backup_controller_page_background_wifi": "Tylko Wi-Fi", "backup_controller_page_backup": "Kopia Zapasowa", "backup_controller_page_backup_selected": "Zaznaczone: ", "backup_controller_page_backup_sub": "Tworzenie kopii zapasowych zdjęć i filmÃŗw", - "backup_controller_page_created": "Utworzony na: {}", + "backup_controller_page_created": "Utworzono dnia: {backup_controller_page_created}", "backup_controller_page_desc_backup": "Włącz kopię zapasową, aby automatycznie przesyłać nowe zasoby na serwer.", "backup_controller_page_excluded": "Wykluczone: ", - "backup_controller_page_failed": "Nieudane ({})", - "backup_controller_page_filename": "Nazwa pliku: {} [{}]", + "backup_controller_page_failed": "Nieudane ({backup_controller_page_failed})", + "backup_controller_page_filename": "Nazwa pliku: {backup_controller_page_filename} [{backup_controller_page_filename}]", "backup_controller_page_id": "ID: {}", "backup_controller_page_info": "Informacje o kopii zapasowej", "backup_controller_page_none_selected": "Brak wybranych", @@ -545,13 +545,13 @@ "backup_controller_page_start_backup": "Rozpocznij Kopię Zapasową", "backup_controller_page_status_off": "Kopia Zapasowa jest wyłaczona", "backup_controller_page_status_on": "Kopia Zapasowa jest włączona", - "backup_controller_page_storage_format": "{} z {} wykorzystanych", - "backup_controller_page_to_backup": "Albumy do backupu", + "backup_controller_page_storage_format": "{used} z {available} wykorzystanych", + "backup_controller_page_to_backup": "Albumy z Kopią Zapasową", "backup_controller_page_total_sub": "Wszystkie unikalne zdjęcia i filmy z wybranych albumÃŗw", "backup_controller_page_turn_off": "Wyłącz Kopię Zapasową", "backup_controller_page_turn_on": "Włącz Kopię Zapasową", "backup_controller_page_uploading_file_info": "Przesyłanie informacji o pliku", - "backup_err_only_album": "Nie moÅŧna usunąć tylko i wyłącznie albumu", + "backup_err_only_album": "Nie moÅŧna usunąć jedynego albumu", "backup_info_card_assets": "zasoby", "backup_manual_cancelled": "Anulowano", "backup_manual_in_progress": "Przesyłanie juÅŧ trwa. SprÃŗbuj po pewnym czasie", @@ -566,17 +566,17 @@ "bugs_and_feature_requests": "Błędy i prośby o funkcje", "build": "Kompilacja", "build_image": "Obraz Buildu", - "bulk_delete_duplicates_confirmation": "Czy na pewno chcesz trwale usunąć {count, plural, one {# zduplikowany zasÃŗb} few {# zduplikowane zasoby} many {# zduplikowanych zasobÃŗw} other {# zduplikowanych zasobÃŗw}}? Zostanie zachowany największy zasÃŗb z kaÅŧdej grupy, a wszystkie pozostałe duplikaty zostaną trwale usunięte. Nie moÅŧna cofnąć tej operacji!", - "bulk_keep_duplicates_confirmation": "Czy na pewno chcesz zachować {count, plural, one {# zduplikowany zasÃŗb} few {# zduplikowane zasoby} many {# zduplikowanych zasobÃŗw} other {# zduplikowanych zasobÃŗw}}? To spowoduje rozwiązanie wszystkich grup duplikatÃŗw bez usuwania czegokolwiek.", - "bulk_trash_duplicates_confirmation": "Czy na pewno chcesz wrzucić do kosza {count, plural, one {# zduplikowany zasÃŗb} few {# zduplikowane zasoby} many {# zduplikowanych zasobÃŗw} other {# zduplikowanych zasobÃŗw}}? Zostanie zachowany największy zasÃŗb z kaÅŧdej grupy, a wszystkie pozostałe duplikaty zostaną wrzucone do kosza.", + "bulk_delete_duplicates_confirmation": "Czy na pewno chcesz trwale usunąć {count, plural, one {# zduplikowany zasÃŗb} few {# zduplikowane zasoby} other {# zduplikowanych zasobÃŗw}}? Zostanie zachowany największy zasÃŗb z kaÅŧdej grupy, a wszystkie pozostałe duplikaty zostaną trwale usunięte. Nie moÅŧna cofnąć tej operacji!", + "bulk_keep_duplicates_confirmation": "Czy na pewno chcesz zachować {count, plural, one {# zduplikowany zasÃŗb} few {# zduplikowane zasoby} other {# zduplikowanych zasobÃŗw}}? To spowoduje rozwiązanie wszystkich grup duplikatÃŗw bez usuwania czegokolwiek.", + "bulk_trash_duplicates_confirmation": "Czy na pewno chcesz wrzucić do kosza {count, plural, one {# zduplikowany zasÃŗb} few {# zduplikowane zasoby} other {# zduplikowanych zasobÃŗw}}? Zostanie zachowany największy zasÃŗb z kaÅŧdej grupy, a wszystkie pozostałe duplikaty zostaną wrzucone do kosza.", "buy": "Kup Immich", - "cache_settings_album_thumbnails": "Miniatury stron bibliotek ({} zasobÃŗw)", + "cache_settings_album_thumbnails": "Miniatury na stronie biblioteki ({count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}})", "cache_settings_clear_cache_button": "Wyczyść Cache", "cache_settings_clear_cache_button_title": "Czyści pamięć podręczną aplikacji. Wpłynie to znacząco na wydajność aplikacji, dopÃŗki pamięć podręczna nie zostanie odbudowana.", "cache_settings_duplicated_assets_clear_button": "WYCZYŚĆ", "cache_settings_duplicated_assets_subtitle": "Zdjęcia i filmy umieszczone na czarnej liście aplikacji", - "cache_settings_duplicated_assets_title": "Zduplikowane zasoby ({})", - "cache_settings_image_cache_size": "Rozmiar pamięci podręcznej obrazÃŗw ({} zasobÃŗw)", + "cache_settings_duplicated_assets_title": "Zduplikowane zasoby ({number})", + "cache_settings_image_cache_size": "Rozmiar pamięci podręcznej obrazÃŗw ({count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}})", "cache_settings_statistics_album": "Biblioteka miniatur", "cache_settings_statistics_assets": "{} zasoby ({})", "cache_settings_statistics_full": "Pełne Zdjęcia", @@ -584,7 +584,7 @@ "cache_settings_statistics_thumbnail": "Miniatury", "cache_settings_statistics_title": "UÅŧycie Cache", "cache_settings_subtitle": "Kontrolowanie zachowania buforowania aplikacji mobilnej Immich", - "cache_settings_thumbnail_size": "Rozmiar pamięci podręcznej miniatur ({} zasobÃŗw)", + "cache_settings_thumbnail_size": "Rozmiar pamięci podręcznej miniatur ({count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}})", "cache_settings_tile_subtitle": "Kontroluj zachowanie lokalnego magazynu", "cache_settings_tile_title": "Lokalny magazyn", "cache_settings_title": "Ustawienia Buforowania", @@ -654,13 +654,13 @@ "contain": "Zawiera", "context": "Kontekst", "continue": "Kontynuuj", - "control_bottom_app_bar_album_info_shared": "{} pozycji ¡ Udostępnionych", + "control_bottom_app_bar_album_info_shared": "{count, plural, one {# element ¡ Udostępniony} few {# elementy ¡ Udostępnione} other {# elementÃŗw ¡ Udostępnionych}}", "control_bottom_app_bar_create_new_album": "UtwÃŗrz nowy album", "control_bottom_app_bar_delete_from_immich": "Usuń z Immicha", "control_bottom_app_bar_delete_from_local": "Usuń z urządzenia", "control_bottom_app_bar_edit_location": "Edytuj lokalizację", "control_bottom_app_bar_edit_time": "Edytuj datę i godzinę", - "control_bottom_app_bar_share_link": "Share Link", + "control_bottom_app_bar_share_link": "Udostępnij link", "control_bottom_app_bar_share_to": "Wyślij", "control_bottom_app_bar_trash_from_immich": "Przenieść do kosza", "copied_image_to_clipboard": "Skopiowano obraz do schowka.", @@ -698,13 +698,13 @@ "current_server_address": "Aktualny adres serwera", "custom_locale": "Niestandardowy Region", "custom_locale_description": "Formatuj daty i liczby na podstawie języka i regionu", - "daily_title_text_date": "E, MMM dd", - "daily_title_text_date_year": "E, MMM dd, yyyy", + "daily_title_text_date": "E, dd MMM", + "daily_title_text_date_year": "E, dd MMM, yyyy", "dark": "Ciemny", "date_after": "Data po", "date_and_time": "Data i godzina", "date_before": "Data przed", - "date_format": "E, LLL d, y â€ĸ h:mm a", + "date_format": "E d. LLL y â€ĸ hh:mm", "date_of_birth_saved": "Data urodzenia zapisana pomyślnie", "date_range": "Zakres dat", "day": "Dzień", @@ -807,14 +807,14 @@ "editor_crop_tool_h2_aspect_ratios": "Proporcje obrazu", "editor_crop_tool_h2_rotation": "ObrÃŗt", "email": "E-mail", - "empty_folder": "This folder is empty", + "empty_folder": "Ten folder jest pusty", "empty_trash": "OprÃŗÅŧnij kosz", "empty_trash_confirmation": "Czy na pewno chcesz oprÃŗÅŧnić kosz? Spowoduje to trwałe usunięcie wszystkich zasobÃŗw znajdujących się w koszu z Immich.\nNie moÅŧna cofnąć tej operacji!", "enable": "Włącz", "enabled": "Włączone", "end_date": "Do dnia", "enqueued": "Kolejka", - "enter_wifi_name": "WprowadÅē nazwę Wi-Fi", + "enter_wifi_name": "WprowadÅē nazwę punktu dostępu Wi-Fi", "error": "Błąd", "error_change_sort_album": "Nie udało się zmienić kolejności sortowania albumÃŗw", "error_delete_face": "Wystąpił błąd podczas usuwania twarzy z zasobÃŗw", @@ -849,10 +849,12 @@ "failed_to_keep_this_delete_others": "Nie udało się zachować tego zasobu i usunąć innych zasobÃŗw", "failed_to_load_asset": "Nie udało się załadować zasobu", "failed_to_load_assets": "Nie udało się załadować zasobÃŗw", + "failed_to_load_notifications": "Błąd ładowania powiadomień", "failed_to_load_people": "Błąd pobierania ludzi", "failed_to_remove_product_key": "Nie udało się usunąć klucza produktu", "failed_to_stack_assets": "Nie udało się zestawić zasobÃŗw", "failed_to_unstack_assets": "Nie udało się rozdzielić zasobÃŗw", + "failed_to_update_notification_status": "Błąd aktualizacji statusu powiadomienia", "import_path_already_exists": "Ta ścieÅŧka importu juÅŧ istnieje.", "incorrect_email_or_password": "Nieprawidłowy e-mail lub hasło", "paths_validation_failed": "{paths, plural, one {# ścieÅŧka} few {# ścieÅŧki} other {# ścieÅŧek}}", @@ -953,10 +955,10 @@ "exif_bottom_sheet_location": "LOKALIZACJA", "exif_bottom_sheet_people": "LUDZIE", "exif_bottom_sheet_person_add_person": "Dodaj nazwę", - "exif_bottom_sheet_person_age": "Age {}", - "exif_bottom_sheet_person_age_months": "Age {} months", - "exif_bottom_sheet_person_age_year_months": "Age 1 year, {} months", - "exif_bottom_sheet_person_age_years": "Age {}", + "exif_bottom_sheet_person_age": "Wiek {count, plural, one {# rok} few {# lata} other {# lat}}", + "exif_bottom_sheet_person_age_months": "Wiek {months, plural, one {# miesiąc} few {# miesiące} other {# miesięcy}}", + "exif_bottom_sheet_person_age_year_months": "Wiek 1 rok, {months, plural, one {# miesiąc} few {# miesiące} other {# miesięcy}}", + "exif_bottom_sheet_person_age_years": "Wiek {years, plural, one {# rok} few {# lata} other {# lat}}", "exit_slideshow": "Zamknij Pokaz SlajdÃŗw", "expand_all": "Rozwiń wszystko", "experimental_settings_new_asset_list_subtitle": "Praca w toku", @@ -974,16 +976,16 @@ "external": "Zewnętrzny", "external_libraries": "Biblioteki Zewnętrzne", "external_network": "Sieć zewnętrzna", - "external_network_sheet_info": "Jeśli nie korzystasz z preferowanej sieci Wi-Fi, aplikacja połączy się z serwerem za pośrednictwem pierwszego z poniÅŧszych adresÃŗw URL, do ktÃŗrego moÅŧe dotrzeć, zaczynając od gÃŗry do dołu", + "external_network_sheet_info": "Jeśli nie korzystasz z preferowanej sieci Wi-Fi aplikacja połączy się z serwerem za pośrednictwem pierwszego z dostępnych poniÅŧej adresÃŗw URL, zaczynając od gÃŗry do dołu", "face_unassigned": "Nieprzypisany", "failed": "Niepowodzenie", "failed_to_load_assets": "Nie udało się załadować zasobÃŗw", - "failed_to_load_folder": "Failed to load folder", + "failed_to_load_folder": "Nie udało się załadować folderu", "favorite": "Ulubione", "favorite_or_unfavorite_photo": "Dodaj lub usuń z ulubionych", "favorites": "Ulubione", "favorites_page_no_favorites": "Nie znaleziono ulubionych zasobÃŗw", - "feature_photo_updated": "Pomyślnie zmieniono gÅ‚Ãŗwne zdjęcie", + "feature_photo_updated": "Zdjęcie gÅ‚Ãŗwne zaktualizowane pomyślnie", "features": "Funkcje", "features_setting_description": "Zarządzaj funkcjami aplikacji", "file_name": "Nazwa pliku", @@ -992,10 +994,11 @@ "filetype": "Typ pliku", "filter": "Filtr", "filter_people": "Szukaj osoby", + "filter_places": "Filtruj miejsca", "find_them_fast": "Wyszukuj szybciej przypisując nazwę", "fix_incorrect_match": "Napraw nieprawidłowe dopasowanie", "folder": "Folder", - "folder_not_found": "Folder not found", + "folder_not_found": "Nie znaleziono folderu", "folders": "Foldery", "folders_feature_description": "Przeglądanie zdjęć i filmÃŗw w widoku folderÃŗw", "forward": "Do przodu", @@ -1037,15 +1040,15 @@ "home_page_archive_err_partner": "Nie moÅŧna zarchiwizować zasobÃŗw partnera, pomijam", "home_page_building_timeline": "Budowanie osi czasu", "home_page_delete_err_partner": "Nie moÅŧna usunąć zasobÃŗw partnera, pomijam", - "home_page_delete_remote_err_local": "Local assets in delete remote selection, skipping", - "home_page_favorite_err_local": "Nie moÅŧna dodać do ulubionych lokalnych zasobÃŗw, pomijam", + "home_page_delete_remote_err_local": "Lokalne zasoby w wyborze do zdalnego usunięcia, pomijam", + "home_page_favorite_err_local": "Nie moÅŧna jeszcze dodać do ulubionych lokalnych zasobÃŗw, pomijam", "home_page_favorite_err_partner": "Nie moÅŧna jeszcze dodać do ulubionych zasobÃŗw partnera, pomijam", - "home_page_first_time_notice": "Jeśli korzystasz z aplikacji po raz pierwszy, pamiętaj o wybraniu albumÃŗw zapasowych, aby oś czasu mogła zapełnić zdjęcia i filmy w albumach.", + "home_page_first_time_notice": "Jeśli korzystasz z aplikacji po raz pierwszy, pamiętaj o wybraniu albumÃŗw do kopii zapasowej, aby oś czasu mogła wypełnić się zdjęciami i filmami", "home_page_share_err_local": "Nie moÅŧna udostępniać zasobÃŗw lokalnych za pośrednictwem linku, pomijajam", "home_page_upload_err_limit": "MoÅŧna przesłać maksymalnie 30 zasobÃŗw jednocześnie, pomijanie", "host": "Host", "hour": "Godzina", - "ignore_icloud_photos": "Ignoruj ​​zdjęcia w iCloud", + "ignore_icloud_photos": "Ignoruj zdjęcia w iCloud", "ignore_icloud_photos_description": "Zdjęcia przechowywane w usłudze iCloud nie zostaną przesłane na serwer Immich", "image": "Zdjęcie", "image_alt_text_date": "{isVideo, select, true {Wideo} other {Zdjęcie}} zrobione dnia {date}", @@ -1120,7 +1123,7 @@ "local_network": "Sieć lokalna", "local_network_sheet_info": "Aplikacja połączy się z serwerem za pośrednictwem tego adresu URL podczas korzystania z określonej sieci Wi-Fi", "location_permission": "Zezwolenie na lokalizację", - "location_permission_content": "Aby mÃŗc korzystać z funkcji automatycznego przełączania, Immich potrzebuje precyzyjnego pozwolenia na lokalizację, aby mÃŗc odczytać nazwę bieÅŧącej sieci WiFi", + "location_permission_content": "Aby mÃŗc korzystać z funkcji automatycznego przełączania, Immich potrzebuje uprawnienia do dokładnej lokalizacji, aby mÃŗc odczytać nazwę bieÅŧącej sieci Wi-Fi", "location_picker_choose_on_map": "Wybierz na mapie", "location_picker_latitude_error": "WprowadÅē prawidłową szerokość geograficzną", "location_picker_latitude_hint": "Wpisz tutaj swoją szerokość geograficzną", @@ -1144,7 +1147,7 @@ "login_form_err_trailing_whitespace": "Białe znaki po przecinku", "login_form_failed_get_oauth_server_config": "Błąd logowania przy uÅŧyciu OAuth. SprawdÅē adres URL serwera", "login_form_failed_get_oauth_server_disable": "Funkcja OAuth nie jest dostępna na tym serwerze", - "login_form_failed_login": "Błąd logowania, sprawdÅē adres url serwera, email i hasło.", + "login_form_failed_login": "Błąd logowania, sprawdÅē adres url serwera, email i hasło", "login_form_handshake_exception": "Wystąpił wyjątek uzgadniania z serwerem. Włącz obsługę certyfikatÃŗw z podpisem własnym w ustawieniach, jeśli uÅŧywasz certyfikatu z podpisem własnym.", "login_form_password_hint": "hasło", "login_form_save_login": "Pozostań zalogowany", @@ -1170,8 +1173,8 @@ "manage_your_devices": "Zarządzaj swoimi zalogowanymi urządzeniami", "manage_your_oauth_connection": "Zarządzaj swoim połączeniem OAuth", "map": "Mapa", - "map_assets_in_bound": "{} zdjęć", - "map_assets_in_bounds": "{} zdjęć", + "map_assets_in_bound": "{count, plural, one {# zdjęcie}}", + "map_assets_in_bounds": "{count, plural, one {# zdjęcie} few {# zdjęcia} other {# zdjęć}}", "map_cannot_get_user_location": "Nie moÅŧna uzyskać lokalizacji uÅŧytkownika", "map_location_dialog_yes": "Tak", "map_location_picker_page_use_location": "UÅŧyj tej lokalizacji", @@ -1185,15 +1188,18 @@ "map_settings": "Ustawienia mapy", "map_settings_dark_mode": "Tryb ciemny", "map_settings_date_range_option_day": "Ostatnie 24 godziny", - "map_settings_date_range_option_days": "Ostatnie {} dni", + "map_settings_date_range_option_days": "{count, plural, one {Poprzedni dzień} other {Minione # dni}}", "map_settings_date_range_option_year": "Poprzedni rok", - "map_settings_date_range_option_years": "Ostatnie {} lat", + "map_settings_date_range_option_years": "{count, plural, one {Poprzedni rok} few {Minione # lata} other {Minione # lat}}", "map_settings_dialog_title": "Ustawienia mapy", "map_settings_include_show_archived": "Uwzględnij zarchiwizowane", "map_settings_include_show_partners": "Uwzględnij partnerÃŗw", "map_settings_only_show_favorites": "PokaÅŧ tylko ulubione", "map_settings_theme_settings": "Motyw mapy", "map_zoom_to_see_photos": "Pomniejsz, aby zobaczyć zdjęcia", + "mark_all_as_read": "Zaznacz wszystkie jako odczytane", + "mark_as_read": "Zaznacz jako odczytane", + "marked_all_as_read": "Zaznaczono wszystkie jako przeczytane", "matches": "Powiązania", "media_type": "Typ zasobu", "memories": "Wspomnienia", @@ -1203,7 +1209,7 @@ "memories_start_over": "Zacznij od nowa", "memories_swipe_to_close": "Przesuń w gÃŗrę, aby zamknąć", "memories_year_ago": "Rok temu", - "memories_years_ago": "{} lat temu", + "memories_years_ago": "{count, plural, few {# lata temu} other {# lat temu}}", "memory": "Pamięć", "memory_lane_title": "Aleja Wspomnień {title}", "menu": "Menu", @@ -1219,7 +1225,9 @@ "model": "Model", "month": "Miesiąc", "monthly_title_text_date_format": "MMMM y", - "more": "Więcej...", + "more": "Więcej", + "moved_to_archive": "Przeniesiono {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}} do archiwum", + "moved_to_library": "Przeniesiono {count, plural, one {# zasÃŗb} few {# zasoby} other {# zasobÃŗw}} do biblioteki", "moved_to_trash": "Przeniesiono do kosza", "multiselect_grid_edit_date_time_err_read_only": "Nie moÅŧna edytować daty zasobÃŗw tylko do odczytu, pomijanie", "multiselect_grid_edit_gps_err_read_only": "Nie moÅŧna edytować lokalizacji zasobÃŗw tylko do odczytu, pomijanie", @@ -1228,7 +1236,7 @@ "name": "Nazwa", "name_or_nickname": "Nazwa lub pseudonim", "networking_settings": "Sieć", - "networking_subtitle": "Zarządzaj ustawieniami serwera końcowego ", + "networking_subtitle": "Zarządzaj ustawieniami punktu końcowego serwera", "never": "nigdy", "new_album": "Nowy album", "new_api_key": "Nowy Klucz API", @@ -1252,6 +1260,8 @@ "no_favorites_message": "Dodaj ulubione aby szybko znaleÅēć swoje najlepsze zdjęcia i filmy", "no_libraries_message": "StwÃŗrz bibliotekę zewnętrzną, aby przeglądać swoje zdjęcia i filmy", "no_name": "Brak Nazwy", + "no_notifications": "Brak powiadomień", + "no_people_found": "Brak pasujących osÃŗb", "no_places": "Brak miejsc", "no_results": "Brak wynikÃŗw", "no_results_description": "SprÃŗbuj uÅŧyć synonimu lub bardziej ogÃŗlnego słowa kluczowego", @@ -1282,6 +1292,7 @@ "onboarding_welcome_user": "Witaj, {user}", "online": "Połączony", "only_favorites": "Tylko ulubione", + "open": "OtwÃŗrz", "open_in_map_view": "OtwÃŗrz w widoku mapy", "open_in_openstreetmap": "OtwÃŗrz w OpenStreetMap", "open_the_search_filters": "OtwÃŗrz filtry wyszukiwania", @@ -1300,12 +1311,12 @@ "partner_can_access_location": "Informacji o tym, gdzie zostały zrobione Twoje zdjęcia", "partner_list_user_photos": "{user} zdjęcia", "partner_list_view_all": "PokaÅŧ wszystkie", - "partner_page_empty_message": "Twoje zdjęcia nie są udostępnione Åŧadnemu partnerowi", + "partner_page_empty_message": "Twoje zdjęcia nie są udostępnione Åŧadnemu partnerowi.", "partner_page_no_more_users": "Brak uÅŧytkownikÃŗw do dodania", "partner_page_partner_add_failed": "Nie udało się dodać partnera", "partner_page_select_partner": "Wybierz partnera", "partner_page_shared_to_title": "Udostępniono", - "partner_page_stop_sharing_content": "{} nie będzie juÅŧ mieć dostępu do twoich zdjęć.", + "partner_page_stop_sharing_content": "{user} nie będzie juÅŧ mieć dostępu do twoich zdjęć.", "partner_sharing": "Dzielenie z Partnerami", "partners": "Partnerzy", "password": "Hasło", @@ -1426,6 +1437,8 @@ "recent_searches": "Ostatnie wyszukiwania", "recently_added": "Ostatnio dodane", "recently_added_page_title": "Ostatnio Dodane", + "recently_taken": "Ostatnio wykonane", + "recently_taken_page_title": "Ostatnio Wykonane", "refresh": "OdświeÅŧ", "refresh_encoded_videos": "OdświeÅŧ enkodowane wideo", "refresh_faces": "OdświeÅŧ twarze", @@ -1560,6 +1573,7 @@ "select_keep_all": "Zaznacz zachowaj wszystko", "select_library_owner": "Wybierz właściciela biblioteki", "select_new_face": "Wybierz nową twarz", + "select_person_to_tag": "Wybierz osobę do oznaczenia", "select_photos": "Wybierz zdjęcia", "select_trash_all": "Zaznacz cały kosz", "select_user_for_sharing_page_err_album": "Nie udało się utworzyć albumu", @@ -1567,7 +1581,7 @@ "selected_count": "{count, plural, other {# wybrane}}", "send_message": "Wyślij wiadomość", "send_welcome_email": "Wyślij e-mail powitalny", - "server_endpoint": "Serwer końcowy", + "server_endpoint": "Punkt końcowy serwera", "server_info_box_app_version": "Wersja Aplikacji", "server_info_box_server_url": "Adres URL", "server_offline": "Serwer Offline", @@ -1591,11 +1605,11 @@ "setting_languages_subtitle": "Zmień język aplikacji", "setting_languages_title": "Języki", "setting_notifications_notify_failures_grace_period": "Powiadomienie o awariach kopii zapasowych w tle: {}", - "setting_notifications_notify_hours": "{} godzin", + "setting_notifications_notify_hours": "{count, plural, one {# godzina} few {# godziny} other {# godzin}}", "setting_notifications_notify_immediately": "natychmiast", - "setting_notifications_notify_minutes": "{} minut", + "setting_notifications_notify_minutes": "{count, plural, one {# minuta} few {# minuty} other {# minut}}", "setting_notifications_notify_never": "nigdy", - "setting_notifications_notify_seconds": "{} sekund", + "setting_notifications_notify_seconds": "{count, plural, one {# sekunda} few {# sekundy} other {# sekund}}", "setting_notifications_single_progress_subtitle": "SzczegÃŗÅ‚owe informacje o postępie przesyłania dla kaÅŧdego zasobu", "setting_notifications_single_progress_title": "PokaÅŧ postęp szczegÃŗÅ‚Ãŗw kopii zapasowej w tle", "setting_notifications_subtitle": "Dostosuj preferencje powiadomień", @@ -1609,8 +1623,8 @@ "settings_saved": "Ustawienia zapisane", "share": "Udostępnij", "share_add_photos": "Dodaj zdjęcia", - "share_assets_selected": "{} wybrano", - "share_dialog_preparing": "Przygotowywanie...", + "share_assets_selected": "{count, plural, one {# wybrane} few {# wybrane} other {# wybranych}}", + "share_dialog_preparing": "Przygotowywanieâ€Ļ", "shared": "Udostępnione", "shared_album_activities_input_disable": "Komentarz jest wyłączony", "shared_album_activity_remove_content": "Czy chcesz usunąć tę aktywność?", @@ -1627,28 +1641,28 @@ "shared_link_app_bar_title": "Udostępnione linki", "shared_link_clipboard_copied_massage": "Skopiowane do schowka", "shared_link_clipboard_text": "Link: {}\nHasło: {}", - "shared_link_create_error": "Błąd podczas tworzenia udostępnionego linka", + "shared_link_create_error": "Błąd podczas tworzenia linka do udostępnienia", "shared_link_edit_description_hint": "WprowadÅē opis udostępnienia", - "shared_link_edit_expire_after_option_day": "1 dzień", - "shared_link_edit_expire_after_option_days": "{} dni", - "shared_link_edit_expire_after_option_hour": "1 godzina", - "shared_link_edit_expire_after_option_hours": "{} godzin", - "shared_link_edit_expire_after_option_minute": "1 minuta", - "shared_link_edit_expire_after_option_minutes": "{} minut", - "shared_link_edit_expire_after_option_months": "{} miesięcy", - "shared_link_edit_expire_after_option_year": "{} lat", + "shared_link_edit_expire_after_option_day": "1 dniu", + "shared_link_edit_expire_after_option_days": "{count, plural, one {# dniu} other {# dniach}}", + "shared_link_edit_expire_after_option_hour": "1 godzinie", + "shared_link_edit_expire_after_option_hours": "{count, plural, one {# godzinie} other {# godzinach}}", + "shared_link_edit_expire_after_option_minute": "1 minucie", + "shared_link_edit_expire_after_option_minutes": "{count, plural, one {# minucie} other {# minutach}}", + "shared_link_edit_expire_after_option_months": "{count, plural, one {# miesiącu} other {# miesiącach}}", + "shared_link_edit_expire_after_option_year": "{count, plural, one {# roku} other {# latach}}", "shared_link_edit_password_hint": "WprowadÅē hasło udostępniania", "shared_link_edit_submit_button": "Aktualizuj link", "shared_link_error_server_url_fetch": "Nie moÅŧna pobrać adresu URL serwera", - "shared_link_expires_day": "Wygasa za {} dni", - "shared_link_expires_days": "Wygasa za {} dni", - "shared_link_expires_hour": "Wygasa za {} godzin", - "shared_link_expires_hours": "Wygasa za {} godzin", - "shared_link_expires_minute": "Wygasa za {} minut", - "shared_link_expires_minutes": "Wygasa za {} minut", + "shared_link_expires_day": "Wygasa za {count, plural, one {# dzień}}", + "shared_link_expires_days": "Wygasa za {count, plural, one {# dzień} other {# dni}}", + "shared_link_expires_hour": "Wygasa za {count, plural, one {# godzinę}}", + "shared_link_expires_hours": "Wygasa za {count, plural, one {# godzinę} few {# godziny} other {# godzin}}", + "shared_link_expires_minute": "Wygasa za {count, plural, one {# minutę}}", + "shared_link_expires_minutes": "Wygasa za {count, plural, one {# minutę} few {# minuty} other {# minut}}", "shared_link_expires_never": "Wygasa ∞", - "shared_link_expires_second": "Wygasa za {} sekund", - "shared_link_expires_seconds": "Wygasa za {} sekund", + "shared_link_expires_second": "Wygasa za {count, plural, one {# sekundę}}", + "shared_link_expires_seconds": "Wygasa za {count, plural, one {# sekundę} few {# sekundy} other {# sekund}}", "shared_link_individual_shared": "Indywidualnie udostępnione", "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "Zarządzaj udostępnionymi linkami", @@ -1784,11 +1798,11 @@ "trash_no_results_message": "Tu znajdziesz wyrzucone zdjęcia i filmy.", "trash_page_delete_all": "Usuń wszystko", "trash_page_empty_trash_dialog_content": "Czy chcesz oprÃŗÅŧnić swoje usunięte zasoby? Przedmioty te zostaną trwale usunięte z Immich", - "trash_page_info": "Elementy przeniesione do kosza zostaną trwale usunięte po {} dniach", + "trash_page_info": "Elementy przeniesione do kosza zostaną trwale usunięte po {count, plural, one {# dniu} other {# dniach}}", "trash_page_no_assets": "Brak usuniętych zasobÃŗw", "trash_page_restore_all": "PrzywrÃŗcić wszystkie", "trash_page_select_assets_btn": "Wybierz zasoby", - "trash_page_title": "Kosz({})", + "trash_page_title": "Kosz ({})", "trashed_items_will_be_permanently_deleted_after": "Wyrzucone zasoby zostaną trwale usunięte po {days, plural, one {jednym dniu} other {{days, number} dniach}}.", "type": "Typ", "unarchive": "Cofnij archiwizację", @@ -1872,6 +1886,7 @@ "view_name": "Widok", "view_next_asset": "Wyświetl następny zasÃŗb", "view_previous_asset": "Wyświetl poprzedni zasÃŗb", + "view_qr_code": "PokaÅŧ kod QR", "view_stack": "Zobacz UłoÅŧenie", "viewer_remove_from_stack": "Usuń ze stosu", "viewer_stack_use_as_main_asset": "UÅŧyj jako gÅ‚Ãŗwnego zasobu", diff --git a/i18n/pt.json b/i18n/pt.json index 05b2ebfdd9..5f97f65a25 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Registo automÃĄtico", "oauth_auto_register_description": "Registar automaticamente novos utilizadores apÃŗs iniciarem sessÃŖo com o OAuth", "oauth_button_text": "Texto do botÃŖo", - "oauth_client_id": "ID do Cliente", - "oauth_client_secret": "Segredo do cliente", "oauth_enable_description": "Iniciar sessÃŖo com o OAuth", - "oauth_issuer_url": "URL do emissor", "oauth_mobile_redirect_uri": "URI de redirecionamento mÃŗvel", "oauth_mobile_redirect_uri_override": "SubstituiÃ§ÃŖo de URI de redirecionamento mÃŗvel", "oauth_mobile_redirect_uri_override_description": "Ative quando o provedor do OAuth nÃŖo permite um URI mÃŗvel, como '{callback}'", - "oauth_profile_signing_algorithm": "Algoritmo de assinatura de perfis", - "oauth_profile_signing_algorithm_description": "Algoritmo utilizado para assinar o perfil de utilizador.", - "oauth_scope": "Escopo", "oauth_settings": "OAuth", "oauth_settings_description": "Gerir definiçÃĩes de inicio de sessÃŖo do OAuth", "oauth_settings_more_details": "Para mais informaçÃĩes sobre esta funcionalidade, veja a documentaÃ§ÃŖo.", - "oauth_signing_algorithm": "Algoritmo de assinatura", "oauth_storage_label_claim": "ReivindicaÃ§ÃŖo de RÃŗtulo de Armazenamento", "oauth_storage_label_claim_description": "Definir automaticamente o RÃŗtulo de Armazenamento do utilizador para o valor desta declaraÃ§ÃŖo.", "oauth_storage_quota_claim": "ReivindicaÃ§ÃŖo de quota de armazenamento", diff --git a/i18n/pt_BR.json b/i18n/pt_BR.json index 3db825d567..b398c6ab28 100644 --- a/i18n/pt_BR.json +++ b/i18n/pt_BR.json @@ -14,6 +14,7 @@ "add_a_location": "Adicionar uma localizaÃ§ÃŖo", "add_a_name": "Adicionar um nome", "add_a_title": "Adicionar um título", + "add_endpoint": "Adicionar URL", "add_exclusion_pattern": "Adicionar padrÃŖo de exclusÃŖo", "add_import_path": "Adicionar caminho de importaÃ§ÃŖo", "add_location": "Adicionar local", @@ -23,6 +24,8 @@ "add_photos": "Adicionar fotos", "add_to": "Adicionar aâ€Ļ", "add_to_album": "Adicionar ao ÃĄlbum", + "add_to_album_bottom_sheet_added": "Adicionado ao {album}", + "add_to_album_bottom_sheet_already_exists": "JÃĄ existe em {album}", "add_to_shared_album": "Adicionar ao ÃĄlbum compartilhado", "add_url": "Adicionar URL", "added_to_archive": "Adicionado ao arquivo", @@ -36,11 +39,11 @@ "authentication_settings_disable_all": "Tem certeza de que deseja desativar todos os mÊtodos de login? O login serÃĄ completamente desativado.", "authentication_settings_reenable": "Para reabilitar, use um Comando do Servidor.", "background_task_job": "Tarefas em segundo plano", - "backup_database": "Backup do banco de dados", + "backup_database": "Criar backup do banco de dados", "backup_database_enable_description": "Ativar backup do banco de dados", "backup_keep_last_amount": "Quantidade de backups anteriores para manter salvo", "backup_settings": "ConfiguraçÃĩes de backup", - "backup_settings_description": "Gerenciar configuraçÃĩes de backup do banco de dados", + "backup_settings_description": "Gerenciar configuraçÃĩes de backup do banco de dados. Nota: essas tarefas nÃŖo sÃŖo monitoradas e vocÃĒ nÃŖo serÃĄ notificado em caso de falhas.", "check_all": "Selecionar Tudo", "cleanup": "Limpeza", "cleared_jobs": "Tarefas removidas de: {job}", @@ -189,26 +192,22 @@ "oauth_auto_register": "Registro automÃĄtico", "oauth_auto_register_description": "Registre automaticamente novos usuÃĄrios apÃŗs fazer login com OAuth", "oauth_button_text": "BotÃŖo de texto", - "oauth_client_id": "ID do Cliente", - "oauth_client_secret": "Segredo do cliente", + "oauth_client_secret_description": "ObrigatÃŗrio se PKCE (Proof Key for Code Exchange) nÃŖo for suportado pelo provedor OAuth", "oauth_enable_description": "Faça login com OAuth", - "oauth_issuer_url": "URL do emissor", "oauth_mobile_redirect_uri": "URI de redirecionamento mÃŗvel", "oauth_mobile_redirect_uri_override": "SubstituiÃ§ÃŖo de URI de redirecionamento mÃŗvel", "oauth_mobile_redirect_uri_override_description": "Ative quando o provedor do OAuth nÃŖo suportar uma URI de aplicativo, por exemplo '{callback}'", - "oauth_profile_signing_algorithm": "Algoritmo de assinatura de perfis", - "oauth_profile_signing_algorithm_description": "Algoritmo usado para assinar o perfil do usuÃĄrio.", - "oauth_scope": "Escopo", "oauth_settings": "OAuth", "oauth_settings_description": "Gerenciar configuraçÃĩes de login do OAuth", "oauth_settings_more_details": "Para mais detalhes sobre este recurso, consulte a documentaÃ§ÃŖo.", - "oauth_signing_algorithm": "Algoritmo de assinatura", "oauth_storage_label_claim": "ReivindicaÃ§ÃŖo de rÃŗtulo de armazenamento", "oauth_storage_label_claim_description": "Defina automaticamente o rÃŗtulo de armazenamento do usuÃĄrio para o valor desta declaraÃ§ÃŖo.", "oauth_storage_quota_claim": "ReivindicaÃ§ÃŖo de cota de armazenamento", "oauth_storage_quota_claim_description": "Defina automaticamente a cota de armazenamento do usuÃĄrio para o valor desta declaraÃ§ÃŖo.", "oauth_storage_quota_default": "Cota de armazenamento padrÃŖo (GiB)", "oauth_storage_quota_default_description": "Cota em GiB a ser usada quando nenhuma reivindicaÃ§ÃŖo for fornecida (insira 0 para cota ilimitada).", + "oauth_timeout": "Tempo Limite de RequisiÃ§ÃŖo", + "oauth_timeout_description": "Tempo limite para requisiçÃĩes, em milissegundos", "offline_paths": "Caminhos off-line", "offline_paths_description": "Esses resultados podem ser devidos à exclusÃŖo manual de arquivos que nÃŖo fazem parte de uma biblioteca externa.", "password_enable_description": "Login com e-mail e senha", @@ -368,6 +367,20 @@ "admin_password": "Senha do administrador", "administration": "AdministraÃ§ÃŖo", "advanced": "Avançado", + "advanced_settings_enable_alternate_media_filter_subtitle": "Use esta opÃ§ÃŖo para filtrar mídias durante a sincronizaÃ§ÃŖo com base em critÊrios alternativos. Tente esta opÃ§ÃŖo somente se o aplicativo estiver com problemas para detectar todos os ÃĄlbuns.", + "advanced_settings_enable_alternate_media_filter_title": "[EXPERIMENTAL] Utilizar filtro alternativo de sincronizaÃ§ÃŖo de ÃĄlbum de dispositivo", + "advanced_settings_log_level_title": "Nível de log: {}", + "advanced_settings_prefer_remote_subtitle": "Alguns dispositivos sÃŖo extremamente lentos para carregar as miniaturas locais. Ative esta opÃ§ÃŖo para preferir imagens do servidor.", + "advanced_settings_prefer_remote_title": "Preferir imagens do servidor", + "advanced_settings_proxy_headers_subtitle": "Defina os cabeçalhos do proxy que o Immich deve enviar em todas comunicaçÃĩes com a rede", + "advanced_settings_proxy_headers_title": "Cabeçalhos do Proxy", + "advanced_settings_self_signed_ssl_subtitle": "Ignora a verificaÃ§ÃŖo do certificado SSL do servidor. ObrigatÃŗrio para certificados auto assinados.", + "advanced_settings_self_signed_ssl_title": "Permitir certificados SSL auto assinados", + "advanced_settings_sync_remote_deletions_subtitle": "Excluir ou restaurar os arquivos automaticamente neste dispositivo quando essas açÃĩes forem realizada na interface web", + "advanced_settings_sync_remote_deletions_title": "Sincronizar exclusÃĩes remotas [EXPERIMENTAL]", + "advanced_settings_tile_subtitle": "ConfiguraçÃĩes avançadas do usuÃĄrio", + "advanced_settings_troubleshooting_subtitle": "Ativar recursos adicionais para soluÃ§ÃŖo de problemas", + "advanced_settings_troubleshooting_title": "SoluÃ§ÃŖo de problemas", "age_months": "Idade {months, plural, one {# mÃĒs} other {# meses}}", "age_year_months": "Idade 1 ano e {months, plural, one {# mÃĒs} other {# meses}}", "age_years": "{years, plural, other {Idade #}}", @@ -387,17 +400,20 @@ "album_remove_user_confirmation": "Tem certeza de que deseja remover {user}?", "album_share_no_users": "Parece que vocÃĒ jÃĄ compartilhou este ÃĄlbum com todos os usuÃĄrios ou nÃŖo hÃĄ nenhum usuÃĄrio para compartilhar.", "album_thumbnail_card_item": "1 item", - "album_thumbnail_card_items": "{} items", + "album_thumbnail_card_items": "{} itens", "album_thumbnail_card_shared": " ¡ Compartilhado", + "album_thumbnail_shared_by": "Compartilhado por {}", "album_updated": "Álbum atualizado", "album_updated_setting_description": "Receba uma notificaÃ§ÃŖo por e-mail quando um ÃĄlbum compartilhado tiver novos recursos", "album_user_left": "Saiu do ÃĄlbum {album}", "album_user_removed": "UsuÃĄrio {user} foi removido", + "album_viewer_appbar_delete_confirm": "Tem certeza de que deseja excluir este ÃĄlbum da sua conta?", "album_viewer_appbar_share_err_delete": "Falha ao excluir ÃĄlbum", "album_viewer_appbar_share_err_leave": "Falha ao sair do ÃĄlbum", "album_viewer_appbar_share_err_remove": "HÃĄ problemas ao remover recursos do ÃĄlbum", "album_viewer_appbar_share_err_title": "Falha ao alterar o título do ÃĄlbum", "album_viewer_appbar_share_leave": "Sair do ÃĄlbum", + "album_viewer_appbar_share_to": "Compartilhar", "album_viewer_page_share_add_users": "Adicionar usuÃĄrios", "album_with_link_access": "Permitir que qualquer pessoa com o link veja as fotos e as pessoas neste ÃĄlbum.", "albums": "Álbuns", @@ -416,42 +432,71 @@ "api_key_description": "Este valor serÃĄ mostrado apenas uma vez. Por favor, certifique-se de copiÃĄ-lo antes de fechar a janela.", "api_key_empty": "O nome da sua chave de API nÃŖo deve estar vazio", "api_keys": "Chaves de API", + "app_bar_signout_dialog_content": "Tem certeza de que deseja sair?", + "app_bar_signout_dialog_ok": "Sim", + "app_bar_signout_dialog_title": "Sair", "app_settings": "ConfiguraçÃĩes do Aplicativo", "appears_in": "Aparece em", "archive": "Arquivados", "archive_or_unarchive_photo": "Arquivar ou desarquivar foto", + "archive_page_no_archived_assets": "Nenhum arquivo encontrado", + "archive_page_title": "Arquivados ({})", "archive_size": "Tamanho do arquivo", "archive_size_description": "Configure o tamanho do arquivo para baixar (em GiB)", + "archived": "Arquivado", "archived_count": "{count, plural, one {# Arquivado} other {# Arquivados}}", "are_these_the_same_person": "Essas pessoas sÃŖo a mesma pessoa?", "are_you_sure_to_do_this": "Tem certeza de que deseja fazer isso?", + "asset_action_delete_err_read_only": "NÃŖo Ê possível excluir arquivo sÃŗ leitura, ignorando", + "asset_action_share_err_offline": "NÃŖo foi possível obter os arquivos offline, ignorando", "asset_added_to_album": "Adicionado ao ÃĄlbum", "asset_adding_to_album": "Adicionando ao ÃĄlbumâ€Ļ", "asset_description_updated": "A descriÃ§ÃŖo do ativo foi atualizada", "asset_filename_is_offline": "O arquivo {filename} nÃŖo estÃĄ disponível", "asset_has_unassigned_faces": "O arquivo tem rostos sem nomes", "asset_hashing": "Processandoâ€Ļ", + "asset_list_group_by_sub_title": "Agrupar por", + "asset_list_layout_settings_dynamic_layout_title": "Layout dinÃĸmico", + "asset_list_layout_settings_group_automatically": "AutomÃĄtico", + "asset_list_layout_settings_group_by": "Agrupar arquivos por", + "asset_list_layout_settings_group_by_month_day": "MÃĒs + dia", + "asset_list_layout_sub_title": "Layout", + "asset_list_settings_subtitle": "ConfiguraçÃĩes de layout da grade de fotos", + "asset_list_settings_title": "Grade de Fotos", "asset_offline": "Arquivo indisponível", "asset_offline_description": "Este arquivo externo nÃŖo estÃĄ mais disponível. Contate seu administrador do Immich para obter ajuda.", + "asset_restored_successfully": "Arquivo restaurado", "asset_skipped": "Ignorado", "asset_skipped_in_trash": "Na lixeira", "asset_uploaded": "Carregado", "asset_uploading": "Carregandoâ€Ļ", + "asset_viewer_settings_subtitle": "Gerenciar as configuraçÃĩes do visualizador da galeria", + "asset_viewer_settings_title": "Visualizador de Mídia", "assets": "Arquivos", "assets_added_count": "{count, plural, one {# arquivo adicionado} other {# arquivos adicionados}}", "assets_added_to_album_count": "{count, plural, one {# arquivo adicionado} other {# arquivos adicionados}} ao ÃĄlbum", "assets_added_to_name_count": "{count, plural, one {# arquivo adicionado} other {# arquivos adicionados}} {hasName, select, true {ao ÃĄlbum {name}} other {em um novo ÃĄlbum}}", "assets_count": "{count, plural, one {# arquivo} other {# arquivos}}", + "assets_deleted_permanently": "{} arquivo(s) deletado(s) permanentemente", + "assets_deleted_permanently_from_server": "{} arquivo(s) deletado(s) permanentemente do servidor Immich", "assets_moved_to_trash_count": "{count, plural, one {# arquivo movido} other {# arquivos movidos}} para a lixeira", "assets_permanently_deleted_count": "{count, plural, one {# arquivo excluído permanentemente} other {# arquivos excluídos permanentemente}}", "assets_removed_count": "{count, plural, one {# arquivo removido} other {# arquivos removidos}}", + "assets_removed_permanently_from_device": "{} arquivo(s) removido(s) permanentemente do seu dispositivo", "assets_restore_confirmation": "Tem certeza de que deseja restaurar todos os seus arquivos na lixeira? Esta aÃ§ÃŖo nÃŖo pode ser desfeita! Nota: Arquivos externos nÃŖo podem ser restaurados desta maneira.", "assets_restored_count": "{count, plural, one {# arquivo restaurado} other {# arquivos restaurados}}", + "assets_restored_successfully": "{} arquivo(s) restaurado(s)", + "assets_trashed": "{} arquivo enviado para a lixeira", "assets_trashed_count": "{count, plural, one {# arquivo movido para a lixeira} other {# arquivos movidos para a lixeira}}", + "assets_trashed_from_server": "{} arquivos foram enviados para a lixeira", "assets_were_part_of_album_count": "{count, plural, one {O arquivo jÃĄ faz} other {Os arquivos jÃĄ fazem}} parte do ÃĄlbum", "authorized_devices": "Dispositivos Autorizados", + "automatic_endpoint_switching_subtitle": "Conecte-se localmente quando estiver em uma rede uma Wi-Fi específica e use conexÃĩes alternativas em outras redes", + "automatic_endpoint_switching_title": "Troca automÃĄtica de URL", "back": "Voltar", "back_close_deselect": "Voltar, fechar ou desmarcar", + "background_location_permission": "PermissÃŖo de localizaÃ§ÃŖo em segundo plano", + "background_location_permission_content": "Para que seja possível trocar a URL quando estiver executando em segundo plano, o Immich deve *sempre* ter a permissÃŖo de localizaÃ§ÃŖo precisa para que o aplicativo consiga ler o nome da rede Wi-Fi", "backup_album_selection_page_albums_device": "Álbuns no dispositivo ({})", "backup_album_selection_page_albums_tap": "Toque para incluir, toque duas vezes para excluir", "backup_album_selection_page_assets_scatter": "Os recursos podem se espalhar por vÃĄrios ÃĄlbuns. Assim, os ÃĄlbuns podem ser incluídos ou excluídos durante o processo de backup.", @@ -459,19 +504,30 @@ "backup_album_selection_page_selection_info": "InformaçÃĩes da SeleÃ§ÃŖo", "backup_album_selection_page_total_assets": "Total de recursos exclusivos", "backup_all": "Todos", + "backup_background_service_backup_failed_message": "Falha ao fazer backup. Tentando novamenteâ€Ļ", + "backup_background_service_connection_failed_message": "Falha na conexÃŖo com o servidor. Tentando novamenteâ€Ļ", "backup_background_service_current_upload_notification": "Enviando {}", "backup_background_service_default_notification": "Checking for new assetsâ€Ļ", + "backup_background_service_error_title": "Erro no backup", "backup_background_service_in_progress_notification": "Fazendo backup de seus ativosâ€Ļ", - "backup_background_service_upload_failure_notification": "Falha ao carregar {}", + "backup_background_service_upload_failure_notification": "Falha ao enviar {}", "backup_controller_page_albums": "Álbuns de backup", + "backup_controller_page_background_app_refresh_disabled_content": "Para utilizar o backup em segundo plano, ative a atualizaÃ§ÃŖo da aplicaÃ§ÃŖo em segundo plano em ConfiguraçÃĩes > Geral > AtualizaÃ§ÃŖo em 2Âē plano", + "backup_controller_page_background_app_refresh_disabled_title": "AtualizaÃ§ÃŖo em 2Âē plano desativada", + "backup_controller_page_background_app_refresh_enable_button_text": "Ir para as configuraçÃĩes", + "backup_controller_page_background_battery_info_link": "Mostre-me como", + "backup_controller_page_background_battery_info_message": "Para uma melhor experiÃĒncia de backup em segundo plano, desative todas as otimizaçÃĩes de bateria que restrinjam a atividade em segundo plano do Immich.\n\nComo isso Ê específico por dispositivo, consulte as informaçÃĩes de como fazer isso com o fabricante do seu dispositivo.", + "backup_controller_page_background_battery_info_ok": "OK", + "backup_controller_page_background_battery_info_title": "OtimizaçÃĩes de bateria", "backup_controller_page_background_charging": "Apenas durante o carregamento", "backup_controller_page_background_configure_error": "Falha ao configurar o serviço em segundo plano", + "backup_controller_page_background_delay": "Adiar backup de novos arquivos: {}", "backup_controller_page_background_description": "Ative o serviço em segundo plano para fazer backup automÃĄtico de novos ativos sem precisar abrir o aplicativo", "backup_controller_page_background_is_off": "O backup automÃĄtico em segundo plano estÃĄ desativado", "backup_controller_page_background_is_on": "O backup automÃĄtico em segundo plano estÃĄ ativado", "backup_controller_page_background_turn_off": "Desativar o serviço em segundo plano", "backup_controller_page_background_turn_on": "Ativar o serviço em segundo plano", - "backup_controller_page_background_wifi": "Apenas em Wi-Fi", + "backup_controller_page_background_wifi": "Apenas no Wi-Fi", "backup_controller_page_backup": "Backup", "backup_controller_page_backup_selected": "Selecionado: ", "backup_controller_page_backup_sub": "Backup de fotos e vídeos", @@ -489,7 +545,7 @@ "backup_controller_page_start_backup": "Iniciar backup", "backup_controller_page_status_off": "O backup estÃĄ desativado", "backup_controller_page_status_on": "O backup estÃĄ ativado", - "backup_controller_page_storage_format": "{} de {} usado", + "backup_controller_page_storage_format": "{} de {} usados", "backup_controller_page_to_backup": "Álbuns para backup", "backup_controller_page_total_sub": "Todas as fotos e vídeos Ãēnicos dos ÃĄlbuns selecionados", "backup_controller_page_turn_off": "Desativar o backup", @@ -497,6 +553,12 @@ "backup_controller_page_uploading_file_info": "Carregando informaçÃĩes do arquivo", "backup_err_only_album": "NÃŖo Ê possível remover o Ãēnico ÃĄlbum", "backup_info_card_assets": "ativos", + "backup_manual_cancelled": "Cancelado", + "backup_manual_in_progress": "Envio jÃĄ estÃĄ em progresso. Tente novamente mais tarde", + "backup_manual_success": "Sucesso", + "backup_manual_title": "Estado do envio", + "backup_options_page_title": "OpçÃĩes de backup", + "backup_setting_subtitle": "Gerenciar as configuraçÃĩes de envio em primeiro e segundo plano", "backward": "Para trÃĄs", "birthdate_saved": "Data de nascimento salva com sucesso", "birthdate_set_description": "A data de nascimento Ê usada para calcular a idade da pessoa no momento em que a foto foi tirada.", @@ -508,24 +570,52 @@ "bulk_keep_duplicates_confirmation": "Tem certeza de que deseja manter {count, plural, one {# arquivo duplicado} other {# arquivos duplicados}}? Isso resolverÃĄ todos os grupos duplicados sem excluir nada.", "bulk_trash_duplicates_confirmation": "Tem a certeza de que deseja mover para a lixeira {count, plural, one {# arquivo duplicado} other {# arquivos duplicados}}? Isso manterÃĄ o maior arquivo de cada grupo e moverÃĄ para a lixeira todas as outras duplicidades.", "buy": "Comprar o Immich", + "cache_settings_album_thumbnails": "Miniaturas da biblioteca ({} arquivos)", + "cache_settings_clear_cache_button": "Limpar o cache", + "cache_settings_clear_cache_button_title": "Limpa o cache do aplicativo. Isso afetarÃĄ significativamente o desempenho do aplicativo atÊ que o cache seja reconstruído.", + "cache_settings_duplicated_assets_clear_button": "LIMPAR", + "cache_settings_duplicated_assets_subtitle": "Fotos e vídeos que sÃŖo bloqueados pelo app", + "cache_settings_duplicated_assets_title": "Arquivos duplicados ({})", + "cache_settings_image_cache_size": "Tamanho do cache de imagens ({} arquivos)", + "cache_settings_statistics_album": "Miniaturas da biblioteca", + "cache_settings_statistics_assets": "{} arquivos ({})", + "cache_settings_statistics_full": "Imagens completas", + "cache_settings_statistics_shared": "Miniaturas de ÃĄlbuns compartilhados", + "cache_settings_statistics_thumbnail": "Miniaturas", + "cache_settings_statistics_title": "Uso do cache", + "cache_settings_subtitle": "Controle o comportamento de cache do aplicativo Immich", + "cache_settings_thumbnail_size": "Tamanho do cache de miniaturas ({} arquivos)", + "cache_settings_tile_subtitle": "Controle o comportamento do armazenamento local", + "cache_settings_tile_title": "Armazenamento Local", + "cache_settings_title": "ConfiguraçÃĩes de cache", "camera": "CÃĸmera", "camera_brand": "Marca da cÃĸmera", "camera_model": "Modelo da cÃĸmera", "cancel": "Cancelar", "cancel_search": "Cancelar pesquisa", + "canceled": "Cancelado", "cannot_merge_people": "NÃŖo Ê possível mesclar pessoas", "cannot_undo_this_action": "VocÃĒ nÃŖo pode desfazer esta aÃ§ÃŖo!", "cannot_update_the_description": "NÃŖo Ê possível atualizar a descriÃ§ÃŖo", "change_date": "Alterar data", + "change_display_order": "Alterar ordem de exibiÃ§ÃŖo", "change_expiration_time": "Alterar o prazo de validade", "change_location": "Alterar localizaÃ§ÃŖo", "change_name": "Alterar nome", "change_name_successfully": "Nome alterado com sucesso", "change_password": "Mudar a senha", "change_password_description": "Esta Ê a primeira vez que vocÃĒ estÃĄ acessando o sistema ou foi feita uma solicitaÃ§ÃŖo para alterar sua senha. Por favor, insira a nova senha abaixo.", + "change_password_form_confirm_password": "Confirme a senha", + "change_password_form_description": "OlÃĄ {name},\n\nEsta Ê a primeira vez que vocÃĒ estÃĄ acessando o sistema ou foi feita uma solicitaÃ§ÃŖo para alterar sua senha. Por favor, insira a nova senha abaixo.", + "change_password_form_new_password": "Nova Senha", + "change_password_form_password_mismatch": "As senhas nÃŖo estÃŖo iguais", + "change_password_form_reenter_new_password": "Confirme a nova senha", "change_your_password": "Alterar sua senha", "changed_visibility_successfully": "Visibilidade alterada com sucesso", "check_all": "Verificar tudo", + "check_corrupt_asset_backup": "Verifique se hÃĄ backups corrompidos", + "check_corrupt_asset_backup_button": "Verificar", + "check_corrupt_asset_backup_description": "Execute esta verificaÃ§ÃŖo somente em uma rede Wi-Fi e quando o backup de todos os arquivos jÃĄ estiver concluído. O processo demora alguns minutos.", "check_logs": "Verificar registros", "choose_matching_people_to_merge": "Escolha pessoas correspondentes para mesclar", "city": "Cidade", @@ -534,6 +624,14 @@ "clear_all_recent_searches": "Limpar todas as buscas recentes", "clear_message": "Limpar mensagem", "clear_value": "Limpar valor", + "client_cert_dialog_msg_confirm": "OK", + "client_cert_enter_password": "Digite a senha", + "client_cert_import": "Importar", + "client_cert_import_success_msg": "Certificado do cliente importado", + "client_cert_invalid_msg": "Arquivo de certificado invÃĄlido ou senha errada", + "client_cert_remove_msg": "Certificado do cliente removido", + "client_cert_subtitle": "Suporta apenas o formato PKCS12 (.p12, .pfx). A importaÃ§ÃŖo/remoÃ§ÃŖo de certificados estÃĄ disponível somente antes do login", + "client_cert_title": "Certificado de Cliente SSL", "clockwise": "HorÃĄrio", "close": "Fechar", "collapse": "Recolher", @@ -544,15 +642,27 @@ "comment_options": "OpçÃĩes de comentÃĄrio", "comments_and_likes": "ComentÃĄrios e curtidas", "comments_are_disabled": "ComentÃĄrios estÃŖo desativados", + "common_create_new_album": "Criar novo ÃĄlbum", + "common_server_error": "Verifique a sua conexÃŖo de rede, certifique-se de que o servidor estÃĄ acessível e de que as versÃĩes do aplicativo e servidor sÃŖo compatíveis.", + "completed": "Sucesso", "confirm": "Confirmar", "confirm_admin_password": "Confirmar senha de administrador", "confirm_delete_face": "Tem certeza que deseja remover a face de {name} deste arquivo?", "confirm_delete_shared_link": "Tem certeza de que deseja excluir este link compartilhado?", - "confirm_keep_this_delete_others": "Todos os outros arquivos da pilha serÃŖo excluídos, exceto este arquivo. Tem certeza de que deseja continuar?", + "confirm_keep_this_delete_others": "Todos os outros arquivos do grupo serÃŖo excluídos, exceto este arquivo. Tem certeza de que deseja continuar?", "confirm_password": "Confirme a senha", "contain": "Caber", "context": "Contexto", "continue": "Continuar", + "control_bottom_app_bar_album_info_shared": "{} arquivos ¡ Compartilhado", + "control_bottom_app_bar_create_new_album": "Criar novo ÃĄlbum", + "control_bottom_app_bar_delete_from_immich": "Excluir do Immich", + "control_bottom_app_bar_delete_from_local": "Excluir do dispositivo", + "control_bottom_app_bar_edit_location": "Editar LocalizaÃ§ÃŖo", + "control_bottom_app_bar_edit_time": "Editar data e hora", + "control_bottom_app_bar_share_link": "Compartilhar Link", + "control_bottom_app_bar_share_to": "Compartilhar", + "control_bottom_app_bar_trash_from_immich": "Mover para a Lixeira", "copied_image_to_clipboard": "Imagem copiada para a ÃĄrea de transferÃĒncia.", "copied_to_clipboard": "Copiado para a ÃĄrea de transferÃĒncia!", "copy_error": "Copiar erro", @@ -572,6 +682,7 @@ "create_link": "Criar link", "create_link_to_share": "Criar link para partilhar", "create_link_to_share_description": "Permitir que qualquer pessoa com o link veja a(s) foto(s) selecionada(s)", + "create_new": "CRIAR NOVO", "create_new_person": "Criar nova pessoa", "create_new_person_hint": "Atribuir arquivos selecionados a uma nova pessoa", "create_new_user": "Criar novo usuÃĄrio", @@ -581,7 +692,10 @@ "create_tag_description": "Cria um novo marcador. Para marcadores multi nível, digite o caminho completo do marcador, inclusive as barras.", "create_user": "Criar usuÃĄrio", "created": "Criado", + "crop": "Cortar", + "curated_object_page_title": "Objetos", "current_device": "Dispositivo atual", + "current_server_address": "Endereço atual do servidor", "custom_locale": "LocalizaÃ§ÃŖo Customizada", "custom_locale_description": "Formatar datas e nÃēmeros baseados na linguagem e regiÃŖo", "daily_title_text_date": "E, MMM dd", @@ -605,20 +719,29 @@ "delete_album": "Excluir ÃĄlbum", "delete_api_key_prompt": "Tem certeza de que deseja excluir esta chave de API?", "delete_dialog_alert": "Esses itens serÃŖo excluídos permanentemente do Immich e do seu dispositivo", + "delete_dialog_alert_local": "Estes arquivos serÃŖo permanentemente excluídos do seu dispositivo, mas continuarÃŖo disponíveis no servidor Immich", + "delete_dialog_alert_local_non_backed_up": "NÃŖo hÃĄ backup de alguns dos arquivos no servidor e eles serÃŖo excluídos permanentemente do seu dispositivo", + "delete_dialog_alert_remote": "Esses arquivos serÃŖo excluídos permanentemente do servidor Immich", + "delete_dialog_ok_force": "Excluir mesmo assim", "delete_dialog_title": "Excluir permanentemente", "delete_duplicates_confirmation": "Tem certeza de que deseja excluir permanentemente estas duplicidades?", "delete_face": "Remover face", "delete_key": "Excluir chave", "delete_library": "Excluir biblioteca", "delete_link": "Excluir link", + "delete_local_dialog_ok_backed_up_only": "Excluir apenas arquivos com backup feito", + "delete_local_dialog_ok_force": "Excluir mesmo assim", "delete_others": "Excluir restante", "delete_shared_link": "Excluir link de compartilhamento", + "delete_shared_link_dialog_title": "Excluir link compartilhado", "delete_tag": "Remover marcador", "delete_tag_confirmation_prompt": "Tem certeza que deseja excluir o marcador {tagName} ?", "delete_user": "Excluir usuÃĄrio", "deleted_shared_link": "Link de compartilhamento excluído", "deletes_missing_assets": "Excluir arquivos nÃŖo encontrados", "description": "DescriÃ§ÃŖo", + "description_input_hint_text": "Adicionar descriÃ§ÃŖo...", + "description_input_submit_error": "Erro ao atualizar a descriÃ§ÃŖo, verifique o log para mais detalhes", "details": "Detalhes", "direction": "DireÃ§ÃŖo", "disabled": "Desativado", @@ -635,12 +758,26 @@ "documentation": "DocumentaÃ§ÃŖo", "done": "Feito", "download": "Baixar", + "download_canceled": "Cancelado", + "download_complete": "Sucesso", + "download_enqueue": "Na fila", + "download_error": "Erro ao baixar", + "download_failed": "Falha", + "download_filename": "arquivo: {}", + "download_finished": "Concluído", "download_include_embedded_motion_videos": "Vídeos inclusos", "download_include_embedded_motion_videos_description": "Baixar os vídeos inclusos de uma foto em movimento em um arquivo separado", + "download_notfound": "NÃŖo encontrado", + "download_paused": "Pausado", "download_settings": "Baixar", "download_settings_description": "Gerenciar configuraçÃĩes relacionadas a transferÃĒncia de arquivos", + "download_started": "Baixando", + "download_sucess": "Baixado com sucesso", + "download_sucess_android": "O arquivo foi salvo em DCIM/Immich", + "download_waiting_to_retry": "Aguardando para tentar novamente", "downloading": "Baixando", "downloading_asset_filename": "Baixando arquivo {filename}", + "downloading_media": "Baixando mídia", "drop_files_to_upload": "Solte arquivos em qualquer lugar para carregar", "duplicates": "Duplicados", "duplicates_description": "Marque cada grupo indicando quais arquivos, se algum, sÃŖo duplicados", @@ -657,6 +794,7 @@ "edit_key": "Editar chave", "edit_link": "Editar link", "edit_location": "Editar LocalizaÃ§ÃŖo", + "edit_location_dialog_title": "LocalizaÃ§ÃŖo", "edit_name": "Editar nome", "edit_people": "Editar pessoas", "edit_tag": "Editar marcador", @@ -669,14 +807,19 @@ "editor_crop_tool_h2_aspect_ratios": "ProporçÃĩes", "editor_crop_tool_h2_rotation": "RotaÃ§ÃŖo", "email": "E-mail", + "empty_folder": "A pasta estÃĄ vazia", "empty_trash": "Esvaziar lixo", "empty_trash_confirmation": "Tem certeza de que deseja esvaziar a lixeira? Isso removerÃĄ permanentemente do Immich todos os arquivos que estÃŖo na lixeira.\nVocÃĒ nÃŖo pode desfazer esta aÃ§ÃŖo!", "enable": "Habilitar", "enabled": "Habilitado", "end_date": "Data final", + "enqueued": "Na fila", + "enter_wifi_name": "Digite o nome do Wi-Fi", "error": "Erro", + "error_change_sort_album": "Falha ao alterar a ordem de exibiÃ§ÃŖo", "error_delete_face": "Erro ao remover face do arquivo", "error_loading_image": "Erro ao carregar a pÃĄgina", + "error_saving_image": "Erro: {}", "error_title": "Erro - Algo deu errado", "errors": { "cannot_navigate_next_asset": "NÃŖo foi possível navegar para o prÃŗximo arquivo", @@ -706,10 +849,12 @@ "failed_to_keep_this_delete_others": "Falha ao manter este arquivo e excluir os outros", "failed_to_load_asset": "NÃŖo foi possível carregar o ativo", "failed_to_load_assets": "NÃŖo foi possível carregar os ativos", + "failed_to_load_notifications": "Falha ao carregar notificaçÃĩes", "failed_to_load_people": "Falha ao carregar pessoas", "failed_to_remove_product_key": "Falha ao remover a chave do produto", - "failed_to_stack_assets": "Falha ao empilhar arquivos", - "failed_to_unstack_assets": "Falha ao desempilhar arquivos", + "failed_to_stack_assets": "Falha ao agrupar arquivos", + "failed_to_unstack_assets": "Falha ao remover arquivos do grupo", + "failed_to_update_notification_status": "Falha ao atualizar o status da notificaÃ§ÃŖo", "import_path_already_exists": "Este caminho de importaÃ§ÃŖo jÃĄ existe.", "incorrect_email_or_password": "E-mail ou senha incorretos", "paths_validation_failed": "A validaÃ§ÃŖo de {paths, plural, one {# caminho falhou} other {# caminhos falharam}}", @@ -808,8 +953,18 @@ "exif_bottom_sheet_description": "Adicionar descriÃ§ÃŖo...", "exif_bottom_sheet_details": "DETALHES", "exif_bottom_sheet_location": "LOCALIZAÇÃO", + "exif_bottom_sheet_people": "PESSOAS", + "exif_bottom_sheet_person_add_person": "Adicionar nome", + "exif_bottom_sheet_person_age": "Idade {}", + "exif_bottom_sheet_person_age_months": "Idade {} meses", + "exif_bottom_sheet_person_age_year_months": "Idade 1 ano, {} meses", + "exif_bottom_sheet_person_age_years": "Idade {}", "exit_slideshow": "Sair da apresentaÃ§ÃŖo", "expand_all": "Expandir tudo", + "experimental_settings_new_asset_list_subtitle": "Em andamento", + "experimental_settings_new_asset_list_title": "Ativar grade de fotos experimental", + "experimental_settings_subtitle": "Use por sua conta e risco!", + "experimental_settings_title": "Experimental", "expire_after": "Expira depois", "expired": "Expirou", "expires_date": "Expira em {date}", @@ -820,11 +975,16 @@ "extension": "ExtensÃŖo", "external": "Externo", "external_libraries": "Bibliotecas externas", + "external_network": "Rede externa", + "external_network_sheet_info": "Quando nÃŖo estiver na rede Wi-Fi especificada, o aplicativo irÃĄ se conectar usando a primeira URL abaixo que obtiver sucesso, começando do topo da lista para baixo.", "face_unassigned": "Sem nome", + "failed": "Falhou", "failed_to_load_assets": "Falha ao carregar arquivos", + "failed_to_load_folder": "Falha ao carregar a pasta", "favorite": "Favorito", "favorite_or_unfavorite_photo": "Marque ou desmarque a foto como favorita", "favorites": "Favoritos", + "favorites_page_no_favorites": "Nenhuma mídia favorita encontrada", "feature_photo_updated": "Foto principal atualizada", "features": "Funcionalidades", "features_setting_description": "Gerenciar as funcionalidades da aplicaÃ§ÃŖo", @@ -832,26 +992,39 @@ "file_name_or_extension": "Nome do arquivo ou extensÃŖo", "filename": "Nome do arquivo", "filetype": "Tipo de arquivo", + "filter": "Filtro", "filter_people": "Filtrar pessoas", "filter_places": "Filtrar lugares", "find_them_fast": "Encontre pelo nome em uma pesquisa", "fix_incorrect_match": "Corrigir correspondÃĒncia incorreta", + "folder": "Pasta", + "folder_not_found": "Pasta nÃŖo encontrada", "folders": "Pastas", "folders_feature_description": "Navegar pelas pastas das fotos e vídeos no sistema de arquivos", "forward": "Para frente", "general": "Geral", "get_help": "Obter Ajuda", + "get_wifiname_error": "NÃŖo foi possível obter o nome do Wi-Fi. Verifique se concedeu as permissÃĩes necessÃĄrias e se estÃĄ conectado a uma rede Wi-Fi", "getting_started": "Primeiros passos", "go_back": "Voltar", "go_to_folder": "Ir para a pasta", "go_to_search": "Ir para a pesquisa", + "grant_permission": "Conceder permissÃŖo", "group_albums_by": "Agrupar ÃĄlbuns por...", "group_country": "Agrupar por país", "group_no": "Sem agrupamento", "group_owner": "Agrupar por dono", "group_places_by": "Agrupar lugares por...", "group_year": "Agrupar por ano", + "haptic_feedback_switch": "Ativar vibraÃ§ÃŖo", + "haptic_feedback_title": "VibraÃ§ÃŖo", "has_quota": "Cota", + "header_settings_add_header_tip": "Adicionar Cabeçalho", + "header_settings_field_validator_msg": "O valor nÃŖo pode estar vazio", + "header_settings_header_name_input": "Nome do cabeçalho", + "header_settings_header_value_input": "Valor do cabeçalho", + "headers_settings_tile_subtitle": "Defina cabeçalhos de proxy que o aplicativo deve enviar com cada solicitaÃ§ÃŖo de rede", + "headers_settings_tile_title": "Cabeçalhos de proxy personalizados", "hi_user": "OlÃĄ {name} ({email})", "hide_all_people": "Esconder todas as pessoas", "hide_gallery": "Ocultar galeria", @@ -859,8 +1032,24 @@ "hide_password": "Ocultar senha", "hide_person": "Ocultar pessoa", "hide_unnamed_people": "Esconder pessoas sem nome", + "home_page_add_to_album_conflicts": "{added} arquivos adicionados ao ÃĄlbum {album}. {failed} arquivos jÃĄ estÃŖo no ÃĄlbum.", + "home_page_add_to_album_err_local": "Ainda nÃŖo Ê possível adicionar arquivos locais aos ÃĄlbuns, ignorando", + "home_page_add_to_album_success": "{added} arquivos adicionados ao ÃĄlbum {album}.", + "home_page_album_err_partner": "Ainda nÃŖo Ê possível adicionar arquivos de parceiros a um ÃĄlbum, ignorando", + "home_page_archive_err_local": "Ainda nÃŖo Ê possível arquivar mídias locais, ignorando", + "home_page_archive_err_partner": "NÃŖo Ê possível arquivar as mídias do parceiro, ignorando", + "home_page_building_timeline": "Construindo a linha do tempo", + "home_page_delete_err_partner": "NÃŖo Ê possível excluir arquivos do parceiro, ignorando", + "home_page_delete_remote_err_local": "Foram selecionados arquivos locais para excluir remotamente, ignorando", + "home_page_favorite_err_local": "Ainda nÃŖo Ê possível adicionar arquivos locais aos favoritos, ignorando", + "home_page_favorite_err_partner": "Ainda nÃŖo Ê possível marcar arquivos do parceiro como favoritos, ignorando", + "home_page_first_time_notice": "Se Ê a primeira vez que utiliza o aplicativo, certifique-se de marcar um ou mais ÃĄlbuns do dispositivo para backup, assim a linha do tempo serÃĄ preenchida com as fotos e vídeos.", + "home_page_share_err_local": "NÃŖo Ê possível compartilhar arquivos locais com um link, ignorando", + "home_page_upload_err_limit": "SÃŗ Ê possível enviar 30 arquivos de cada vez, ignorando", "host": "Host", "hour": "Hora", + "ignore_icloud_photos": "Ignorar fotos do iCloud", + "ignore_icloud_photos_description": "Fotos que estÃŖo armazenadas no iCloud nÃŖo serÃŖo enviadas para o servidor do Immich", "image": "Imagem", "image_alt_text_date": "{isVideo, select, true {Vídeo gravado} other {Foto tirada}} em {date}", "image_alt_text_date_1_person": "{isVideo, select, true {Vídeo gravado} other {Foto tirada}} com {person1} em {date}", @@ -872,6 +1061,10 @@ "image_alt_text_date_place_2_people": "{isVideo, select, true {Vídeo gravado} other {Foto tirada}} em {city}, {country} com {person1} e {person2} em {date}", "image_alt_text_date_place_3_people": "{isVideo, select, true {Vídeo gravado} other {Foto tirada}} em {city}, {country} com {person1}, {person2}, e {person3} em {date}", "image_alt_text_date_place_4_or_more_people": "{isVideo, select, true {Vídeo gravado} other {Foto tirada}} em {city}, {country} com {person1}, {person2}, e {additionalCount, number} outros em {date}", + "image_saved_successfully": "Imagem salva", + "image_viewer_page_state_provider_download_started": "Baixando arquivo", + "image_viewer_page_state_provider_download_success": "Baixado com sucesso", + "image_viewer_page_state_provider_share_error": "Erro ao compartilhar", "immich_logo": "Logo do Immich", "immich_web_interface": "Interface Web do Immich", "import_from_json": "Importar do JSON", @@ -890,6 +1083,8 @@ "night_at_midnight": "Toda noite, meia noite", "night_at_twoam": "Toda noite, 2am" }, + "invalid_date": "Data invÃĄlida", + "invalid_date_format": "Formato de data invÃĄlido", "invite_people": "Convidar Pessoas", "invite_to_album": "Convidar para o ÃĄlbum", "items_count": "{count, plural, one {# item} other {# itens}}", @@ -910,7 +1105,12 @@ "level": "Nível", "library": "Biblioteca", "library_options": "OpçÃĩes da biblioteca", + "library_page_device_albums": "Álbuns no Dispositivo", "library_page_new_album": "Novo album", + "library_page_sort_asset_count": "Quantidade de arquivos", + "library_page_sort_created": "Data de criaÃ§ÃŖo", + "library_page_sort_last_modified": "Última modificaÃ§ÃŖo", + "library_page_sort_title": "Título do ÃĄlbum", "light": "Claro", "like_deleted": "Curtida excluída", "link_motion_video": "Relacionar video animado", @@ -920,22 +1120,42 @@ "list": "Lista", "loading": "Carregando", "loading_search_results_failed": "Falha ao carregar os resultados da pesquisa", + "local_network": "Rede local", + "local_network_sheet_info": "O aplicativo irÃĄ se conectar ao servidor atravÊs desta URL quando estiver na rede Wi-Fi especificada", + "location_permission": "PermissÃŖo de localizaÃ§ÃŖo", + "location_permission_content": "Para utilizar a funÃ§ÃŖo de troca automÃĄtica de URL, Ê necessÃĄrio a permissÃŖo de localizaÃ§ÃŖo precisa, para que seja possível ler o nome da rede Wi-Fi.", + "location_picker_choose_on_map": "Escolha no mapa", + "location_picker_latitude_error": "Digite uma latitude vÃĄlida", + "location_picker_latitude_hint": "Digite a latitude", + "location_picker_longitude_error": "Digite uma longitude vÃĄlida", + "location_picker_longitude_hint": "Digite a longitude", "log_out": "Sair", "log_out_all_devices": "Sair de todos dispositivos", "logged_out_all_devices": "Saiu de todos os dispositivos", "logged_out_device": "Dispositivo desconectado", "login": "Iniciar sessÃŖo", + "login_disabled": "Login desativado", + "login_form_api_exception": "Erro de API. Verifique a URL do servidor e tente novamente.", + "login_form_back_button_text": "Voltar", "login_form_email_hint": "youremail@email.com", "login_form_endpoint_hint": "http://your-server-ip:port", "login_form_endpoint_url": "Server Endpoint URL", "login_form_err_http": "Please specify http:// or https://", "login_form_err_invalid_email": "E-mail invÃĄlido", + "login_form_err_invalid_url": "URL InvÃĄlida", "login_form_err_leading_whitespace": "Leading whitespace", "login_form_err_trailing_whitespace": "Trailing whitespace", + "login_form_failed_get_oauth_server_config": "Erro de login com OAuth, verifique a URL do servidor", + "login_form_failed_get_oauth_server_disable": "O recurso OAuth nÃŖo estÃĄ disponível neste servidor", "login_form_failed_login": "Erro ao fazer login, verifique a url do servidor, e-mail e senha", + "login_form_handshake_exception": "Houve um erro de autorizaÃ§ÃŖo com o servidor. Se estiver utilizando um certificado auto assinado, ative o suporte a isso nas configuraçÃĩes.", "login_form_password_hint": "password", "login_form_save_login": "Permaneçer conectado", + "login_form_server_empty": "Digite a URL do servidor.", + "login_form_server_error": "NÃŖo foi possível conectar ao servidor.", "login_has_been_disabled": "Login foi desativado.", + "login_password_changed_error": "Erro ao atualizar a sua senha", + "login_password_changed_success": "Senha atualizada com sucesso", "logout_all_device_confirmation": "Tem certeza de que deseja sair de todos os dispositivos?", "logout_this_device_confirmation": "Tem certeza de que deseja sair deste dispositivo?", "longitude": "Longitude", @@ -953,13 +1173,43 @@ "manage_your_devices": "Gerenciar seus dispositivos logados", "manage_your_oauth_connection": "Gerenciar sua conexÃŖo OAuth", "map": "Mapa", + "map_assets_in_bound": "{} foto", + "map_assets_in_bounds": "{} fotos", + "map_cannot_get_user_location": "NÃŖo foi possível obter a sua localizaÃ§ÃŖo", + "map_location_dialog_yes": "Sim", + "map_location_picker_page_use_location": "Use esta localizaÃ§ÃŖo", + "map_location_service_disabled_content": "O serviço de localizaÃ§ÃŖo precisa estar ativado para exibir os arquivos da sua localizaÃ§ÃŖo atual. Deseja ativar agora?", + "map_location_service_disabled_title": "Serviço de localizaÃ§ÃŖo desativado", "map_marker_for_images": "Marcador de mapa para imagens tiradas em {city}, {country}", "map_marker_with_image": "Marcador de mapa com imagem", + "map_no_assets_in_bounds": "NÃŖo hÃĄ fotos nesta ÃĄrea", + "map_no_location_permission_content": "É necessÃĄria a permissÃŖo de localizaÃ§ÃŖo para exibir os arquivos da sua localizaÃ§ÃŖo atual. Deseja conceder a permissÃŖo agora?", + "map_no_location_permission_title": "PermissÃŖo de localizaÃ§ÃŖo foi negada", "map_settings": "DefiniçÃĩes do mapa", + "map_settings_dark_mode": "Modo escuro", + "map_settings_date_range_option_day": "Últimas 24 horas", + "map_settings_date_range_option_days": "Últimos {} dias", + "map_settings_date_range_option_year": "Último ano", + "map_settings_date_range_option_years": "Últimos {} anos", + "map_settings_dialog_title": "ConfiguraçÃĩes do mapa", + "map_settings_include_show_archived": "Incluir arquivados", + "map_settings_include_show_partners": "Incluir parceiros", + "map_settings_only_show_favorites": "Mostrar apenas favoritos", + "map_settings_theme_settings": "Tema do mapa", + "map_zoom_to_see_photos": "Diminua o zoom para ver mais fotos", + "mark_all_as_read": "Marcar tudo como lido", + "mark_as_read": "Marcar como lido", + "marked_all_as_read": "Tudo marcado como lido", "matches": "CorrespondÃĒncias", "media_type": "Tipo de mídia", "memories": "MemÃŗrias", + "memories_all_caught_up": "Finalizamos por hoje", + "memories_check_back_tomorrow": "Volte amanhÃŖ para ver mais lembranças", "memories_setting_description": "Gerencie o que vÃĒ em suas memÃŗrias", + "memories_start_over": "Ver de novo", + "memories_swipe_to_close": "Deslize para cima para fechar", + "memories_year_ago": "Um ano atrÃĄs", + "memories_years_ago": "{} anos atrÃĄs", "memory": "MemÃŗria", "memory_lane_title": "Trilha das RecordaçÃĩes {title}", "menu": "Menu", @@ -976,11 +1226,17 @@ "month": "MÃĒs", "monthly_title_text_date_format": "MMMM y", "more": "Mais", + "moved_to_archive": "{count, plural, one {# mídia foi arquivada} other {# mídias foram arquivadas}}", + "moved_to_library": "{count, plural, one {# arquivo foi enviado} other {# arquivos foram enviados}} à biblioteca", "moved_to_trash": "Enviado para a lixeira", + "multiselect_grid_edit_date_time_err_read_only": "NÃŖo Ê possível editar a data do(s) arquivo(s) somente leitura, pulando", + "multiselect_grid_edit_gps_err_read_only": "NÃŖo Ê possível editar a localizaÃ§ÃŖo dos arquivos somente leitura, ignorando", "mute_memories": "Silenciar memÃŗrias", "my_albums": "Meus Álbuns", "name": "Nome", "name_or_nickname": "Nome ou apelido", + "networking_settings": "ConexÃĩes", + "networking_subtitle": "Gerencie as conexÃĩes ao servidor", "never": "Nunca", "new_album": "Novo Álbum", "new_api_key": "Nova Chave de API", @@ -997,19 +1253,27 @@ "no_albums_yet": "Parece que vocÃĒ ainda nÃŖo tem nenhum ÃĄlbum.", "no_archived_assets_message": "Arquive fotos e vídeos para os ocultar da sua visualizaÃ§ÃŖo de fotos", "no_assets_message": "CLIQUE PARA CARREGAR SUA PRIMEIRA FOTO", + "no_assets_to_show": "NÃŖo hÃĄ arquivos para exibir", "no_duplicates_found": "Nenhuma duplicidade foi encontrada.", "no_exif_info_available": "Sem informaçÃĩes exif disponíveis", "no_explore_results_message": "Carregue mais fotos para explorar sua coleÃ§ÃŖo.", "no_favorites_message": "Adicione aos favoritos para encontrar suas melhores fotos e vídeos rapidamente", "no_libraries_message": "Crie uma biblioteca externa para ver suas fotos e vídeos", "no_name": "Sem Nome", + "no_notifications": "Nenhuma notificaÃ§ÃŖo", + "no_people_found": "Nenhuma pessoa encontrada", "no_places": "Sem lugares", "no_results": "Sem resultados", "no_results_description": "Tente um sinônimo ou uma palavra-chave mais geral", "no_shared_albums_message": "Crie um ÃĄlbum para compartilhar fotos e vídeos com pessoas em sua rede", "not_in_any_album": "Fora de ÃĄlbum", + "not_selected": "NÃŖo selecionado", "note_apply_storage_label_to_previously_uploaded assets": "Nota: Para aplicar o rÃŗtulo de armazenamento a arquivos carregados anteriormente, execute o", "notes": "Notas", + "notification_permission_dialog_content": "Para ativar as notificaçÃĩes, vÃĄ em ConfiguraçÃĩes e selecione permitir.", + "notification_permission_list_tile_content": "Conceda permissÃŖo para ativar notificaçÃĩes.", + "notification_permission_list_tile_enable_button": "Ativar notificaçÃĩes", + "notification_permission_list_tile_title": "PermissÃŖo de notificaçÃĩes", "notification_toggle_setting_description": "Habilitar notificaçÃĩes por e-mail", "notifications": "NotificaçÃĩes", "notifications_setting_description": "Gerenciar notificaçÃĩes", @@ -1020,6 +1284,7 @@ "offline_paths_description": "Estes resultados podem ser devidos a arquivos deletados manualmente e que nÃŖo sÃŖo parte de uma biblioteca externa.", "ok": "Ok", "oldest_first": "Mais antigo primeiro", + "on_this_device": "Neste dispositivo", "onboarding": "IntegraÃ§ÃŖo", "onboarding_privacy_description": "As seguintes funçÃĩes opcionais dependem de serviços externos e podem ser desabilitadas a qualquer momento nas configuraçÃĩes de administraÃ§ÃŖo.", "onboarding_theme_description": "Escolha um tema de cores para sua instÃĸncia. VocÃĒ pode alterar isso posteriormente em suas configuraçÃĩes.", @@ -1027,6 +1292,7 @@ "onboarding_welcome_user": "Bem-vindo, {user}", "online": "Online", "only_favorites": "Somente favoritos", + "open": "Abrir", "open_in_map_view": "Mostrar no mapa", "open_in_openstreetmap": "Abrir no OpenStreetMap", "open_the_search_filters": "Abre os filtros de pesquisa", @@ -1043,6 +1309,14 @@ "partner_can_access": "{partner} pode acessar", "partner_can_access_assets": "Todas suas fotos e vídeos, excetos os Arquivados ou Excluídos", "partner_can_access_location": "A localizaÃ§ÃŖo onde as fotos foram tiradas", + "partner_list_user_photos": "Fotos de {user}", + "partner_list_view_all": "Ver tudo", + "partner_page_empty_message": "As suas fotos ainda nÃŖo foram compartilhadas com nenhum parceiro.", + "partner_page_no_more_users": "NÃŖo hÃĄ mais usuÃĄrios para adicionar", + "partner_page_partner_add_failed": "Falha ao adicionar parceiro", + "partner_page_select_partner": "Selecione o parceiro", + "partner_page_shared_to_title": "Compartilhado com", + "partner_page_stop_sharing_content": "{} nÃŖo poderÃĄ mais acessar as suas fotos.", "partner_sharing": "Compartilhamento com Parceiro", "partners": "Parceiros", "password": "Senha", @@ -1071,6 +1345,14 @@ "permanently_delete_assets_prompt": "VocÃĒ tem certeza de que deseja excluir permanentemente {count, plural, one {este ativo?} other {estes # ativos?}} Esta aÃ§ÃŖo tambÊm removerÃĄ {count, plural, one {o ativo} other {os ativos}} de um ou mais ÃĄlbuns.", "permanently_deleted_asset": "Arquivo deletado permanentemente", "permanently_deleted_assets_count": "{count, plural, one {# arquivo permanentemente excluído} other {# arquivos permanentemente excluídos}}", + "permission_onboarding_back": "Voltar", + "permission_onboarding_continue_anyway": "Continuar assim mesmo", + "permission_onboarding_get_started": "Começar", + "permission_onboarding_go_to_settings": "Ir para as configuraçÃĩes", + "permission_onboarding_permission_denied": "PermissÃŖo negada. Para utilizar o Immich, conceda permissÃĩes de fotos e vídeo nas configuraçÃĩes.", + "permission_onboarding_permission_granted": "PermissÃŖo concedida! Tudo pronto.", + "permission_onboarding_permission_limited": "PermissÃŖo limitada. Para permitir que o Immich faça backups e gerencie sua galeria, conceda permissÃĩes para fotos e vídeos nas configuraçÃĩes.", + "permission_onboarding_request": "Immich requer permissÃŖo para visualizar suas fotos e vídeos.", "person": "Pessoa", "person_birthdate": "Nasceu em {date}", "person_hidden": "{name}{hidden, select, true { (oculto)} other {}}", @@ -1088,6 +1370,8 @@ "play_motion_photo": "Reproduzir foto em movimento", "play_or_pause_video": "Reproduzir ou Pausar vídeo", "port": "Porta", + "preferences_settings_subtitle": "Gerenciar as preferÃĒncias do aplicativo", + "preferences_settings_title": "PreferÃĒncias", "preset": "PredefiniÃ§ÃŖo", "preview": "PrÊ-visualizar", "previous": "Anterior", @@ -1095,7 +1379,13 @@ "previous_or_next_photo": "Foto anterior ou prÃŗxima", "primary": "PrimÃĄrio", "privacy": "Privacidade", + "profile_drawer_app_logs": "Logs", + "profile_drawer_client_out_of_date_major": "O aplicativo estÃĄ desatualizado. Por favor, atualize para a versÃŖo mais recente.", + "profile_drawer_client_out_of_date_minor": "O aplicativo estÃĄ desatualizado. Por favor, atualize para a versÃŖo mais recente.", "profile_drawer_client_server_up_to_date": "Cliente e Servidor estÃŖo atualizados", + "profile_drawer_github": "GitHub", + "profile_drawer_server_out_of_date_major": "O servidor estÃĄ desatualizado. Atualize para a versÃŖo principal mais recente.", + "profile_drawer_server_out_of_date_minor": "O servidor estÃĄ desatualizado. Atualize para a versÃŖo mais recente.", "profile_image_of_user": "Imagem do perfil de {user}", "profile_picture_set": "Foto de perfil definida.", "public_album": "Álbum pÃēblico", @@ -1145,6 +1435,10 @@ "recent": "Recente", "recent-albums": "Álbuns recentes", "recent_searches": "Pesquisas recentes", + "recently_added": "Adicionado recentemente", + "recently_added_page_title": "Adicionados recentemente", + "recently_taken": "Tirada recentemente", + "recently_taken_page_title": "Tiradas recentemente", "refresh": "Atualizar", "refresh_encoded_videos": "Atualizar vídeos codificados", "refresh_faces": "Atualizar rostos", @@ -1201,10 +1495,12 @@ "role_editor": "Editor", "role_viewer": "Visualizador", "save": "Salvar", + "save_to_gallery": "Salvar na galeria", "saved_api_key": "Chave de API salva", "saved_profile": "Perfil Salvo", "saved_settings": "ConfiguraçÃĩes salvas", "say_something": "Diga algo", + "scaffold_body_error_occurred": "Ocorreu um erro", "scan_all_libraries": "Escanear Todas Bibliotecas", "scan_library": "Escanear", "scan_settings": "OpçÃĩes de escanear", @@ -1220,20 +1516,45 @@ "search_camera_model": "Pesquisar cÃĸmera do modelo...", "search_city": "Pesquisar cidade...", "search_country": "Pesquisar país...", + "search_filter_apply": "Aplicar filtro", + "search_filter_camera_title": "Selecione o tipo de cÃĸmera", + "search_filter_date": "Data", + "search_filter_date_interval": "de {start} atÊ {end}", + "search_filter_date_title": "Selecione o intervalo de datas", + "search_filter_display_option_not_in_album": "NÃŖo estÃĄ em nenhum ÃĄlbum", + "search_filter_display_options": "OpçÃĩes de exibiÃ§ÃŖo", + "search_filter_filename": "Pesquisar por nome de arquivo", + "search_filter_location": "LocalizaÃ§ÃŖo", + "search_filter_location_title": "Selecione a localizaÃ§ÃŖo", + "search_filter_media_type": "Tipo de mídia", + "search_filter_media_type_title": "Selecione o tipo de mídia", + "search_filter_people_title": "Selecione pessoas", "search_for": "Pesquisar por", "search_for_existing_person": "Pesquisar por pessoas", + "search_no_more_result": "NÃŖo hÃĄ mais resultados", "search_no_people": "Nenhuma pessoa", "search_no_people_named": "Nenhuma pessoa chamada \"{name}\"", + "search_no_result": "Nenhum resultado encontrado, tente pesquisar por algo diferente", "search_options": "OpçÃĩes de pesquisa", + "search_page_categories": "Categorias", + "search_page_motion_photos": "Fotos com movimento", "search_page_no_objects": "Nenhuma informaÃ§ÃŖo de objeto disponível", "search_page_no_places": "Nenhuma informaÃ§ÃŖo de lugares disponível", + "search_page_screenshots": "Capturas de tela", + "search_page_search_photos_videos": "Pesquise suas fotos e vídeos", + "search_page_selfies": "Selfies", "search_page_things": "Coisas", + "search_page_view_all_button": "Ver tudo", + "search_page_your_activity": "Sua atividade", + "search_page_your_map": "Seu mapa", "search_people": "Pesquisar pessoas", "search_places": "Pesquisar lugares", "search_rating": "Pesquisar por classificaÃ§ÃŖo...", "search_result_page_new_search_hint": "Nova pesquisa", "search_settings": "ConfiguraçÃĩes de pesquisa", "search_state": "Pesquisar estado...", + "search_suggestion_list_smart_search_hint_1": "A pesquisa inteligente Ê utilizada por padrÃŖo, para pesquisar por metadados, use a sintaxe ", + "search_suggestion_list_smart_search_hint_2": "m:seu-termo-de-pesquisa", "search_tags": "Procurar marcadores...", "search_timezone": "Pesquisar fuso horÃĄrio...", "search_type": "Pesquisar tipo", @@ -1252,6 +1573,7 @@ "select_keep_all": "Marcar manter em todos", "select_library_owner": "Selecione o dono da biblioteca", "select_new_face": "Selecionar novo rosto", + "select_person_to_tag": "Selecione uma pessoa para marcar", "select_photos": "Selecionar fotos", "select_trash_all": "Marcar lixo em todos", "select_user_for_sharing_page_err_album": "Falha ao criar ÃĄlbum", @@ -1259,6 +1581,9 @@ "selected_count": "{count, plural, one {# selecionado} other {# selecionados}}", "send_message": "Enviar mensagem", "send_welcome_email": "Enviar E-mail de boas vindas", + "server_endpoint": "URL do servidor", + "server_info_box_app_version": "VersÃŖo do aplicativo", + "server_info_box_server_url": "URL do servidor", "server_offline": "Servidor Indisponível", "server_online": "Servidor Disponível", "server_stats": "Status do servidor", @@ -1270,20 +1595,82 @@ "set_date_of_birth": "Definir data de nascimento", "set_profile_picture": "Definir foto de perfil", "set_slideshow_to_fullscreen": "ApresentaÃ§ÃŖo em tela cheia", + "setting_image_viewer_help": "O visualizador de imagens carrega primeiro a miniatura pequena, depois carrega a imagem de tamanho mÊdio (se ativado) e, por fim, carrega o original (se ativado).", + "setting_image_viewer_original_subtitle": "Ative para carregar a imagem original em resoluÃ§ÃŖo mÃĄxima (grande!). Desative para reduzir o uso de dados (tanto na rede quanto no cache do dispositivo).", + "setting_image_viewer_original_title": "Carregar imagem original", + "setting_image_viewer_preview_subtitle": "Ative para carregar uma imagem de resoluÃ§ÃŖo mÊdia. Desative para carregar diretamente o original ou usar apenas a miniatura.", + "setting_image_viewer_preview_title": "Carregar imagem de prÊ-visualizaÃ§ÃŖo", + "setting_image_viewer_title": "Imagens", + "setting_languages_apply": "Aplicar", + "setting_languages_subtitle": "Alterar o idioma do aplicativo", + "setting_languages_title": "Idiomas", + "setting_notifications_notify_failures_grace_period": "Notifique falhas de backup em segundo plano: {}", + "setting_notifications_notify_hours": "{} horas", + "setting_notifications_notify_immediately": "imediatamente", + "setting_notifications_notify_minutes": "{} minutos", + "setting_notifications_notify_never": "nunca", + "setting_notifications_notify_seconds": "{} segundos", + "setting_notifications_single_progress_subtitle": "InformaçÃĩes detalhadas sobre o progresso do envio por arquivo", + "setting_notifications_single_progress_title": "Mostrar detalhes do progresso do backup em segundo plano", + "setting_notifications_subtitle": "Ajuste suas preferÃĒncias de notificaÃ§ÃŖo", + "setting_notifications_total_progress_subtitle": "Progresso do envio de arquivos (concluídos/total)", + "setting_notifications_total_progress_title": "Mostrar o progresso total do backup em segundo plano", + "setting_video_viewer_looping_title": "Repetir", + "setting_video_viewer_original_video_subtitle": "Ao transmitir um vídeo do servidor, usar o arquivo original, mesmo quando uma versÃŖo transcodificada esteja disponível. Pode fazer com que o vídeo demore para carregar. Vídeos disponíveis localmente sÃŖo exibidos na qualidade original independente desta configuraÃ§ÃŖo.", + "setting_video_viewer_original_video_title": "Forçar vídeo original", "settings": "ConfiguraçÃĩes", + "settings_require_restart": "Reinicie o Immich para aplicar esta configuraÃ§ÃŖo", "settings_saved": "ConfiguraçÃĩes salvas", "share": "Compartilhar", "share_add_photos": "Adicionar fotos", + "share_assets_selected": "{} selecionado", "share_dialog_preparing": "Preparando...", "shared": "Compartilhado", + "shared_album_activities_input_disable": "ComentÃĄrios desativados", + "shared_album_activity_remove_content": "Deseja excluir esta atividade?", + "shared_album_activity_remove_title": "Excluir atividade", + "shared_album_section_people_action_error": "Erro ao sair/remover do ÃĄlbum", + "shared_album_section_people_action_leave": "Sair do ÃĄlbum", + "shared_album_section_people_action_remove_user": "Remover usuÃĄrio do ÃĄlbum", + "shared_album_section_people_title": "PESSOAS", "shared_by": "Compartilhado por", "shared_by_user": "Compartilhado por {user}", "shared_by_you": "Compartilhado por vocÃĒ", "shared_from_partner": "Fotos de {partner}", + "shared_intent_upload_button_progress_text": "Enviados {} de {}", + "shared_link_app_bar_title": "Links compartilhados", + "shared_link_clipboard_copied_massage": "Copiado para a ÃĄrea de transferÃĒncia", + "shared_link_clipboard_text": "Link: {}\nSenha: {}", + "shared_link_create_error": "Erro ao criar o link compartilhado", + "shared_link_edit_description_hint": "Digite a descriÃ§ÃŖo do compartilhamento", + "shared_link_edit_expire_after_option_day": "1 dia", + "shared_link_edit_expire_after_option_days": "{} dias", + "shared_link_edit_expire_after_option_hour": "1 hora", + "shared_link_edit_expire_after_option_hours": "{} horas", + "shared_link_edit_expire_after_option_minute": "1 minuto", + "shared_link_edit_expire_after_option_minutes": "{} minutos", + "shared_link_edit_expire_after_option_months": "{} meses", + "shared_link_edit_expire_after_option_year": "{} ano", + "shared_link_edit_password_hint": "Digite uma senha para proteger este link", + "shared_link_edit_submit_button": "Atualizar link", + "shared_link_error_server_url_fetch": "Erro ao abrir a URL do servidor", + "shared_link_expires_day": "Expira em {} dia", + "shared_link_expires_days": "Expira em {} dias", + "shared_link_expires_hour": "Expira em {} hora", + "shared_link_expires_hours": "Expira em {} horas", + "shared_link_expires_minute": "Expira em {} minuto", + "shared_link_expires_minutes": "Expira em {} minutos", + "shared_link_expires_never": "Expira em ∞", + "shared_link_expires_second": "Expira em {} segundo", + "shared_link_expires_seconds": "Expira em {} segundos", + "shared_link_individual_shared": "Compartilhado Individualmente", + "shared_link_info_chip_metadata": "EXIF", + "shared_link_manage_links": "Gerenciar links compartilhados", "shared_link_options": "OpçÃĩes de link compartilhado", "shared_links": "Links compartilhados", "shared_links_description": "Compartilhar fotos e videos com um link", "shared_photos_and_videos_count": "{assetCount, plural, one {# Foto & vídeo compartilhado.} other {# Fotos & vídeos compartilhados.}}", + "shared_with_me": "Compartilhado comigo", "shared_with_partner": "Compartilhado com {partner}", "sharing": "Compartilhamento", "sharing_enter_password": "Digite a senha para visualizar esta pÃĄgina.", @@ -1334,12 +1721,12 @@ "sort_recent": "Foto mais recente", "sort_title": "Título", "source": "Fonte", - "stack": "Empilhar", - "stack_duplicates": "Empilhar duplicados", - "stack_select_one_photo": "Selecione uma foto principal para a pilha", - "stack_selected_photos": "Empilhar fotos selecionadas", - "stacked_assets_count": "{count, plural, one {# Arquivo empilhado} other {# Arquivos empilhados}}", - "stacktrace": "Rastreamento de pilha", + "stack": "Agrupar", + "stack_duplicates": "Agrupar duplicados", + "stack_select_one_photo": "Selecione uma foto principal para o grupo", + "stack_selected_photos": "Agrupar fotos selecionadas", + "stacked_assets_count": "{count, plural, one {# arquivo adicionado} other {# arquivos adicionados}} ao grupo", + "stacktrace": "Stacktrace", "start": "Início", "start_date": "Data inicial", "state": "Estado", @@ -1359,6 +1746,9 @@ "support_third_party_description": "Sua instalaÃ§ÃŖo do Immich Ê fornecida por terceiros. É possível que problemas sejam causados por eles, por isso, se tiver problemas, procure primeiro ajuda com eles utilizando os links abaixo.", "swap_merge_direction": "Alternar direÃ§ÃŖo da mesclagem", "sync": "Sincronizar", + "sync_albums": "Sincronizar ÃĄlbuns", + "sync_albums_manual_subtitle": "Sincronize todos as fotos e vídeos enviados para os ÃĄlbuns de backup selecionados", + "sync_upload_album_setting_subtitle": "Crie e envie suas fotos e vídeos para o ÃĄlbum selecionado no Immich", "tag": "Marcador", "tag_assets": "Marcar arquivos", "tag_created": "Marcador criado: {tag}", @@ -1372,8 +1762,15 @@ "theme": "Tema", "theme_selection": "Selecionar tema", "theme_selection_description": "Defina automaticamente o tema como claro ou escuro com base na preferÃĒncia do sistema do seu navegador", + "theme_setting_asset_list_storage_indicator_title": "Mostrar indicador de armazenamento na grade de fotos", + "theme_setting_asset_list_tiles_per_row_title": "Quantidade de arquivos por linha ({})", + "theme_setting_colorful_interface_subtitle": "Aplica a cor primÃĄria ao fundo", + "theme_setting_colorful_interface_title": "Interface colorida", "theme_setting_image_viewer_quality_subtitle": "Ajuste a qualidade de imagens detalhadas do visualizador", "theme_setting_image_viewer_quality_title": "Qualidade das imagens do visualizador", + "theme_setting_primary_color_subtitle": "Selecione uma cor para açÃĩes principais e realces.", + "theme_setting_primary_color_title": "Cor primÃĄria", + "theme_setting_system_primary_color_title": "Usar a cor do sistema", "theme_setting_system_theme_switch": "AutomÃĄtico (seguir a configuraÃ§ÃŖo do sistema)", "theme_setting_theme_subtitle": "Escolha a configuraÃ§ÃŖo de tema do app", "theme_setting_three_stage_loading_subtitle": "O carregamento em trÃĒs estÃĄgios oferece a imagem de melhor qualidade em troca de uma velocidade de carregamento mais lenta", @@ -1397,7 +1794,15 @@ "trash_all": "Mover todos para o lixo", "trash_count": "Lixo {count, number}", "trash_delete_asset": "Jogar na lixeira/Excluir Arquivo", + "trash_emptied": "Lixeira esvaziada", "trash_no_results_message": "Fotos e vídeos enviados para o lixo aparecem aqui.", + "trash_page_delete_all": "Excluir tudo", + "trash_page_empty_trash_dialog_content": "Deseja esvaziar a lixera? Estes arquivos serÃŖo apagados de forma permanente do Immich", + "trash_page_info": "Os itens da lixeira sÃŖo excluídos de forma permanente apÃŗs {} dias", + "trash_page_no_assets": "Lixeira vazia", + "trash_page_restore_all": "Restaurar tudo", + "trash_page_select_assets_btn": "Selecionar arquivos", + "trash_page_title": "Lixeira ({})", "trashed_items_will_be_permanently_deleted_after": "Os itens da lixeira serÃŖo deletados permanentemente apÃŗs {days, plural, one {# dia} other {# dias}}.", "type": "Tipo", "unarchive": "Desarquivar", @@ -1418,14 +1823,16 @@ "unsaved_change": "AlteraÃ§ÃŖo nÃŖo salva", "unselect_all": "Desselecionar todos", "unselect_all_duplicates": "Desselecionar todas as duplicatas", - "unstack": "Desempilhar", - "unstacked_assets_count": "{count, plural, one {# Arquivo desempilhado} other {# Arquivos desempilhados}}", + "unstack": "Retirar do grupo", + "unstacked_assets_count": "{count, plural, one {# arquivo retirado} other {# arquivos retirados}} do grupo", "untracked_files": "Arquivos nÃŖo monitorados", "untracked_files_decription": "Estes arquivos nÃŖo sÃŖo monitorados pela aplicaÃ§ÃŖo. Podem ser resultados de falhas em uma movimentaÃ§ÃŖo, carregamentos interrompidos, ou deixados para trÃĄs por causa de um problema", "up_next": "A seguir", "updated_password": "Senha atualizada", "upload": "Carregar", "upload_concurrency": "Envios simultÃĸneos", + "upload_dialog_info": "Deseja fazer o backup dos arquivos selecionados no servidor?", + "upload_dialog_title": "Enviar arquivo", "upload_errors": "Envio concluído com {count, plural, one {# erro} other {# erros}}, atualize a pÃĄgina para ver os novos arquivos carregados.", "upload_progress": "{remaining, number} restantes - {processed, number}/{total, number} jÃĄ processados", "upload_skipped_duplicates": "{count, plural, one {# Arquivo duplicado foi ignorado} other {# Arquivos duplicados foram ignorados}}", @@ -1433,8 +1840,11 @@ "upload_status_errors": "Erros", "upload_status_uploaded": "Carregado", "upload_success": "Carregado com sucesso, atualize a pÃĄgina para ver os novos arquivos.", + "upload_to_immich": "Enviar para o Immich ({})", + "uploading": "Enviando", "url": "URL", "usage": "Uso", + "use_current_connection": "usar conexÃŖo atual", "use_custom_date_range": "Usar intervalo de datas personalizado", "user": "UsuÃĄrio", "user_id": "ID do usuÃĄrio", @@ -1449,6 +1859,7 @@ "users": "UsuÃĄrios", "utilities": "Ferramentas", "validate": "Validar", + "validate_endpoint_error": "Digite uma URL vÃĄlida", "variables": "VariÃĄveis", "version": "VersÃŖo", "version_announcement_closing": "De seu amigo, Alex", @@ -1476,16 +1887,21 @@ "view_next_asset": "Ver prÃŗximo arquivo", "view_previous_asset": "Ver arquivo anterior", "view_qr_code": "Ver QR Code", - "view_stack": "Ver Pilha", + "view_stack": "Ver grupo", + "viewer_remove_from_stack": "Remover do grupo", + "viewer_stack_use_as_main_asset": "Usar como foto principal", + "viewer_unstack": "Desagrupar", "visibility_changed": "A visibilidade de {count, plural, one {# pessoa foi alterada} other {# pessoas foram alteradas}}", "waiting": "Na fila", "warning": "Aviso", "week": "Semana", - "welcome": "Bem-vindo", - "welcome_to_immich": "Bem-vindo ao Immich", + "welcome": "Bem-vindo(a)", + "welcome_to_immich": "Bem-vindo(a) ao Immich", + "wifi_name": "Nome do Wi-Fi", "year": "Ano", "years_ago": "{years, plural, one {# ano} other {# anos}} atrÃĄs", "yes": "Sim", - "you_dont_have_any_shared_links": "VocÃĒ nÃŖo possui links compartilhados", + "you_dont_have_any_shared_links": "NÃŖo hÃĄ links compartilhados", + "your_wifi_name": "Nome do seu Wi-Fi", "zoom_image": "Ampliar imagem" } diff --git a/i18n/ro.json b/i18n/ro.json index 82bdc6d1dd..80f5ed4650 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Auto ÃŽnregistrare", "oauth_auto_register_description": "Înregistrează automat utilizatori noi după autentificarea cu OAuth", "oauth_button_text": "Text buton", - "oauth_client_id": "ID Client", - "oauth_client_secret": "Secret client", "oauth_enable_description": "Autentifică-te cu OAuth", - "oauth_issuer_url": "Emitentul URL", "oauth_mobile_redirect_uri": "URI de redirecționare mobilă", "oauth_mobile_redirect_uri_override": "Înlocuire URI de redirecționare mobilă", "oauth_mobile_redirect_uri_override_description": "Activați atunci cÃĸnd furnizorul OAuth nu permite un URI mobil, precum '{callback}'", - "oauth_profile_signing_algorithm": "Algoritm de semnare a profilului", - "oauth_profile_signing_algorithm_description": "Algoritm folosit pentru a semna profilul utilizatorului.", - "oauth_scope": "Domeniul de aplicare", "oauth_settings": "OAuth", "oauth_settings_description": "Gestionați setările de conectare OAuth", "oauth_settings_more_details": "Pentru mai multe detalii despre aceastĮŽ funcționalitate, verificĮŽ documentația.", - "oauth_signing_algorithm": "Algoritm de semnare", "oauth_storage_label_claim": "Revendicare eticheta de stocare", "oauth_storage_label_claim_description": "Setați automat eticheta de stocare a utilizatorului la valoarea acestei revendicări.", "oauth_storage_quota_claim": "Revendicare spațiu de stocare", diff --git a/i18n/ru.json b/i18n/ru.json index a78a9d6701..bc230a3d29 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -49,13 +49,13 @@ "cleared_jobs": "ĐžŅ‡Đ¸Ņ‰ĐĩĐŊŅ‹ ĐˇĐ°Đ´Đ°Ņ‡Đ¸ Đ´ĐģŅ: {job}", "config_set_by_file": "ĐĐ°ŅŅ‚Ņ€ĐžĐĩĐŊĐž ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ Ņ„Đ°ĐšĐģа ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸Đ¸", "confirm_delete_library": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ йийĐģĐ¸ĐžŅ‚ĐĩĐē҃ \"{library}\"?", - "confirm_delete_library_assets": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚Ņƒ йийĐģĐ¸ĐžŅ‚ĐĩĐē҃? Đ­Ņ‚Đž ĐąĐĩĐˇĐ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚ĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚ {count, plural, one {# ŅĐžĐ´ĐĩŅ€ĐļиĐŧŅ‹Đš ĐžĐąŅŠĐĩĐēŅ‚} few {# ŅĐžĐ´ĐĩŅ€ĐļиĐŧҋ҅ ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {all # ŅĐžĐ´ĐĩŅ€ĐļиĐŧҋ҅ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} иС Immich. ФаКĐģŅ‹ ĐžŅŅ‚Đ°ĐŊŅƒŅ‚ŅŅ ĐŊа Đ´Đ¸ŅĐēĐĩ.", + "confirm_delete_library_assets": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚Ņƒ йийĐģĐ¸ĐžŅ‚ĐĩĐē҃? Đ­Ņ‚Đž ĐąĐĩĐˇĐ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚ĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ°}} иС Immich. ФаКĐģŅ‹ ĐžŅŅ‚Đ°ĐŊŅƒŅ‚ŅŅ ĐŊа Đ´Đ¸ŅĐēĐĩ.", "confirm_email_below": "Đ§Ņ‚ĐžĐąŅ‹ ĐŋĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ, ввĐĩĐ´Đ¸Ņ‚Đĩ \"{email}\" ĐŊиĐļĐĩ", "confirm_reprocess_all_faces": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐžĐ˛Ņ‚ĐžŅ€ĐŊĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐģĐ¸Ņ†Đ°? Đ‘ŅƒĐ´ŅƒŅ‚ Ņ‚Đ°ĐēĐļĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹ иĐŧĐĩĐŊа ŅĐž Đ˛ŅĐĩŅ… ĐģĐ¸Ņ†.", "confirm_user_password_reset": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅĐąŅ€ĐžŅĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ {user}?", "create_job": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ СадаĐŊиĐĩ", "cron_expression": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ (Đ˛Ņ‹Ņ€Đ°ĐļĐĩĐŊиĐĩ ĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Ņ‰Đ¸Đēа cron)", - "cron_expression_description": "Đ§Đ°ŅŅ‚ĐžŅ‚Đ° и Đ˛Ņ€ĐĩĐŧŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ СадаĐŊĐ¸Ņ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ ĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Ņ‰Đ¸Đēа cron. Đ’ĐžŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚ĐĩҁҌ ĐžĐŊĐģаКĐŊ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ĐžĐŧ Crontab Guru ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸.", + "cron_expression_description": "Đ§Đ°ŅŅ‚ĐžŅ‚Đ° и Đ˛Ņ€ĐĩĐŧŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐĩĐŊĐ¸Ņ СадаĐŊĐ¸Ņ в Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ ĐŋĐģаĐŊĐ¸Ņ€ĐžĐ˛Ņ‰Đ¸Đēа cron. Đ’ĐžŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚ĐĩҁҌ ĐŋŅ€Đ¸ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐžŅŅ‚Đ¸ Đ˛Đ¸ĐˇŅƒĐ°ĐģҌĐŊŅ‹Đŧ Ņ€ĐĩдаĐēŅ‚ĐžŅ€ĐžĐŧ Crontab Guru", "cron_expression_presets": "Đ Đ°ŅĐŋĐ¸ŅĐ°ĐŊиĐĩ (ĐŋŅ€ĐĩĐ´ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐŊŅ‹Đĩ Đ˛Đ°Ņ€Đ¸Đ°ĐŊ҂ҋ)", "disable_login": "ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ˛Ņ…ĐžĐ´", "duplicate_detection_job_description": "ЗаĐŋ҃ҁĐēаĐĩŅ‚ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ĐŋĐžŅ…ĐžĐļĐ¸Ņ… Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиК ĐŋŅ€Đ¸ ĐŋĐžĐŧĐžŅ‰Đ¸ ĐŧĐ°ŅˆĐ¸ĐŊĐŊĐžĐŗĐž ĐˇŅ€ĐĩĐŊĐ¸Ņ (ĐˇĐ°Đ˛Đ¸ŅĐ¸Ņ‚ ĐžŅ‚ ҃ĐŧĐŊĐžĐŗĐž ĐŋĐžĐ¸ŅĐēа)", @@ -192,26 +192,22 @@ "oauth_auto_register": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐ°Ņ Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ", "oauth_auto_register_description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŊĐžĐ˛Ņ‹Ņ… ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš ĐŋŅ€Đ¸ Đ˛Ņ…ĐžĐ´Đĩ в ŅĐ¸ŅŅ‚ĐĩĐŧ҃ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ OAuth", "oauth_button_text": "ĐĸĐĩĐēҁ҂ ĐēĐŊĐžĐŋĐēи", - "oauth_client_id": "ID КĐģиĐĩĐŊŅ‚Đ°", - "oauth_client_secret": "ĐĄĐĩĐēŅ€ĐĩŅ‚ КĐģиĐĩĐŊŅ‚Đ°", + "oauth_client_secret_description": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐĩҁĐģи PKCE (Proof Key for Code Exchange) ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ OAuth ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€ĐžĐŧ", "oauth_enable_description": "Đ’Ņ…ĐžĐ´ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ OAuth", - "oauth_issuer_url": "URL-Đ°Đ´Ņ€Đĩҁ ŅĐŧĐ¸Ņ‚ĐĩĐŊŅ‚Đ°", "oauth_mobile_redirect_uri": "URI Ņ€ĐĩĐ´Đ¸Ņ€ĐĩĐēŅ‚Đ° Đ´ĐģŅ ĐŧОйиĐģҌĐŊҋ҅", "oauth_mobile_redirect_uri_override": "ПĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ URI Đ´ĐģŅ ĐŧОйиĐģҌĐŊҋ҅ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛", "oauth_mobile_redirect_uri_override_description": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ, ĐĩҁĐģи ĐŋĐžŅŅ‚Đ°Đ˛Ņ‰Đ¸Đē OAuth ĐŊĐĩ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ°ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ ĐŧОйиĐģҌĐŊĐžĐŗĐž URI, ĐŊаĐŋŅ€Đ¸ĐŧĐĩŅ€, '{callback}'", - "oauth_profile_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ ĐŋОдĐŋĐ¸ŅĐ¸ ĐŋŅ€ĐžŅ„Đ¸ĐģŅ", - "oauth_profile_signing_algorithm_description": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ, Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Đš Đ´ĐģŅ Đ˛Ņ…ĐžĐ´Đ° в ĐŋŅ€ĐžŅ„Đ¸ĐģҌ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ.", - "oauth_scope": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐ¸Ņ", "oauth_settings": "OAuth", "oauth_settings_description": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēи Đ˛Ņ…ĐžĐ´Đ° ҇ĐĩŅ€ĐĩС OAuth", "oauth_settings_more_details": "ДĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐ¸Ņ Đ´ĐžĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đš Ой ŅŅ‚ĐžĐš Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸ ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚ĐĩҁҌ Đē Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸.", - "oauth_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ ĐŋОдĐŋĐ¸ŅĐ¸", "oauth_storage_label_claim": "ĐĸĐĩĐŗ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸Đ¸ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°", "oauth_storage_label_claim_description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ĐˇĐ°Đ´Đ°Đ˛Đ°Ņ‚ŅŒ Đ´ĐģŅ ĐŧĐĩŅ‚Đēи Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ ŅŅ‚ĐžĐŗĐž ŅƒŅ‚Đ˛ĐĩŅ€ĐļĐ´ĐĩĐŊĐ¸Ņ.", "oauth_storage_quota_claim": "Đ—Đ°ŅĐ˛Đēа ĐŊа ĐēĐ˛ĐžŅ‚Ņƒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ°", "oauth_storage_quota_claim_description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅƒŅŅ‚Đ°ĐŊавĐģĐ¸Đ˛Đ°Ņ‚ŅŒ ĐēĐ˛ĐžŅ‚Ņƒ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ ĐŊа СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ, ҃ĐēаСаĐŊĐŊĐžĐĩ в ŅŅ‚ĐžĐš ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐĩ.", "oauth_storage_quota_default": "ĐšĐ˛ĐžŅ‚Đ° Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đ° ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ (ГБ)", "oauth_storage_quota_default_description": "ĐšĐ˛ĐžŅ‚Đ° в GiB, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐąŅƒĐ´ĐĩŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ, ĐĩҁĐģи ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŊĐĩ СадаĐŊа (ввĐĩĐ´Đ¸Ņ‚Đĩ 0 Đ´ĐģŅ ĐŊĐĩĐžĐŗŅ€Đ°ĐŊĐ¸Ņ‡ĐĩĐŊĐŊОК ĐēĐ˛ĐžŅ‚Ņ‹).", + "oauth_timeout": "ĐĸаКĐŧĐ°ŅƒŅ‚ Đ´ĐģŅ СаĐŋŅ€ĐžŅĐžĐ˛", + "oauth_timeout_description": "МаĐēŅĐ¸ĐŧаĐģҌĐŊĐžĐĩ Đ˛Ņ€ĐĩĐŧŅ, в Ņ‚Đĩ҇ĐĩĐŊиĐĩ ĐēĐžŅ‚ĐžŅ€ĐžĐŗĐž ĐžĐļĐ¸Đ´Đ°Ņ‚ŅŒ ĐžŅ‚Đ˛ĐĩŅ‚Đ°, в ĐŧиĐģĐģĐ¸ŅĐĩĐē҃ĐŊĐ´Đ°Ņ…", "offline_paths": "НĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đĩ ĐŋŅƒŅ‚Đ¸", "offline_paths_description": "Đ­Ņ‚Đ¸ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ‹ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊŅ‹ Ņ€ŅƒŅ‡ĐŊŅ‹Đŧ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩĐŧ Ņ„Đ°ĐšĐģОв, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ Ņ‡Đ°ŅŅ‚ŅŒŅŽ вĐŊĐĩ҈ĐŊĐĩĐš йийĐģĐ¸ĐžŅ‚ĐĩĐēи.", "password_enable_description": "Đ’ĐžĐšŅ‚Đ¸ ĐŋĐž ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Đĩ и ĐŋĐ°Ņ€ĐžĐģŅŽ", @@ -225,7 +221,7 @@ "registration_description": "ĐŸĐžŅĐēĐžĐģҌĐē҃ Đ˛Ņ‹ ŅĐ˛ĐģŅĐĩŅ‚ĐĩҁҌ ĐŋĐĩŅ€Đ˛Ņ‹Đŧ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐŧ в ŅĐ¸ŅŅ‚ĐĩĐŧĐĩ, ваĐŧ ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€Đ¸ŅĐ˛ĐžĐĩĐŊа Ņ€ĐžĐģҌ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°, и Đ˛Ņ‹ ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐžŅ‚Đ˛ĐĩŅ‡Đ°Ņ‚ŅŒ Са адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚Đ¸Đ˛ĐŊŅ‹Đĩ ĐˇĐ°Đ´Đ°Ņ‡Đ¸. ДоĐŋĐžĐģĐŊĐ¸Ņ‚ĐĩĐģҌĐŊҋ҅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš ĐąŅƒĐ´ĐĩŅ‚Đĩ ŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ‚ŅŒ Đ˛Ņ‹.", "repair_all": "ĐŸĐžŅ‡Đ¸ĐŊĐ¸Ņ‚ŅŒ Đ˛ŅŅ‘", "repair_matched_items": "ĐĄĐžĐžŅ‚Đ˛ĐĩŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ {count, plural, one {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Ņƒ} few {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧ} many {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧ} other {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°Đŧ}}", - "repaired_items": "Đ’ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž {count, plural, one {# ŅĐģĐĩĐŧĐĩĐŊŅ‚} few {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°} many {# ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛} other {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°}}", + "repaired_items": "{count, plural, one {Đ’ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ # ŅĐģĐĩĐŧĐĩĐŊŅ‚} many {Đ’ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž # ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛} other {Đ’ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž # ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°}}", "require_password_change_on_login": "ĐĸŅ€ĐĩĐąĐžĐ˛Đ°Ņ‚ŅŒ ҁĐŧĐĩĐŊ҃ ĐŋĐ°Ņ€ĐžĐģŅ ĐŋŅ€Đ¸ ĐŋĐĩŅ€Đ˛ĐžĐŧ Đ˛Ņ…ĐžĐ´Đĩ", "reset_settings_to_default": "ĐĄĐąŅ€ĐžŅ ĐŊĐ°ŅŅ‚Ņ€ĐžĐĩĐē Đ´Đž СĐŊĐ°Ņ‡ĐĩĐŊиК ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ", "reset_settings_to_recent_saved": "ĐĄĐąŅ€ĐžŅŅŒŅ‚Đĩ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи Đē ĐŋĐžŅĐģĐĩĐ´ĐŊиĐŧ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊŅ‹Đŧ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēаĐŧ", @@ -421,7 +417,7 @@ "album_viewer_page_share_add_users": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš", "album_with_link_access": "ПодĐĩĐģĐ¸Ņ‚ĐĩҁҌ ҁҁҋĐģĐēОК ĐŊа аĐģŅŒĐąĐžĐŧ, Ņ‡Ņ‚ĐžĐąŅ‹ Đ˛Đ°ŅˆĐ¸ Đ´Ņ€ŅƒĐˇŅŒŅ ĐŧĐžĐŗĐģи ĐĩĐŗĐž ĐŋĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ.", "albums": "АĐģŅŒĐąĐžĐŧŅ‹", - "albums_count": "{count, plural, one {{count, number} аĐģŅŒĐąĐžĐŧ} few {{count, number} аĐģŅŒĐąĐžĐŧа} many {{count, number} аĐģŅŒĐąĐžĐŧОв} other {{count, number} аĐģŅŒĐąĐžĐŧОв}}", + "albums_count": "{count, plural, one {{count, number} аĐģŅŒĐąĐžĐŧ} few {{count, number} аĐģŅŒĐąĐžĐŧа} many {{count, number} аĐģŅŒĐąĐžĐŧОв} other {{count, number} аĐģŅŒĐąĐžĐŧа}}", "all": "Đ’ŅĐĩ", "all_albums": "Đ’ŅĐĩ аĐģŅŒĐąĐžĐŧŅ‹", "all_people": "Đ’ŅĐĩ ĐģŅŽĐ´Đ¸", @@ -448,7 +444,7 @@ "archive_size": "РаСĐŧĐĩŅ€ Đ°Ņ€Ņ…Đ¸Đ˛Đ°", "archive_size_description": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа Ņ€Đ°ĐˇĐŧĐĩŅ€Đ° Đ°Ņ€Ņ…Đ¸Đ˛Đ° Đ´ĐģŅ ҁĐēĐ°Ņ‡Đ¸Đ˛Đ°ĐŊĐ¸Ņ (в GiB)", "archived": "ĐŅ€Ņ…Đ¸Đ˛", - "archived_count": "{count, plural, other {ĐŅ€Ņ…Đ¸Đ˛Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž #}}", + "archived_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ĐŋĐĩŅ€ĐĩĐŊĐĩҁґĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ĐŋĐĩŅ€ĐĩĐŊĐĩҁĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ĐŋĐĩŅ€ĐĩĐŊĐĩҁĐĩĐŊĐž}} в Đ°Ņ€Ņ…Đ¸Đ˛", "are_these_the_same_person": "Đ­Ņ‚Đž ОдиĐŊ и Ņ‚ĐžŅ‚ ĐļĐĩ ҇ĐĩĐģОвĐĩĐē?", "are_you_sure_to_do_this": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅŅ‚Đž ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ?", "asset_action_delete_err_read_only": "НĐĩвОСĐŧĐžĐļĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐžĐąŅŠĐĩĐēŅ‚(Ņ‹) Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ, ĐŋŅ€ĐžĐŋ҃ҁĐē...", @@ -477,21 +473,21 @@ "asset_viewer_settings_subtitle": "ĐĐ°ŅŅ‚Ņ€ĐžĐšĐēа ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ĐžĐ˛ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ", "asset_viewer_settings_title": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ Đ¸ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиК", "assets": "ĐžĐąŅŠĐĩĐē҂ҋ", - "assets_added_count": "ДобавĐģĐĩĐŊĐž {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", - "assets_added_to_album_count": "В аĐģŅŒĐąĐžĐŧ дОйавĐģĐĩĐŊĐž {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", - "assets_added_to_name_count": "ДобавĐģĐĩĐŊĐž {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} в {hasName, select, true {{name}} other {ĐŊĐžĐ˛Ņ‹Đš аĐģŅŒĐąĐžĐŧ}}", - "assets_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", + "assets_added_count": "{count, plural, one {ДобавĐģĐĩĐŊ # ĐžĐąŅŠĐĩĐēŅ‚} many {ДобавĐģĐĩĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {ДобавĐģĐĩĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚Đ°}}", + "assets_added_to_album_count": "В аĐģŅŒĐąĐžĐŧ {count, plural, one {дОйавĐģĐĩĐŊ # ĐžĐąŅŠĐĩĐēŅ‚} many {дОйавĐģĐĩĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {дОйавĐģĐĩĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚Đ°}}", + "assets_added_to_name_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ дОйавĐģĐĩĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ дОйавĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° дОйавĐģĐĩĐŊĐž}} в {hasName, select, true {аĐģŅŒĐąĐžĐŧ {name}} other {ĐŊĐžĐ˛Ņ‹Đš аĐģŅŒĐąĐžĐŧ}}", + "assets_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ°}}", "assets_deleted_permanently": "{} ĐžĐąŅŠĐĩĐēŅ‚(Ņ‹) ŅƒĐ´Đ°ĐģĐĩĐŊ(Ņ‹) ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°", "assets_deleted_permanently_from_server": "{} ĐžĐąŅŠĐĩĐēŅ‚(Ņ‹) ŅƒĐ´Đ°ĐģĐĩĐŊ(Ņ‹) ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ҁ ҁĐĩŅ€Đ˛ĐĩŅ€Đ° Immich", - "assets_moved_to_trash_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃", - "assets_permanently_deleted_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} ŅƒĐ´Đ°ĐģĐĩĐŊĐž ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°", - "assets_removed_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} ŅƒĐ´Đ°ĐģĐĩĐŊĐž", + "assets_moved_to_trash_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ґĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž}} в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃", + "assets_permanently_deleted_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ŅƒĐ´Đ°ĐģŅ‘ĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ŅƒĐ´Đ°ĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ŅƒĐ´Đ°ĐģĐĩĐŊĐž}} ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°", + "assets_removed_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ŅƒĐ´Đ°ĐģŅ‘ĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ŅƒĐ´Đ°ĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ŅƒĐ´Đ°ĐģĐĩĐŊĐž}}", "assets_removed_permanently_from_device": "{} ĐžĐąŅŠĐĩĐēŅ‚(Ņ‹) ŅƒĐ´Đ°ĐģĐĩĐŊ(Ņ‹) ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ҁ Đ˛Đ°ŅˆĐĩĐŗĐž ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°", "assets_restore_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ˛ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐžĐąŅŠĐĩĐē҂ҋ иС ĐēĐžŅ€ĐˇĐ¸ĐŊŅ‹? Đ­Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŊĐĩĐģŅŒĐˇŅ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ! ĐžĐąŅ€Đ°Ņ‚Đ¸Ņ‚Đĩ вĐŊиĐŧаĐŊиĐĩ, Ņ‡Ņ‚Đž ĐģŅŽĐąŅ‹Đĩ ĐžŅ„Ņ„ĐģаКĐŊ-ĐžĐąŅŠĐĩĐē҂ҋ ĐŊĐĩ ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹ Ņ‚Đ°ĐēиĐŧ ҁĐŋĐžŅĐžĐąĐžĐŧ.", - "assets_restored_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", + "assets_restored_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž}}", "assets_restored_successfully": "{} ĐžĐąŅŠĐĩĐēŅ‚(Ņ‹) ҃ҁĐŋĐĩ҈ĐŊĐž Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ(Ņ‹)", "assets_trashed": "{} ĐžĐąŅŠĐĩĐēŅ‚(Ņ‹) ĐŋĐžĐŧĐĩ҉ĐĩĐŊ(Ņ‹) в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃", - "assets_trashed_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃", + "assets_trashed_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ґĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž}} в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃", "assets_trashed_from_server": "{} ĐžĐąŅŠĐĩĐēŅ‚(Ņ‹) ĐŋĐžĐŧĐĩ҉ĐĩĐŊ(Ņ‹) в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃ ĐŊа ҁĐĩŅ€Đ˛ĐĩŅ€Đĩ Immich", "assets_were_part_of_album_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} ҃ĐļĐĩ в аĐģŅŒĐąĐžĐŧĐĩ", "authorized_devices": "Đ Đ°ĐˇŅ€Đĩ҈ĐĩĐŊĐŊŅ‹Đĩ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°", @@ -531,7 +527,7 @@ "backup_controller_page_background_is_on": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐĩ Ņ€ĐĩСĐĩŅ€Đ˛ĐŊĐžĐĩ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ в Ņ„ĐžĐŊОвОĐŧ Ņ€ĐĩĐļиĐŧĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "backup_controller_page_background_turn_off": "Đ’Ņ‹ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ĐžĐŊĐžĐ˛ŅƒŅŽ ҁĐģ҃ĐļĐąŅƒ", "backup_controller_page_background_turn_on": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Ņ„ĐžĐŊĐžĐ˛ŅƒŅŽ ҁĐģ҃ĐļĐąŅƒ", - "backup_controller_page_background_wifi": "ĐĸĐžĐģҌĐēĐž ҇ĐĩŅ€ĐĩС WiFi", + "backup_controller_page_background_wifi": "ĐĸĐžĐģҌĐēĐž ҇ĐĩŅ€ĐĩС Wi-Fi", "backup_controller_page_backup": "Đ ĐĩСĐĩŅ€Đ˛ĐŊĐžĐĩ ĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ", "backup_controller_page_backup_selected": "Đ’Ņ‹ĐąŅ€Đ°ĐŊĐž: ", "backup_controller_page_backup_sub": "Đ—Đ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊŅ‹Đĩ Ņ„ĐžŅ‚Đž и видĐĩĐž", @@ -570,9 +566,9 @@ "bugs_and_feature_requests": "ĐžŅˆĐ¸ĐąĐēи и СаĐŋŅ€ĐžŅŅ‹", "build": "ĐĄĐąĐžŅ€Đēа", "build_image": "ВĐĩŅ€ŅĐ¸Ņ ŅĐąĐžŅ€Đēи", - "bulk_delete_duplicates_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŧĐ°ŅŅĐžĐ˛Đž ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩĐēŅ‚} other {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}? Đ­Ņ‚Đž ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ ŅĐ°ĐŧŅ‹Đš йОĐģŅŒŅˆĐžĐš Ņ„Đ°ĐšĐģ иС ĐēаĐļдОК ĐŗŅ€ŅƒĐŋĐŋŅ‹ и ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐ¸Ņ‚ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹. Đ­Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŊĐĩĐģŅŒĐˇŅ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ!", - "bulk_keep_duplicates_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ {count, plural, one {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩĐēŅ‚} other {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}? Đ­Ņ‚Đž ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ Đ˛ŅĐĩ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹.", - "bulk_trash_duplicates_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŧĐ°ŅŅĐžĐ˛Đž ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃ {count, plural, one {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩĐēŅ‚} other {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}? Đ­Ņ‚Đž ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ ŅĐ°ĐŧŅ‹Đš йОĐģŅŒŅˆĐžĐš Ņ„Đ°ĐšĐģ иС ĐēаĐļдОК ĐŗŅ€ŅƒĐŋĐŋŅ‹ и ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹ в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃.", + "bulk_delete_duplicates_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩĐēŅ‚} many {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚Đ°}}? Đ‘ŅƒĐ´ĐĩŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊŅ‘ĐŊ ŅĐ°ĐŧŅ‹Đš йОĐģŅŒŅˆĐžĐš Ņ„Đ°ĐšĐģ в ĐēаĐļдОК ĐŗŅ€ŅƒĐŋĐŋĐĩ, а ĐĩĐŗĐž Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹. Đ­Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŊĐĩĐģŅŒĐˇŅ ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ!", + "bulk_keep_duplicates_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ {count, plural, one {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩĐēŅ‚} many {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚Đ°}}? Đ­Ņ‚Đž ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ Đ˛ŅĐĩ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹.", + "bulk_trash_duplicates_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋĐĩŅ€ĐĩĐŧĐĩŅŅ‚Đ¸Ņ‚ŅŒ в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃ {count, plural, one {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐšŅŅ ĐžĐąŅŠĐĩĐēŅ‚} many {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ ĐžĐąŅŠĐĩĐēŅ‚Đ°}}? Đ‘ŅƒĐ´ĐĩŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊŅ‘ĐŊ ŅĐ°ĐŧŅ‹Đš йОĐģŅŒŅˆĐžĐš Ņ„Đ°ĐšĐģ в ĐēаĐļдОК ĐŗŅ€ŅƒĐŋĐŋĐĩ, а ĐĩĐŗĐž Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊŅ‹ в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃.", "buy": "ĐŸŅ€Đ¸ĐžĐąŅ€ĐĩŅ‚ĐĩĐŊиĐĩ ĐģĐ¸Ņ†ĐĩĐŊСии Immich", "cache_settings_album_thumbnails": "МиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Ņ‹ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ† йийĐģĐ¸ĐžŅ‚ĐĩĐēи ({} ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛)", "cache_settings_clear_cache_button": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ ĐēŅŅˆ", @@ -651,7 +647,7 @@ "completed": "ЗавĐĩŅ€ŅˆĐĩĐŊĐž", "confirm": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚ŅŒ", "confirm_admin_password": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ АдĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°", - "confirm_delete_face": "Đ’Ņ‹ Ņ‚ĐžŅ‡ĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐģĐ¸Ņ†Đž {name} иС ĐžĐąŅŠĐĩĐēŅ‚Đ°?", + "confirm_delete_face": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐģĐ¸Ņ†Đž ҇ĐĩĐģОвĐĩĐēа {name} иС ĐžĐąŅŠĐĩĐēŅ‚Đ°?", "confirm_delete_shared_link": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚Ņƒ ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅƒŅŽ ҁҁҋĐģĐē҃?", "confirm_keep_this_delete_others": "Đ’ŅĐĩ ĐžŅŅ‚Đ°ĐģҌĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ в ĐŗŅ€ŅƒĐŋĐŋĐĩ ĐąŅƒĐ´ŅƒŅ‚ ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹, ĐēŅ€ĐžĐŧĐĩ ŅŅ‚ĐžĐŗĐž ĐžĐąŅŠĐĩĐēŅ‚Đ°. Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ?", "confirm_password": "ĐŸĐžĐ´Ņ‚Đ˛ĐĩŅ€Đ´Đ¸Ņ‚Đĩ ĐŋĐ°Ņ€ĐžĐģҌ", @@ -687,8 +683,8 @@ "create_link_to_share": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ҁҁҋĐģĐē҃ ĐžĐąŅ‰ĐĩĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа", "create_link_to_share_description": "Đ Đ°ĐˇŅ€ĐĩŅˆĐ¸Ņ‚ŅŒ Đ˛ŅĐĩĐŧ, ҃ ĐēĐžĐŗĐž ĐĩŅŅ‚ŅŒ ҁҁҋĐģĐēа, ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đ¸", "create_new": "СОЗДАĐĸĐŦ НОВĐĢЙ", - "create_new_person": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŊĐžĐ˛ĐžĐŗĐž ҇ĐĩĐģОвĐĩĐēа", - "create_new_person_hint": "НазĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ĐŊОвОĐŧ҃ ҇ĐĩĐģОвĐĩĐē҃", + "create_new_person": "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŊĐžĐ˛ĐžĐŗĐž ҇ĐĩĐģОвĐĩĐēа", + "create_new_person_hint": "НазĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ ĐŊа ĐŊĐžĐ˛ĐžĐŗĐž ҇ĐĩĐģОвĐĩĐēа", "create_new_user": "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŊĐžĐ˛ĐžĐŗĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", "create_shared_album_page_share_add_assets": "ДОБАВИĐĸĐŦ ОБĐĒЕКĐĸĐĢ", "create_shared_album_page_share_select_photos": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đ¸", @@ -800,10 +796,10 @@ "edit_location": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ", "edit_location_dialog_title": "МĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ", "edit_name": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ иĐŧŅ", - "edit_people": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҇ĐĩĐģОвĐĩĐēа", + "edit_people": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐģŅŽĐ´ĐĩĐš", "edit_tag": "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ Ņ‚ĐĩĐŗ", "edit_title": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ—Đ°ĐŗĐžĐģОвОĐē", - "edit_user": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", + "edit_user": "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", "edited": "ĐžŅ‚Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐž", "editor": "Đ ĐĩдаĐēŅ‚ĐžŅ€", "editor_close_without_save_prompt": "ИСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹", @@ -831,7 +827,7 @@ "cant_apply_changes": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ĐŋŅ€Đ¸ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊĐ¸Ņ", "cant_change_activity": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ {enabled, select, true {ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ} other {вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ}} аĐēŅ‚Đ¸Đ˛ĐŊĐžŅŅ‚ŅŒ", "cant_change_asset_favorite": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ \"Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐĩ\" Đ´ĐģŅ Ņ€ĐĩŅŅƒŅ€ŅĐ°", - "cant_change_metadata_assets_count": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ ҃ {count, plural, one {# Ņ€ĐĩŅŅƒŅ€ŅĐ°} few {# Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛} many {# Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛} other {# Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛}}", + "cant_change_metadata_assets_count": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ ҃ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", "cant_get_faces": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐģĐ¸Ņ†Đ°", "cant_get_number_of_comments": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đĩв", "cant_search_people": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ ĐŋĐžĐ¸ŅĐē ĐģŅŽĐ´ĐĩĐš", @@ -853,10 +849,12 @@ "failed_to_keep_this_delete_others": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ ĐžĐąŅŠĐĩĐēŅ‚ и ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐžĐąŅŠĐĩĐē҂ҋ", "failed_to_load_asset": "ĐžŅˆĐ¸ĐąĐēа ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēи ĐžĐąŅŠĐĩĐēŅ‚Đ°", "failed_to_load_assets": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐžĐąŅŠĐĩĐē҂ҋ", + "failed_to_load_notifications": "ХйОК ĐŋŅ€Đ¸ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēĐĩ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊиК", "failed_to_load_people": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐģŅŽĐ´ĐĩĐš", "failed_to_remove_product_key": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐēĐģŅŽŅ‡ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ°", "failed_to_stack_assets": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅŠĐĩĐē҂ҋ", "failed_to_unstack_assets": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ Ņ€Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅŠĐĩĐē҂ҋ", + "failed_to_update_notification_status": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ", "import_path_already_exists": "Đ­Ņ‚ĐžŅ‚ ĐŋŅƒŅ‚ŅŒ иĐŧĐŋĐžŅ€Ņ‚Đ° ҃ĐļĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒĐĩŅ‚.", "incorrect_email_or_password": "НĐĩвĐĩŅ€ĐŊŅ‹Đš Đ°Đ´Ņ€Đĩҁ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹ иĐģи ĐŋĐ°Ņ€ĐžĐģҌ", "paths_validation_failed": "{paths, plural, one {# ĐŋŅƒŅ‚ŅŒ} other {# ĐŋŅƒŅ‚ĐĩĐš}} ĐŊĐĩ ĐŋŅ€ĐžŅˆĐģи ĐŋŅ€ĐžĐ˛ĐĩŅ€Đē҃", @@ -877,7 +875,7 @@ "unable_to_change_favorite": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅƒŅ \"Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐĩ\" Đ´ĐģŅ Ņ€ĐĩŅŅƒŅ€ŅĐ°", "unable_to_change_location": "НĐĩвОСĐŧĐžĐļĐŊĐž иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ", "unable_to_change_password": "НĐĩвОСĐŧĐžĐļĐŊĐž иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ", - "unable_to_change_visibility": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ видиĐŧĐžŅŅ‚ŅŒ Đ´ĐģŅ {count, plural, one {# ҇ĐĩĐģОвĐĩĐēа} few {# ĐģŅŽĐ´ĐĩĐš} many {# ĐģŅŽĐ´ĐĩĐš} other {# ĐģŅŽĐ´ĐĩĐš}}", + "unable_to_change_visibility": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ видиĐŧĐžŅŅ‚ŅŒ ҃ {count, plural, one {# ҇ĐĩĐģОвĐĩĐēа} other {# ҇ĐĩĐģОвĐĩĐē}}", "unable_to_complete_oauth_login": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ Đ˛Ņ‹ĐŋĐžĐģĐŊĐ¸Ņ‚ŅŒ Đ˛Ņ…ĐžĐ´ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ OAuth", "unable_to_connect": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ĐŋОдĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒŅŅ", "unable_to_connect_to_server": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋОдĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒŅŅ Đē ҁĐĩŅ€Đ˛ĐĩŅ€Ņƒ", @@ -901,7 +899,7 @@ "unable_to_exit_fullscreen": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ Đ˛Ņ‹ĐšŅ‚Đ¸ иС ĐŋĐžĐģĐŊĐžŅĐēŅ€Đ°ĐŊĐŊĐžĐŗĐž Ņ€ĐĩĐļиĐŧа", "unable_to_get_comments_number": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐēĐžĐģĐ¸Ņ‡ĐĩŅŅ‚Đ˛Đž ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đĩв", "unable_to_get_shared_link": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊŅƒŅŽ ҁҁҋĐģĐē҃", - "unable_to_hide_person": "НĐĩвОСĐŧĐžĐļĐŊĐž ҁĐēŅ€Ņ‹Ņ‚ŅŒ ĐŋĐĩŅ€ŅĐžĐŊ҃", + "unable_to_hide_person": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ҁĐēŅ€Ņ‹Ņ‚ŅŒ ҇ĐĩĐģОвĐĩĐēа", "unable_to_link_motion_video": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ŅĐ˛ŅĐˇĐ°Ņ‚ŅŒ двиĐļŅƒŅ‰ĐĩĐĩŅŅ видĐĩĐž", "unable_to_link_oauth_account": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ŅĐ˛ŅĐˇĐ°Ņ‚ŅŒ ŅƒŅ‡ĐĩŅ‚ĐŊŅƒŅŽ СаĐŋĐ¸ŅŅŒ OAuth", "unable_to_load_album": "НĐĩвОСĐŧĐžĐļĐŊĐž ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ аĐģŅŒĐąĐžĐŧ", @@ -912,8 +910,8 @@ "unable_to_log_out_device": "НĐĩвОСĐŧĐžĐļĐŊĐž Đ˛Ņ‹ĐšŅ‚Đ¸ иС ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°", "unable_to_login_with_oauth": "НĐĩвОСĐŧĐžĐļĐŊĐž Đ˛ĐžĐšŅ‚Đ¸ в ŅĐ¸ŅŅ‚ĐĩĐŧ҃ ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ OAuth", "unable_to_play_video": "НĐĩвОСĐŧĐžĐļĐŊĐž Đ˛ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ видĐĩĐž", - "unable_to_reassign_assets_existing_person": "НĐĩвОСĐŧĐžĐļĐŊĐž ĐŋĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ĐŊа {name, select, null {ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐŗĐž ҇ĐĩĐģОвĐĩĐēа} other {{name}}}", - "unable_to_reassign_assets_new_person": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ĐŋĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ĐŊОвОĐŧ҃ ҇ĐĩĐģОвĐĩĐē҃", + "unable_to_reassign_assets_existing_person": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ ĐžĐąŅŠĐĩĐē҂ҋ ĐŊа {name, select, null {Đ´Ņ€ŅƒĐŗĐžĐŗĐž ҇ĐĩĐģОвĐĩĐēа} other {҇ĐĩĐģОвĐĩĐēа ҁ иĐŧĐĩĐŊĐĩĐŧ {name}}}", + "unable_to_reassign_assets_new_person": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ ĐžĐąŅŠĐĩĐē҂ҋ ĐŊа ĐŊĐžĐ˛ĐžĐŗĐž ҇ĐĩĐģОвĐĩĐēа", "unable_to_refresh_user": "НĐĩвОСĐŧĐžĐļĐŊĐž ОйĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ", "unable_to_remove_album_users": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš иС аĐģŅŒĐąĐžĐŧа", "unable_to_remove_api_key": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐēĐģŅŽŅ‡ API", @@ -1032,7 +1030,7 @@ "hide_gallery": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐŗĐ°ĐģĐĩŅ€ĐĩŅŽ", "hide_named_person": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ {name}", "hide_password": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģҌ", - "hide_person": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐŋĐĩŅ€ŅĐžĐŊ҃", + "hide_person": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ҇ĐĩĐģОвĐĩĐēа", "hide_unnamed_people": "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐģŅŽĐ´ĐĩĐš ĐąĐĩС иĐŧĐĩĐŊи", "home_page_add_to_album_conflicts": "ДобавĐģĐĩĐŊĐž {added} ĐŧĐĩдиа в аĐģŅŒĐąĐžĐŧ {album}. {failed} ĐŧĐĩдиа ҃ĐļĐĩ в аĐģŅŒĐąĐžĐŧĐĩ.", "home_page_add_to_album_err_local": "ПоĐēа ĐŊĐĩĐģŅŒĐˇŅ дОйавĐģŅŅ‚ŅŒ ĐģĐžĐēаĐģҌĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ в аĐģŅŒĐąĐžĐŧŅ‹, ĐŋŅ€ĐžĐŋ҃ҁĐē", @@ -1071,7 +1069,7 @@ "immich_web_interface": "ВĐĩĐą иĐŊŅ‚ĐĩҀ҄ĐĩĐšŅ Immich", "import_from_json": "ИĐŧĐŋĐžŅ€Ņ‚ иС JSON", "import_path": "ĐŸŅƒŅ‚ŅŒ иĐŧĐŋĐžŅ€Ņ‚Đ°", - "in_albums": "В {count, plural, one {# аĐģŅŒĐąĐžĐŧĐĩ} few {# аĐģŅŒĐąĐžĐŧĐ°Ņ…} many {# аĐģŅŒĐąĐžĐŧĐ°Ņ…} other {# аĐģŅŒĐąĐžĐŧĐ°Ņ…}}", + "in_albums": "В {count, plural, one {# аĐģŅŒĐąĐžĐŧĐĩ} other {# аĐģŅŒĐąĐžĐŧĐ°Ņ…}}", "in_archive": "В Đ°Ņ€Ņ…Đ¸Đ˛Đĩ", "include_archived": "ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°Ņ‚ŅŒ Đ°Ņ€Ņ…Đ¸Đ˛", "include_shared_albums": "ВĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒ ĐžĐąŅ‰Đ¸Đĩ аĐģŅŒĐąĐžĐŧŅ‹", @@ -1089,12 +1087,12 @@ "invalid_date_format": "НĐĩвĐĩŅ€ĐŊŅ‹Đš Ņ„ĐžŅ€ĐŧĐ°Ņ‚ Đ´Đ°Ņ‚Ņ‹", "invite_people": "ĐŸŅ€Đ¸ĐŗĐģĐ°ŅĐ¸Ņ‚ŅŒ", "invite_to_album": "ĐŸŅ€Đ¸ĐŗĐģĐ°ŅĐ¸Ņ‚ŅŒ в аĐģŅŒĐąĐžĐŧ", - "items_count": "{count, plural, one {# ŅĐģĐĩĐŧĐĩĐŊŅ‚} two {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°} few {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°} other {# ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛}}", + "items_count": "{count, plural, one {# ŅĐģĐĩĐŧĐĩĐŊŅ‚} many {# ŅĐģĐĩĐŧĐĩĐŊŅ‚ĐžĐ˛} other {# ŅĐģĐĩĐŧĐĩĐŊŅ‚Đ°}}", "jobs": "Đ—Đ°Đ´Đ°Ņ‡Đ¸", "keep": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ", "keep_all": "ĐĄĐžŅ…Ņ€Đ°ĐŊĐ¸Ņ‚ŅŒ Đ˛ŅŅ‘", "keep_this_delete_others": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚, ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐžŅŅ‚Đ°ĐģҌĐŊŅ‹Đĩ", - "kept_this_deleted_others": "ĐĄĐžŅ…Ņ€Đ°ĐŊиĐģ ŅŅ‚ĐžŅ‚ ĐžĐąŅŠĐĩĐēŅ‚ и ŅƒĐ´Đ°ĐģиĐģ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", + "kept_this_deleted_others": "ĐĄĐžŅ…Ņ€Đ°ĐŊŅ‘ĐŊ ŅŅ‚ĐžŅ‚ ĐžĐąŅŠĐĩĐēŅ‚ и {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ŅƒĐ´Đ°ĐģŅ‘ĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ŅƒĐ´Đ°ĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ŅƒĐ´Đ°ĐģĐĩĐŊĐž}}", "keyboard_shortcuts": "ĐĄĐžŅ‡ĐĩŅ‚Đ°ĐŊĐ¸Ņ ĐēĐģĐ°Đ˛Đ¸Ņˆ", "language": "Đ¯ĐˇŅ‹Đē", "language_setting_description": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŋŅ€ĐĩĐ´ĐŋĐžŅ‡Đ¸Ņ‚Đ°ĐĩĐŧŅ‹Đš ваĐŧи ŅĐˇŅ‹Đē", @@ -1125,7 +1123,7 @@ "local_network": "ЛоĐēаĐģҌĐŊĐ°Ņ ҁĐĩŅ‚ŅŒ", "local_network_sheet_info": "ĐŸŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ ĐąŅƒĐ´ĐĩŅ‚ ĐŋОдĐēĐģŅŽŅ‡Đ°Ņ‚ŅŒŅŅ Đē ҁĐĩŅ€Đ˛ĐĩŅ€Ņƒ ĐŋĐž ŅŅ‚ĐžĐŧ҃ Đ°Đ´Ņ€Đĩҁ҃, ĐēĐžĐŗĐ´Đ° ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đž ĐŋОдĐēĐģŅŽŅ‡ĐĩĐŊĐž Đē Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊОК Wi-Fi ҁĐĩŅ‚Đ¸", "location_permission": "Đ”ĐžŅŅ‚ŅƒĐŋ Đē ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸ŅŽ", - "location_permission_content": "Đ§Ņ‚ĐžĐąŅ‹ ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ иĐŧŅ Wi-Fi ҁĐĩŅ‚Đ¸, ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸ŅŽ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸Đŧ Đ´ĐžŅŅ‚ŅƒĐŋ Đē Ņ‚ĐžŅ‡ĐŊĐžĐŧ҃ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸ŅŽ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°", + "location_permission_content": "Đ§Ņ‚ĐžĐąŅ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ„ŅƒĐŊĐēŅ†Đ¸ŅŽ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēĐžĐŗĐž ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊĐ¸Ņ, Immich ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧĐž Ņ€Đ°ĐˇŅ€Đĩ҈ĐĩĐŊиĐĩ ĐŊа Ņ‚ĐžŅ‡ĐŊĐžĐĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊĐ¸Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŊĐž ĐŧĐžĐŗĐģĐž ŅŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐŊаСваĐŊиĐĩ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐš Wi-Fi ҁĐĩŅ‚Đ¸", "location_picker_choose_on_map": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐŊа ĐēĐ°Ņ€Ņ‚Đĩ", "location_picker_latitude_error": "ĐŖĐēаĐļĐ¸Ņ‚Đĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊŅƒŅŽ ŅˆĐ¸Ņ€ĐžŅ‚Ņƒ", "location_picker_latitude_hint": "ВвĐĩĐ´Đ¸Ņ‚Đĩ ŅˆĐ¸Ņ€ĐžŅ‚Ņƒ", @@ -1199,6 +1197,9 @@ "map_settings_only_show_favorites": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐĩ", "map_settings_theme_settings": "ĐĻвĐĩŅ‚ ĐēĐ°Ņ€Ņ‚Ņ‹", "map_zoom_to_see_photos": "ĐŖĐŧĐĩĐŊҌ҈ĐĩĐŊиĐĩ ĐŧĐ°ŅŅˆŅ‚Đ°ĐąĐ° Đ´ĐģŅ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đ° Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đš", + "mark_all_as_read": "ĐžŅ‚ĐŧĐĩŅ‚Đ¸Ņ‚ŅŒ Đ˛ŅĐĩ ĐēаĐē ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ‹Đĩ", + "mark_as_read": "ĐžŅ‚ĐŧĐĩŅ‚Đ¸Ņ‚ŅŒ ĐēаĐē ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°ĐŊĐŊĐžĐĩ", + "marked_all_as_read": "ĐžŅ‚ĐŧĐĩ҇ĐĩĐŊŅ‹ ĐēаĐē ĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ‹Đĩ", "matches": "ХОвĐŋадĐĩĐŊĐ¸Ņ", "media_type": "ĐĸиĐŋ ĐŧĐĩдиа", "memories": "Đ’ĐžŅĐŋĐžĐŧиĐŊаĐŊĐ¸Ņ", @@ -1213,11 +1214,11 @@ "memory_lane_title": "Đ’ĐžŅĐŋĐžĐŧиĐŊаĐŊиĐĩ {title}", "menu": "МĐĩĐŊŅŽ", "merge": "ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ", - "merge_people": "ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ ĐŋĐĩŅ€ŅĐžĐŊŅ‹", + "merge_people": "ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ ĐģŅŽĐ´ĐĩĐš", "merge_people_limit": "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐžĐąŅŠĐĩдиĐŊŅŅ‚ŅŒ Đ´Đž 5 ĐģĐ¸Ņ† Са ОдиĐŊ Ņ€Đ°Đˇ", "merge_people_prompt": "Đ’Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžĐąŅŠĐĩдиĐŊĐ¸Ņ‚ŅŒ ŅŅ‚Đ¸Ņ… ĐģŅŽĐ´ĐĩĐš? Đ­Ņ‚Đž Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ ĐŊĐĩĐžĐąŅ€Đ°Ņ‚Đ¸ĐŧĐž.", - "merge_people_successfully": "ПĐĩŅ€ŅĐžĐŊŅ‹ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊŅ‹ ҃ҁĐŋĐĩ҈ĐŊĐž", - "merged_people_count": "ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐž {count, plural, one {# ҇ĐĩĐģОвĐĩĐē} few {# ҇ĐĩĐģОвĐĩĐēа} many {# ҇ĐĩĐģОвĐĩĐē} other {# ҇ĐĩĐģОвĐĩĐēа}}", + "merge_people_successfully": "Đ›Đ¸Ņ†Đ° ĐģŅŽĐ´ĐĩĐš ҃ҁĐŋĐĩ҈ĐŊĐž ĐžĐąŅŠĐĩдиĐŊĐĩĐŊŅ‹", + "merged_people_count": "ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐž {count, plural, one {# ҇ĐĩĐģОвĐĩĐē} many {# ҇ĐĩĐģОвĐĩĐē} other {# ҇ĐĩĐģОвĐĩĐēа}}", "minimize": "МиĐŊиĐŧĐ¸ĐˇĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", "minute": "МиĐŊŅƒŅ‚Đ°", "missing": "ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ", @@ -1225,6 +1226,8 @@ "month": "МĐĩŅŅŅ†", "monthly_title_text_date_format": "MMMM y", "more": "БоĐģҌ҈Đĩ", + "moved_to_archive": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ґĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž}} в Đ°Ņ€Ņ…Đ¸Đ˛", + "moved_to_library": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ґĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊĐž}} в йийĐģĐ¸ĐžŅ‚ĐĩĐē҃", "moved_to_trash": "ПĐĩŅ€ĐĩĐŊĐĩҁĐĩĐŊĐž в ĐēĐžŅ€ĐˇĐ¸ĐŊ҃", "multiselect_grid_edit_date_time_err_read_only": "НĐĩвОСĐŧĐžĐļĐŊĐž иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ Đ´Đ°Ņ‚Ņƒ Ņ„Đ°ĐšĐģОв Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ, ĐŋŅ€ĐžĐŋ҃ҁĐē", "multiselect_grid_edit_gps_err_read_only": "НĐĩвОСĐŧĐžĐļĐŊĐž иСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ Ņ„Đ°ĐšĐģОв Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ҇҂ĐĩĐŊĐ¸Ņ, ĐŋŅ€ĐžĐŋ҃ҁĐē", @@ -1238,7 +1241,7 @@ "new_album": "ĐĐžĐ˛Ņ‹Đš аĐģŅŒĐąĐžĐŧ", "new_api_key": "ĐĐžĐ˛Ņ‹Đš API-ĐēĐģŅŽŅ‡", "new_password": "ĐĐžĐ˛Ņ‹Đš ĐŋĐ°Ņ€ĐžĐģҌ", - "new_person": "ĐĐžĐ˛Đ°Ņ ĐŋĐĩŅ€ŅĐžĐŊа", + "new_person": "ĐĐžĐ˛Ņ‹Đš ҇ĐĩĐģОвĐĩĐē", "new_user_created": "ĐĐžĐ˛Ņ‹Đš ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌ ŅĐžĐˇĐ´Đ°ĐŊ", "new_version_available": "ДОСĐĸĐŖĐŸĐĐ ĐĐžĐ’ĐĐ¯ Đ’Đ•Đ ĐĄĐ˜Đ¯", "newest_first": "ĐĄĐŊĐ°Ņ‡Đ°Đģа ĐŊĐžĐ˛Ņ‹Đĩ", @@ -1257,6 +1260,8 @@ "no_favorites_message": "ДобавĐģŅĐšŅ‚Đĩ в Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐąŅ‹ŅŅ‚Ņ€Đž ĐŊĐ°ĐšŅ‚Đ¸ ŅĐ˛ĐžĐ¸ ĐģŅƒŅ‡ŅˆĐ¸Đĩ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đ¸ и видĐĩĐž", "no_libraries_message": "ĐĄĐžĐˇĐ´Đ°ĐšŅ‚Đĩ вĐŊĐĩ҈ĐŊŅŽŅŽ йийĐģĐ¸ĐžŅ‚ĐĩĐē҃ Đ´ĐģŅ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đ° Đ˛Đ°ŅˆĐ¸Ņ… Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đš и видĐĩĐž", "no_name": "НĐĩŅ‚ иĐŧĐĩĐŊи", + "no_notifications": "НĐĩŅ‚ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊиК", + "no_people_found": "НиĐēĐžĐŗĐž ĐŊĐĩ ĐŊаКдĐĩĐŊĐž", "no_places": "НĐĩŅ‚ ĐŧĐĩҁ҂", "no_results": "НĐĩŅ‚ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚ĐžĐ˛", "no_results_description": "ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐ¸ĐŊĐžĐŊиĐŧ иĐģи йОĐģĐĩĐĩ ĐžĐąŅ‰ĐĩĐĩ ĐēĐģŅŽŅ‡ĐĩвОĐĩ ҁĐģОвО", @@ -1330,16 +1335,16 @@ "paused": "ĐŸŅ€Đ¸ĐžŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž", "pending": "ОĐļидаĐĩŅ‚", "people": "Đ›ŅŽĐ´Đ¸", - "people_edits_count": "ИСĐŧĐĩĐŊĐĩĐŊĐž {count, plural, one {# ҇ĐĩĐģОвĐĩĐē} few {# ҇ĐĩĐģОвĐĩĐēа} many {# ĐģŅŽĐ´ĐĩĐš} other {# ҇ĐĩĐģОвĐĩĐē}}", + "people_edits_count": "{count, plural, one {ИСĐŧĐĩĐŊŅ‘ĐŊ # ҇ĐĩĐģОвĐĩĐē} many {ИСĐŧĐĩĐŊĐĩĐŊĐž # ҇ĐĩĐģОвĐĩĐē} other {ИСĐŧĐĩĐŊĐĩĐŊĐž # ҇ĐĩĐģОвĐĩĐēа}}", "people_feature_description": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đš и видĐĩĐž, ŅĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐž ĐģŅŽĐ´ŅĐŧ", "people_sidebar_description": "ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°Ņ‚ŅŒ Đŋ҃ĐŊĐēŅ‚ ĐŧĐĩĐŊŅŽ \"Đ›ŅŽĐ´Đ¸\" в йОĐēОвОК ĐŋаĐŊĐĩĐģи", "permanent_deletion_warning": "ĐŸŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊиĐĩ Ой ŅƒĐ´Đ°ĐģĐĩĐŊии", "permanent_deletion_warning_setting_description": "ĐŸŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´Đ°Ņ‚ŅŒ ĐŋĐĩŅ€ĐĩĐ´ ĐąĐĩĐˇĐ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚ĐŊŅ‹Đŧ ŅƒĐ´Đ°ĐģĐĩĐŊиĐĩĐŧ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛", "permanently_delete": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°", - "permanently_delete_assets_count": "БĐĩĐˇĐ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚ĐŊĐž ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {Ņ€ĐĩŅŅƒŅ€Ņ} few {Ņ€ĐĩŅŅƒŅ€ŅĐ°} many {Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛} other {Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛}}", - "permanently_delete_assets_prompt": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {ŅŅ‚ĐžŅ‚ ĐžĐąŅŠĐĩĐēŅ‚?} other {ŅŅ‚Đ¸ # ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛?}} Đ­Ņ‚Đž Ņ‚Đ°Đē ĐļĐĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ {count, plural, one {ĐĩĐŗĐž} other {Đ¸Ņ…}} иС аĐģŅŒĐąĐžĐŧа(Ов).", + "permanently_delete_assets_count": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {ĐžĐąŅŠĐĩĐēŅ‚} other {ĐžĐąŅŠĐĩĐē҂ҋ}} ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°", + "permanently_delete_assets_prompt": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ° ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {ŅŅ‚ĐžŅ‚ ĐžĐąŅŠĐĩĐēŅ‚} many {ŅŅ‚Đ¸ # ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {ŅŅ‚Đ¸ # ĐžĐąŅŠĐĩĐēŅ‚Đ°}}? Đ­Ņ‚Đž Ņ‚Đ°ĐēĐļĐĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ {count, plural, one {ĐĩĐŗĐž} other {Đ¸Ņ…}} иС Đ˛ŅĐĩŅ… аĐģŅŒĐąĐžĐŧОв.", "permanently_deleted_asset": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°", - "permanently_deleted_assets_count": "БĐĩĐˇĐ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‚ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊĐž {count, plural, one {# Ņ„Đ°ĐšĐģ} few {# Ņ„Đ°ĐšĐģа} many {# Ņ„Đ°ĐšĐģОв} other {# Ņ„Đ°ĐšĐģОв}}", + "permanently_deleted_assets_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ŅƒĐ´Đ°ĐģŅ‘ĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ŅƒĐ´Đ°ĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ŅƒĐ´Đ°ĐģĐĩĐŊĐž}} ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°", "permission_onboarding_back": "Назад", "permission_onboarding_continue_anyway": "Đ’ŅĐĩ Ņ€Đ°Đ˛ĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ", "permission_onboarding_get_started": "Đ”Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŊĐ°Ņ‡ĐŊŅ‘Đŧ", @@ -1354,12 +1359,12 @@ "photo_shared_all_users": "ĐŸĐžŅ…ĐžĐļĐĩ, Ņ‡Ņ‚Đž Đ˛Ņ‹ ĐŋОдĐĩĐģиĐģĐ¸ŅŅŒ ŅĐ˛ĐžĐ¸Đŧи Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸ŅĐŧи ŅĐž Đ˛ŅĐĩĐŧи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅĐŧи иĐģи ҃ Đ˛Đ°Ņ ĐŊĐĩŅ‚ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš, ҁ ĐēĐžŅ‚ĐžŅ€Ņ‹Đŧи ĐŧĐžĐļĐŊĐž ĐŋОдĐĩĐģĐ¸Ņ‚ŅŒŅŅ.", "photos": "Đ¤ĐžŅ‚Đž", "photos_and_videos": "Đ¤ĐžŅ‚Đž и ВидĐĩĐž", - "photos_count": "{count, plural, one {{count, number} Đ¤ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Ņ} few {{count, number} Đ¤ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đ¸} many {{count, number} Đ¤ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đš} other {{count, number} Đ¤ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đš}}", + "photos_count": "{count, plural, one {{count, number} Ņ„ĐžŅ‚Đž} other {{count, number} Ņ„ĐžŅ‚Đž}}", "photos_from_previous_years": "Đ¤ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đ¸ ĐŋŅ€ĐžŅˆĐģҋ҅ ĐģĐĩŅ‚ в ŅŅ‚ĐžŅ‚ Đ´ĐĩĐŊҌ", "pick_a_location": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐŧĐĩŅŅ‚ĐžĐŋĐžĐģĐžĐļĐĩĐŊиĐĩ", "place": "МĐĩŅŅ‚Đ°", "places": "МĐĩŅŅ‚Đ°", - "places_count": "{count, plural, one {{count, number} МĐĩŅŅ‚Đž} other {{count, number} МĐĩҁ҂}}", + "places_count": "{count, plural, one {{count, number} ĐŧĐĩŅŅ‚Đž} many {{count, number} ĐŧĐĩҁ҂} other {{count, number} ĐŧĐĩŅŅ‚Đ°}}", "play": "Đ’ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸", "play_memories": "Đ’ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩŅŅ‚Đ¸ Đ˛ĐžŅĐŋĐžĐŧиĐŊаĐŊĐ¸Ņ", "play_motion_photo": "Đ’ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ двиĐļŅƒŅ‰Đ¸ĐĩŅŅ Ņ„ĐžŅ‚Đž", @@ -1419,19 +1424,21 @@ "purchase_settings_server_activated": "КĐģŅŽŅ‡ ĐŋŅ€ĐžĐ´ŅƒĐēŅ‚Đ° ҁĐĩŅ€Đ˛ĐĩŅ€Đ° ҃ĐŋŅ€Đ°Đ˛ĐģŅĐĩŅ‚ŅŅ адĐŧиĐŊĐ¸ŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐŧ", "rating": "Đ ĐĩĐšŅ‚Đ¸ĐŊĐŗ ĐˇĐ˛Ņ‘ĐˇĐ´", "rating_clear": "ĐžŅ‡Đ¸ŅŅ‚Đ¸Ņ‚ŅŒ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ", - "rating_count": "{count, plural, one {# СвĐĩСда} other {# СвĐĩСд}}", + "rating_count": "{count, plural, one {# СвĐĩСда} many {# СвĐĩСд} other {# СвĐĩĐˇĐ´Ņ‹}}", "rating_description": "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗ в ĐŋаĐŊĐĩĐģи иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸", "reaction_options": "ОĐŋŅ†Đ¸Đ¸ Ņ€ĐĩаĐēŅ†Đ¸Đš", "read_changelog": "ĐŸŅ€ĐžŅ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ ҁĐŋĐ¸ŅĐžĐē иСĐŧĐĩĐŊĐĩĐŊиК", "reassign": "ПĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ", - "reassigned_assets_to_existing_person": "ПĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡ĐĩĐŊ{count, plural, one { # Ņ€ĐĩŅŅƒŅ€Ņ} few {Đž # Ņ€ĐĩŅŅƒŅ€ŅĐ°} many {Đž # Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛} other {Đž # Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛}} ĐŊа {name, select, null {ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐŗĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ} other {{name}}}", - "reassigned_assets_to_new_person": "ПĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡ĐĩĐŊ{count, plural, one { # Ņ€ĐĩŅŅƒŅ€Ņ} few {Đž # Ņ€ĐĩŅŅƒŅ€ŅĐ°} many {Đž # Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛} other {Đž # Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛}} ĐŊОвОĐŧ҃ ҇ĐĩĐģОвĐĩĐē҃", - "reassing_hint": "НазĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰ĐĩĐŧ҃ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅŽ", + "reassigned_assets_to_existing_person": "Đ›Đ¸Ņ†Đ° ĐŊа {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚Đĩ} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ°Ņ…}} ĐŋĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡ĐĩĐŊŅ‹ ĐŊа {name, select, null {Đ´Ņ€ŅƒĐŗĐžĐŗĐž ҇ĐĩĐģОвĐĩĐēа} other {҇ĐĩĐģОвĐĩĐēа ҁ иĐŧĐĩĐŊĐĩĐŧ {name}}}", + "reassigned_assets_to_new_person": "Đ›Đ¸Ņ†Đ° ĐŊа {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚Đĩ} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ°Ņ…}} ĐŋĐĩŅ€ĐĩĐŊаСĐŊĐ°Ņ‡ĐĩĐŊŅ‹ ĐŊа ĐŊĐžĐ˛ĐžĐŗĐž ҇ĐĩĐģОвĐĩĐēа", + "reassing_hint": "НазĐŊĐ°Ņ‡Đ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ Ņ€ĐĩŅŅƒŅ€ŅŅ‹ ҃ĐēаСаĐŊĐŊĐžĐŧ҃ ҇ĐĩĐģОвĐĩĐē҃", "recent": "НĐĩдавĐŊиĐĩ", "recent-albums": "НĐĩдавĐŊиĐĩ аĐģŅŒĐąĐžĐŧŅ‹", "recent_searches": "НĐĩдавĐŊиĐĩ ĐŋĐžĐ¸ŅĐēĐžĐ˛Ņ‹Đĩ СаĐŋŅ€ĐžŅŅ‹", "recently_added": "НĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ", "recently_added_page_title": "НĐĩдавĐŊĐž дОйавĐģĐĩĐŊĐŊŅ‹Đĩ", + "recently_taken": "НĐĩдавĐŊĐž ҁĐŊŅŅ‚Đž", + "recently_taken_page_title": "НĐĩдавĐŊĐž ĐĄĐŊŅŅ‚Đž", "refresh": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ", "refresh_encoded_videos": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ СаĐēĐžĐ´Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ видĐĩĐž", "refresh_faces": "ОбĐŊĐžĐ˛Đ¸Ņ‚ŅŒ ĐģĐ¸Ņ†Đ°", @@ -1444,8 +1451,8 @@ "refreshing_metadata": "ОбĐŊОвĐģĐĩĐŊиĐĩ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊҋ҅", "regenerating_thumbnails": "Đ’ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиĐĩ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€", "remove": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ", - "remove_assets_album_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} иС аĐģŅŒĐąĐžĐŧа?", - "remove_assets_shared_link_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} иС ŅŅ‚ĐžĐš ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊОК ҁҁҋĐģĐēи?", + "remove_assets_album_confirmation": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ°}} иС аĐģŅŒĐąĐžĐŧа?", + "remove_assets_shared_link_confirmation": "Đ’Ņ‹ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ°}} иС ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊĐžĐŗĐž Đ´ĐžŅŅ‚ŅƒĐŋа ĐŋĐž ŅŅ‚ĐžĐš ҁҁҋĐģĐēĐĩ?", "remove_assets_title": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐžĐąŅŠĐĩĐē҂ҋ?", "remove_custom_date_range": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģҌҁĐēиК диаĐŋаСОĐŊ Đ´Đ°Ņ‚", "remove_deleted_assets": "ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ Đ°Đ˛Ņ‚ĐžĐŊĐžĐŧĐŊҋ҅ Ņ„Đ°ĐšĐģОв", @@ -1459,10 +1466,10 @@ "removed_api_key": "ĐŖĐ´Đ°ĐģĐĩĐŊ ĐēĐģŅŽŅ‡ API: {name}", "removed_from_archive": "ĐŖĐ´Đ°ĐģĐĩĐŊ иС Đ°Ņ€Ņ…Đ¸Đ˛Đ°", "removed_from_favorites": "ĐŖĐ´Đ°ĐģĐĩĐŊĐž иС Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž", - "removed_from_favorites_count": "{count, plural, other {ĐŖĐ´Đ°ĐģĐĩĐŊĐž #}} иС Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž", + "removed_from_favorites_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ŅƒĐ´Đ°ĐģŅ‘ĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ŅƒĐ´Đ°ĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ŅƒĐ´Đ°ĐģĐĩĐŊĐž}} иС Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž", "removed_memory": "Đ’ĐžŅĐŋĐžĐŧиĐŊаĐŊиĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐž", "removed_photo_from_memory": "Đ¤ĐžŅ‚Đž ŅƒĐ´Đ°ĐģĐĩĐŊĐž иС Đ˛ĐžŅĐŋĐžĐŧиĐŊаĐŊĐ¸Ņ", - "removed_tagged_assets": "ĐĸĐĩĐŗ Đ´ĐģŅ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}} ŅƒĐ´Đ°ĐģĐĩĐŊ", + "removed_tagged_assets": "ĐĸĐĩĐŗ ŅƒĐ´Đ°ĐģŅ‘ĐŊ ҃ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", "rename": "ПĐĩŅ€ĐĩиĐŧĐĩĐŊĐžĐ˛Đ°Ņ‚ŅŒ", "repair": "Đ ĐĩĐŧĐžĐŊŅ‚", "repair_no_results_message": "ЗдĐĩҁҌ ĐąŅƒĐ´ŅƒŅ‚ ĐžŅ‚ĐžĐąŅ€Đ°ĐļĐ°Ņ‚ŅŒŅŅ ĐŊĐĩĐžŅ‚ŅĐģĐĩĐļиваĐĩĐŧŅ‹Đĩ и ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ Ņ„Đ°ĐšĐģŅ‹", @@ -1565,12 +1572,13 @@ "select_from_computer": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ҁ ĐēĐžĐŧĐŋŅŒŅŽŅ‚ĐĩŅ€Đ°", "select_keep_all": "ĐžŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ Đ˛ŅŅ‘ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊĐžĐĩ", "select_library_owner": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ вĐģадĐĩĐģŅŒŅ†Đ° йийĐģĐ¸ĐžŅ‚ĐĩĐēи", - "select_new_face": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ ĐŊОвОĐĩ ĐģĐ¸Ņ†Đž", + "select_new_face": "Đ’Ņ‹ĐąŅ€Đ°Ņ‚ŅŒ Đ´Ņ€ŅƒĐŗĐžĐĩ ĐģĐ¸Ņ†Đž", + "select_person_to_tag": "Đ’Ņ‹Đ´ĐĩĐģĐ¸Ņ‚Đĩ ҇ĐĩĐģОвĐĩĐēа, ĐēĐžŅ‚ĐžŅ€ĐžĐŗĐž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ĐžŅ‚ĐŧĐĩŅ‚Đ¸Ņ‚ŅŒ", "select_photos": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đ¸", "select_trash_all": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Đ˛ŅŅ‘ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊĐžĐĩ", "select_user_for_sharing_page_err_album": "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ аĐģŅŒĐąĐžĐŧ", "selected": "Đ’Ņ‹ĐąŅ€Đ°ĐŊĐž", - "selected_count": "{count, plural, one {# Đ˛Ņ‹ĐąŅ€Đ°ĐŊ} other {# Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐž}}", + "selected_count": "{count, plural, one {Đ’Ņ‹ĐąŅ€Đ°ĐŊ # ĐžĐąŅŠĐĩĐēŅ‚} many {Đ’Ņ‹ĐąŅ€Đ°ĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {Đ’Ņ‹ĐąŅ€Đ°ĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚Đ°}}", "send_message": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊиĐĩ", "send_welcome_email": "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐŋŅ€Đ¸Đ˛ĐĩŅ‚ŅŅ‚Đ˛ĐĩĐŊĐŊĐžĐĩ ĐŋĐ¸ŅŅŒĐŧĐž", "server_endpoint": "ĐĐ´Ņ€Đĩҁ ҁĐĩŅ€Đ˛ĐĩŅ€Đ°", @@ -1717,7 +1725,7 @@ "stack_duplicates": "Đ“Ņ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹", "stack_select_one_photo": "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŗĐģавĐŊŅƒŅŽ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸ŅŽ Đ´ĐģŅ ĐŗŅ€ŅƒĐŋĐŋŅ‹", "stack_selected_photos": "Đ“Ņ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ", - "stacked_assets_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ дОйавĐģĐĩĐŊ} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ° дОйавĐģĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ дОйавĐģĐĩĐŊĐž}} в ĐŗŅ€ŅƒĐŋĐŋ҃", + "stacked_assets_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° ĐžĐąŅŠĐĩдиĐŊĐĩĐŊĐž}} в ĐŗŅ€ŅƒĐŋĐŋ҃", "stacktrace": "ĐĸŅ€Đ°ŅŅĐ¸Ņ€ĐžĐ˛Đēа ҁ҂ĐĩĐēа", "start": "ĐĄŅ‚Đ°Ņ€Ņ‚", "start_date": "Đ”Đ°Ņ‚Đ° ĐŊĐ°Ņ‡Đ°Đģа", @@ -1746,9 +1754,9 @@ "tag_created": "ĐĸĐĩĐŗ {tag} ŅĐžĐˇĐ´Đ°ĐŊ", "tag_feature_description": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ Ņ„ĐžŅ‚ĐžĐŗŅ€Đ°Ņ„Đ¸Đš и видĐĩĐž, ŅĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊҋ҅ ĐŋĐž Ņ‚ĐĩĐŗĐ°Đŧ", "tag_not_found_question": "НĐĩ ŅƒĐ´Đ°ĐĩŅ‚ŅŅ ĐŊĐ°ĐšŅ‚Đ¸ Ņ‚ĐĩĐŗ? ĐĄĐžĐˇĐ´Đ°ĐšŅ‚Đĩ ĐŊĐžĐ˛Ņ‹Đš Ņ‚ĐĩĐŗ.", - "tag_people": "ĐĸĐĩĐŗ ĐģŅŽĐ´ĐĩĐš", + "tag_people": "ĐžŅ‚ĐŧĐĩŅ‚Đ¸Ņ‚ŅŒ ҇ĐĩĐģОвĐĩĐēа", "tag_updated": "ĐĸĐĩĐŗ {tag} иСĐŧĐĩĐŊĐĩĐŊ", - "tagged_assets": "ПоĐŧĐĩ҇ĐĩĐŊĐž {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", + "tagged_assets": "ĐĸĐĩĐŗ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊ Đ´ĐģŅ {count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚Đ°} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛}}", "tags": "ĐĸĐĩĐŗĐ¸", "template": "ШайĐģĐžĐŊ", "theme": "ĐĸĐĩĐŧа", @@ -1798,9 +1806,9 @@ "trashed_items_will_be_permanently_deleted_after": "Đ­ĐģĐĩĐŧĐĩĐŊ҂ҋ в ĐēĐžŅ€ĐˇĐ¸ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ Đ°Đ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅƒĐ´Đ°ĐģĐĩĐŊŅ‹ ҇ĐĩŅ€ĐĩС {days, plural, one {# Đ´ĐĩĐŊҌ} other {# Đ´ĐŊĐĩĐš}}.", "type": "ĐĸиĐŋ", "unarchive": "Đ’ĐžŅŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ", - "unarchived_count": "{count, plural, other {Đ’ĐžĐˇĐ˛Ņ€Đ°Ņ‰ĐĩĐŊĐž иС Đ°Ņ€Ņ…Đ¸Đ˛Đ° #}}", + "unarchived_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰Ņ‘ĐŊ} many {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰ĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚Đ° Đ˛ĐžĐˇĐ˛Ņ€Đ°Ņ‰ĐĩĐŊĐž}} иС Đ°Ņ€Ņ…Đ¸Đ˛Đ°", "unfavorite": "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иС Đ¸ĐˇĐąŅ€Đ°ĐŊĐŊĐžĐŗĐž", - "unhide_person": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ĐŋĐĩŅ€ŅĐžĐŊ҃", + "unhide_person": "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ ҇ĐĩĐģОвĐĩĐēа", "unknown": "НĐĩиСвĐĩҁ҂ĐŊĐž", "unknown_country": "НĐĩиСвĐĩҁ҂ĐŊĐ°Ņ ŅŅ‚Ņ€Đ°ĐŊа", "unknown_year": "НĐĩиСвĐĩҁ҂ĐŊŅ‹Đš Год", @@ -1813,10 +1821,10 @@ "unnamed_album_delete_confirmation": "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ аĐģŅŒĐąĐžĐŧ?", "unnamed_share": "ĐžĐąŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ ĐąĐĩС ĐŊаСваĐŊĐ¸Ņ", "unsaved_change": "НĐĩ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊĐŊĐžĐĩ иСĐŧĐĩĐŊĐĩĐŊиĐĩ", - "unselect_all": "ĐĄĐŊŅŅ‚ŅŒ Đ˛ŅŅ‘", + "unselect_all": "ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ Đ˛Ņ‹Đ´ĐĩĐģĐĩĐŊиĐĩ", "unselect_all_duplicates": "ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąĐžŅ€ Đ˛ŅĐĩŅ… Đ´ŅƒĐąĐģиĐēĐ°Ņ‚ĐžĐ˛", "unstack": "Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", - "unstacked_assets_count": "{count, plural, one {# ĐžĐąŅŠĐĩĐēŅ‚ иСвĐģĐĩ҇ĐĩĐŊ} few {# ĐžĐąŅŠĐĩĐēŅ‚Đ° иСвĐģĐĩ҇ĐĩĐŊĐž} other {# ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ иСвĐģĐĩ҇ĐĩĐŊĐž}} иС ĐŗŅ€ŅƒĐŋĐŋŅ‹", + "unstacked_assets_count": "{count, plural, one {Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊ # ĐžĐąŅŠĐĩĐēŅ‚} many {Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛} other {Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž # ĐžĐąŅŠĐĩĐēŅ‚Đ°}}", "untracked_files": "НЕОĐĸСЛЕЖИВАЕМĐĢЕ ФАЙЛĐĢ", "untracked_files_decription": "ĐŸŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ ĐŊĐĩ ĐžŅ‚ŅĐģĐĩĐļиваĐĩŅ‚ ŅŅ‚Đ¸ Ņ„Đ°ĐšĐģŅ‹. ОĐŊи ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ Ņ€ĐĩĐˇŅƒĐģŅŒŅ‚Đ°Ņ‚ĐžĐŧ ĐŊĐĩŅƒĐ´Đ°Ņ‡ĐŊҋ҅ ĐŋĐĩŅ€ĐĩĐŧĐĩ҉ĐĩĐŊиК, ĐŋŅ€ĐĩŅ€Đ˛Đ°ĐŊĐŊҋ҅ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐžĐē иĐģи ĐŋŅ€ĐžĐŋŅƒŅ‰ĐĩĐŊŅ‹ иС-Са ĐžŅˆĐ¸ĐąĐēи", "up_next": "ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰ĐĩĐĩ", @@ -1825,9 +1833,9 @@ "upload_concurrency": "ĐŸĐ°Ņ€Đ°ĐģĐģĐĩĐģҌĐŊĐžŅŅ‚ŅŒ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐēи", "upload_dialog_info": "ĐĨĐžŅ‚Đ¸Ņ‚Đĩ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Đ˛Ņ‹ĐąŅ€Đ°ĐŊĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ ĐŊа ҁĐĩŅ€Đ˛ĐĩŅ€?", "upload_dialog_title": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ ĐžĐąŅŠĐĩĐēŅ‚", - "upload_errors": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēа СавĐĩŅ€ŅˆĐĩĐŊа ҁ {count, plural, one {# ĐžŅˆĐ¸ĐąĐēОК} other {# ĐžŅˆĐ¸ĐąĐēаĐŧи}}, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐ˛Đ¸Đ´ĐĩŅ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đĩ ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊŅ‹Đĩ Ņ€ĐĩŅŅƒŅ€ŅŅ‹.", + "upload_errors": "Đ—Đ°ĐŗŅ€ŅƒĐˇĐēа СавĐĩŅ€ŅˆĐĩĐŊа ҁ {count, plural, one {# ĐžŅˆĐ¸ĐąĐēОК} other {# ĐžŅˆĐ¸ĐąĐēаĐŧи}}, ОйĐŊĐžĐ˛Đ¸Ņ‚Đĩ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ, Ņ‡Ņ‚ĐžĐąŅ‹ ŅƒĐ˛Đ¸Đ´ĐĩŅ‚ŅŒ ĐŊĐžĐ˛Ņ‹Đĩ ĐˇĐ°ĐŗŅ€ŅƒĐļĐĩĐŊĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ.", "upload_progress": "ĐžŅŅ‚Đ°ĐģĐžŅŅŒ {remaining, number} - ĐžĐąŅ€Đ°ĐąĐžŅ‚Đ°ĐŊĐž {processed, number}/{total, number}", - "upload_skipped_duplicates": "ĐŸŅ€ĐžĐŋŅƒŅ‰ĐĩĐŊ{count, plural, one { # Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸ĐšŅŅ Ņ€ĐĩŅŅƒŅ€Ņ} few {Đž # Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ Ņ€ĐĩŅŅƒŅ€ŅĐ°} many {Đž # Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛} other {Đž # Đ´ŅƒĐąĐģĐ¸Ņ€ŅƒŅŽŅ‰Đ¸Ņ…ŅŅ Ņ€ĐĩŅŅƒŅ€ŅĐ°}}", + "upload_skipped_duplicates": "ĐŸŅ€ĐžĐŋŅƒŅ‰ĐĩĐŊ{count, plural, one { # Đ´ŅƒĐąĐģиĐēĐ°Ņ‚} many {Đž # Đ´ŅƒĐąĐģиĐēĐ°Ņ‚ĐžĐ˛} other {Đž # Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Đ°}}", "upload_status_duplicates": "Đ”ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹", "upload_status_errors": "ĐžŅˆĐ¸ĐąĐēи", "upload_status_uploaded": "Đ—Đ°ĐŗŅ€ŅƒĐļĐĩĐŊĐž", @@ -1867,7 +1875,7 @@ "video_hover_setting": "Đ’ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐ´ĐĩĐŊиĐĩ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Ņ‹ видĐĩĐž ĐŋŅ€Đ¸ ĐŊавĐĩĐ´ĐĩĐŊии ĐēŅƒŅ€ŅĐžŅ€Đ° ĐŧŅ‹ŅˆĐ¸", "video_hover_setting_description": "Đ’ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐžĐ´Đ¸Ņ‚ŅŒ ĐŧиĐŊĐ¸Đ°Ņ‚ŅŽŅ€Ņ‹ видĐĩĐž ĐŋŅ€Đ¸ ĐŊавĐĩĐ´ĐĩĐŊии ĐēŅƒŅ€ŅĐžŅ€Đ° ĐŧŅ‹ŅˆĐ¸ ĐŊа ĐžĐąŅŠĐĩĐēŅ‚. ДаĐļĐĩ ĐĩҁĐģи ŅŅ‚ĐžŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ, Đ˛ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐ´ĐĩĐŊиĐĩ ĐŧĐžĐļĐŊĐž СаĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ, ĐŊавĐĩĐ´Ņ ĐēŅƒŅ€ŅĐžŅ€ ĐŊа СĐŊĐ°Ņ‡ĐžĐē Đ˛ĐžŅĐŋŅ€ĐžĐ¸ĐˇĐ˛ĐĩĐ´ĐĩĐŊĐ¸Ņ.", "videos": "ВидĐĩĐž", - "videos_count": "{count, plural, one {# ВидĐĩĐž} few {# ВидĐĩĐž} many {# ВидĐĩĐž} other {# ВидĐĩĐž}}", + "videos_count": "{count, plural, one {# видĐĩĐž} other {# видĐĩĐž}}", "view": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€", "view_album": "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ аĐģŅŒĐąĐžĐŧ", "view_all": "ĐŸĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ Đ˛ŅŅ‘", @@ -1883,7 +1891,7 @@ "viewer_remove_from_stack": "ĐŖĐąŅ€Đ°Ņ‚ŅŒ иС ĐŗŅ€ŅƒĐŋĐŋŅ‹", "viewer_stack_use_as_main_asset": "Đ˜ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ в ĐēĐ°Ņ‡ĐĩŅŅ‚Đ˛Đĩ ĐžŅĐŊОвĐŊĐžĐŗĐž ĐžĐąŅŠĐĩĐēŅ‚Đ°", "viewer_unstack": "Đ Đ°ĐˇĐŗŅ€ŅƒĐŋĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ", - "visibility_changed": "ВидиĐŧĐžŅŅ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊа Đ´ĐģŅ {count, plural, one {# ҇ĐĩĐģОвĐĩĐēа} other {# ĐģŅŽĐ´ĐĩĐš}}", + "visibility_changed": "ИСĐŧĐĩĐŊĐĩĐŊа видиĐŧĐžŅŅ‚ŅŒ ҃ {count, plural, one {# ҇ĐĩĐģОвĐĩĐēа} other {# ҇ĐĩĐģОвĐĩĐē}}", "waiting": "В ĐžŅ‡ĐĩŅ€Đĩди", "warning": "ĐŸŅ€ĐĩĐ´ŅƒĐŋŅ€ĐĩĐļĐ´ĐĩĐŊиĐĩ", "week": "НĐĩĐ´ĐĩĐģŅ", diff --git a/i18n/sk.json b/i18n/sk.json index 8ab3b0cded..912669f596 100644 --- a/i18n/sk.json +++ b/i18n/sk.json @@ -187,20 +187,13 @@ "oauth_auto_register": "AutomatickÃĄ regristrÃĄcia", "oauth_auto_register_description": "AutomatickÊ zaregistrovanie novÊho poŞívateÄža pri prihlÃĄsení pomocou OAuth", "oauth_button_text": "Text tlačítka", - "oauth_client_id": "Client ID", - "oauth_client_secret": "Client Secret", "oauth_enable_description": "PrihlÃĄsiÅĨ sa pomocou OAuth", - "oauth_issuer_url": "Adresa URL vydavateÄža", "oauth_mobile_redirect_uri": "URI mobilnÊho presmerovania", "oauth_mobile_redirect_uri_override": "Prepísanie URI mobilnÊho presmerovania", "oauth_mobile_redirect_uri_override_description": "PovoÄžte, keď poskytovateÄž protokolu OAuth nepovoÄžuje identifikÃĄtor URI pre mobilnÊ zariadenia, napríklad '{callback}'", - "oauth_profile_signing_algorithm": "Algoritmus podpisovania profilu", - "oauth_profile_signing_algorithm_description": "Algoritmus pouŞívanÃŊ na prihlÃĄsenie uŞívateÄžskÊho profilu.", - "oauth_scope": "Rozsah", "oauth_settings": "OAuth", "oauth_settings_description": "SpravovaÅĨ nastavenia prihlÃĄsenia OAuth", "oauth_settings_more_details": "Pre viac informÃĄcii o tejto funkcii, prejdite na docs.", - "oauth_signing_algorithm": "Algoritmus podpisovania", "oauth_storage_label_claim": "NÃĄrokovaÅĨ Å títok ÃēloÅžiska", "oauth_storage_label_claim_description": "Automaticky nastaviÅĨ Å títok ÃēloÅžiska pouŞívateÄža na hodnotu tohto nÃĄroku.", "oauth_storage_quota_claim": "DeklarÃĄcia kvÃŗty ÃēloÅžiska", diff --git a/i18n/sl.json b/i18n/sl.json index 01f62d204e..19e31871a6 100644 --- a/i18n/sl.json +++ b/i18n/sl.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Samodejna registracija", "oauth_auto_register_description": "Samodejna registracija novih uporabnikov po prijavi z OAuth", "oauth_button_text": "Besedilo gumba", - "oauth_client_id": "ID stranke", - "oauth_client_secret": "Skrivnost stranke", "oauth_enable_description": "Prijava z OAuth", - "oauth_issuer_url": "URL izdajatelja", "oauth_mobile_redirect_uri": "Mobilni preusmeritveni URI", "oauth_mobile_redirect_uri_override": "Preglasitev URI preusmeritve za mobilne naprave", "oauth_mobile_redirect_uri_override_description": "Omogoči, ko ponudnik OAuth ne dovoli mobilnega URI-ja, kot je '{callback}'", - "oauth_profile_signing_algorithm": "Algoritem za podpisovanje profila", - "oauth_profile_signing_algorithm_description": "Algoritem, ki se uporablja za podpisovanje uporabniÅĄkega profila.", - "oauth_scope": "Področje uporabe", "oauth_settings": "OAuth", "oauth_settings_description": "Upravljanje nastavitev prijave OAuth", "oauth_settings_more_details": "Za več podrobnosti o tej funkciji glejte dokumentacijo.", - "oauth_signing_algorithm": "Algoritem podpisovanja", "oauth_storage_label_claim": "Zahtevek za nalepko za shranjevanje", "oauth_storage_label_claim_description": "Samodejno nastavi uporabnikovo oznako za shranjevanje na vrednost tega zahtevka.", "oauth_storage_quota_claim": "Zahtevek za kvoto prostora za shranjevanje", @@ -404,9 +397,9 @@ "album_remove_user_confirmation": "Ali ste prepričani, da Åželite odstraniti {user}?", "album_share_no_users": "Videti je, da ste ta album dali v skupno rabo z vsemi uporabniki ali pa nimate nobenega uporabnika, s katerim bi ga lahko delili.", "album_thumbnail_card_item": "1 element", - "album_thumbnail_card_items": "{count, plural, one {# element} two {# elementa} few {# elementi} other {# elementov}}", + "album_thumbnail_card_items": "{} elementov", "album_thumbnail_card_shared": " ¡ V skupni rabi", - "album_thumbnail_shared_by": "Delil {user}", + "album_thumbnail_shared_by": "Delil {}", "album_updated": "Album posodobljen", "album_updated_setting_description": "Prejmite e-poÅĄtno obvestilo, ko ima album v skupni rabi nova sredstva", "album_user_left": "Zapustil {album}", @@ -444,7 +437,7 @@ "archive": "Arhiv", "archive_or_unarchive_photo": "Arhivirajte ali odstranite fotografijo iz arhiva", "archive_page_no_archived_assets": "Ni arhiviranih sredstev", - "archive_page_title": "Arhiv ({number})", + "archive_page_title": "Arhiv ({})", "archive_size": "Velikost arhiva", "archive_size_description": "Konfigurirajte velikost arhiva za prenose (v GiB)", "archived": "Arhivirano", @@ -481,18 +474,18 @@ "assets_added_to_album_count": "Dodano {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}} v album", "assets_added_to_name_count": "Dodano {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}} v {hasName, select, true {{name}} other {new album}}", "assets_count": "{count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}}", - "assets_deleted_permanently": "{count, plural, one {# sredstvo trajno izbrisano} two {# sredstvi trajno izbrisani} few {# sredstva trajno izbrisana} other {# sredstev trajno izbrisanih}}", - "assets_deleted_permanently_from_server": "{count, plural, one {# sredstvo trajno izbrisano iz streÅžnika Immich} two {# sredstvi trajno izbrisani iz streÅžnika Immich} few {# sredstva trajno izbrisana iz streÅžnika Immich} other {# sredstev trajno izbrisanih iz streÅžnika Immich}}", + "assets_deleted_permanently": "trajno izrisana sredstva {}", + "assets_deleted_permanently_from_server": "trajno izbrisana sredstva iz streÅžnika Immich {}", "assets_moved_to_trash_count": "Premaknjeno {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}} v smetnjak", "assets_permanently_deleted_count": "Trajno izbrisano {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}}", "assets_removed_count": "Odstranjeno {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}}", - "assets_removed_permanently_from_device": "{count, plural, one {# sredstvo trajno izbrisano iz naprave} two {# sredstvi strajno izbrisani iz naprave} few {# sredstva trajno izbrisana iz naprave} other {# sredstve trajno izbrisanih iz naprave}}", + "assets_removed_permanently_from_device": "trajno odstranjena sredstva iz naprave {}", "assets_restore_confirmation": "Ali ste prepričani, da Åželite obnoviti vsa sredstva, ki ste jih odstranili? Tega dejanja ne morete razveljaviti! UpoÅĄtevajte, da sredstev brez povezave ni mogoče obnoviti na ta način.", "assets_restored_count": "Obnovljeno {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}}", - "assets_restored_successfully": "{count, plural, one {# sredstvo uspeÅĄno obnovljeno} two {# sredstvi uspeÅĄno obnovljeni} few {# sredstva uspeÅĄno obnovljena} other {# sredstev uspeÅĄno obnovljenih}}", - "assets_trashed": "{count, plural, one {# sredstvo premaknjeno v smetnjak} two {# sredstvi premaknjeni v smetnjak} few {# sredstva premaknjena v smetnjak} other {# sredstev premaknjenih v smetnjak}}", - "assets_trashed_count": "V smetnjak {count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}}", - "assets_trashed_from_server": "{count, plural, one {# sredstvo iz Immich streÅžnika v smetnjak} two {# sredstvi iz Immich streÅžnika v smetnjak} few {# sredstva iz Immich streÅžnika v smetnjak} other {# sredstev iz Immich streÅžnika v smetnjak}}", + "assets_restored_successfully": "uspeÅĄno obnovljena sredstva {}", + "assets_trashed": "sredstva v smetnjaku {}", + "assets_trashed_count": "V smetnjak {count, plural, one {# sredstvo} other {# sredstva}}", + "assets_trashed_from_server": "sredstva iz streÅžnika Immich v smetnjaku {}", "assets_were_part_of_album_count": "{count, plural, one {sredstvo je} two {sredstvi sta} few {sredstva so} other {sredstev je}} Åže del albuma", "authorized_devices": "PooblaÅĄÄene naprave", "automatic_endpoint_switching_subtitle": "PoveÅžite se lokalno prek določenega omreÅžja Wi-Fi, ko je na voljo, in uporabite druge povezave drugje", @@ -531,11 +524,11 @@ "backup_controller_page_background_is_on": "Samodejno varnostno kopiranje v ozadju je vklopljeno", "backup_controller_page_background_turn_off": "Izklopi storitev v ozadju", "backup_controller_page_background_turn_on": "Vklopi storitev v ozadju", - "backup_controller_page_background_wifi": "Samo na WiFi", + "backup_controller_page_background_wifi": "Samo na Wi-Fi", "backup_controller_page_backup": "Varnostna kopija", "backup_controller_page_backup_selected": "Izbrano: ", "backup_controller_page_backup_sub": "Varnostno kopirane fotografije in videoposnetki", - "backup_controller_page_created": "Ustvarjeno: {date}", + "backup_controller_page_created": "Ustvarjeno: {}", "backup_controller_page_desc_backup": "Vklopite varnostno kopiranje v ospredju za samodejno nalaganje novih sredstev na streÅžnik, ko odprete aplikacijo.", "backup_controller_page_excluded": "Izključeno: ", "backup_controller_page_failed": "NeuspeÅĄno ({})", @@ -549,7 +542,7 @@ "backup_controller_page_start_backup": "ZaÅženi varnostno kopiranje", "backup_controller_page_status_off": "Samodejno varnostno kopiranje v ospredju je izklopljeno", "backup_controller_page_status_on": "Samodejno varnostno kopiranje v ospredju je vklopljeno", - "backup_controller_page_storage_format": "{used} od {available} uporabljeno", + "backup_controller_page_storage_format": "Uporabljeno {} od {}", "backup_controller_page_to_backup": "Albumi, ki bodo varnostno kopirani", "backup_controller_page_total_sub": "Vse edinstvene fotografije in videi iz izbranih albumov", "backup_controller_page_turn_off": "Izklopite varnostno kopiranje v ospredju", @@ -574,13 +567,13 @@ "bulk_keep_duplicates_confirmation": "Ali ste prepričani, da Åželite obdrÅžati {count, plural, one {# dvojnik} two {# dvojnika} few {# dvojnike} other {# dvojnikov}}? S tem boste razreÅĄili vse podvojene skupine, ne da bi karkoli izbrisali.", "bulk_trash_duplicates_confirmation": "Ali ste prepričani, da Åželite mnoÅžično vreči v smetnjak {count, plural, one {# dvojnik} two {# dvojnika} few {# dvojnike} other {# dvojnikov}}? S tem boste obdrÅžali največje sredstvo vsake skupine in odstranili vse druge dvojnike.", "buy": "Kupi Immich", - "cache_settings_album_thumbnails": "Sličice strani knjiÅžnice ({count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}})", + "cache_settings_album_thumbnails": "Sličice strani knjiÅžnice ({} sredstev)", "cache_settings_clear_cache_button": "Počisti predpomnilnik", "cache_settings_clear_cache_button_title": "Počisti predpomnilnik aplikacije. To bo znatno vplivalo na delovanje aplikacije, dokler se predpomnilnik ne obnovi.", "cache_settings_duplicated_assets_clear_button": "POČISTI", "cache_settings_duplicated_assets_subtitle": "Fotografije in videoposnetki, ki jih je aplikacija uvrstila na črni seznam", - "cache_settings_duplicated_assets_title": "{count, plural, one {# podvojeno sredstvo} two {# podvojeni sredstvi} few {# podvojena sredstva} other {# podvojenih sredstev}}", - "cache_settings_image_cache_size": "Velikost predpomnilnika slik ({count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}})", + "cache_settings_duplicated_assets_title": "Podvojena sredstva ({})", + "cache_settings_image_cache_size": "Velikost predpomnilnika slik ({} sredstev)", "cache_settings_statistics_album": "Sličice knjiÅžnice", "cache_settings_statistics_assets": "{} sredstva ({})", "cache_settings_statistics_full": "Izvirne slike", @@ -588,7 +581,7 @@ "cache_settings_statistics_thumbnail": "Sličice", "cache_settings_statistics_title": "Uporaba predpomnilnika", "cache_settings_subtitle": "Nadzirajte delovanje predpomnjenja mobilne aplikacije Immich", - "cache_settings_thumbnail_size": "Velikost predpomnilnika sličic ({count, plural, one {# sredstvo} two {# sredstvi} few {# sredstva} other {# sredstev}})", + "cache_settings_thumbnail_size": "Velikost predpomnilnika sličic ({} sredstev)", "cache_settings_tile_subtitle": "Nadzoruj vedenje lokalnega shranjevanja", "cache_settings_tile_title": "Lokalna shramba", "cache_settings_title": "Nastavitve predpomnjenja", @@ -658,7 +651,7 @@ "contain": "Vsebuje", "context": "Kontekst", "continue": "Nadaljuj", - "control_bottom_app_bar_album_info_shared": "{count, plural, one {# element v skupni rabi} two {# elementa v skupni rabi} few {# elementi v skupni rabi} other {# elementov v skupni rabi}}", + "control_bottom_app_bar_album_info_shared": "{} elementov ¡ V skupni rabi", "control_bottom_app_bar_create_new_album": "Ustvari nov album", "control_bottom_app_bar_delete_from_immich": "IzbriÅĄi iz Immicha", "control_bottom_app_bar_delete_from_local": "IzbriÅĄi iz naprave", @@ -1175,8 +1168,8 @@ "manage_your_devices": "Upravljajte svoje prijavljene naprave", "manage_your_oauth_connection": "Upravljajte svojo OAuth povezavo", "map": "Zemljevid", - "map_assets_in_bound": "{count, plural, one {# slika}}", - "map_assets_in_bounds": "{count, plural, two {# sliki} few {# slike} other {# slik}}", + "map_assets_in_bound": "{} slika", + "map_assets_in_bounds": "{} slik", "map_cannot_get_user_location": "Lokacije uporabnika ni mogoče dobiti", "map_location_dialog_yes": "Da", "map_location_picker_page_use_location": "Uporabi to lokacijo", @@ -1190,9 +1183,9 @@ "map_settings": "Nastavitve zemljevida", "map_settings_dark_mode": "Temni način", "map_settings_date_range_option_day": "Zadnjih 24 ur", - "map_settings_date_range_option_days": "{count, plural, one {Zadnji # dan} two {Zadnja # dneva} few {Zadnje # dni} other {Zadnjih # dni}}", + "map_settings_date_range_option_days": "Zadnjih {} dni", "map_settings_date_range_option_year": "Zadnje leto", - "map_settings_date_range_option_years": "{count, plural, two {Zadnje # leti} few {# Zadnja # leta} other {Zadnjih # let}}", + "map_settings_date_range_option_years": "Zadnjih {} let", "map_settings_dialog_title": "Nastavitve zemljevida", "map_settings_include_show_archived": "Vključi arhivirane", "map_settings_include_show_partners": "Vključi partnerjeve", @@ -1208,7 +1201,7 @@ "memories_start_over": "Začni od začetka", "memories_swipe_to_close": "Podrsaj gor za zapiranje", "memories_year_ago": "Leto dni nazaj", - "memories_years_ago": "{years, plural, two {# leti} few {# leta} other {# let}} nazaj", + "memories_years_ago": "{} let nazaj", "memory": "Spomin", "memory_lane_title": "Spominski trak {title}", "menu": "Meni", @@ -1311,7 +1304,7 @@ "partner_page_partner_add_failed": "Partnerja ni bilo mogoče dodati", "partner_page_select_partner": "Izberi partnerja", "partner_page_shared_to_title": "V skupni rabi z", - "partner_page_stop_sharing_content": "{user} ne bo imel več dostopa do vaÅĄih fotografij.", + "partner_page_stop_sharing_content": "{} ne bo imel več dostopa do vaÅĄih fotografij.", "partner_sharing": "Skupna raba s partnerjem", "partners": "Partnerji", "password": "Geslo", @@ -1598,12 +1591,12 @@ "setting_languages_apply": "Uporabi", "setting_languages_subtitle": "Spremeni jezik aplikacije", "setting_languages_title": "Jeziki", - "setting_notifications_notify_failures_grace_period": "Obvesti o napakah varnostnega kopiranja v ozadju: {user}", - "setting_notifications_notify_hours": "{count, plural, one {# ura} two {# uri} few {# ure} other {# ur}}", + "setting_notifications_notify_failures_grace_period": "Obvesti o napakah varnostnega kopiranja v ozadju: {}", + "setting_notifications_notify_hours": "{} ur", "setting_notifications_notify_immediately": "takoj", - "setting_notifications_notify_minutes": "{count, plural, one {# minuta} two {# minuti} few {# minute} other {# minut}}", + "setting_notifications_notify_minutes": "{} minut", "setting_notifications_notify_never": "nikoli", - "setting_notifications_notify_seconds": "{count, plural, one {# sekunda} two {# sekundi} few {# sekunde} other {# sekund}}", + "setting_notifications_notify_seconds": "{} sekund", "setting_notifications_single_progress_subtitle": "Podrobne informacije o napredku nalaganja po sredstvih", "setting_notifications_single_progress_title": "PokaÅži napredek varnostnega kopiranja v ozadju", "setting_notifications_subtitle": "Prilagodite svoje nastavitve obvestil", @@ -1617,7 +1610,7 @@ "settings_saved": "Nastavitve shranjene", "share": "Deli", "share_add_photos": "Dodaj fotografije", - "share_assets_selected": "{count, plural, one {# izbrana} two {# izbrani} few {# izbrane} other {# izbranih}}", + "share_assets_selected": "{} izbrano", "share_dialog_preparing": "Priprava...", "shared": "V skupni rabi", "shared_album_activities_input_disable": "Komentiranje je onemogočeno", @@ -1638,25 +1631,25 @@ "shared_link_create_error": "Napaka pri ustvarjanju povezave skupne rabe", "shared_link_edit_description_hint": "Vnesi opis skupne rabe", "shared_link_edit_expire_after_option_day": "1 dan", - "shared_link_edit_expire_after_option_days": "{count, plural, other {# dni}}", + "shared_link_edit_expire_after_option_days": "{} dni", "shared_link_edit_expire_after_option_hour": "1 ura", - "shared_link_edit_expire_after_option_hours": "{count, plural, two {# uri} few {# ure} other {# ur}}", + "shared_link_edit_expire_after_option_hours": "{} ur", "shared_link_edit_expire_after_option_minute": "1 minuta", - "shared_link_edit_expire_after_option_minutes": "{count, plural, two {# minuti} few {# minute} other {# minut}}", - "shared_link_edit_expire_after_option_months": "{count, plural, one {# mesec} two {# meseca} few {# mesece} other {# mesecev}}", - "shared_link_edit_expire_after_option_year": "{count, plural, one {# leto} two {# leti} few {# leta} other {# let}}", + "shared_link_edit_expire_after_option_minutes": "{} minut", + "shared_link_edit_expire_after_option_months": "{} mesecev", + "shared_link_edit_expire_after_option_year": "{} let", "shared_link_edit_password_hint": "Vnesi geslo za skupno rabo", "shared_link_edit_submit_button": "Posodobi povezavo", "shared_link_error_server_url_fetch": "URL-ja streÅžnika ni mogoče pridobiti", - "shared_link_expires_day": "Poteče čez {count, plural, one {# dan}}", - "shared_link_expires_days": "Poteče čez {count, plural, other {# dni}}", - "shared_link_expires_hour": "Poteče čez {count, plural, one {# uro}}", - "shared_link_expires_hours": "Poteče čez {count, plural, two {# uri} few {# ure} other {# ur}}", - "shared_link_expires_minute": "Poteče čez {count, plural, one {# minuto}}", - "shared_link_expires_minutes": "Poteče čez {count, plural, two {# minuti} few {# minute} other {# minut}}", + "shared_link_expires_day": "Poteče čez {} dan", + "shared_link_expires_days": "Poteče čez {} dni", + "shared_link_expires_hour": "Poteče čez {} uro", + "shared_link_expires_hours": "Poteče čez {} ur", + "shared_link_expires_minute": "Poteče čez {} minuto", + "shared_link_expires_minutes": "Poteče čez {} minut", "shared_link_expires_never": "Poteče ∞", - "shared_link_expires_second": "Poteče čez {count,plural, one {# sekundo}}", - "shared_link_expires_seconds": "Poteče čez {count, plural, two {# sekundi} few {# sekunde} other {# sekund}}", + "shared_link_expires_second": "Poteče čez {} sekundo", + "shared_link_expires_seconds": "Poteče čez {} sekund", "shared_link_individual_shared": "Individualno deljeno", "shared_link_info_chip_metadata": "EXIF", "shared_link_manage_links": "Upravljanje povezav v skupni rabi", @@ -1792,11 +1785,11 @@ "trash_no_results_message": "Fotografije in videoposnetki, ki so v smetnjaku, bodo prikazani tukaj.", "trash_page_delete_all": "IzbriÅĄi vse", "trash_page_empty_trash_dialog_content": "Ali Åželite izprazniti svoja sredstva v smeti? Ti elementi bodo trajno odstranjeni iz Immicha", - "trash_page_info": "Elementi v smeteh bodo trajno izbrisani po {number} dneh", + "trash_page_info": "Elementi v smeteh bodo trajno izbrisani po {} dneh", "trash_page_no_assets": "Ni sredstev v smeteh", "trash_page_restore_all": "Obnovi vse", "trash_page_select_assets_btn": "Izberite sredstva", - "trash_page_title": "Smetnjak ({count, number})", + "trash_page_title": "Smetnjak ({})", "trashed_items_will_be_permanently_deleted_after": "Elementi v smetnjaku bodo trajno izbrisani po {days, plural, one {# dnevu} two {# dnevih} few {# dnevih} other {# dneh}}.", "type": "Vrsta", "unarchive": "Odstrani iz arhiva", diff --git a/i18n/sr_Cyrl.json b/i18n/sr_Cyrl.json index 97fe461afd..34fe5084e6 100644 --- a/i18n/sr_Cyrl.json +++ b/i18n/sr_Cyrl.json @@ -192,20 +192,13 @@ "oauth_auto_register": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēа Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Đ°", "oauth_auto_register_description": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи Ņ€ĐĩĐŗĐ¸ŅŅ‚Ņ€ŅƒŅ˜Ņ‚Đĩ ĐŊОвĐĩ ĐēĐžŅ€Đ¸ŅĐŊиĐēĐĩ ĐŊаĐēĐžĐŊ ŅˆŅ‚Đž ҁĐĩ ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ĐŋĐžĐŧĐžŅ›Ņƒ OAuth-a", "oauth_button_text": "ĐĸĐĩĐēҁ҂ Đ´ŅƒĐŗĐŧĐĩŅ‚Đ°", - "oauth_client_id": "ИД ĐēĐģĐ¸Ņ˜ĐĩĐŊŅ‚Đ°", - "oauth_client_secret": "ĐĸĐ°Ņ˜ĐŊа ĐēĐģĐ¸Ņ˜ĐĩĐŊŅ‚Đ°", "oauth_enable_description": "ĐŸŅ€Đ¸Ņ˜Đ°Đ˛Đ¸Ņ‚Đĩ ҁĐĩ ĐŋĐžĐŧĐžŅ›Ņƒ OAuth-a", - "oauth_issuer_url": "ĐŖĐ Đ› Đ¸ĐˇĐ´Đ°Đ˛Đ°Ņ‡Đ°", "oauth_mobile_redirect_uri": "ĐŖĐ Đ˜ Са ĐŋŅ€Đĩ҃ҁĐŧĐĩŅ€Đ°Đ˛Đ°ŅšĐĩ ĐŧОйиĐģĐŊĐ¸Ņ… ŅƒŅ€ĐĩŅ’Đ°Ņ˜Đ°", "oauth_mobile_redirect_uri_override": "ЗаĐŧĐĩĐŊа ĐŖĐ Đ˜-Ņ˜Đ° ĐŧОйиĐģĐŊĐžĐŗ ĐŋŅ€Đĩ҃ҁĐŧĐĩŅ€Đ°Đ˛Đ°ŅšĐ°", "oauth_mobile_redirect_uri_override_description": "ОĐŧĐžĐŗŅƒŅ›Đ¸ Đēада ОАuth Đ´ĐžĐąĐ°Đ˛Ņ™Đ°Ņ‡ (provider) ĐŊĐĩ Đ´ĐžĐˇĐ˛ĐžŅ™Đ°Đ˛Đ° ĐŧОйиĐģĐŊи URI, ĐēаО ŅˆŅ‚Đž ҘĐĩ '{callback}'", - "oauth_profile_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đ°Đŧ Са ĐŋĐžŅ‚ĐŋĐ¸ŅĐ¸Đ˛Đ°ŅšĐĩ ĐŋŅ€ĐžŅ„Đ¸Đģа", - "oauth_profile_signing_algorithm_description": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đ°Đŧ ĐēĐžŅ˜Đ¸ ҁĐĩ ĐēĐžŅ€Đ¸ŅŅ‚Đ¸ Са ĐŋĐžŅ‚ĐŋĐ¸ŅĐ¸Đ˛Đ°ŅšĐĩ ĐēĐžŅ€Đ¸ŅĐŊĐ¸Ņ‡ĐēĐžĐŗ ĐŋŅ€ĐžŅ„Đ¸Đģа.", - "oauth_scope": "ОбиĐŧ", "oauth_settings": "ĐžĐŅƒŅ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đ°", "oauth_settings_description": "ĐŖĐŋŅ€Đ°Đ˛Ņ™Đ°Ņ˜Ņ‚Đĩ ĐŋОдĐĩŅˆĐ°Đ˛Đ°ŅšĐ¸Đŧа Са ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ ŅĐ° ĐžĐŅƒŅ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Ņ˜ĐžĐŧ", "oauth_settings_more_details": "За Đ˛Đ¸ŅˆĐĩ Đ´ĐĩŅ‚Đ°Ņ™Đ° Đž ĐžĐ˛ĐžŅ˜ Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ˜Đ¸ ĐŋĐžĐŗĐģĐĩĐ´Đ°Ņ˜Ņ‚Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đĩ.", - "oauth_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đ°Đŧ ĐŋĐžŅ‚ĐŋĐ¸ŅĐ¸Đ˛Đ°ŅšĐ°", "oauth_storage_label_claim": "Đ—Đ°Ņ…Ņ‚Đĩв Са ĐŊаĐģĐĩĐŋĐŊĐ¸Ņ†Ņƒ Са ҁĐēĐģĐ°Đ´Đ¸ŅˆŅ‚ĐĩҚĐĩ", "oauth_storage_label_claim_description": "ĐŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи ĐŋОдĐĩŅĐ¸Ņ‚Đĩ ОСĐŊаĐē҃ Са ҁĐēĐģĐ°Đ´Đ¸ŅˆŅ‚ĐĩҚĐĩ ĐēĐžŅ€Đ¸ŅĐŊиĐēа ĐŊа Đ˛Ņ€ĐĩĐ´ĐŊĐžŅŅ‚ ĐžĐ˛ĐžĐŗ ĐˇĐ°Ņ…Ņ‚Đĩва.", "oauth_storage_quota_claim": "Đ—Đ°Ņ…Ņ‚Đĩв Са ĐēĐ˛ĐžŅ‚Ņƒ ҁĐēĐģĐ°Đ´Đ¸ŅˆŅ‚ĐĩŅšĐ°", diff --git a/i18n/sr_Latn.json b/i18n/sr_Latn.json index 093bf06df7..055a156d71 100644 --- a/i18n/sr_Latn.json +++ b/i18n/sr_Latn.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Automatska registracija", "oauth_auto_register_description": "Automatski registrujte nove korisnike nakon ÅĄto se prijavite pomocˁu OAuth-a", "oauth_button_text": "Tekst dugmeta", - "oauth_client_id": "ID klijenta", - "oauth_client_secret": "Tajna klijenta", "oauth_enable_description": "Prijavite se pomocˁu OAuth-a", - "oauth_issuer_url": "URL izdavača", "oauth_mobile_redirect_uri": "URI za preusmeravanje mobilnih uređaja", "oauth_mobile_redirect_uri_override": "Zamena URI-ja mobilnog preusmeravanja", "oauth_mobile_redirect_uri_override_description": "Omogucˁi kada OAuth dobavljač (provider) ne dozvoljava mobilni URI, kao ÅĄto je '{callback}'", - "oauth_profile_signing_algorithm": "Algoritam za potpisivanje profila", - "oauth_profile_signing_algorithm_description": "Algoritam koji se koristi za potpisivanje korisničkog profila.", - "oauth_scope": "Obim", "oauth_settings": "OAutorizacija", "oauth_settings_description": "Upravljajte podeÅĄavanjima za prijavu sa OAutorizacijom", "oauth_settings_more_details": "Za viÅĄe detalja o ovoj funkciji pogledajte dokumente.", - "oauth_signing_algorithm": "Algoritam potpisivanja", "oauth_storage_label_claim": "Zahtev za nalepnicu za skladiÅĄtenje", "oauth_storage_label_claim_description": "Automatski podesite oznaku za skladiÅĄtenje korisnika na vrednost ovog zahteva.", "oauth_storage_quota_claim": "Zahtev za kvotu skladiÅĄtenja", diff --git a/i18n/sv.json b/i18n/sv.json index fff282f99f..175e47a51f 100644 --- a/i18n/sv.json +++ b/i18n/sv.json @@ -192,20 +192,13 @@ "oauth_auto_register": "Autoregistrera", "oauth_auto_register_description": "Registrera nya användare automatiskt efter inloggning med OAuth", "oauth_button_text": "Knapptext", - "oauth_client_id": "Klient-ID", - "oauth_client_secret": "Klienthemlighet", "oauth_enable_description": "Logga in med OAuth", - "oauth_issuer_url": "Utfärdar-URL", "oauth_mobile_redirect_uri": "Telefonomdirigernings-URI", "oauth_mobile_redirect_uri_override": "Telefonomdirigerings-URI Ãļverrskridning", "oauth_mobile_redirect_uri_override_description": "Aktivera om OAuth-leverantÃļren inte tillÃĨter mobila URI:er, sÃĨ som '{callback}'", - "oauth_profile_signing_algorithm": "Profilsigneringsalgorithm", - "oauth_profile_signing_algorithm_description": "Algorithm som används fÃļr att signera användarprofilen.", - "oauth_scope": "Omfattning", "oauth_settings": "OAuth", "oauth_settings_description": "Hantera OAuth-logininställningar", "oauth_settings_more_details": "FÃļr ytterligare detaljer om denna funktion, se dokumentationen.", - "oauth_signing_algorithm": "Signeringsalgoritm", "oauth_storage_label_claim": "Användaranknuten lagringsetikett", "oauth_storage_label_claim_description": "Sätter automatiskt angiven användares lagringsetikett.", "oauth_storage_quota_claim": "Användaranknuten lagringskvot", diff --git a/i18n/ta.json b/i18n/ta.json index 224277f68c..dd5cce6330 100644 --- a/i18n/ta.json +++ b/i18n/ta.json @@ -180,20 +180,13 @@ "oauth_auto_register": "āŽ¤āŽžāŽŠāŽŋāŽ¯āŽ™ā¯āŽ•ā¯ āŽĒāŽ¤āŽŋāŽĩ❁", "oauth_auto_register_description": "OAuth āŽ‰āŽŸāŽŠā¯ āŽ‰āŽŗā¯āŽ¨ā¯āŽ´ā¯ˆāŽ¨ā¯āŽ¤ āŽĒāŽŋāŽąāŽ•ā¯ āŽ¤āŽžāŽŠāŽžāŽ•āŽĩ❇ āŽĒā¯āŽ¤āŽŋāŽ¯ āŽĒāŽ¯āŽŠāŽ°ā¯āŽ•āŽŗā¯ˆāŽĒā¯ āŽĒāŽ¤āŽŋāŽĩā¯āŽšā¯†āŽ¯ā¯āŽ¯āŽĩā¯āŽŽā¯", "oauth_button_text": "āŽĒāŽŸā¯āŽŸāŽŠā¯ āŽ‰āŽ°ā¯ˆ", - "oauth_client_id": "āŽĩāŽžāŽŸāŽŋāŽ•ā¯āŽ•ā¯ˆāŽ¯āŽžāŽŗāŽ°ā¯ āŽāŽŸāŽŋ", - "oauth_client_secret": "āŽĩāŽžāŽŸāŽŋāŽ•ā¯āŽ•ā¯ˆāŽ¯āŽžāŽŗāŽ°ā¯ āŽ°āŽ•āŽšāŽŋāŽ¯āŽŽā¯", "oauth_enable_description": "OAuth āŽŽā¯‚āŽ˛āŽŽā¯ āŽ‰āŽŗā¯āŽ¨ā¯āŽ´ā¯ˆāŽ•", - "oauth_issuer_url": "āŽĩāŽ´āŽ™ā¯āŽ•ā¯āŽĒāŽĩāŽ°ā¯ URL", "oauth_mobile_redirect_uri": "āŽŽā¯ŠāŽĒā¯ˆāŽ˛ā¯ āŽĩāŽ´āŽŋāŽŽāŽžāŽąā¯āŽąā¯ URI", "oauth_mobile_redirect_uri_override": "āŽŽā¯ŠāŽĒā¯ˆāŽ˛ā¯ āŽĩāŽ´āŽŋāŽŽāŽžāŽąā¯āŽąā¯ URI āŽŽā¯‡āŽ˛ā¯†āŽ´ā¯āŽ¤ā¯āŽ¤āŽ˛ā¯", "oauth_mobile_redirect_uri_override_description": "'app.immich:/' āŽ¤āŽĩāŽąāŽžāŽŠ āŽĩāŽ´āŽŋāŽŽāŽžāŽąā¯āŽąā¯ URI āŽ†āŽ• āŽ‡āŽ°ā¯āŽ•ā¯āŽ•ā¯āŽŽā¯āŽĒā¯‹āŽ¤ā¯ āŽ‡āŽ¯āŽ•ā¯āŽ•āŽĩā¯āŽŽā¯.", - "oauth_profile_signing_algorithm": "āŽšā¯āŽ¯āŽĩāŽŋāŽĩāŽ° āŽ•ā¯ˆāŽ¯ā¯ŠāŽĒā¯āŽĒāŽŽāŽŋāŽŸā¯āŽŽā¯ āŽĩāŽ´āŽŋāŽŽā¯āŽąā¯ˆ", - "oauth_profile_signing_algorithm_description": "āŽĒāŽ¯āŽŠāŽ°ā¯ āŽšā¯āŽ¯āŽĩāŽŋāŽĩāŽ°āŽ¤ā¯āŽ¤āŽŋāŽ˛ā¯ āŽ•ā¯ˆāŽ¯ā¯ŠāŽĒā¯āŽĒāŽŽāŽŋāŽŸ āŽĒāŽ¯āŽŠā¯āŽĒāŽŸā¯āŽ¤ā¯āŽ¤āŽĒā¯āŽĒāŽŸā¯āŽŽā¯ āŽĩāŽ´āŽŋāŽŽā¯āŽąā¯ˆ.", - "oauth_scope": "āŽĩāŽžāŽ¯ā¯āŽĒā¯āŽĒ❁", "oauth_settings": "Oauth", "oauth_settings_description": "OAuth āŽ‰āŽŗā¯āŽ¨ā¯āŽ´ā¯ˆāŽĩ❁ āŽ…āŽŽā¯ˆāŽĒā¯āŽĒā¯āŽ•āŽŗā¯ˆ āŽ¨āŽŋāŽ°ā¯āŽĩāŽ•āŽŋāŽ•ā¯āŽ•āŽĩā¯āŽŽā¯", "oauth_settings_more_details": "āŽ‡āŽ¨ā¯āŽ¤ āŽ…āŽŽā¯āŽšāŽ¤ā¯āŽ¤ā¯ˆāŽĒā¯ āŽĒāŽąā¯āŽąāŽŋāŽ¯ āŽ•ā¯‚āŽŸā¯āŽ¤āŽ˛ā¯ āŽĩāŽŋāŽĩāŽ°āŽ™ā¯āŽ•āŽŗā¯āŽ•ā¯āŽ•ā¯, āŽŸāŽžāŽ•ā¯āŽ¸ā¯ āŽāŽĒā¯ āŽĒāŽžāŽ°ā¯āŽ•ā¯āŽ•āŽĩā¯āŽŽā¯.", - "oauth_signing_algorithm": "āŽ•ā¯ˆāŽ¯ā¯ŠāŽĒā¯āŽĒāŽŽāŽŋāŽŸā¯āŽŽā¯ āŽĩāŽ´āŽŋāŽŽā¯āŽąā¯ˆ", "oauth_storage_label_claim": "āŽšā¯‡āŽŽāŽŋāŽĒā¯āŽĒāŽ• āŽ˛ā¯‡āŽĒāŽŋāŽŗā¯ āŽ‰āŽ°āŽŋāŽŽā¯ˆāŽ•ā¯‹āŽ°āŽ˛ā¯", "oauth_storage_label_claim_description": "āŽĒāŽ¯āŽŠāŽ°āŽŋāŽŠā¯ āŽšā¯‡āŽŽāŽŋāŽĒā¯āŽĒāŽ• āŽ˛ā¯‡āŽĒāŽŋāŽŗā¯ˆ āŽ‡āŽ¨ā¯āŽ¤ āŽ‰āŽ°āŽŋāŽŽā¯ˆāŽ•ā¯‹āŽ°āŽ˛āŽŋāŽŠā¯ āŽŽāŽ¤āŽŋāŽĒā¯āŽĒā¯āŽ•ā¯āŽ•ā¯ āŽ¤āŽžāŽŠāŽžāŽ• āŽ…āŽŽā¯ˆāŽ•ā¯āŽ•āŽĩā¯āŽŽā¯.", "oauth_storage_quota_claim": "āŽšā¯‡āŽŽāŽŋāŽĒā¯āŽĒāŽ• āŽ’āŽ¤ā¯āŽ•ā¯āŽ•ā¯€āŽŸā¯ āŽ‰āŽ°āŽŋāŽŽā¯ˆāŽ•ā¯‹āŽ°āŽ˛ā¯", diff --git a/i18n/te.json b/i18n/te.json index a46773d36f..0dcb2f6df1 100644 --- a/i18n/te.json +++ b/i18n/te.json @@ -183,20 +183,13 @@ "oauth_auto_register": "ā°¸āąā°ĩāą€ā°¯ ā°¨ā°Žāą‹ā°Ļāą", "oauth_auto_register_description": "OAuth ā°¤āą‹ ā°¸āąˆā°¨āą ā°‡ā°¨āą ā°šāą‡ā°¸ā°ŋā°¨ ā°¤ā°°āąā°ĩā°žā°¤ ā°•āąŠā°¤āąā°¤ ā°ĩā°ŋā°¨ā°ŋā°¯āą‹ā°—ā°Ļā°žā°°āąā°˛ā°¨āą ā°¸āąā°ĩā°¯ā°‚ā°šā°žā°˛ā°•ā°‚ā°—ā°ž ā°¨ā°Žāą‹ā°Ļāą ā°šāą‡ā°¯ā°‚ā°Ąā°ŋ", "oauth_button_text": "ā°Ŧā°Ÿā°¨āą ā°ĩā°šā°¨ā°‚", - "oauth_client_id": "ā°•āąā°˛ā°¯ā°ŋā°‚ā°Ÿāą ID", - "oauth_client_secret": "ā°•āąā°˛ā°¯ā°ŋā°‚ā°Ÿāą ā°°ā°šā°¸āąā°¯ā°‚", "oauth_enable_description": "OAuth ā°¤āą‹ ā°˛ā°žā°—ā°ŋā°¨āą ā°…ā°ĩāąā°ĩā°‚ā°Ąā°ŋ", - "oauth_issuer_url": "ā°œā°žā°°āą€ā°Ļā°žā°°āą URL", "oauth_mobile_redirect_uri": "ā°ŽāąŠā°Ŧāąˆā°˛āą ā°Ļā°žā°°ā°ŋā°Žā°žā°°āąā°Ēāą URI", "oauth_mobile_redirect_uri_override": "ā°ŽāąŠā°Ŧāąˆā°˛āą ā°Ļā°žā°°ā°ŋā°Žā°žā°°āąā°Ēāą URI ā°“ā°ĩā°°āąâ€Œā°°āąˆā°Ąāą", "oauth_mobile_redirect_uri_override_description": "OAuth ā°Ēāąā°°āąŠā°ĩāąˆā°Ąā°°āą '{callback}'ā°ĩā°‚ā°Ÿā°ŋ ā°ŽāąŠā°Ŧāąˆā°˛āą URIā°¨ā°ŋ ā°…ā°¨āąā°Žā°¤ā°ŋā°‚ā°šā°¨ā°Ēāąā°Ēāąā°Ąāą ā°Ēāąā°°ā°žā°°ā°‚ā°­ā°ŋā°‚ā°šā°‚ā°Ąā°ŋ", - "oauth_profile_signing_algorithm": "ā°Ēāąā°°āąŠā°Ģāąˆā°˛āą ⰏⰂⰤⰕⰂ ā°…ā°˛āąā°—āą‹ā°°ā°ŋā°Ĩā°‚", - "oauth_profile_signing_algorithm_description": "ā°ĩā°ŋā°¨ā°ŋā°¯āą‹ā°—ā°Ļā°žā°°āą ā°Ēāąā°°āąŠā°Ģāąˆā°˛āąâ€Œā°Ēāąˆ ⰏⰂⰤⰕⰂ ā°šāą‡ā°¯ā°Ąā°žā°¨ā°ŋā°•ā°ŋ ā°‰ā°Ēā°¯āą‹ā°—ā°ŋā°‚ā°šāą‡ ā°…ā°˛āąā°—āą‹ā°°ā°ŋā°Ĩā°‚.", - "oauth_scope": "ā°Ēā°°ā°ŋā°§ā°ŋ", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth ā°˛ā°žā°—ā°ŋā°¨āą ā°¸āą†ā°Ÿāąā°Ÿā°ŋā°‚ā°—āąâ€Œā°˛ā°¨āą ā°¨ā°ŋā°°āąā°ĩā°šā°ŋā°‚ā°šā°‚ā°Ąā°ŋ", "oauth_settings_more_details": "Ⰸ ā°Ģāą€ā°šā°°āą ā°—āąā°°ā°ŋā°‚ā°šā°ŋ ā°Žā°°ā°ŋā°¨āąā°¨ā°ŋ ā°ĩā°ŋā°ĩā°°ā°žā°˛ ā°•āą‹ā°¸ā°‚, ā°Ąā°žā°•āąā°¸āą ā°šāą‚ā°Ąā°‚ā°Ąā°ŋ.", - "oauth_signing_algorithm": "ⰏⰂⰤⰕⰂ ā°…ā°˛āąā°—āą‹ā°°ā°ŋā°Ĩā°‚", "oauth_storage_label_claim": "ā°¨ā°ŋā°˛āąā°ĩ ā°˛āą‡ā°Ŧāąā°˛āą ā°•āąā°˛āą†ā°¯ā°ŋā°Žāą", "oauth_storage_label_claim_description": "ā°¯āą‚ā°œā°°āą ā°¯āąŠā°•āąā°• ā°¨ā°ŋā°˛āąā°ĩ ā°˛āą‡ā°Ŧāąā°˛āąâ€Œā°¨āą Ⰸ ā°•āąā°˛āą†ā°¯ā°ŋā°Žāą ā°ĩā°ŋā°˛āąā°ĩā°•āą ā°¸āąā°ĩā°¯ā°‚ā°šā°žā°˛ā°•ā°‚ā°—ā°ž ā°¸āą†ā°Ÿāą ā°šāą‡ā°¯ā°‚ā°Ąā°ŋ.", "oauth_storage_quota_claim": "ā°¨ā°ŋā°˛āąā°ĩ ā°•āą‹ā°Ÿā°ž ā°•āąā°˛āą†ā°¯ā°ŋā°Žāą", diff --git a/i18n/th.json b/i18n/th.json index 939ab431a9..a77bb94116 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -191,20 +191,13 @@ "oauth_auto_register": "ā¸Ĩā¸‡ā¸—ā¸°āš€ā¸šā¸ĩā¸ĸā¸™ā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "oauth_auto_register_description": "ā¸Ĩā¸‡ā¸—ā¸°āš€ā¸šā¸ĩā¸ĸā¸™ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™āšƒā¸Ģā¸Ąāšˆā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´āš€ā¸Ąā¸ˇāšˆā¸­ā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ā¸œāšˆā¸˛ā¸™ OAuth", "oauth_button_text": "ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸›ā¸¸āšˆā¸Ąā¸ā¸”", - "oauth_client_id": "ID āš„ā¸„ā¸Ĩāš€ā¸­ā¸™ā¸•āšŒ", - "oauth_client_secret": "Secret āš„ā¸„ā¸Ĩāš€ā¸­ā¸™ā¸•āšŒ", "oauth_enable_description": "ā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ā¸œāšˆā¸˛ā¸™ OAuth", - "oauth_issuer_url": "ā¸œā¸šāš‰ā¸­ā¸­ā¸ URL", "oauth_mobile_redirect_uri": "URI āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸šā¸™āš‚ā¸—ā¸Ŗā¸¨ā¸ąā¸žā¸—āšŒ", "oauth_mobile_redirect_uri_override": "āšā¸—ā¸™ā¸—ā¸ĩāšˆ URI āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡ā¸šā¸™āš‚ā¸—ā¸Ŗā¸¨ā¸ąā¸žā¸—āšŒ", "oauth_mobile_redirect_uri_override_description": "āš€ā¸›ā¸´ā¸”āš€ā¸Ąā¸ˇāšˆā¸­ 'app.immich:/' āš€ā¸›āš‡ā¸™ URI ⏗ā¸ĩāšˆāš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™āš€ā¸Ēāš‰ā¸™ā¸—ā¸˛ā¸‡āš„ā¸Ąāšˆā¸–ā¸šā¸ā¸•āš‰ā¸­ā¸‡", - "oauth_profile_signing_algorithm": "ā¸­ā¸ąā¸Ĩ⏁⏭⏪⏴⏗ā¸ļā¸Ąā¸ā¸˛ā¸Ŗā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸šā¸ąā¸ā¸Šā¸ĩā¸œā¸šāš‰āšƒā¸Šāš‰", - "oauth_profile_signing_algorithm_description": "ā¸­ā¸ąā¸Ĩ⏁⏭⏪⏴⏗ā¸ļā¸Ąāšƒā¸Šāš‰āšƒā¸™ā¸ā¸˛ā¸Ŗā¸Ŗā¸ąā¸šā¸Ŗā¸­ā¸‡ā¸šā¸ąā¸ā¸Šā¸ĩā¸œā¸šāš‰āšƒā¸Šāš‰", - "oauth_scope": "ā¸‚ā¸­ā¸šāš€ā¸‚ā¸•", "oauth_settings": "OAuth", "oauth_settings_description": "ā¸ˆā¸ąā¸”ā¸ā¸˛ā¸Ŗā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸Ĩāš‡ā¸­ā¸ā¸­ā¸´ā¸™ā¸œāšˆā¸˛ā¸™ OAuth", "oauth_settings_more_details": "ā¸Ē⏺ā¸Ģā¸Ŗā¸ąā¸šā¸Ŗā¸˛ā¸ĸā¸Ĩā¸°āš€ā¸­ā¸ĩā¸ĸā¸”āš€ā¸žā¸´āšˆā¸Ąāš€ā¸•ā¸´ā¸Ą āšƒā¸Ģāš‰ā¸­āš‰ā¸˛ā¸‡ā¸–ā¸ļā¸‡āš€ā¸­ā¸ā¸Ē⏞⏪", - "oauth_signing_algorithm": "ā¸­ā¸ąā¸Ĩ⏁⏭⏪⏴⏗ā¸ļā¸Ąā¸ā¸˛ā¸Ŗā¸Ĩā¸‡ā¸™ā¸˛ā¸Ą", "oauth_storage_label_claim": "ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸—ā¸ĩāšˆāšƒā¸Šāš‰ā¸­āš‰ā¸˛ā¸‡ā¸–ā¸ļā¸‡ā¸›āš‰ā¸˛ā¸ĸā¸ā¸ŗā¸ā¸ąā¸šā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸š", "oauth_storage_label_claim_description": "ā¸•ā¸ąāš‰ā¸‡ā¸›āš‰ā¸˛ā¸ĸā¸ā¸ŗā¸ā¸ąā¸šā¸ā¸˛ā¸Ŗā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸šā¸‚ā¸­ā¸‡ā¸œā¸šāš‰āšƒā¸Šāš‰ā¸‡ā¸˛ā¸™ā¸•ā¸˛ā¸Ąā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸—ā¸ĩāšˆāšƒā¸Šāš‰ā¸­āš‰ā¸˛ā¸‡ā¸–ā¸ļā¸‡āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "oauth_storage_quota_claim": "ā¸Ēā¸´ā¸—ā¸˜ā¸´āšŒā¸—ā¸ĩāšˆāšƒā¸Šāš‰ā¸­āš‰ā¸˛ā¸‡ā¸–ā¸ļā¸‡āš‚ā¸„ā¸§ā¸•āš‰ā¸˛ā¸žā¸ˇāš‰ā¸™ā¸—ā¸ĩāšˆā¸ˆā¸ąā¸”āš€ā¸āš‡ā¸š", diff --git a/i18n/tr.json b/i18n/tr.json index db9088f5e7..12795bc9bd 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -187,20 +187,13 @@ "oauth_auto_register": "Otomatik kayÄąt", "oauth_auto_register_description": "OAuth ile giriş yapan yeni kullanÄącÄąlarÄą otomatik kaydet", "oauth_button_text": "Buton yazÄąsÄą", - "oauth_client_id": "İstemci ID", - "oauth_client_secret": "Gizli İstemci AnahtarÄą", "oauth_enable_description": "OAuth ile giriş yap", - "oauth_issuer_url": "YayÄąnlayÄącÄą URL", "oauth_mobile_redirect_uri": "Mobil yÃļnlendirme URL'si", "oauth_mobile_redirect_uri_override": "Mobilde zorla kullanÄąlacak YÃļnlendirme Adresi", "oauth_mobile_redirect_uri_override_description": "Mobil URI'ye izin vermeyen OAuth sağlayÄącÄąsÄą olduğunda etkinleştir, Ãļrneğin '{callback}'", - "oauth_profile_signing_algorithm": "Profil imzalama algoritmasÄą", - "oauth_profile_signing_algorithm_description": "KullanÄącÄąnÄąn profilini imzalarken kullanÄąlacak gÃŧvenlik algoritmasÄą.", - "oauth_scope": "Kapsam", "oauth_settings": "OAuth", "oauth_settings_description": "OAuth giriş ayarlarÄąnÄą yÃļnet", "oauth_settings_more_details": "Bu Ãļzellik hakkÄąnda daha fazla bilgi için bu sayfayÄą ziyaret edin DÃļkÃŧmanlar.", - "oauth_signing_algorithm": "İmzalama algoritmasÄą", "oauth_storage_label_claim": "Depolama etiketi talebi", "oauth_storage_label_claim_description": "KullanÄącÄąnÄąn dosyalarÄąnÄą depolarken kullanÄąlan alt klasÃļrÃŧn adÄąnÄą belirlerken kulanÄąlacak değer (en: OAuth claim).", "oauth_storage_quota_claim": "Depolama kotasÄą talebi", diff --git a/i18n/uk.json b/i18n/uk.json index 061d9bd78f..a1ce9461f5 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -192,20 +192,13 @@ "oauth_auto_register": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊа Ņ€ĐĩŅ”ŅŅ‚Ņ€Đ°Ņ†Ņ–Ņ", "oauth_auto_register_description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Ņ€ĐĩŅ”ŅŅ‚Ņ€ŅƒĐ˛Đ°Ņ‚Đ¸ ĐŊĐžĐ˛Đ¸Ņ… ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Ņ–Đ˛ ĐŋҖҁĐģŅ Đ˛Ņ…ĐžĐ´Ņƒ ҇ĐĩŅ€ĐĩС OAuth", "oauth_button_text": "ĐĸĐĩĐēҁ҂ ĐēĐŊĐžĐŋĐēи", - "oauth_client_id": "ID КĐģŅ–Ņ”ĐŊŅ‚Đ°", - "oauth_client_secret": "ĐĄĐĩĐēŅ€ĐĩŅ‚ ĐēĐģŅ–Ņ”ĐŊŅ‚Đ°", "oauth_enable_description": "ĐŖĐ˛Ņ–ĐšŅ‚Đ¸ Са Đ´ĐžĐŋĐžĐŧĐžĐŗĐžŅŽ OAuth", - "oauth_issuer_url": "URL Đ˛Đ¸Đ´Đ°Ņ‡Ņ–", "oauth_mobile_redirect_uri": "URI ĐŧĐžĐąŅ–ĐģҌĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ", "oauth_mobile_redirect_uri_override": "ПĐĩŅ€ĐĩвиСĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ URI ĐŧĐžĐąŅ–ĐģҌĐŊĐžĐŗĐž ĐŋĐĩŅ€ĐĩĐŊаĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ", "oauth_mobile_redirect_uri_override_description": "ĐŖĐ˛Ņ–ĐŧĐēĐŊŅƒŅ‚Đ¸, ŅĐēŅ‰Đž OAuth-ĐŋŅ€ĐžĐ˛Đ°ĐšĐ´ĐĩŅ€ ĐŊĐĩ ĐŋŅ–Đ´Ņ‚Ņ€Đ¸ĐŧŅƒŅ” ĐŧĐžĐąŅ–ĐģҌĐŊиК URI, ŅĐē '{callback}'", - "oauth_profile_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ ĐŋŅ–Đ´ĐŋĐ¸ŅĐ°ĐŊĐŊŅ ĐŋŅ€ĐžŅ„Ņ–ĐģŅŽ", - "oauth_profile_signing_algorithm_description": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ, ŅĐēиК виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´ĐģŅ ĐŋŅ–Đ´ĐŋĐ¸ŅŅƒ ĐŋŅ€ĐžŅ„Ņ–ĐģŅŽ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ°.", - "oauth_scope": "ĐœĐ°ŅŅˆŅ‚Đ°Đą", "oauth_settings": "OAuth", "oauth_settings_description": "КĐĩŅ€ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅĐŧи Đ˛Ņ…ĐžĐ´Ņƒ ҇ĐĩŅ€ĐĩС OAuth", "oauth_settings_more_details": "ДĐģŅ ĐžŅ‚Ņ€Đ¸ĐŧаĐŊĐŊŅ Đ´ĐžĐ´Đ°Ņ‚ĐēĐžĐ˛ĐžŅ— Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–Ņ— ĐŋŅ€Đž Ņ†ŅŽ Ņ„ŅƒĐŊĐēŅ†Ņ–ŅŽ, СвĐĩŅ€ĐŊŅ–Ņ‚ŅŒŅŅ Đ´Đž Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Ņ–Ņ—.", - "oauth_signing_algorithm": "АĐģĐŗĐžŅ€Đ¸Ņ‚Đŧ ĐŋŅ–Đ´ĐŋĐ¸ŅŅƒ", "oauth_storage_label_claim": "ĐĸĐĩĐŗ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Ņ–Ņ— ŅŅ…ĐžĐ˛Đ¸Ņ‰Đ°", "oauth_storage_label_claim_description": "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐŊĐž Đ˛ŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚Đ¸ ĐŧŅ–Ņ‚Đē҃ СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ ĐēĐžŅ€Đ¸ŅŅ‚ŅƒĐ˛Đ°Ņ‡Đ° ĐŊа СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ҆ҖҔҗ виĐŧĐžĐŗĐ¸.", "oauth_storage_quota_claim": "Đ—Đ°ŅĐ˛Đēа ĐŊа ĐēĐ˛ĐžŅ‚Ņƒ ĐŊа СйĐĩŅ€Ņ–ĐŗĐ°ĐŊĐŊŅ", @@ -1544,7 +1537,7 @@ "search_places": "ĐŸĐžŅˆŅƒĐē ĐŧŅ–ŅŅ†ŅŒ", "search_rating": "ĐŸĐžŅˆŅƒĐē Са Ņ€ĐĩĐšŅ‚Đ¸ĐŊĐŗĐžĐŧ...", "search_result_page_new_search_hint": "Новий ĐŋĐžŅˆŅƒĐē", - "search_settings": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐžŅˆŅƒĐē҃", + "search_settings": "ĐŸĐžŅˆŅƒĐē ĐŊаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ", "search_state": "ĐŸĐžŅˆŅƒĐē Ņ€ĐĩĐŗŅ–ĐžĐŊ҃...", "search_suggestion_list_smart_search_hint_1": "Đ ĐžĐˇŅƒĐŧĐŊиК ĐŋĐžŅˆŅƒĐē ŅƒĐ˛Ņ–ĐŧĐēĐŊĐĩĐŊĐž Са СаĐŧĐžĐ˛Ņ‡ŅƒĐ˛Đ°ĐŊĐŊŅĐŧ, Đ´ĐģŅ ĐŋĐžŅˆŅƒĐē҃ Са ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊиĐŧи виĐēĐžŅ€Đ¸ŅŅ‚ĐžĐ˛ŅƒĐšŅ‚Đĩ ŅĐ¸ĐŊŅ‚Đ°ĐēŅĐ¸Ņ. ", "search_suggestion_list_smart_search_hint_2": "m:Đ˛Đ°Ņˆ-ĐŋĐžŅˆŅƒĐēОвиК-Ņ‚ĐĩŅ€ĐŧŅ–ĐŊ", @@ -1889,11 +1882,11 @@ "week": "ĐĸиĐļĐ´ĐĩĐŊҌ", "welcome": "Đ›Đ°ŅĐēавО ĐŋŅ€ĐžŅĐ¸ĐŧĐž", "welcome_to_immich": "Đ›Đ°ŅĐēавО ĐŋŅ€ĐžŅĐ¸ĐŧĐž Đ´Đž Immich", - "wifi_name": "Назва WiFi", + "wifi_name": "Назва Wi-Fi", "year": "Đ Ņ–Đē", "years_ago": "{years, plural, one {# ҀҖĐē} few {# Ņ€ĐžĐēи} many {# Ņ€ĐžĐēŅ–Đ˛} other {# Ņ€ĐžĐēŅ–Đ˛}} Ņ‚ĐžĐŧ҃", "yes": "ĐĸаĐē", "you_dont_have_any_shared_links": "ĐŖ Đ˛Đ°Ņ ĐŊĐĩĐŧĐ°Ņ” ҁĐŋŅ–ĐģҌĐŊĐ¸Ņ… ĐŋĐžŅĐ¸ĐģаĐŊҌ", - "your_wifi_name": "Đ’Đ°ŅˆĐ° ĐŊаСва WiFi", + "your_wifi_name": "Назва Đ˛Đ°ŅˆĐžŅ— Wi-Fi ĐŧĐĩŅ€ĐĩĐļŅ–", "zoom_image": "Đ—ĐąŅ–ĐģŅŒŅˆĐ¸Ņ‚Đ¸ ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐŊŅ" } diff --git a/i18n/ur.json b/i18n/ur.json index f68a3fe2ae..c439165e2d 100644 --- a/i18n/ur.json +++ b/i18n/ur.json @@ -2,19 +2,44 @@ "about": "Ų…ØĒØšŲ„Ų‚", "account": "Ø§ÚŠØ§Ø¤Ų†Ųš", "account_settings": "Ø§ÚŠØ§Ø¤Ų†Ųš ÚŠÛŒ ØĒØąØĒیباØĒ", + "acknowledge": "ØĒØŗŲ„ÛŒŲ… ÚŠØąŲ†Ø§", "action": "ØšŲ…Ų„", + "action_common_update": "Ø§Ųž ÚˆÛŒŲš", "actions": "Ø§ØšŲ…Ø§Ų„", "active": "ŲØšØ§Ų„", "activity": "ØŗØąÚ¯ØąŲ…ÛŒ", + "activity_changed": "ØŗØąÚ¯ØąŲ…ÛŒ {enabled, select, true {ŲØšØ§Ų„ ہے} other {ØēÛŒØą ŲØšØ§Ų„ ہے}}", "add": "Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_a_description": "ØĒ؁ØĩÛŒŲ„ Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_a_location": "Ų…Ų‚Ø§Ų… Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_a_name": "Ų†Ø§Ų… Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_a_title": "ØšŲ†ŲˆØ§Ų† Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", + "add_endpoint": "ا؎ØĒØĒØ§Ų…ÛŒ Ų†Ų‚ØˇÛ Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_exclusion_pattern": "ØŽØ§ØąØŦ ÚŠØąŲ†Û’ ڊا Ų†Ų…ŲˆŲ†Û Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_import_path": "Ø¯ØąØĸŲ…Ø¯ ڊا ØąØ§ØŗØĒہ Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_location": "Ų…Ų‚Ø§Ų… Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_more_users": "Ų…Ø˛ÛŒØ¯ ØĩØ§ØąŲÛŒŲ† Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", "add_partner": "ØŗØ§ØĒÚžÛŒ Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", - "add_path": "ØąØ§ØŗØĒہ Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē" + "add_path": "ØąØ§ØŗØĒہ Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", + "add_photos": "ØĒØĩØ§ŲˆÛŒØą Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", + "add_to": "Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚēâ€Ļ", + "add_to_album": "Ø§Ų„Ø¨Ų… Ų…ÛŒÚē Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", + "add_to_album_bottom_sheet_added": "{album} Ų…ÛŒÚē Ø´Ø§Ų…Ų„ ÚŠØąØ¯ÛŒØ§Ú¯ÛŒØ§", + "add_to_album_bottom_sheet_already_exists": "ŲžÛŲ„Û’ ہی {album} Ų…ÛŒÚē Ø´Ø§Ų…Ų„ ہے", + "add_to_shared_album": "Ų…Ø´ØĒØąÚŠÛ Ø§Ų„Ø¨Ų… Ų…ÛŒÚē Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", + "add_url": "URL Ø´Ø§Ų…Ų„ ÚŠØąÛŒÚē", + "added_to_archive": "Ų…Ø­ŲŲˆØ¸ شدہ Ø¯ØŗØĒØ§ŲˆÛŒØ˛Ø§ØĒ Ų…ÛŒÚē Ø´Ø§Ų…Ų„ ڊیا گیا", + "added_to_favorites": "ŲžØŗŲ†Ø¯ÛŒØ¯Û Ų…ÛŒÚē Ø´Ø§Ų…Ų„ ڊیا گیا", + "added_to_favorites_count": "ŲžØŗŲ†Ø¯ÛŒØ¯Û Ų…ÛŒÚē {count, number} Ø´Ø§Ų…Ų„ ڊیے Ú¯ØĻے", + "admin": { + "authentication_settings_disable_all": "ڊیا ØĸŲž ŲˆØ§Ų‚ØšÛŒ Ų„Ø§Ú¯ Ø§Ų† ÚŠÛ’ ØĒŲ…Ø§Ų… ØˇØąÛŒŲ‚ŲˆÚē ÚŠŲˆ ØēÛŒØą ŲØšØ§Ų„ ÚŠØąŲ†Ø§ چاہØĒے ہیÚ稟 Ų„Ø§Ú¯ Ø§Ų† Ų…ÚŠŲ…Ų„ ØˇŲˆØą ŲžØą ØēÛŒØą ŲØšØ§Ų„ ÛŲˆ ØŦاØĻے گا۔", + "check_all": "ØŗØ¨ چیڊ ÚŠØąÛŒÚē", + "cleanup": "ØĩØ§Ų ÚŠØąŲˆ", + "confirm_delete_library": "ڊیا ØĸŲž ŲˆØ§Ų‚ØšÛŒ {library} Ų„Ø§ØĻØ¨ØąÛŒØąÛŒ ÚŠŲˆ Ø­Ø°Ų ÚŠØąŲ†Ø§ چاہØĒے ہیÚ稟", + "confirm_email_below": "ØĒØĩØ¯ÛŒŲ‚ ÚŠØąŲ†Û’ ÚŠÛ’ Ų„ÛŒÛ’ØŒ Ų†ÛŒÚ†Û’ ای Ų…ÛŒŲ„ ŲšØ§ØĻŲž ÚŠØąÛŒÚē {email}", + "image_preview_title": "ŲžÛŒØ´ Ų†Ø¸Ø§ØąÛ", + "image_quality": "Ų…ØšÛŒØ§Øą", + "image_settings": "ØĒØĩŲˆÛŒØą ÚŠÛŒ ØĒØąØĒیباØĒ" + }, + "zoom_image": "Ø˛ŲˆŲ… ØĒØĩŲˆÛŒØą" } diff --git a/i18n/vi.json b/i18n/vi.json index 9262d8a6b3..7a0bc83a96 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -1,5 +1,5 @@ { - "about": "Làm máģ›i", + "about": "Giáģ›i thiáģ‡u", "account": "Tài khoáēŖn", "account_settings": "Cài đáēˇt tài khoáēŖn", "acknowledge": "Ghi nháē­n", @@ -22,11 +22,12 @@ "add_partner": "ThÃĒm ngưáģi thÃĸn", "add_path": "ThÃĒm đưáģng dáēĢn", "add_photos": "ThÃĒm áēŖnh", - "add_to": "ThÃĒm vào...", + "add_to": "ThÃĒm vàoâ€Ļ", "add_to_album": "ThÃĒm vào album", "add_to_album_bottom_sheet_added": "ThÃĒm vào {album}", "add_to_album_bottom_sheet_already_exists": "ÄÃŖ cÃŗ sáēĩn trong {album}", "add_to_shared_album": "ThÃĒm vào album chia sáēģ", + "add_url": "ThÃĒm URL", "added_to_archive": "ÄÃŖ thÃĒm vào Kho lưu tráģ¯", "added_to_favorites": "ÄÃŖ thÃĒm vào MáģĨc yÃĒu thích", "added_to_favorites_count": "ÄÃŖ thÃĒm {count, number} vào MáģĨc yÃĒu thích", @@ -38,8 +39,8 @@ "authentication_settings_disable_all": "BáēĄn cÃŗ cháē¯c cháē¯n muáģ‘n vô hiáģ‡u hoÃĄ táēĨt cáēŖ cÃĄc phÆ°ÆĄng tháģŠc đăng nháē­p? Đăng nháē­p sáēŊ báģ‹ vô hiáģ‡u hÃŗa hoàn toàn.", "authentication_settings_reenable": "Đáģƒ báē­t láēĄi, dÚng Láģ‡nh MÃĄy cháģ§.", "background_task_job": "CÃĄc tÃĄc váģĨ náģn", - "backup_database": "Sao lưu dáģ¯ liáģ‡u", - "backup_database_enable_description": "Kích hoáēĄt Sao lưu dáģ¯ liáģ‡u", + "backup_database": "TáēĄo báēŖn sao lưu cÆĄ sáģŸ dáģ¯ liáģ‡u", + "backup_database_enable_description": "Báē­t sao lưu cÆĄ sáģŸ dáģ¯ liáģ‡u", "backup_keep_last_amount": "Sáģ‘ lưáģŖng cÃĄc báēŖn Sao lưu đưáģŖc giáģ¯ láēĄi", "backup_settings": "Cài đáēˇt sao lưu", "backup_settings_description": "QuáēŖn lÃŊ cÃĄc thông sáģ‘ cài đáēˇt cáģ§a Sao lưu dáģ¯ liáģ‡u", @@ -188,20 +189,13 @@ "oauth_auto_register": "Táģą Ä‘áģ™ng đăng kÃŊ", "oauth_auto_register_description": "Táģą Ä‘áģ™ng đăng kÃŊ ngưáģi dÚng máģ›i sau khi đăng nháē­p váģ›i OAuth", "oauth_button_text": "Náģ™i dung văn báēŖn nÃēt báēĨm", - "oauth_client_id": "MÃŖ áģŠng dáģĨng khÃĄch OAuth", - "oauth_client_secret": "Máē­t kháēŠu áģŠng dáģĨng khÃĄch OAuth", "oauth_enable_description": "Đăng nháē­p váģ›i OAuth", - "oauth_issuer_url": "Đáģ‹a cháģ‰ nhà cung cáēĨp OAuth", "oauth_mobile_redirect_uri": "URI chuyáģƒn hưáģ›ng trÃĒn thiáēŋt báģ‹ di đáģ™ng", "oauth_mobile_redirect_uri_override": "Ghi đè URI chuyáģƒn hưáģ›ng cho thiáēŋt báģ‹ di đáģ™ng", "oauth_mobile_redirect_uri_override_description": "Báē­t khi nhà cung cáēĨp OAuth không cho phÊp URI di đáģ™ng, như '{callback}'", - "oauth_profile_signing_algorithm": "Thuáē­t toÃĄn kÃŊ vào háģ“ sÆĄ ngưáģi dÚng", - "oauth_profile_signing_algorithm_description": "Thuáē­t toÃĄn đưáģŖc sáģ­ dáģĨng đáģƒ kÃŊ vào háģ“ sÆĄ ngưáģi dÚng.", - "oauth_scope": "PháēĄm vi", "oauth_settings": "OAuth", "oauth_settings_description": "QuáēŖn lÃŊ cài đáēˇt đăng nháē­p OAuth", "oauth_settings_more_details": "Đáģƒ biáēŋt thÃĒm chi tiáēŋt váģ tính năng này, hÃŖy tham kháēŖo tài liáģ‡u.", - "oauth_signing_algorithm": "Thuáē­t toÃĄn kÃŊ", "oauth_storage_label_claim": "Claim cho nhÃŖn lưu tráģ¯", "oauth_storage_label_claim_description": "Táģą Ä‘áģ™ng đáēˇt nhÃŖn lưu tráģ¯ cáģ§a ngưáģi dÚng theo giÃĄ tráģ‹ cáģ§a claim này.", "oauth_storage_quota_claim": "Claim cho háēĄn máģŠc lưu tráģ¯", @@ -299,7 +293,7 @@ "transcoding_hardware_acceleration": "Tăng táģ‘c pháē§n cáģŠng", "transcoding_hardware_acceleration_description": "(Tháģ­ nghiáģ‡m) nhanh hÆĄn nhiáģu nhưng sáēŊ cÃŗ cháēĨt lưáģŖng tháēĨp hÆĄn áģŸ cÚng bitrate", "transcoding_hardware_decoding": "GiáēŖi mÃŖ pháē§n cáģŠng", - "transcoding_hardware_decoding_setting_description": "Cho phÊp tăng táģ‘c đáē§u cuáģ‘i thay vÃŦ cháģ‰ tăng táģ‘c mÃŖ hÃŗa. CÃŗ tháģƒ không hoáēĄt đáģ™ng trÃĒn táēĨt cáēŖ video.", + "transcoding_hardware_decoding_setting_description": "Cho phÊp tăng táģ‘c đáē§u cuáģ‘i thay vÃŦ cháģ‰ tăng táģ‘c mÃŖ hÃŗa. CÃŗ tháģƒ không hoáēĄt đáģ™ng váģ›i máģi video.", "transcoding_hevc_codec": "Codec HEVC", "transcoding_max_b_frames": "Sáģ‘ B-frame táģ‘i đa", "transcoding_max_b_frames_description": "GiÃĄ tráģ‹ cao hÆĄn cáēŖi thiáģ‡n hiáģ‡u quáēŖ nÊn, nhưng làm cháē­m mÃŖ hÃŗa. CÃŗ tháģƒ không tÆ°ÆĄng thích váģ›i tăng táģ‘c pháē§n cáģŠng trÃĒn cÃĄc thiáēŋt báģ‹ cÅŠ. GiÃĄ tráģ‹ 0 đáģƒ táē¯t B-frames, trong khi giÃĄ tráģ‹ -1 đáģƒ táģą Ä‘áģ™ng thiáēŋt láē­p giÃĄ tráģ‹ này.", diff --git a/i18n/zh_Hant.json b/i18n/zh_Hant.json index 7758052880..0dc86f00c0 100644 --- a/i18n/zh_Hant.json +++ b/i18n/zh_Hant.json @@ -192,20 +192,13 @@ "oauth_auto_register": "č‡Ē動č¨ģ冊", "oauth_auto_register_description": "äŊŋᔍ OAuth į™ģ錄垌č‡Ē動č¨ģå†Šæ–°į”¨æˆļ", "oauth_button_text": "按鈕文字", - "oauth_client_id": "åŽĸæˆļį̝ ID", - "oauth_client_secret": "åŽĸæˆļį̝坆鑰", "oauth_enable_description": "ᔍ OAuth į™ģå…Ĩ", - "oauth_issuer_url": "į°Ŋį™ŧ者įļ˛å€", "oauth_mobile_redirect_uri": "į§ģ動įĢ¯é‡åŽšå‘ URI", "oauth_mobile_redirect_uri_override": "į§ģ動įĢ¯é‡åŽšå‘ URI čφ蓋", "oauth_mobile_redirect_uri_override_description": "į•ļ OAuth æäž›č€…ä¸å…č¨ąäŊŋį”¨čĄŒå‹• URIīŧˆåĻ‚ã€Œ'{callback}'」īŧ‰æ™‚å•Ÿį”¨", - "oauth_profile_signing_algorithm": "č¨­åŽšæĒ”į°ŊįĢ æŧ”įŽ—æŗ•", - "oauth_profile_signing_algorithm_description": "ᔍæ–ŧį°ŊįŊ˛äŊŋį”¨č€…č¨­åŽšæĒ”įš„æŧ”įŽ—æŗ•ã€‚", - "oauth_scope": "į¯„åœ", "oauth_settings": "OAuth", "oauth_settings_description": "įŽĄį† OAuth į™ģå…Ĩč¨­åŽš", "oauth_settings_more_details": "æŦ˛įž­č§Ŗæ­¤åŠŸčƒŊīŧŒčĢ‹åƒé–ąčĒĒæ˜Žæ›¸ã€‚", - "oauth_signing_algorithm": "į°ŊįĢ æŧ”įŽ—æŗ•", "oauth_storage_label_claim": "å„˛å­˜æ¨™įą¤åŽŖå‘Š", "oauth_storage_label_claim_description": "č‡Ē動將äŊŋį”¨č€…įš„å„˛å­˜æ¨™įą¤åŽšį‚ēæ­¤åŽŖå‘Šäš‹å€ŧ。", "oauth_storage_quota_claim": "å„˛å­˜é…éĄåŽŖå‘Š", @@ -1552,7 +1545,7 @@ "select": "選擇", "select_album_cover": "é¸æ“‡į›¸į°ŋ封éĸ", "select_all": "選擇全部", - "select_all_duplicates": "é¸æ“‡æ‰€æœ‰é‡č¤‡é …", + "select_all_duplicates": "äŋį•™æ‰€æœ‰é‡č¤‡é …", "select_avatar_color": "選擇åŊĸ象顏色", "select_face": "é¸æ“‡č‡‰å­”", "select_featured_photo": "é¸æ“‡į‰šč‰˛į…§į‰‡", diff --git a/i18n/zh_SIMPLIFIED.json b/i18n/zh_SIMPLIFIED.json index 573fbb7a24..c379efcd68 100644 --- a/i18n/zh_SIMPLIFIED.json +++ b/i18n/zh_SIMPLIFIED.json @@ -14,7 +14,7 @@ "add_a_location": "æˇģ加äŊįŊŽ", "add_a_name": "æˇģåŠ åį§°", "add_a_title": "æˇģ加标éĸ˜", - "add_endpoint": "æˇģåŠ æœåŠĄæŽĨåŖ", + "add_endpoint": "æˇģåŠ æœåŠĄå™¨ URL", "add_exclusion_pattern": "æˇģåŠ æŽ’é™¤č§„åˆ™", "add_import_path": "æˇģ加å¯ŧå…Ĩčˇ¯åž„", "add_location": "æˇģåŠ åœ°į‚š", @@ -27,7 +27,7 @@ "add_to_album_bottom_sheet_added": "æˇģ加到 {album}", "add_to_album_bottom_sheet_already_exists": "厞圍 {album} 中", "add_to_shared_album": "æˇģåŠ åˆ°å…ąäēĢį›¸å†Œ", - "add_url": "æˇģ加URL", + "add_url": "æˇģ加 URL", "added_to_archive": "æˇģ加到åŊ’æĄŖ", "added_to_favorites": "æˇģ加到æ”ļ藏", "added_to_favorites_count": "æˇģ加{count, number}éĄšåˆ°æ”ļ藏", @@ -181,7 +181,7 @@ "notification_email_sent_test_email_button": "发送æĩ‹č¯•邎äģļåšļäŋå­˜", "notification_email_setting_description": "发送邎äģļ通įŸĨ莞įŊŽ", "notification_email_test_email": "发送æĩ‹č¯•邎äģļ", - "notification_email_test_email_failed": "发送æĩ‹č¯•邎äģļå¤ąč´ĨīŧŒč¯ˇæŖ€æŸĨäŊ čž“å…Ĩįš„äŋĄæ¯", + "notification_email_test_email_failed": "发送æĩ‹č¯•邎äģļå¤ąč´ĨīŧŒč¯ˇæŖ€æŸĨæ‚¨čž“å…Ĩįš„äŋĄæ¯", "notification_email_test_email_sent": "厞向 {email} 发送äē†ä¸€å°æĩ‹č¯•邎äģļīŧŒč¯ˇæŗ¨æ„æŸĨæ”ļ。", "notification_email_username_description": "与邮äģᅵåŠĄå™¨čŋ›čĄŒčēĢäģŊénj蝁æ—ļäŊŋį”¨įš„į”¨æˆˇå", "notification_enable_email_notifications": "å¯į”¨é‚Žäģļ通įŸĨ", @@ -192,26 +192,22 @@ "oauth_auto_register": "č‡ĒåŠ¨æŗ¨å†Œ", "oauth_auto_register_description": "äŊŋᔍ OAuth į™ģåŊ•后č‡ĒåŠ¨æŗ¨å†Œä¸ēæ–°į”¨æˆˇ", "oauth_button_text": "按钎文æœŦ", - "oauth_client_id": "åŽĸæˆˇį̝ ID", - "oauth_client_secret": "åŽĸæˆˇį̝坆é’Ĩ", + "oauth_client_secret_description": "åĻ‚æžœ OAuth 提䞛商不支持 PKCEīŧˆį”¨äēŽäģŖį ä礿ĸįš„č¯æ˜Žå¯†é’Ĩīŧ‰īŧŒåˆ™ä¸ēåŋ…åĄĢ饚", "oauth_enable_description": "äŊŋᔍ OAuth į™ģåŊ•", - "oauth_issuer_url": "提䞛斚 URL", "oauth_mobile_redirect_uri": "į§ģ动įĢ¯é‡åŽšå‘ URI", "oauth_mobile_redirect_uri_override": "į§ģ动įĢ¯é‡åŽšå‘ URI čφᛖ", "oauth_mobile_redirect_uri_override_description": "åŊ“ OAuth æäž›å•†ä¸å…čŽ¸äŊŋᔍį§ģ动 URI æ—ļ吝ᔍīŧŒåĻ‚â€œ'{callback}'”", - "oauth_profile_signing_algorithm": "配įŊŽæ–‡äģļį­žåįŽ—æŗ•", - "oauth_profile_signing_algorithm_description": "ᔍäēŽį­žįŊ˛į”¨æˆˇé…įŊŽæ–‡äģļįš„įŽ—æŗ•ã€‚", - "oauth_scope": "čŒƒå›´", "oauth_settings": "OAuth", "oauth_settings_description": "įŽĄį† OAuth į™ģåŊ•莞įŊŽ", "oauth_settings_more_details": "å…ŗäēŽæ­¤åŠŸčƒŊįš„æ›´å¤šč¯Ļįģ†äŋĄæ¯īŧŒč¯ˇæŸĨįœ‹į›¸å…ŗæ–‡æĄŖã€‚", - "oauth_signing_algorithm": "į­žåįŽ—æŗ•", "oauth_storage_label_claim": "å­˜å‚¨æ ‡į­žåŖ°æ˜Ž", "oauth_storage_label_claim_description": "č‡ĒåŠ¨å°†į”¨æˆˇįš„å­˜å‚¨æ ‡į­žčŽžįŊŽä¸ēæ­¤éĄšįš„å€ŧ。", "oauth_storage_quota_claim": "存储配éĸåŖ°æ˜Ž", "oauth_storage_quota_claim_description": "č‡ĒåŠ¨å°†į”¨æˆˇįš„å­˜å‚¨é…éĸčŽžįŊŽä¸ēæ­¤éĄšįš„å€ŧ。", "oauth_storage_quota_default": "éģ˜čŽ¤å­˜å‚¨é…éĸīŧˆGBīŧ‰", "oauth_storage_quota_default_description": "æœĒæäž›åŖ°æ˜Žæ—ļäŊŋį”¨įš„é…éĸīŧˆGBīŧ‰īŧˆ0襨į¤ē无限åˆļīŧ‰ã€‚", + "oauth_timeout": "č¯ˇæą‚čļ…æ—ļ", + "oauth_timeout_description": "č¯ˇæą‚čļ…æ—ļīŧˆæ¯Ģį§’īŧ‰", "offline_paths": "įĻģįēŋ文äģļ", "offline_paths_description": "čŋ™å¯čƒŊæ˜¯į”ąäēŽæ‰‹åŠ¨åˆ é™¤äē†ä¸åąžäēŽå¤–部回åē“įš„æ–‡äģļ。", "password_enable_description": "äŊŋį”¨é‚ŽįŽąå’Œå¯†į į™ģåŊ•", @@ -279,7 +275,7 @@ "thumbnail_generation_job": "į”ŸæˆįŧŠį•Ĩ回", "thumbnail_generation_job_description": "ä¸ē每ä¸ĒéĄšį›Žį”Ÿæˆä¸åŒå°ēå¯¸įš„įŧŠį•Ĩ回īŧŒåšļä¸ē每ä¸Ēäēēį‰Šį”ŸæˆįŧŠį•Ĩ回", "transcoding_acceleration_api": "加速器 API", - "transcoding_acceleration_api_description": "čŋ™ä¸Ē API 将äŧšä¸ŽäŊ įš„čŽžå¤‡čŋ›čĄŒäē¤äē’īŧŒäģĨ加速čŊŦ᠁čŋ‡į¨‹ã€‚æ­¤čŽžįŊŽä¸ē“å°ŊåŠ›č€Œä¸ē”——åĻ‚æžœčŊŦį å¤ąč´ĨīŧŒå°†äŧšå›žé€€åˆ°čŊ¯äģļčŊŦį ã€‚VP9 是åĻåˇĨäŊœå–冺äēŽäŊ įš„įĄŦäģļ配įŊŽã€‚", + "transcoding_acceleration_api_description": "čŋ™ä¸Ē API 将äŧšä¸Žæ‚¨įš„čŽžå¤‡čŋ›čĄŒäē¤äē’īŧŒäģĨ加速čŊŦ᠁čŋ‡į¨‹ã€‚æ­¤čŽžįŊŽä¸ē“å°ŊåŠ›č€Œä¸ē”——åĻ‚æžœčŊŦį å¤ąč´ĨīŧŒå°†äŧšå›žé€€åˆ°čŊ¯äģļčŊŦį ã€‚VP9 是åĻåˇĨäŊœå–冺äēŽæ‚¨įš„įĄŦäģļ配įŊŽã€‚", "transcoding_acceleration_nvenc": "NVENCīŧˆéœ€čρ NVIDIA GPUīŧ‰", "transcoding_acceleration_qsv": "Quick Syncīŧˆéœ€čρ Intel 7äģŖåŠäģĨä¸Šįš„ CPUīŧ‰", "transcoding_acceleration_rkmpp": "RKMPPīŧˆäģ…适ᔍäēŽ Rockchip SOCsīŧ‰", @@ -376,16 +372,16 @@ "advanced_settings_log_level_title": "æ—Ĩåŋ—į­‰įē§: {}", "advanced_settings_prefer_remote_subtitle": "在某äē›čŽžå¤‡ä¸ŠīŧŒäģŽæœŦåœ°įš„éĄšį›ŽåŠ čŊŊįŧŠį•Ĩå›žįš„é€ŸåēĻ非常æ…ĸã€‚å¯į”¨æ­¤é€‰éĄšäģĨ加čŊŊčŋœį¨‹éĄšį›Žã€‚", "advanced_settings_prefer_remote_title": "äŧ˜å…ˆčŋœį¨‹éĄšį›Ž", - "advanced_settings_proxy_headers_subtitle": "厚䚉äģŖį†æ ‡å¤´īŧŒåē”ᔍäēŽImmichįš„æ¯æŦĄįŊ‘įģœč¯ˇæą‚", + "advanced_settings_proxy_headers_subtitle": "厚䚉äģŖį†æ ‡å¤´īŧŒåē”ᔍäēŽ Immich įš„æ¯æŦĄįŊ‘įģœč¯ˇæą‚", "advanced_settings_proxy_headers_title": "äģŖį†æ ‡å¤´", - "advanced_settings_self_signed_ssl_subtitle": "莺čŋ‡æœåŠĄå™¨įģˆįģ“į‚šįš„ SSL 蝁äšĻénj蝁īŧˆč¯Ĩé€‰éĄšé€‚į”¨äēŽäŊŋᔍč‡Ēį­žåč¯äšĻįš„æœåŠĄå™¨īŧ‰ã€‚", + "advanced_settings_self_signed_ssl_subtitle": "莺čŋ‡å¯šæœåŠĄå™¨ įš„ SSL 蝁äšĻénj蝁īŧˆč¯Ĩé€‰éĄšé€‚į”¨äēŽäŊŋᔍč‡Ēį­žåč¯äšĻįš„æœåŠĄå™¨īŧ‰ã€‚", "advanced_settings_self_signed_ssl_title": "å…čŽ¸č‡Ēį­žå SSL 蝁äšĻ", "advanced_settings_sync_remote_deletions_subtitle": "在įŊ‘éĄĩä¸Šæ‰§čĄŒæ“äŊœæ—ļīŧŒč‡Ē动删除或čŋ˜åŽŸč¯ĨčŽžå¤‡ä¸­įš„éĄšį›Ž", "advanced_settings_sync_remote_deletions_title": "čŋœį¨‹åŒæ­Ĩ删除 [厞énj]", "advanced_settings_tile_subtitle": "é̘įē§į”¨æˆˇčŽžįŊŽ", "advanced_settings_troubleshooting_subtitle": "吝ᔍᔍäēŽæ•…éšœæŽ’é™¤įš„éĸå¤–功čƒŊ", "advanced_settings_troubleshooting_title": "故障排除", - "age_months": "{months, plural, one {#ä¸Ē月} other {#ä¸Ē月}}", + "age_months": "{months, plural, one {#月鞄} other {#月鞄}}", "age_year_months": "1垁{months, plural, one {#ä¸Ē月} other {#ä¸Ē月}}", "age_years": "{years, plural, other {#垁}}", "album_added": "čĸĢæˇģåŠ åˆ°į›¸å†Œ", @@ -401,7 +397,7 @@ "album_name": "į›¸å†Œåį§°", "album_options": "į›¸å†ŒčŽžįŊŽ", "album_remove_user": "į§ģé™¤į”¨æˆˇīŧŸ", - "album_remove_user_confirmation": "äŊ įĄŽåޚčρį§ģ除“{user}”吗īŧŸ", + "album_remove_user_confirmation": "įĄŽåŽščρį§ģ除“{user}”吗īŧŸ", "album_share_no_users": "įœ‹čĩˇæĨæ‚¨åˇ˛ä¸Žæ‰€æœ‰į”¨æˆˇå…ąäēĢä熿­¤į›¸å†ŒīŧŒæˆ–č€…æ‚¨æ šæœŦæ˛Ąæœ‰äģģäŊ•į”¨æˆˇå¯å…ąäēĢ。", "album_thumbnail_card_item": "1 饚", "album_thumbnail_card_items": "{} 饚", @@ -495,8 +491,8 @@ "assets_trashed_from_server": "{} ä¸ĒéĄšį›Žåˇ˛æ”žå…Ĩ回æ”ļįĢ™", "assets_were_part_of_album_count": "{count, plural, one {éĄšį›Ž} other {éĄšį›Ž}}厞įģåœ¨į›¸å†Œä¸­", "authorized_devices": "åˇ˛æŽˆæƒčŽžå¤‡", - "automatic_endpoint_switching_subtitle": "åœ¨å¯į”¨įš„æƒ…å†ĩ下īŧŒé€ščŋ‡æŒ‡åŽšįš„ Wi-Fi čŋ›čĄŒæœŦ地čŋžæŽĨīŧŒåšļ在å…ļ厃地斚äŊŋᔍæ›ŋäģŖčŋžæŽĨ", - "automatic_endpoint_switching_title": "č‡Ē动切æĸURL", + "automatic_endpoint_switching_subtitle": "åŊ“čŋžæŽĨåˆ°æŒ‡åŽšįš„ Wi-Fi æ—ļäŊŋᔍæœŦ地čŋžæŽĨīŧŒåœ¨å…ļåŽƒįŽ¯åĸƒä¸‹äŊŋᔍæ›ŋäģŖčŋžæŽĨ", + "automatic_endpoint_switching_title": "č‡Ē动切æĸ URL", "back": "čŋ”回", "back_close_deselect": "čŋ”å›žã€å…ŗé—­æˆ–åé€‰", "background_location_permission": "后台厚äŊæƒé™", @@ -531,7 +527,7 @@ "backup_controller_page_background_is_on": "后台č‡Ē动备äģŊ厞åŧ€å¯", "backup_controller_page_background_turn_off": "å…ŗé—­åŽå°æœåŠĄ", "backup_controller_page_background_turn_on": "åŧ€å¯åŽå°æœåŠĄ", - "backup_controller_page_background_wifi": "äģ… WiFi", + "backup_controller_page_background_wifi": "äģ… Wi-Fi", "backup_controller_page_backup": "备äģŊ", "backup_controller_page_backup_selected": "厞选䏭īŧš ", "backup_controller_page_backup_sub": "厞备äģŊįš„į…§į‰‡å’Œč§†éĸ‘", @@ -608,18 +604,18 @@ "change_name": "æ›´æ”šåį§°", "change_name_successfully": "æ›´æ”šåį§°æˆåŠŸ", "change_password": "äŋŽæ”šå¯†į ", - "change_password_description": "čŋ™æ˜¯äŊ įš„įŦŦ一æŦĄį™ģåŊ•äēĻæˆ–有äēēčĻæą‚æ›´æ”šäŊ įš„å¯†į ã€‚č¯ˇåœ¨ä¸‹éĸ输å…Ĩæ–°å¯†į ã€‚", + "change_password_description": "čŋ™æ˜¯æ‚¨įš„įŦŦ一æŦĄį™ģåŊ•äēĻæˆ–有äēēčĻæą‚æ›´æ”šæ‚¨įš„å¯†į ã€‚č¯ˇåœ¨ä¸‹éĸ输å…Ĩæ–°å¯†į ã€‚", "change_password_form_confirm_password": "įĄŽčŽ¤å¯†į ", "change_password_form_description": "{name} 您åĨŊīŧŒ\n\nčŋ™æ˜¯æ‚¨éĻ–æŦĄį™ģåŊ•įŗģįģŸīŧŒæˆ–čĸĢįŽĄį†å‘˜čĻæą‚æ›´æ”šå¯†į ã€‚č¯ˇåœ¨ä¸‹æ–ščž“å…Ĩæ–°å¯†į ã€‚", "change_password_form_new_password": "æ–°å¯†į ", "change_password_form_password_mismatch": "å¯†į ä¸åŒšé…", "change_password_form_reenter_new_password": "再æŦĄčž“å…Ĩæ–°å¯†į ", - "change_your_password": "äŋŽæ”šäŊ įš„坆᠁", + "change_your_password": "äŋŽæ”šæ‚¨įš„å¯†į ", "changed_visibility_successfully": "æ›´æ”šå¯č§æ€§æˆåŠŸ", "check_all": "æŖ€æŸĨ所有", "check_corrupt_asset_backup": "æŖ€æŸĨ备äģŊ是åĻ损坏", "check_corrupt_asset_backup_button": "æ‰§čĄŒæŖ€æŸĨ", - "check_corrupt_asset_backup_description": "äģ…在čŋžæŽĨ到Wi-FiåšļåŽŒæˆæ‰€æœ‰éĄšį›Žå¤‡äģŊåŽæ‰§čĄŒæ­¤æŖ€æŸĨ。č¯Ĩčŋ‡į¨‹å¯čƒŊ需čĻå‡ åˆ†é’Ÿã€‚", + "check_corrupt_asset_backup_description": "äģ…在čŋžæŽĨ到 Wi-Fi åšļåŽŒæˆæ‰€æœ‰éĄšį›Žå¤‡äģŊåŽæ‰§čĄŒæ­¤æŖ€æŸĨ。č¯Ĩčŋ‡į¨‹å¯čƒŊ需čĻå‡ åˆ†é’Ÿã€‚", "check_logs": "æŖ€æŸĨæ—Ĩåŋ—", "choose_matching_people_to_merge": "é€‰æ‹ŠåŒšé…įš„äēēčŋ›čĄŒåˆåšļ", "city": "城市", @@ -634,8 +630,8 @@ "client_cert_import_success_msg": "åŽĸæˆˇį̝蝁äšĻ厞å¯ŧå…Ĩ", "client_cert_invalid_msg": "æ— æ•ˆįš„č¯äšĻ文äģ￈–坆᠁错蝝", "client_cert_remove_msg": "åŽĸæˆˇį̝蝁äšĻ厞į§ģ除", - "client_cert_subtitle": "äģ…æ”¯æŒPKCS12 (.p12, .pfx)æ ŧåŧã€‚äģ…可在į™ģåŊ•前čŋ›čĄŒč¯äšĻįš„å¯ŧå…Ĩ和į§ģ除", - "client_cert_title": "SSLåŽĸæˆˇį̝蝁äšĻ", + "client_cert_subtitle": "äģ…æ”¯æŒ PKCS12 (.p12, .pfx) æ ŧåŧã€‚äģ…可在į™ģåŊ•前čŋ›čĄŒč¯äšĻįš„å¯ŧå…Ĩ和į§ģ除", + "client_cert_title": "SSL åŽĸæˆˇį̝蝁äšĻ", "clockwise": "éĄēæ—ļ针", "close": "å…ŗé—­", "collapse": "折叠", @@ -652,15 +648,15 @@ "confirm": "įĄŽčŽ¤", "confirm_admin_password": "įĄŽčŽ¤įŽĄį†å‘˜å¯†į ", "confirm_delete_face": "æ‚¨įĄŽåŽščρäģŽčĩ„äē§ä¸­åˆ é™¤ {name} įš„č„¸å—īŧŸ", - "confirm_delete_shared_link": "äŊ įĄŽåޚčĻåˆ é™¤æ­¤å…ąäēĢ链æŽĨ吗īŧŸ", - "confirm_keep_this_delete_others": "é™¤æ­¤éĄšį›Žå¤–īŧŒå †å ä¸­įš„æ‰€æœ‰å…ļåŽƒéĄšį›ŽéƒŊ将čĸĢ删除。äŊ įĄŽåޚčρįģ§įģ­å—īŧŸ", + "confirm_delete_shared_link": "įĄŽåŽščĻåˆ é™¤æ­¤å…ąäēĢ链æŽĨ吗īŧŸ", + "confirm_keep_this_delete_others": "é™¤æ­¤éĄšį›Žå¤–īŧŒå †å ä¸­įš„æ‰€æœ‰å…ļåŽƒéĄšį›ŽéƒŊ将čĸĢåˆ é™¤ã€‚įĄŽåŽščρįģ§įģ­å—īŧŸ", "confirm_password": "įĄŽčŽ¤å¯†į ", "contain": "包åĢ", "context": "äģĨ文搜回", "continue": "įģ§įģ­", "control_bottom_app_bar_album_info_shared": "åˇ˛å…ąäēĢ {} 饚", "control_bottom_app_bar_create_new_album": "新åģēį›¸å†Œ", - "control_bottom_app_bar_delete_from_immich": "äģŽImmichæœåŠĄå™¨ä¸­åˆ é™¤", + "control_bottom_app_bar_delete_from_immich": "äģŽ Immich æœåŠĄå™¨ä¸­åˆ é™¤", "control_bottom_app_bar_delete_from_local": "äģŽį§ģåŠ¨čŽžå¤‡ä¸­åˆ é™¤", "control_bottom_app_bar_edit_location": "įŧ–čž‘äŊįŊŽäŋĄæ¯", "control_bottom_app_bar_edit_time": "įŧ–čž‘æ—Ĩ期和æ—ļ间", @@ -721,14 +717,14 @@ "default_locale_description": "æ šæŽæ‚¨įš„æĩč§ˆå™¨åœ°åŒē莞įŊŽæ—Ĩ期和数字昞į¤ēæ ŧåŧ", "delete": "删除", "delete_album": "åˆ é™¤į›¸å†Œ", - "delete_api_key_prompt": "įĄŽåŽšåˆ é™¤æ­¤API key吗īŧŸ", + "delete_api_key_prompt": "įĄŽåŽšåˆ é™¤æ­¤ API key 吗īŧŸ", "delete_dialog_alert": "čŋ™äē›éĄšį›Žå°†äģŽ Immich å’Œæ‚¨įš„čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤", - "delete_dialog_alert_local": "čŋ™äē›éĄšį›Žå°†äģŽæ‚¨įš„į§ģåŠ¨čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤īŧŒäŊ†äģį„ļ可äģĨäģŽImmichæœåŠĄå™¨ä¸­å†æŦĄčŽˇå–", - "delete_dialog_alert_local_non_backed_up": "éƒ¨åˆ†éĄšį›Žčŋ˜æœĒ备äģŊ臺ImmichæœåŠĄå™¨īŧŒå°†äģŽæ‚¨įš„į§ģåŠ¨čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤", - "delete_dialog_alert_remote": "čŋ™äē›éĄšį›Žå°†äģŽImmichæœåŠĄå™¨ä¸­æ°¸äš…åˆ é™¤", + "delete_dialog_alert_local": "čŋ™äē›éĄšį›Žå°†äģŽæ‚¨įš„į§ģåŠ¨čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤īŧŒäŊ†äģį„ļ可äģĨäģŽ Immich æœåŠĄå™¨ä¸­å†æŦĄčŽˇå–", + "delete_dialog_alert_local_non_backed_up": "éƒ¨åˆ†éĄšį›Žčŋ˜æœĒ备äģŊ臺 Immich æœåŠĄå™¨īŧŒå°†äģŽæ‚¨įš„į§ģåŠ¨čŽžå¤‡ä¸­æ°¸äš…åˆ é™¤", + "delete_dialog_alert_remote": "čŋ™äē›éĄšį›Žå°†äģŽ Immich æœåŠĄå™¨ä¸­æ°¸äš…åˆ é™¤", "delete_dialog_ok_force": "įĄŽčŽ¤åˆ é™¤", "delete_dialog_title": "永䚅删除", - "delete_duplicates_confirmation": "äŊ čĻæ°¸äš…åˆ é™¤čŋ™äē›é‡å¤éĄšå—īŧŸ", + "delete_duplicates_confirmation": "įĄŽåŽščĻæ°¸äš…åˆ é™¤čŋ™äē›é‡å¤éĄšå—īŧŸ", "delete_face": "删除äēē脸", "delete_key": "删除密é’Ĩ", "delete_library": "删除回åē“", @@ -853,10 +849,12 @@ "failed_to_keep_this_delete_others": "æ— æŗ•äŋį•™č¯ĨéĄšį›Žåšļ删除å…ļåŽƒéĄšį›Ž", "failed_to_load_asset": "加čŊŊéĄšį›Žå¤ąč´Ĩ", "failed_to_load_assets": "加čŊŊéĄšį›Žå¤ąč´Ĩ", + "failed_to_load_notifications": "加čŊŊ通įŸĨå¤ąč´Ĩ", "failed_to_load_people": "加čŊŊäēēį‰Šå¤ąč´Ĩ", "failed_to_remove_product_key": "į§ģ除äē§å“å¯†é’Ĩå¤ąč´Ĩ", "failed_to_stack_assets": "æ— æŗ•å †å éĄšį›Ž", "failed_to_unstack_assets": "æ— æŗ•å–æļˆå †å éĄšį›Ž", + "failed_to_update_notification_status": "更新通įŸĨįŠļæ€å¤ąč´Ĩ", "import_path_already_exists": "æ­¤å¯ŧå…Ĩčˇ¯åž„åˇ˛å­˜åœ¨ã€‚", "incorrect_email_or_password": "é‚ŽįŽąæˆ–å¯†į é”™č¯¯", "paths_validation_failed": "{paths, plural, one {#æĄčˇ¯åž„} other {#æĄčˇ¯åž„}} æ ĄéĒŒå¤ąč´Ĩ", @@ -881,7 +879,7 @@ "unable_to_complete_oauth_login": "æ— æŗ•åŽŒæˆ OAuth į™ģåŊ•", "unable_to_connect": "æ— æŗ•čŋžæŽĨ", "unable_to_connect_to_server": "æ— æŗ•čŋžæŽĨč‡ŗæœåŠĄå™¨", - "unable_to_copy_to_clipboard": "æ— æŗ•å¤åˆļ到å‰Ē切æŋīŧŒč¯ˇįĄŽäŋäŊ åœ¨äŊŋᔍhttpsčŽŋ问æœŦéĄĩ", + "unable_to_copy_to_clipboard": "æ— æŗ•å¤åˆļ到å‰Ē切æŋīŧŒč¯ˇįĄŽäŋæ‚¨åœ¨äŊŋᔍhttpsčŽŋ问æœŦéĄĩ", "unable_to_create_admin_account": "æ— æŗ•åˆ›åģēįŽĄį†å‘˜č´Ļæˆˇ", "unable_to_create_api_key": "æ— æŗ•åˆ›åģēæ–°įš„ API Key", "unable_to_create_library": "æ— æŗ•åˆ›åģē回åē“", @@ -978,7 +976,7 @@ "external": "å¤–éƒ¨įš„", "external_libraries": "外部回åē“", "external_network": "外部įŊ‘įģœ", - "external_network_sheet_info": "åŊ“不在éĻ–é€‰įš„ Wi-Fi įŊ‘įģœä¸Šæ—ļīŧŒåē”ᔍፋåēå°†é€ščŋ‡ä¸‹æ–šįŦŦ一ä¸Ē可čŋžé€šįš„ URL čŋžæŽĨåˆ°æœåŠĄå™¨", + "external_network_sheet_info": "åŊ“æœĒčŋžæŽĨåˆ°æŒ‡åŽšįš„ Wi-Fi įŊ‘į윿—ļīŧŒåē”ᔍፋåēå°†é€ščŋ‡ä¸‹æ–šįŦŦ一ä¸Ē可čŋžé€šįš„ URL čŽŋé—ŽæœåŠĄå™¨", "face_unassigned": "æœĒ指洞", "failed": "å¤ąč´Ĩ", "failed_to_load_assets": "加čŊŊéĄšį›Žå¤ąč´Ĩ", @@ -1027,7 +1025,7 @@ "header_settings_header_value_input": "标头å€ŧ", "headers_settings_tile_subtitle": "厚䚉äģŖį†æ ‡å¤´īŧŒåē”ᔍäēŽæ¯æŦĄįŊ‘įģœč¯ˇæą‚", "headers_settings_tile_title": "č‡Ē厚䚉äģŖį†æ ‡å¤´", - "hi_user": "äŊ åĨŊīŧŒ{name}īŧˆ{email}īŧ‰", + "hi_user": "您åĨŊīŧŒ{name}īŧˆ{email}īŧ‰", "hide_all_people": "éšč—æ‰€æœ‰äēēį‰Š", "hide_gallery": "éšč—į›¸å†Œ", "hide_named_person": "隐藏äēēį‰Šâ€œ{name}”", @@ -1050,8 +1048,8 @@ "home_page_upload_err_limit": "一æŦĄæœ€å¤šåĒčƒŊ上äŧ  30 ä¸ĒéĄšį›ŽīŧŒčˇŗčŋ‡", "host": "æœåŠĄå™¨", "hour": "æ—ļ", - "ignore_icloud_photos": "åŋŊį•ĨiCloudᅧቇ", - "ignore_icloud_photos_description": "存储在iCloudä¸­įš„į…§į‰‡ä¸äŧšä¸Šäŧ č‡ŗImmichæœåŠĄå™¨", + "ignore_icloud_photos": "åŋŊį•Ĩ iCloud ᅧቇ", + "ignore_icloud_photos_description": "存储在 iCloud ä¸­įš„į…§į‰‡ä¸äŧšä¸Šäŧ č‡ŗ Immich æœåŠĄå™¨", "image": "å›žį‰‡", "image_alt_text_date": "在{date}æ‹æ‘„įš„{isVideo, select, true {视éĸ‘} other {ᅧቇ}}", "image_alt_text_date_1_person": "{date}æ‹æ‘„įš„åŒ…åĢ{person1}įš„{isVideo, select, true {视éĸ‘} other {ᅧቇ}}", @@ -1123,9 +1121,9 @@ "loading": "加čŊŊ中", "loading_search_results_failed": "加čŊŊ搜į´ĸį쓿žœå¤ąč´Ĩ", "local_network": "æœŦ地įŊ‘įģœ", - "local_network_sheet_info": "äŊŋį”¨æŒ‡åŽšįš„ Wi-Fi įŊ‘į윿—ļīŧŒåē”ᔍፋåēå°†é€ščŋ‡æ­¤ URL čŋžæŽĨåˆ°æœåŠĄå™¨", + "local_network_sheet_info": "åŊ“äŊŋį”¨æŒ‡åŽšįš„ Wi-Fi įŊ‘į윿—ļīŧŒåē”ᔍፋåēå°†é€ščŋ‡æ­¤ URL čŽŋé—ŽæœåŠĄå™¨", "location_permission": "厚äŊæƒé™", - "location_permission_content": "ä¸ēäē†äŊŋᔍč‡Ē动切æĸ功čƒŊīŧŒImmich 需čĻį˛žįĄŽįš„åŽšäŊæƒé™īŧŒčŋ™æ ˇæ‰čƒŊč¯ģ取åŊ“前 Wi-Fi įŊ‘įģœįš„åį§°", + "location_permission_content": "ä¸ēäŊŋᔍč‡Ē动切æĸ功čƒŊīŧŒImmich 需čĻį˛žįĄŽįš„åŽšäŊæƒé™īŧŒčŋ™æ ˇæ‰čƒŊč¯ģ取åŊ“前 Wi-Fi įŊ‘įģœįš„åį§°", "location_picker_choose_on_map": "在地回上选拊", "location_picker_latitude_error": "输å…Ĩæœ‰æ•ˆįš„įēŦåēĻå€ŧ", "location_picker_latitude_hint": "č¯ˇåœ¨æ­¤å¤„čž“å…Ĩæ‚¨įš„įēŦåēĻå€ŧ", @@ -1170,10 +1168,10 @@ "manage_shared_links": "įŽĄį†å…ąäēĢ链æŽĨ", "manage_sharing_with_partners": "įŽĄį†ä¸ŽåŒäŧ´įš„å…ąäēĢ", "manage_the_app_settings": "įŽĄį†åē”į”¨čŽžįŊŽ", - "manage_your_account": "įŽĄį†äŊ įš„č´Ļæˆˇ", - "manage_your_api_keys": "įŽĄį†äŊ įš„ API 密é’Ĩ", + "manage_your_account": "įŽĄį†æ‚¨įš„č´Ļæˆˇ", + "manage_your_api_keys": "įŽĄį†æ‚¨įš„ API 密é’Ĩ", "manage_your_devices": "įŽĄį†åˇ˛į™ģåŊ•čŽžå¤‡", - "manage_your_oauth_connection": "įŽĄį†äŊ įš„ OAuth įģ‘åޚ", + "manage_your_oauth_connection": "įŽĄį†æ‚¨įš„ OAuth įģ‘åޚ", "map": "地回", "map_assets_in_bound": "{} åŧ į…§į‰‡", "map_assets_in_bounds": "{} åŧ į…§į‰‡", @@ -1199,6 +1197,9 @@ "map_settings_only_show_favorites": "äģ…æ˜žį¤ēæ”ļč—įš„éĄšį›Ž", "map_settings_theme_settings": "地回ä¸ģéĸ˜", "map_zoom_to_see_photos": "įŧŠå°äģĨæŸĨįœ‹éĄšį›Ž", + "mark_all_as_read": "å…¨éƒ¨æ ‡čŽ°ä¸ē厞č¯ģ", + "mark_as_read": "æ ‡čŽ°ä¸ē厞č¯ģ", + "marked_all_as_read": "åˇ˛å…¨éƒ¨æ ‡čŽ°ä¸ē厞č¯ģ", "matches": "匚配", "media_type": "åĒ’äŊ“įąģ型", "memories": "回åŋ†", @@ -1215,7 +1216,7 @@ "merge": "合åšļ", "merge_people": "合åšļäēēį‰Š", "merge_people_limit": "每æŦĄæœ€å¤šåĒčƒŊ合åšļ 5 ä¸Ēäēē", - "merge_people_prompt": "äŊ æƒŗåˆåšļčŋ™äē›äēē吗īŧŸč¯Ĩ操äŊœä¸å¯é€†īŧˆæ— æŗ•čĸĢæ’¤é”€īŧ‰ã€‚", + "merge_people_prompt": "įĄŽåŽščρ合åšļčŋ™äē›äēē吗īŧŸč¯Ĩ操äŊœä¸å¯é€†īŧˆæ— æŗ•čĸĢæ’¤é”€īŧ‰ã€‚", "merge_people_successfully": "合åšļäēēį‰ŠæˆåŠŸ", "merged_people_count": "厞合åšļ{count, plural, one {#ä¸Ēäēē} other {#ä¸Ēäēē}}", "minimize": "最小化", @@ -1225,6 +1226,8 @@ "month": "月", "monthly_title_text_date_format": "MMMM y", "more": "更多", + "moved_to_archive": "厞åŊ’æĄŖ {count, plural, one {# ä¸ĒéĄšį›Ž} other {# ä¸ĒéĄšį›Ž}}", + "moved_to_library": "厞į§ģ动 {count, plural, one {# ä¸ĒéĄšį›Ž} other {# ä¸ĒéĄšį›Ž}} 到回åē“", "moved_to_trash": "åˇ˛æ”žå…Ĩ回æ”ļįĢ™", "multiselect_grid_edit_date_time_err_read_only": "æ— æŗ•įŧ–čž‘åĒč¯ģéĄšį›Žįš„æ—Ĩ期īŧŒčˇŗčŋ‡", "multiselect_grid_edit_gps_err_read_only": "æ— æŗ•įŧ–čž‘åĒč¯ģéĄšį›Žįš„äŊįŊŽäŋĄæ¯īŧŒčˇŗčŋ‡", @@ -1233,7 +1236,7 @@ "name": "åį§°", "name_or_nickname": "åį§°æˆ–æ˜ĩį§°", "networking_settings": "įŊ‘įģœ", - "networking_subtitle": "įŽĄį†æœåŠĄæŽĨåŖčŽžįŊŽ", + "networking_subtitle": "įŽĄį†æœåŠĄå™¨æŽĨåŖčŽžįŊŽ", "never": "永不čŋ‡æœŸ", "new_album": "æ–°į›¸å†Œ", "new_api_key": "新åĸž API Key", @@ -1246,8 +1249,8 @@ "next_memory": "下一ä¸Ē", "no": "åĻ", "no_albums_message": "创åģēį›¸å†ŒäģĨæ•´į†į…§į‰‡å’Œč§†éĸ‘", - "no_albums_with_name_yet": "螌äŧŧäŊ čŋ˜æ˛Ąæœ‰æ­¤åå­—įš„į›¸å†Œã€‚", - "no_albums_yet": "螌äŧŧäŊ čŋ˜æ˛Ąæœ‰åˆ›åģēį›¸å†Œã€‚", + "no_albums_with_name_yet": "螌äŧŧ您čŋ˜æ˛Ąæœ‰æ­¤åå­—įš„į›¸å†Œã€‚", + "no_albums_yet": "螌äŧŧ您čŋ˜æ˛Ąæœ‰åˆ›åģēį›¸å†Œã€‚", "no_archived_assets_message": "åŊ’æĄŖį…§į‰‡å’Œč§†éĸ‘äģĨäžŋåœ¨į…§į‰‡č§†å›žä¸­éšč—åŽƒäģŦ", "no_assets_message": "į‚šå‡ģ上äŧ æ‚¨įš„įŦŦ一åŧ į…§į‰‡", "no_assets_to_show": "æ— éĄšį›Žåą•į¤ē", @@ -1255,8 +1258,9 @@ "no_exif_info_available": "æ˛Ąæœ‰å¯į”¨įš„ EXIF äŋĄæ¯", "no_explore_results_message": "上äŧ æ›´å¤šį…§į‰‡æĨæŽĸį´ĸ。", "no_favorites_message": "æˇģ加到æ”ļč—å¤šīŧŒåŋĢ速æŸĨ扞最äŊŗå›žį‰‡å’Œč§†éĸ‘", - "no_libraries_message": "创åģē外部回å瓿ĨæŸĨįœ‹äŊ įš„į…§į‰‡å’Œč§†éĸ‘", + "no_libraries_message": "创åģē外部回å瓿ĨæŸĨįœ‹æ‚¨įš„į…§į‰‡å’Œč§†éĸ‘", "no_name": "æœĒå‘Ŋ名", + "no_notifications": "æ˛Ąæœ‰é€šįŸĨ", "no_places": "无äŊįŊŽ", "no_results": "无į쓿žœ", "no_results_description": "å°č¯•äŊŋį”¨åŒäš‰č¯æˆ–æ›´é€šį”¨įš„å…ŗé”Žč¯", @@ -1284,7 +1288,7 @@ "onboarding_privacy_description": "äģĨ下īŧˆå¯é€‰īŧ‰åŠŸčƒŊ䞝čĩ–å¤–éƒ¨æœåŠĄīŧŒå¯éšæ—ļåœ¨įŽĄį†čŽžįŊŽä¸­įĻį”¨ã€‚", "onboarding_theme_description": "é€‰æ‹ŠæœåŠĄįš„éĸœč‰˛ä¸ģéĸ˜ã€‚į¨åŽå¯äģĨåœ¨čŽžįŊŽä¸­čŋ›čĄŒäŋŽæ”šã€‚", "onboarding_welcome_description": "我äģŦåœ¨å¯į”¨æœåŠĄå‰å…ˆåšä¸€äē›é€šį”¨čŽžįŊŽã€‚", - "onboarding_welcome_user": "æŦĸčŋŽäŊ īŧŒ{user}", + "onboarding_welcome_user": "æŦĸčŋŽīŧŒ{user}", "online": "在įēŋ", "only_favorites": "äģ…æ˜žį¤ē厞æ”ļ藏", "open": "打åŧ€", @@ -1293,7 +1297,7 @@ "open_the_search_filters": "打åŧ€æœį´ĸčŋ‡æģ¤å™¨", "options": "选项", "or": "或", - "organize_your_library": "æ•´į†äŊ įš„回åē“", + "organize_your_library": "æ•´į†æ‚¨įš„å›žåē“", "original": "原回", "other": "å…ļ厃", "other_devices": "å…ļåŽƒčŽžå¤‡", @@ -1432,6 +1436,8 @@ "recent_searches": "最čŋ‘搜į´ĸ", "recently_added": "čŋ‘期æˇģ加", "recently_added_page_title": "最čŋ‘æˇģ加", + "recently_taken": "čŋ‘期拍摄", + "recently_taken_page_title": "最čŋ‘拍摄", "refresh": "åˆˇæ–°", "refresh_encoded_videos": "åˆˇæ–°åˇ˛įŧ–į įš„č§†éĸ‘", "refresh_faces": "åˆˇæ–°äēē脸", @@ -1573,7 +1579,7 @@ "selected_count": "{count, plural, other {#éĄšåˇ˛é€‰æ‹Š}}", "send_message": "发送æļˆæ¯", "send_welcome_email": "发送æŦĸčŋŽé‚Žäģļ", - "server_endpoint": "æœåŠĄæŽĨåŖ", + "server_endpoint": "æœåŠĄå™¨ URL", "server_info_box_app_version": "App į‰ˆæœŦ", "server_info_box_server_url": "æœåŠĄå™¨åœ°å€", "server_offline": "æœåŠĄå™¨įĻģįēŋ", @@ -1627,7 +1633,7 @@ "shared_album_section_people_title": "äēēį‰Š", "shared_by": "å…ąäēĢč‡Ē", "shared_by_user": "į”ąâ€œ{user}â€å…ąäēĢ", - "shared_by_you": "äŊ įš„å…ąäēĢ", + "shared_by_you": "æ‚¨įš„å…ąäēĢ", "shared_from_partner": "æĨč‡Ē“{partner}â€įš„į…§į‰‡", "shared_intent_upload_button_progress_text": "{} / {} 厞䏊äŧ ", "shared_link_app_bar_title": "å…ąäēĢ链æŽĨ", @@ -1641,7 +1647,7 @@ "shared_link_edit_expire_after_option_hours": "{} 小æ—ļ", "shared_link_edit_expire_after_option_minute": "1分钟", "shared_link_edit_expire_after_option_minutes": "{} 分钟", - "shared_link_edit_expire_after_option_months": "{} ä¸Ē月", + "shared_link_edit_expire_after_option_months": "{} 月鞄", "shared_link_edit_expire_after_option_year": "{} åš´", "shared_link_edit_password_hint": "输å…Ĩå…ąäēĢ坆᠁", "shared_link_edit_submit_button": "更新铞æŽĨ", @@ -1725,7 +1731,7 @@ "status": "įŠļ态", "stop_motion_photo": "厚æ ŧᅧቇ", "stop_photo_sharing": "停æ­ĸå…ąäēĢᅧቇīŧŸ", - "stop_photo_sharing_description": "“{partner}”将不čƒŊčŽŋ问äŊ įš„į…§į‰‡ã€‚", + "stop_photo_sharing_description": "“{partner}”将不čƒŊčŽŋé—Žæ‚¨įš„į…§į‰‡ã€‚", "stop_sharing_photos_with_user": "停æ­ĸä¸Žæ­¤į”¨æˆˇå…ąäēĢᅧቇ", "storage": "存储įŠē间", "storage_label": "å­˜å‚¨æ ‡į­ž", @@ -1735,7 +1741,7 @@ "sunrise_on_the_beach": "æĩˇæģŠä¸Šįš„æ—Ĩå‡ē", "support": "支持", "support_and_feedback": "支持和反éψ", - "support_third_party_description": "æ‚¨įš„ Immich åŽ‰čŖ…į¨‹åēæ˜¯į”ąįŦŦä¸‰æ–šæ‰“åŒ…įš„ã€‚æ‚¨é‡åˆ°įš„é—Žéĸ˜å¯čƒŊæ˜¯į”ąčŊ¯äģļ包åŧ•čĩˇįš„īŧŒå› æ­¤č¯ˇäŧ˜å…ˆäŊŋᔍ䏋éĸįš„é“žæŽĨ提å‡ēIssue或Bug。", + "support_third_party_description": "æ‚¨įš„ Immich åŽ‰čŖ…į¨‹åēæ˜¯į”ąįŦŦä¸‰æ–šæ‰“åŒ…įš„ã€‚æ‚¨é‡åˆ°įš„é—Žéĸ˜å¯čƒŊæ˜¯į”ąčŊ¯äģļ包åŧ•čĩˇįš„īŧŒå› æ­¤č¯ˇäŧ˜å…ˆäŊŋᔍ䏋éĸįš„é“žæŽĨ提å‡ē Issue 或 Bug。", "swap_merge_direction": "äē’æĸ合åšļ斚向", "sync": "同æ­Ĩ", "sync_albums": "同æ­Ĩį›¸å†Œ", @@ -1789,7 +1795,7 @@ "trash_emptied": "įŠē回æ”ļįĢ™", "trash_no_results_message": "åˆ é™¤įš„į…§į‰‡å’Œč§†éĸ‘å°†åœ¨æ­¤å¤„åą•į¤ē。", "trash_page_delete_all": "删除全部", - "trash_page_empty_trash_dialog_content": "是åĻ清įŠē回æ”ļįĢ™īŧŸčŋ™äē›éĄšį›Žå°†čĸĢäģŽImmich中永䚅删除", + "trash_page_empty_trash_dialog_content": "是åĻ清įŠē回æ”ļįĢ™īŧŸčŋ™äē›éĄšį›Žå°†čĸĢäģŽ Immich 中永䚅删除", "trash_page_info": "回æ”ļįĢ™ä¸­éĄšį›Žå°†åœ¨ {} 夊后永䚅删除", "trash_page_no_assets": "æš‚æ— åˇ˛åˆ é™¤éĄšį›Ž", "trash_page_restore_all": "æĸ复全部", @@ -1832,7 +1838,7 @@ "upload_status_errors": "错蝝", "upload_status_uploaded": "厞䏊äŧ ", "upload_success": "上äŧ æˆåŠŸīŧŒåˆˇæ–°éĄĩéĸæŸĨįœ‹æ–°ä¸Šäŧ įš„éĄšį›Žã€‚", - "upload_to_immich": "上äŧ č‡ŗImmichīŧˆ{}īŧ‰", + "upload_to_immich": "上äŧ č‡ŗ Immichīŧˆ{}īŧ‰", "uploading": "æ­Ŗåœ¨ä¸Šäŧ ", "url": "URL", "usage": "į”¨é‡", @@ -1851,11 +1857,11 @@ "users": "į”¨æˆˇ", "utilities": "åŽžį”¨åˇĨå…ˇ", "validate": "énj蝁", - "validate_endpoint_error": "č¯ˇčž“å…Ĩæœ‰æ•ˆįš„URL", + "validate_endpoint_error": "č¯ˇčž“å…Ĩæœ‰æ•ˆįš„ URL", "variables": "变量", "version": "į‰ˆæœŦ", - "version_announcement_closing": "äŊ įš„æœ‹å‹īŧŒAlex", - "version_announcement_message": "äŊ åĨŊīŧåˇ˛įģæŖ€æĩ‹åˆ°Immichæœ‰æ–°į‰ˆæœŦã€‚č¯ˇæŠŊįŠē阅č¯ģä¸€ä¸‹å‘čĄŒč¯´æ˜ŽīŧŒäģĨįĄŽäŋæ‚¨įš„配įŊŽæ–‡äģ￘¯æœ€æ–°įš„īŧŒéŋ免存在配įŊŽé”™č¯¯īŧŒį‰šåˆĢ是åŊ“äŊ æ˜¯äŊŋᔍWatchTower或å…ļ厃įąģäŧŧįš„č‡Ē动升įē§åˇĨå…ˇæ—ļ。", + "version_announcement_closing": "æ‚¨įš„æœ‹å‹īŧŒAlex", + "version_announcement_message": "您åĨŊīŧåˇ˛įģæŖ€æĩ‹åˆ° Immich æœ‰æ–°į‰ˆæœŦã€‚č¯ˇæŠŊįŠē阅č¯ģä¸€ä¸‹å‘čĄŒč¯´æ˜ŽīŧŒäģĨįĄŽäŋæ‚¨įš„配įŊŽæ–‡äģ￘¯æœ€æ–°įš„īŧŒéŋ免存在配įŊŽé”™č¯¯īŧŒį‰šåˆĢ是åŊ“您是äŊŋᔍ WatchTower 或å…ļ厃įąģäŧŧįš„č‡Ē动升įē§åˇĨå…ˇæ—ļ。", "version_announcement_overlay_release_notes": "å‘čĄŒč¯´æ˜Ž", "version_announcement_overlay_text_1": "åˇå¤–åˇå¤–īŧŒæœ‰æ–°į‰ˆæœŦįš„", "version_announcement_overlay_text_2": "č¯ˇčŠąį‚šæ—ļ间čŽŋ问 ", diff --git a/machine-learning/immich_ml/sessions/rknn/rknnpool.py b/machine-learning/immich_ml/sessions/rknn/rknnpool.py index fdcd053e71..fd0af8bcc4 100644 --- a/machine-learning/immich_ml/sessions/rknn/rknnpool.py +++ b/machine-learning/immich_ml/sessions/rknn/rknnpool.py @@ -53,7 +53,7 @@ def init_rknn(model_path: str) -> "RKNNLite": ret = rknn_lite.init_runtime() # Please do not set this parameter on other platforms. if ret != 0: - raise RuntimeError("Failed to inititalize RKNN runtime environment") + raise RuntimeError("Failed to initialize RKNN runtime environment") return rknn_lite diff --git a/machine-learning/uv.lock b/machine-learning/uv.lock index 1930e80661..c281723d1a 100644 --- a/machine-learning/uv.lock +++ b/machine-learning/uv.lock @@ -23,9 +23,9 @@ resolution-markers = [ name = "aiocache" version = "0.12.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7a/64/b945b8025a9d1e6e2138845f4022165d3b337f55f50984fbc6a4c0a1e355/aiocache-0.12.3.tar.gz", hash = "sha256:f528b27bf4d436b497a1d0d1a8f59a542c153ab1e37c3621713cb376d44c4713", size = 132196, upload_time = "2024-09-25T13:20:23.823Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/64/b945b8025a9d1e6e2138845f4022165d3b337f55f50984fbc6a4c0a1e355/aiocache-0.12.3.tar.gz", hash = "sha256:f528b27bf4d436b497a1d0d1a8f59a542c153ab1e37c3621713cb376d44c4713", size = 132196, upload-time = "2024-09-25T13:20:23.823Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/d7/15d67e05b235d1ed8c3ce61688fe4d84130e72af1657acadfaac3479f4cf/aiocache-0.12.3-py2.py3-none-any.whl", hash = "sha256:889086fc24710f431937b87ad3720a289f7fc31c4fd8b68e9f918b9bacd8270d", size = 28199, upload_time = "2024-09-25T13:20:22.688Z" }, + { url = "https://files.pythonhosted.org/packages/37/d7/15d67e05b235d1ed8c3ce61688fe4d84130e72af1657acadfaac3479f4cf/aiocache-0.12.3-py2.py3-none-any.whl", hash = "sha256:889086fc24710f431937b87ad3720a289f7fc31c4fd8b68e9f918b9bacd8270d", size = 28199, upload-time = "2024-09-25T13:20:22.688Z" }, ] [[package]] @@ -40,18 +40,18 @@ dependencies = [ { name = "scikit-image" }, { name = "scipy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/14/d6/8dd5b690d28a332a0b2c3179a345808b5d4c7ad5ddc079b7e116098dff35/albumentations-1.3.1.tar.gz", hash = "sha256:a6a38388fe546c568071e8c82f414498e86c9ed03c08b58e7a88b31cf7a244c6", size = 176371, upload_time = "2023-06-10T07:44:32.36Z" } +sdist = { url = "https://files.pythonhosted.org/packages/14/d6/8dd5b690d28a332a0b2c3179a345808b5d4c7ad5ddc079b7e116098dff35/albumentations-1.3.1.tar.gz", hash = "sha256:a6a38388fe546c568071e8c82f414498e86c9ed03c08b58e7a88b31cf7a244c6", size = 176371, upload-time = "2023-06-10T07:44:32.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/f6/c486cedb4f75147232f32ec4c97026714cfef7c7e247a1f0427bc5489f66/albumentations-1.3.1-py3-none-any.whl", hash = "sha256:6b641d13733181d9ecdc29550e6ad580d1bfa9d25e2213a66940062f25e291bd", size = 125706, upload_time = "2023-06-10T07:44:30.373Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f6/c486cedb4f75147232f32ec4c97026714cfef7c7e247a1f0427bc5489f66/albumentations-1.3.1-py3-none-any.whl", hash = "sha256:6b641d13733181d9ecdc29550e6ad580d1bfa9d25e2213a66940062f25e291bd", size = 125706, upload-time = "2023-06-10T07:44:30.373Z" }, ] [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -64,18 +64,18 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2d/b8/7333d87d5f03247215d86a86362fd3e324111788c6cdd8d2e6196a6ba833/anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f", size = 158770, upload_time = "2023-12-16T17:06:57.709Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/b8/7333d87d5f03247215d86a86362fd3e324111788c6cdd8d2e6196a6ba833/anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f", size = 158770, upload-time = "2023-12-16T17:06:57.709Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/cd/d6d9bb1dadf73e7af02d18225cbd2c93f8552e13130484f1c8dcfece292b/anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", size = 85481, upload_time = "2023-12-16T17:06:55.989Z" }, + { url = "https://files.pythonhosted.org/packages/bf/cd/d6d9bb1dadf73e7af02d18225cbd2c93f8552e13130484f1c8dcfece292b/anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", size = 85481, upload-time = "2023-12-16T17:06:55.989Z" }, ] [[package]] name = "bidict" version = "0.23.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/6e/026678aa5a830e07cd9498a05d3e7e650a4f56a42f267a53d22bcda1bdc9/bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71", size = 29093, upload_time = "2024-02-18T19:09:05.748Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/6e/026678aa5a830e07cd9498a05d3e7e650a4f56a42f267a53d22bcda1bdc9/bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71", size = 29093, upload-time = "2024-02-18T19:09:05.748Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764, upload_time = "2024-02-18T19:09:04.156Z" }, + { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764, upload-time = "2024-02-18T19:09:04.156Z" }, ] [[package]] @@ -91,113 +91,113 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload_time = "2025-01-29T04:15:40.373Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449, upload-time = "2025-01-29T04:15:40.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419, upload_time = "2025-01-29T05:37:06.642Z" }, - { url = "https://files.pythonhosted.org/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080, upload_time = "2025-01-29T05:37:09.321Z" }, - { url = "https://files.pythonhosted.org/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886, upload_time = "2025-01-29T04:18:24.432Z" }, - { url = "https://files.pythonhosted.org/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404, upload_time = "2025-01-29T04:19:04.296Z" }, - { url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372, upload_time = "2025-01-29T05:37:11.71Z" }, - { url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865, upload_time = "2025-01-29T05:37:14.309Z" }, - { url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699, upload_time = "2025-01-29T04:18:17.688Z" }, - { url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028, upload_time = "2025-01-29T04:18:51.711Z" }, - { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload_time = "2025-01-29T05:37:16.707Z" }, - { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload_time = "2025-01-29T05:37:18.273Z" }, - { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload_time = "2025-01-29T04:18:33.823Z" }, - { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload_time = "2025-01-29T04:19:12.944Z" }, - { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload_time = "2025-01-29T05:37:20.574Z" }, - { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload_time = "2025-01-29T05:37:22.106Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload_time = "2025-01-29T04:18:58.564Z" }, - { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload_time = "2025-01-29T04:19:27.63Z" }, - { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload_time = "2025-01-29T04:15:38.082Z" }, + { url = "https://files.pythonhosted.org/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419, upload-time = "2025-01-29T05:37:06.642Z" }, + { url = "https://files.pythonhosted.org/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080, upload-time = "2025-01-29T05:37:09.321Z" }, + { url = "https://files.pythonhosted.org/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886, upload-time = "2025-01-29T04:18:24.432Z" }, + { url = "https://files.pythonhosted.org/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404, upload-time = "2025-01-29T04:19:04.296Z" }, + { url = "https://files.pythonhosted.org/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372, upload-time = "2025-01-29T05:37:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865, upload-time = "2025-01-29T05:37:14.309Z" }, + { url = "https://files.pythonhosted.org/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699, upload-time = "2025-01-29T04:18:17.688Z" }, + { url = "https://files.pythonhosted.org/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028, upload-time = "2025-01-29T04:18:51.711Z" }, + { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988, upload-time = "2025-01-29T05:37:16.707Z" }, + { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985, upload-time = "2025-01-29T05:37:18.273Z" }, + { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816, upload-time = "2025-01-29T04:18:33.823Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860, upload-time = "2025-01-29T04:19:12.944Z" }, + { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673, upload-time = "2025-01-29T05:37:20.574Z" }, + { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190, upload-time = "2025-01-29T05:37:22.106Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926, upload-time = "2025-01-29T04:18:58.564Z" }, + { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613, upload-time = "2025-01-29T04:19:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646, upload-time = "2025-01-29T04:15:38.082Z" }, ] [[package]] name = "blinker" version = "1.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/13/6df5fc090ff4e5d246baf1f45fe9e5623aa8565757dfa5bd243f6a545f9e/blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182", size = 28134, upload_time = "2023-11-01T22:06:01.588Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/13/6df5fc090ff4e5d246baf1f45fe9e5623aa8565757dfa5bd243f6a545f9e/blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182", size = 28134, upload-time = "2023-11-01T22:06:01.588Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9", size = 13068, upload_time = "2023-11-01T22:06:00.162Z" }, + { url = "https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9", size = 13068, upload-time = "2023-11-01T22:06:00.162Z" }, ] [[package]] name = "brotli" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270, upload_time = "2023-09-07T14:05:41.643Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/c2/f9e977608bdf958650638c3f1e28f85a1b075f075ebbe77db8555463787b/Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", size = 7372270, upload-time = "2023-09-07T14:05:41.643Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/3a/dbf4fb970c1019a57b5e492e1e0eae745d32e59ba4d6161ab5422b08eefe/Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752", size = 873045, upload_time = "2023-09-07T14:03:16.894Z" }, - { url = "https://files.pythonhosted.org/packages/dd/11/afc14026ea7f44bd6eb9316d800d439d092c8d508752055ce8d03086079a/Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9", size = 446218, upload_time = "2023-09-07T14:03:18.917Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/7545a6e7729db43cb36c4287ae388d6885c85a86dd251768a47015dfde32/Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3", size = 2903872, upload_time = "2023-09-07T14:03:20.398Z" }, - { url = "https://files.pythonhosted.org/packages/32/23/35331c4d9391fcc0f29fd9bec2c76e4b4eeab769afbc4b11dd2e1098fb13/Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d", size = 2941254, upload_time = "2023-09-07T14:03:21.914Z" }, - { url = "https://files.pythonhosted.org/packages/3b/24/1671acb450c902edb64bd765d73603797c6c7280a9ada85a195f6b78c6e5/Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e", size = 2857293, upload_time = "2023-09-07T14:03:24Z" }, - { url = "https://files.pythonhosted.org/packages/d5/00/40f760cc27007912b327fe15bf6bfd8eaecbe451687f72a8abc587d503b3/Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da", size = 3002385, upload_time = "2023-09-07T14:03:26.248Z" }, - { url = "https://files.pythonhosted.org/packages/b8/cb/8aaa83f7a4caa131757668c0fb0c4b6384b09ffa77f2fba9570d87ab587d/Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80", size = 2911104, upload_time = "2023-09-07T14:03:27.849Z" }, - { url = "https://files.pythonhosted.org/packages/bc/c4/65456561d89d3c49f46b7fbeb8fe6e449f13bdc8ea7791832c5d476b2faf/Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d", size = 2809981, upload_time = "2023-09-07T14:03:29.92Z" }, - { url = "https://files.pythonhosted.org/packages/05/1b/cf49528437bae28abce5f6e059f0d0be6fecdcc1d3e33e7c54b3ca498425/Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0", size = 2935297, upload_time = "2023-09-07T14:03:32.035Z" }, - { url = "https://files.pythonhosted.org/packages/81/ff/190d4af610680bf0c5a09eb5d1eac6e99c7c8e216440f9c7cfd42b7adab5/Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e", size = 2930735, upload_time = "2023-09-07T14:03:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/80/7d/f1abbc0c98f6e09abd3cad63ec34af17abc4c44f308a7a539010f79aae7a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c", size = 2933107, upload_time = "2024-10-18T12:32:09.016Z" }, - { url = "https://files.pythonhosted.org/packages/34/ce/5a5020ba48f2b5a4ad1c0522d095ad5847a0be508e7d7569c8630ce25062/Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1", size = 2845400, upload_time = "2024-10-18T12:32:11.134Z" }, - { url = "https://files.pythonhosted.org/packages/44/89/fa2c4355ab1eecf3994e5a0a7f5492c6ff81dfcb5f9ba7859bd534bb5c1a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2", size = 3031985, upload_time = "2024-10-18T12:32:12.813Z" }, - { url = "https://files.pythonhosted.org/packages/af/a4/79196b4a1674143d19dca400866b1a4d1a089040df7b93b88ebae81f3447/Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec", size = 2927099, upload_time = "2024-10-18T12:32:14.733Z" }, - { url = "https://files.pythonhosted.org/packages/e9/54/1c0278556a097f9651e657b873ab08f01b9a9ae4cac128ceb66427d7cd20/Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2", size = 333172, upload_time = "2023-09-07T14:03:35.212Z" }, - { url = "https://files.pythonhosted.org/packages/f7/65/b785722e941193fd8b571afd9edbec2a9b838ddec4375d8af33a50b8dab9/Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128", size = 357255, upload_time = "2023-09-07T14:03:36.447Z" }, - { url = "https://files.pythonhosted.org/packages/96/12/ad41e7fadd5db55459c4c401842b47f7fee51068f86dd2894dd0dcfc2d2a/Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc", size = 873068, upload_time = "2023-09-07T14:03:37.779Z" }, - { url = "https://files.pythonhosted.org/packages/95/4e/5afab7b2b4b61a84e9c75b17814198ce515343a44e2ed4488fac314cd0a9/Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6", size = 446244, upload_time = "2023-09-07T14:03:39.223Z" }, - { url = "https://files.pythonhosted.org/packages/9d/e6/f305eb61fb9a8580c525478a4a34c5ae1a9bcb12c3aee619114940bc513d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd", size = 2906500, upload_time = "2023-09-07T14:03:40.858Z" }, - { url = "https://files.pythonhosted.org/packages/3e/4f/af6846cfbc1550a3024e5d3775ede1e00474c40882c7bf5b37a43ca35e91/Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf", size = 2943950, upload_time = "2023-09-07T14:03:42.896Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e7/ca2993c7682d8629b62630ebf0d1f3bb3d579e667ce8e7ca03a0a0576a2d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61", size = 2918527, upload_time = "2023-09-07T14:03:44.552Z" }, - { url = "https://files.pythonhosted.org/packages/b3/96/da98e7bedc4c51104d29cc61e5f449a502dd3dbc211944546a4cc65500d3/Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327", size = 2845489, upload_time = "2023-09-07T14:03:46.594Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ef/ccbc16947d6ce943a7f57e1a40596c75859eeb6d279c6994eddd69615265/Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd", size = 2914080, upload_time = "2023-09-07T14:03:48.204Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/0bd38d758d1afa62a5524172f0b18626bb2392d717ff94806f741fcd5ee9/Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9", size = 2813051, upload_time = "2023-09-07T14:03:50.348Z" }, - { url = "https://files.pythonhosted.org/packages/14/56/48859dd5d129d7519e001f06dcfbb6e2cf6db92b2702c0c2ce7d97e086c1/Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265", size = 2938172, upload_time = "2023-09-07T14:03:52.395Z" }, - { url = "https://files.pythonhosted.org/packages/3d/77/a236d5f8cd9e9f4348da5acc75ab032ab1ab2c03cc8f430d24eea2672888/Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8", size = 2933023, upload_time = "2023-09-07T14:03:53.96Z" }, - { url = "https://files.pythonhosted.org/packages/f1/87/3b283efc0f5cb35f7f84c0c240b1e1a1003a5e47141a4881bf87c86d0ce2/Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f", size = 2935871, upload_time = "2024-10-18T12:32:16.688Z" }, - { url = "https://files.pythonhosted.org/packages/f3/eb/2be4cc3e2141dc1a43ad4ca1875a72088229de38c68e842746b342667b2a/Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757", size = 2847784, upload_time = "2024-10-18T12:32:18.459Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/b58ddebfd35edde572ccefe6890cf7c493f0c319aad2a5badee134b4d8ec/Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0", size = 3034905, upload_time = "2024-10-18T12:32:20.192Z" }, - { url = "https://files.pythonhosted.org/packages/84/9c/bc96b6c7db824998a49ed3b38e441a2cae9234da6fa11f6ed17e8cf4f147/Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b", size = 2929467, upload_time = "2024-10-18T12:32:21.774Z" }, - { url = "https://files.pythonhosted.org/packages/e7/71/8f161dee223c7ff7fea9d44893fba953ce97cf2c3c33f78ba260a91bcff5/Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50", size = 333169, upload_time = "2023-09-07T14:03:55.404Z" }, - { url = "https://files.pythonhosted.org/packages/02/8a/fece0ee1057643cb2a5bbf59682de13f1725f8482b2c057d4e799d7ade75/Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1", size = 357253, upload_time = "2023-09-07T14:03:56.643Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693, upload_time = "2024-10-18T12:32:23.824Z" }, - { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489, upload_time = "2024-10-18T12:32:25.641Z" }, - { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081, upload_time = "2023-09-07T14:03:57.967Z" }, - { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244, upload_time = "2023-09-07T14:03:59.319Z" }, - { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505, upload_time = "2023-09-07T14:04:01.327Z" }, - { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152, upload_time = "2023-09-07T14:04:03.033Z" }, - { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252, upload_time = "2023-09-07T14:04:04.675Z" }, - { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955, upload_time = "2023-09-07T14:04:06.585Z" }, - { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304, upload_time = "2023-09-07T14:04:08.668Z" }, - { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452, upload_time = "2023-09-07T14:04:10.736Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751, upload_time = "2023-09-07T14:04:12.875Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757, upload_time = "2023-09-07T14:04:14.551Z" }, - { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146, upload_time = "2024-10-18T12:32:27.257Z" }, - { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055, upload_time = "2024-10-18T12:32:29.376Z" }, - { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102, upload_time = "2024-10-18T12:32:31.371Z" }, - { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029, upload_time = "2024-10-18T12:32:33.293Z" }, - { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276, upload_time = "2023-09-07T14:04:16.49Z" }, - { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255, upload_time = "2023-09-07T14:04:17.83Z" }, - { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681, upload_time = "2024-10-18T12:32:34.942Z" }, - { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475, upload_time = "2024-10-18T12:32:36.485Z" }, - { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173, upload_time = "2024-10-18T12:32:37.978Z" }, - { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803, upload_time = "2024-10-18T12:32:39.606Z" }, - { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946, upload_time = "2024-10-18T12:32:41.679Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707, upload_time = "2024-10-18T12:32:43.478Z" }, - { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231, upload_time = "2024-10-18T12:32:45.224Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157, upload_time = "2024-10-18T12:32:46.894Z" }, - { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122, upload_time = "2024-10-18T12:32:48.844Z" }, - { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206, upload_time = "2024-10-18T12:32:51.198Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804, upload_time = "2024-10-18T12:32:52.661Z" }, - { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517, upload_time = "2024-10-18T12:32:54.066Z" }, + { url = "https://files.pythonhosted.org/packages/6d/3a/dbf4fb970c1019a57b5e492e1e0eae745d32e59ba4d6161ab5422b08eefe/Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752", size = 873045, upload-time = "2023-09-07T14:03:16.894Z" }, + { url = "https://files.pythonhosted.org/packages/dd/11/afc14026ea7f44bd6eb9316d800d439d092c8d508752055ce8d03086079a/Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9", size = 446218, upload-time = "2023-09-07T14:03:18.917Z" }, + { url = "https://files.pythonhosted.org/packages/36/83/7545a6e7729db43cb36c4287ae388d6885c85a86dd251768a47015dfde32/Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3", size = 2903872, upload-time = "2023-09-07T14:03:20.398Z" }, + { url = "https://files.pythonhosted.org/packages/32/23/35331c4d9391fcc0f29fd9bec2c76e4b4eeab769afbc4b11dd2e1098fb13/Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d", size = 2941254, upload-time = "2023-09-07T14:03:21.914Z" }, + { url = "https://files.pythonhosted.org/packages/3b/24/1671acb450c902edb64bd765d73603797c6c7280a9ada85a195f6b78c6e5/Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e", size = 2857293, upload-time = "2023-09-07T14:03:24Z" }, + { url = "https://files.pythonhosted.org/packages/d5/00/40f760cc27007912b327fe15bf6bfd8eaecbe451687f72a8abc587d503b3/Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da", size = 3002385, upload-time = "2023-09-07T14:03:26.248Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/8aaa83f7a4caa131757668c0fb0c4b6384b09ffa77f2fba9570d87ab587d/Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80", size = 2911104, upload-time = "2023-09-07T14:03:27.849Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c4/65456561d89d3c49f46b7fbeb8fe6e449f13bdc8ea7791832c5d476b2faf/Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d", size = 2809981, upload-time = "2023-09-07T14:03:29.92Z" }, + { url = "https://files.pythonhosted.org/packages/05/1b/cf49528437bae28abce5f6e059f0d0be6fecdcc1d3e33e7c54b3ca498425/Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0", size = 2935297, upload-time = "2023-09-07T14:03:32.035Z" }, + { url = "https://files.pythonhosted.org/packages/81/ff/190d4af610680bf0c5a09eb5d1eac6e99c7c8e216440f9c7cfd42b7adab5/Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e", size = 2930735, upload-time = "2023-09-07T14:03:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/80/7d/f1abbc0c98f6e09abd3cad63ec34af17abc4c44f308a7a539010f79aae7a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c", size = 2933107, upload-time = "2024-10-18T12:32:09.016Z" }, + { url = "https://files.pythonhosted.org/packages/34/ce/5a5020ba48f2b5a4ad1c0522d095ad5847a0be508e7d7569c8630ce25062/Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1", size = 2845400, upload-time = "2024-10-18T12:32:11.134Z" }, + { url = "https://files.pythonhosted.org/packages/44/89/fa2c4355ab1eecf3994e5a0a7f5492c6ff81dfcb5f9ba7859bd534bb5c1a/Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2", size = 3031985, upload-time = "2024-10-18T12:32:12.813Z" }, + { url = "https://files.pythonhosted.org/packages/af/a4/79196b4a1674143d19dca400866b1a4d1a089040df7b93b88ebae81f3447/Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec", size = 2927099, upload-time = "2024-10-18T12:32:14.733Z" }, + { url = "https://files.pythonhosted.org/packages/e9/54/1c0278556a097f9651e657b873ab08f01b9a9ae4cac128ceb66427d7cd20/Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2", size = 333172, upload-time = "2023-09-07T14:03:35.212Z" }, + { url = "https://files.pythonhosted.org/packages/f7/65/b785722e941193fd8b571afd9edbec2a9b838ddec4375d8af33a50b8dab9/Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128", size = 357255, upload-time = "2023-09-07T14:03:36.447Z" }, + { url = "https://files.pythonhosted.org/packages/96/12/ad41e7fadd5db55459c4c401842b47f7fee51068f86dd2894dd0dcfc2d2a/Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc", size = 873068, upload-time = "2023-09-07T14:03:37.779Z" }, + { url = "https://files.pythonhosted.org/packages/95/4e/5afab7b2b4b61a84e9c75b17814198ce515343a44e2ed4488fac314cd0a9/Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6", size = 446244, upload-time = "2023-09-07T14:03:39.223Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e6/f305eb61fb9a8580c525478a4a34c5ae1a9bcb12c3aee619114940bc513d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd", size = 2906500, upload-time = "2023-09-07T14:03:40.858Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4f/af6846cfbc1550a3024e5d3775ede1e00474c40882c7bf5b37a43ca35e91/Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf", size = 2943950, upload-time = "2023-09-07T14:03:42.896Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e7/ca2993c7682d8629b62630ebf0d1f3bb3d579e667ce8e7ca03a0a0576a2d/Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61", size = 2918527, upload-time = "2023-09-07T14:03:44.552Z" }, + { url = "https://files.pythonhosted.org/packages/b3/96/da98e7bedc4c51104d29cc61e5f449a502dd3dbc211944546a4cc65500d3/Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327", size = 2845489, upload-time = "2023-09-07T14:03:46.594Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ef/ccbc16947d6ce943a7f57e1a40596c75859eeb6d279c6994eddd69615265/Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd", size = 2914080, upload-time = "2023-09-07T14:03:48.204Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/0bd38d758d1afa62a5524172f0b18626bb2392d717ff94806f741fcd5ee9/Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9", size = 2813051, upload-time = "2023-09-07T14:03:50.348Z" }, + { url = "https://files.pythonhosted.org/packages/14/56/48859dd5d129d7519e001f06dcfbb6e2cf6db92b2702c0c2ce7d97e086c1/Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265", size = 2938172, upload-time = "2023-09-07T14:03:52.395Z" }, + { url = "https://files.pythonhosted.org/packages/3d/77/a236d5f8cd9e9f4348da5acc75ab032ab1ab2c03cc8f430d24eea2672888/Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8", size = 2933023, upload-time = "2023-09-07T14:03:53.96Z" }, + { url = "https://files.pythonhosted.org/packages/f1/87/3b283efc0f5cb35f7f84c0c240b1e1a1003a5e47141a4881bf87c86d0ce2/Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f", size = 2935871, upload-time = "2024-10-18T12:32:16.688Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/2be4cc3e2141dc1a43ad4ca1875a72088229de38c68e842746b342667b2a/Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757", size = 2847784, upload-time = "2024-10-18T12:32:18.459Z" }, + { url = "https://files.pythonhosted.org/packages/66/13/b58ddebfd35edde572ccefe6890cf7c493f0c319aad2a5badee134b4d8ec/Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0", size = 3034905, upload-time = "2024-10-18T12:32:20.192Z" }, + { url = "https://files.pythonhosted.org/packages/84/9c/bc96b6c7db824998a49ed3b38e441a2cae9234da6fa11f6ed17e8cf4f147/Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b", size = 2929467, upload-time = "2024-10-18T12:32:21.774Z" }, + { url = "https://files.pythonhosted.org/packages/e7/71/8f161dee223c7ff7fea9d44893fba953ce97cf2c3c33f78ba260a91bcff5/Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50", size = 333169, upload-time = "2023-09-07T14:03:55.404Z" }, + { url = "https://files.pythonhosted.org/packages/02/8a/fece0ee1057643cb2a5bbf59682de13f1725f8482b2c057d4e799d7ade75/Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1", size = 357253, upload-time = "2023-09-07T14:03:56.643Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d0/5373ae13b93fe00095a58efcbce837fd470ca39f703a235d2a999baadfbc/Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28", size = 815693, upload-time = "2024-10-18T12:32:23.824Z" }, + { url = "https://files.pythonhosted.org/packages/8e/48/f6e1cdf86751300c288c1459724bfa6917a80e30dbfc326f92cea5d3683a/Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f", size = 422489, upload-time = "2024-10-18T12:32:25.641Z" }, + { url = "https://files.pythonhosted.org/packages/06/88/564958cedce636d0f1bed313381dfc4b4e3d3f6015a63dae6146e1b8c65c/Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", size = 873081, upload-time = "2023-09-07T14:03:57.967Z" }, + { url = "https://files.pythonhosted.org/packages/58/79/b7026a8bb65da9a6bb7d14329fd2bd48d2b7f86d7329d5cc8ddc6a90526f/Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", size = 446244, upload-time = "2023-09-07T14:03:59.319Z" }, + { url = "https://files.pythonhosted.org/packages/e5/18/c18c32ecea41b6c0004e15606e274006366fe19436b6adccc1ae7b2e50c2/Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", size = 2906505, upload-time = "2023-09-07T14:04:01.327Z" }, + { url = "https://files.pythonhosted.org/packages/08/c8/69ec0496b1ada7569b62d85893d928e865df29b90736558d6c98c2031208/Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", size = 2944152, upload-time = "2023-09-07T14:04:03.033Z" }, + { url = "https://files.pythonhosted.org/packages/ab/fb/0517cea182219d6768113a38167ef6d4eb157a033178cc938033a552ed6d/Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", size = 2919252, upload-time = "2023-09-07T14:04:04.675Z" }, + { url = "https://files.pythonhosted.org/packages/c7/53/73a3431662e33ae61a5c80b1b9d2d18f58dfa910ae8dd696e57d39f1a2f5/Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", size = 2845955, upload-time = "2023-09-07T14:04:06.585Z" }, + { url = "https://files.pythonhosted.org/packages/55/ac/bd280708d9c5ebdbf9de01459e625a3e3803cce0784f47d633562cf40e83/Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", size = 2914304, upload-time = "2023-09-07T14:04:08.668Z" }, + { url = "https://files.pythonhosted.org/packages/76/58/5c391b41ecfc4527d2cc3350719b02e87cb424ef8ba2023fb662f9bf743c/Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", size = 2814452, upload-time = "2023-09-07T14:04:10.736Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/91b8256dfe99c407f174924b65a01f5305e303f486cc7a2e8a5d43c8bec3/Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", size = 2938751, upload-time = "2023-09-07T14:04:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a6/e2a39a5d3b412938362bbbeba5af904092bf3f95b867b4a3eb856104074e/Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", size = 2933757, upload-time = "2023-09-07T14:04:14.551Z" }, + { url = "https://files.pythonhosted.org/packages/13/f0/358354786280a509482e0e77c1a5459e439766597d280f28cb097642fc26/Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9", size = 2936146, upload-time = "2024-10-18T12:32:27.257Z" }, + { url = "https://files.pythonhosted.org/packages/80/f7/daf538c1060d3a88266b80ecc1d1c98b79553b3f117a485653f17070ea2a/Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb", size = 2848055, upload-time = "2024-10-18T12:32:29.376Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0eaa0585c4077d3c2d1edf322d8e97aabf317941d3a72d7b3ad8bce004b0/Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111", size = 3035102, upload-time = "2024-10-18T12:32:31.371Z" }, + { url = "https://files.pythonhosted.org/packages/d8/63/1c1585b2aa554fe6dbce30f0c18bdbc877fa9a1bf5ff17677d9cca0ac122/Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839", size = 2930029, upload-time = "2024-10-18T12:32:33.293Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3b/4e3fd1893eb3bbfef8e5a80d4508bec17a57bb92d586c85c12d28666bb13/Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", size = 333276, upload-time = "2023-09-07T14:04:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", size = 357255, upload-time = "2023-09-07T14:04:17.83Z" }, + { url = "https://files.pythonhosted.org/packages/0a/9f/fb37bb8ffc52a8da37b1c03c459a8cd55df7a57bdccd8831d500e994a0ca/Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5", size = 815681, upload-time = "2024-10-18T12:32:34.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/b3/dbd332a988586fefb0aa49c779f59f47cae76855c2d00f450364bb574cac/Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8", size = 422475, upload-time = "2024-10-18T12:32:36.485Z" }, + { url = "https://files.pythonhosted.org/packages/bb/80/6aaddc2f63dbcf2d93c2d204e49c11a9ec93a8c7c63261e2b4bd35198283/Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f", size = 2906173, upload-time = "2024-10-18T12:32:37.978Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1d/e6ca79c96ff5b641df6097d299347507d39a9604bde8915e76bf026d6c77/Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648", size = 2943803, upload-time = "2024-10-18T12:32:39.606Z" }, + { url = "https://files.pythonhosted.org/packages/ac/a3/d98d2472e0130b7dd3acdbb7f390d478123dbf62b7d32bda5c830a96116d/Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0", size = 2918946, upload-time = "2024-10-18T12:32:41.679Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a5/c69e6d272aee3e1423ed005d8915a7eaa0384c7de503da987f2d224d0721/Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089", size = 2845707, upload-time = "2024-10-18T12:32:43.478Z" }, + { url = "https://files.pythonhosted.org/packages/58/9f/4149d38b52725afa39067350696c09526de0125ebfbaab5acc5af28b42ea/Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368", size = 2936231, upload-time = "2024-10-18T12:32:45.224Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5a/145de884285611838a16bebfdb060c231c52b8f84dfbe52b852a15780386/Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c", size = 2848157, upload-time = "2024-10-18T12:32:46.894Z" }, + { url = "https://files.pythonhosted.org/packages/50/ae/408b6bfb8525dadebd3b3dd5b19d631da4f7d46420321db44cd99dcf2f2c/Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284", size = 3035122, upload-time = "2024-10-18T12:32:48.844Z" }, + { url = "https://files.pythonhosted.org/packages/af/85/a94e5cfaa0ca449d8f91c3d6f78313ebf919a0dbd55a100c711c6e9655bc/Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7", size = 2930206, upload-time = "2024-10-18T12:32:51.198Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f0/a61d9262cd01351df22e57ad7c34f66794709acab13f34be2675f45bf89d/Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0", size = 333804, upload-time = "2024-10-18T12:32:52.661Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b", size = 358517, upload-time = "2024-10-18T12:32:54.066Z" }, ] [[package]] name = "certifi" version = "2023.11.17" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/91/c89518dd4fe1f3a4e3f6ab7ff23cb00ef2e8c9adf99dacc618ad5e068e28/certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", size = 163637, upload_time = "2023-11-18T02:54:02.397Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/91/c89518dd4fe1f3a4e3f6ab7ff23cb00ef2e8c9adf99dacc618ad5e068e28/certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", size = 163637, upload-time = "2023-11-18T02:54:02.397Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/62/428ef076be88fa93716b576e4a01f919d25968913e817077a386fcbe4f42/certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474", size = 162530, upload_time = "2023-11-18T02:54:00.083Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/428ef076be88fa93716b576e4a01f919d25968913e817077a386fcbe4f42/certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474", size = 162530, upload-time = "2023-11-18T02:54:00.083Z" }, ] [[package]] @@ -207,108 +207,108 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload_time = "2024-09-04T20:45:21.852Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload_time = "2024-09-04T20:43:30.027Z" }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload_time = "2024-09-04T20:43:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload_time = "2024-09-04T20:43:34.186Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload_time = "2024-09-04T20:43:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload_time = "2024-09-04T20:43:38.586Z" }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload_time = "2024-09-04T20:43:40.084Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload_time = "2024-09-04T20:43:41.526Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload_time = "2024-09-04T20:43:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload_time = "2024-09-04T20:43:45.256Z" }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload_time = "2024-09-04T20:43:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload_time = "2024-09-04T20:43:48.186Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload_time = "2024-09-04T20:43:49.812Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload_time = "2024-09-04T20:43:51.124Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload_time = "2024-09-04T20:43:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload_time = "2024-09-04T20:43:56.123Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload_time = "2024-09-04T20:43:57.891Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload_time = "2024-09-04T20:44:00.18Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload_time = "2024-09-04T20:44:01.585Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload_time = "2024-09-04T20:44:03.467Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload_time = "2024-09-04T20:44:05.023Z" }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload_time = "2024-09-04T20:44:06.444Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload_time = "2024-09-04T20:44:08.206Z" }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload_time = "2024-09-04T20:44:09.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload_time = "2024-09-04T20:44:10.873Z" }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload_time = "2024-09-04T20:44:12.232Z" }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload_time = "2024-09-04T20:44:13.739Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload_time = "2024-09-04T20:44:15.231Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload_time = "2024-09-04T20:44:17.188Z" }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload_time = "2024-09-04T20:44:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload_time = "2024-09-04T20:44:20.248Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload_time = "2024-09-04T20:44:21.673Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload_time = "2024-09-04T20:44:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload_time = "2024-09-04T20:44:24.757Z" }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload_time = "2024-09-04T20:44:26.208Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload_time = "2024-09-04T20:44:27.578Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload_time = "2024-09-04T20:44:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload_time = "2024-09-04T20:44:30.289Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload_time = "2024-09-04T20:44:32.01Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload_time = "2024-09-04T20:44:33.606Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload_time = "2024-09-04T20:44:35.191Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload_time = "2024-09-04T20:44:36.743Z" }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload_time = "2024-09-04T20:44:38.492Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload_time = "2024-09-04T20:44:40.046Z" }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload_time = "2024-09-04T20:44:41.616Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload_time = "2024-09-04T20:44:43.733Z" }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, ] [[package]] name = "charset-normalizer" version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809, upload_time = "2023-11-01T04:04:59.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809, upload-time = "2023-11-01T04:04:59.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", size = 194219, upload_time = "2023-11-01T04:02:29.048Z" }, - { url = "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", size = 122521, upload_time = "2023-11-01T04:02:32.452Z" }, - { url = "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", size = 120383, upload_time = "2023-11-01T04:02:34.11Z" }, - { url = "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", size = 138223, upload_time = "2023-11-01T04:02:36.213Z" }, - { url = "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", size = 148101, upload_time = "2023-11-01T04:02:38.067Z" }, - { url = "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", size = 140699, upload_time = "2023-11-01T04:02:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", size = 142065, upload_time = "2023-11-01T04:02:41.357Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", size = 144505, upload_time = "2023-11-01T04:02:43.108Z" }, - { url = "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", size = 139425, upload_time = "2023-11-01T04:02:45.427Z" }, - { url = "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", size = 145287, upload_time = "2023-11-01T04:02:46.705Z" }, - { url = "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", size = 149929, upload_time = "2023-11-01T04:02:48.098Z" }, - { url = "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", size = 141605, upload_time = "2023-11-01T04:02:49.605Z" }, - { url = "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", size = 142646, upload_time = "2023-11-01T04:02:51.35Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d5/4fecf1d58bedb1340a50f165ba1c7ddc0400252d6832ff619c4568b36cc0/charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", size = 92846, upload_time = "2023-11-01T04:02:52.679Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a0/4af29e22cb5942488cf45630cbdd7cefd908768e69bdd90280842e4e8529/charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", size = 100343, upload_time = "2023-11-01T04:02:53.915Z" }, - { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647, upload_time = "2023-11-01T04:02:55.329Z" }, - { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434, upload_time = "2023-11-01T04:02:57.173Z" }, - { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979, upload_time = "2023-11-01T04:02:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582, upload_time = "2023-11-01T04:02:59.776Z" }, - { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645, upload_time = "2023-11-01T04:03:02.186Z" }, - { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398, upload_time = "2023-11-01T04:03:04.255Z" }, - { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273, upload_time = "2023-11-01T04:03:05.983Z" }, - { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577, upload_time = "2023-11-01T04:03:07.567Z" }, - { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747, upload_time = "2023-11-01T04:03:08.886Z" }, - { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375, upload_time = "2023-11-01T04:03:10.613Z" }, - { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474, upload_time = "2023-11-01T04:03:11.973Z" }, - { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232, upload_time = "2023-11-01T04:03:13.505Z" }, - { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859, upload_time = "2023-11-01T04:03:17.362Z" }, - { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509, upload_time = "2023-11-01T04:03:21.453Z" }, - { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870, upload_time = "2023-11-01T04:03:22.723Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892, upload_time = "2023-11-01T04:03:24.135Z" }, - { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213, upload_time = "2023-11-01T04:03:25.66Z" }, - { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404, upload_time = "2023-11-01T04:03:27.04Z" }, - { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275, upload_time = "2023-11-01T04:03:28.466Z" }, - { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518, upload_time = "2023-11-01T04:03:29.82Z" }, - { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182, upload_time = "2023-11-01T04:03:31.511Z" }, - { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869, upload_time = "2023-11-01T04:03:32.887Z" }, - { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042, upload_time = "2023-11-01T04:03:34.412Z" }, - { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275, upload_time = "2023-11-01T04:03:35.759Z" }, - { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819, upload_time = "2023-11-01T04:03:37.216Z" }, - { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415, upload_time = "2023-11-01T04:03:38.694Z" }, - { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212, upload_time = "2023-11-01T04:03:40.07Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167, upload_time = "2023-11-01T04:03:41.491Z" }, - { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041, upload_time = "2023-11-01T04:03:42.836Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397, upload_time = "2023-11-01T04:03:44.467Z" }, - { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543, upload_time = "2023-11-01T04:04:58.622Z" }, + { url = "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", size = 194219, upload-time = "2023-11-01T04:02:29.048Z" }, + { url = "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", size = 122521, upload-time = "2023-11-01T04:02:32.452Z" }, + { url = "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", size = 120383, upload-time = "2023-11-01T04:02:34.11Z" }, + { url = "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", size = 138223, upload-time = "2023-11-01T04:02:36.213Z" }, + { url = "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", size = 148101, upload-time = "2023-11-01T04:02:38.067Z" }, + { url = "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", size = 140699, upload-time = "2023-11-01T04:02:39.436Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", size = 142065, upload-time = "2023-11-01T04:02:41.357Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", size = 144505, upload-time = "2023-11-01T04:02:43.108Z" }, + { url = "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", size = 139425, upload-time = "2023-11-01T04:02:45.427Z" }, + { url = "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", size = 145287, upload-time = "2023-11-01T04:02:46.705Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", size = 149929, upload-time = "2023-11-01T04:02:48.098Z" }, + { url = "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", size = 141605, upload-time = "2023-11-01T04:02:49.605Z" }, + { url = "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", size = 142646, upload-time = "2023-11-01T04:02:51.35Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d5/4fecf1d58bedb1340a50f165ba1c7ddc0400252d6832ff619c4568b36cc0/charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", size = 92846, upload-time = "2023-11-01T04:02:52.679Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a0/4af29e22cb5942488cf45630cbdd7cefd908768e69bdd90280842e4e8529/charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", size = 100343, upload-time = "2023-11-01T04:02:53.915Z" }, + { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647, upload-time = "2023-11-01T04:02:55.329Z" }, + { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434, upload-time = "2023-11-01T04:02:57.173Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979, upload-time = "2023-11-01T04:02:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582, upload-time = "2023-11-01T04:02:59.776Z" }, + { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645, upload-time = "2023-11-01T04:03:02.186Z" }, + { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398, upload-time = "2023-11-01T04:03:04.255Z" }, + { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273, upload-time = "2023-11-01T04:03:05.983Z" }, + { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577, upload-time = "2023-11-01T04:03:07.567Z" }, + { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747, upload-time = "2023-11-01T04:03:08.886Z" }, + { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375, upload-time = "2023-11-01T04:03:10.613Z" }, + { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474, upload-time = "2023-11-01T04:03:11.973Z" }, + { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232, upload-time = "2023-11-01T04:03:13.505Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859, upload-time = "2023-11-01T04:03:17.362Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509, upload-time = "2023-11-01T04:03:21.453Z" }, + { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870, upload-time = "2023-11-01T04:03:22.723Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892, upload-time = "2023-11-01T04:03:24.135Z" }, + { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213, upload-time = "2023-11-01T04:03:25.66Z" }, + { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404, upload-time = "2023-11-01T04:03:27.04Z" }, + { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275, upload-time = "2023-11-01T04:03:28.466Z" }, + { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518, upload-time = "2023-11-01T04:03:29.82Z" }, + { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182, upload-time = "2023-11-01T04:03:31.511Z" }, + { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869, upload-time = "2023-11-01T04:03:32.887Z" }, + { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042, upload-time = "2023-11-01T04:03:34.412Z" }, + { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275, upload-time = "2023-11-01T04:03:35.759Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819, upload-time = "2023-11-01T04:03:37.216Z" }, + { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415, upload-time = "2023-11-01T04:03:38.694Z" }, + { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212, upload-time = "2023-11-01T04:03:40.07Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167, upload-time = "2023-11-01T04:03:41.491Z" }, + { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041, upload-time = "2023-11-01T04:03:42.836Z" }, + { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397, upload-time = "2023-11-01T04:03:44.467Z" }, + { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543, upload-time = "2023-11-01T04:04:58.622Z" }, ] [[package]] @@ -318,18 +318,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121, upload_time = "2023-08-17T17:29:11.868Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121, upload-time = "2023-08-17T17:29:11.868Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941, upload_time = "2023-08-17T17:29:10.08Z" }, + { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941, upload-time = "2023-08-17T17:29:10.08Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] @@ -339,18 +339,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "humanfriendly" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload_time = "2021-06-11T10:22:45.202Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload_time = "2021-06-11T10:22:42.561Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload-time = "2021-06-11T10:22:42.561Z" }, ] [[package]] name = "configargparse" version = "1.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/8a/73f1008adfad01cb923255b924b1528727b8270e67cb4ef41eabdc7d783e/ConfigArgParse-1.7.tar.gz", hash = "sha256:e7067471884de5478c58a511e529f0f9bd1c66bfef1dea90935438d6c23306d1", size = 43817, upload_time = "2023-07-23T16:20:04.95Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/8a/73f1008adfad01cb923255b924b1528727b8270e67cb4ef41eabdc7d783e/ConfigArgParse-1.7.tar.gz", hash = "sha256:e7067471884de5478c58a511e529f0f9bd1c66bfef1dea90935438d6c23306d1", size = 43817, upload-time = "2023-07-23T16:20:04.95Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/b3/b4ac838711fd74a2b4e6f746703cf9dd2cf5462d17dac07e349234e21b97/ConfigArgParse-1.7-py3-none-any.whl", hash = "sha256:d249da6591465c6c26df64a9f73d2536e743be2f244eb3ebe61114af2f94f86b", size = 25489, upload_time = "2023-07-23T16:20:03.27Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b3/b4ac838711fd74a2b4e6f746703cf9dd2cf5462d17dac07e349234e21b97/ConfigArgParse-1.7-py3-none-any.whl", hash = "sha256:d249da6591465c6c26df64a9f73d2536e743be2f244eb3ebe61114af2f94f86b", size = 25489, upload-time = "2023-07-23T16:20:03.27Z" }, ] [[package]] @@ -360,97 +360,97 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/a3/48ddc7ae832b000952cf4be64452381d150a41a2299c2eb19237168528d1/contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a", size = 13455881, upload_time = "2023-11-03T17:01:03.144Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/a3/48ddc7ae832b000952cf4be64452381d150a41a2299c2eb19237168528d1/contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a", size = 13455881, upload-time = "2023-11-03T17:01:03.144Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/ea/f6e90933d82cc5aacf52f886a1c01f47f96eba99108ca2929c7b3ef45f82/contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8", size = 256873, upload_time = "2023-11-03T16:56:34.548Z" }, - { url = "https://files.pythonhosted.org/packages/fe/26/43821d61b7ee62c1809ec852bc572aaf4c27f101ebcebbbcce29a5ee0445/contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4", size = 242211, upload_time = "2023-11-03T16:56:38.028Z" }, - { url = "https://files.pythonhosted.org/packages/9b/99/c8fb63072a7573fe7682e1786a021f29f9c5f660a3aafcdce80b9ee8348d/contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f", size = 293195, upload_time = "2023-11-03T16:56:41.598Z" }, - { url = "https://files.pythonhosted.org/packages/c7/a7/ae0b4bb8e0c865270d02ee619981413996dc10ddf1fd2689c938173ff62f/contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e", size = 332279, upload_time = "2023-11-03T16:56:46.08Z" }, - { url = "https://files.pythonhosted.org/packages/94/7c/682228b9085ff323fb7e946fe139072e5f21b71360cf91f36ea079d4ea95/contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9", size = 305326, upload_time = "2023-11-03T16:56:49.647Z" }, - { url = "https://files.pythonhosted.org/packages/58/56/e2c43dcfa1f9c7db4d5e3d6f5134b24ed953f4e2133a4b12f0062148db58/contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa", size = 310732, upload_time = "2023-11-03T16:56:53.773Z" }, - { url = "https://files.pythonhosted.org/packages/94/0b/8495c4582057abc8377f945f6e11a86f1c07ad7b32fd4fdc968478cd0324/contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9", size = 803420, upload_time = "2023-11-03T16:57:00.669Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1f/40399c7da649297147d404aedaa675cc60018f48ad284630c0d1406133e3/contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab", size = 829204, upload_time = "2023-11-03T16:57:07.813Z" }, - { url = "https://files.pythonhosted.org/packages/8b/01/4be433b60dce7cbce8315cbcdfc016e7d25430a8b94e272355dff79cc3a8/contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488", size = 165434, upload_time = "2023-11-03T16:57:10.601Z" }, - { url = "https://files.pythonhosted.org/packages/fd/7c/168f8343f33d861305e18c56901ef1bb675d3c7f977f435ec72751a71a54/contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41", size = 186652, upload_time = "2023-11-03T16:57:13.57Z" }, - { url = "https://files.pythonhosted.org/packages/9b/54/1dafec3c84df1d29119037330f7289db84a679cb2d5283af4ef24d89f532/contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727", size = 258243, upload_time = "2023-11-03T16:57:16.604Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ac/26fa1057f62beaa2af4c55c6ac733b114a403b746cfe0ce3dc6e4aec921a/contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd", size = 243408, upload_time = "2023-11-03T16:57:20.021Z" }, - { url = "https://files.pythonhosted.org/packages/b7/33/cd0ecc80123f499d76d2fe2807cb4d5638ef8730735c580c8a8a03e1928e/contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a", size = 294142, upload_time = "2023-11-03T16:57:23.48Z" }, - { url = "https://files.pythonhosted.org/packages/6d/75/1b7bf20bf6394e01df2c4b4b3d44d3dc280c16ddaff72724639100bd4314/contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063", size = 333129, upload_time = "2023-11-03T16:57:27.141Z" }, - { url = "https://files.pythonhosted.org/packages/22/5b/fedd961dff1877e5d3b83c5201295cfdcdc2438884c2851aa7ecf6cec045/contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e", size = 307461, upload_time = "2023-11-03T16:57:30.537Z" }, - { url = "https://files.pythonhosted.org/packages/e2/83/29a63bbc72839cc6b24b5a0e3d004d4ed4e8439f26460ad9a34e39251904/contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686", size = 313352, upload_time = "2023-11-03T16:57:34.937Z" }, - { url = "https://files.pythonhosted.org/packages/4b/c7/4bac0fc4f1e802ab47e75076d83d2e1448e0668ba6cc9000cf4e9d5bd94a/contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286", size = 804127, upload_time = "2023-11-03T16:57:42.201Z" }, - { url = "https://files.pythonhosted.org/packages/e3/47/b3fd5bdc2f6ec13502d57a5bc390ffe62648605ed1689c93b0015150a784/contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95", size = 829561, upload_time = "2023-11-03T16:57:49.667Z" }, - { url = "https://files.pythonhosted.org/packages/5c/04/be16038e754169caea4d02d82f8e5cd97dece593e5ac9e05735da0afd0c5/contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6", size = 166197, upload_time = "2023-11-03T16:57:52.682Z" }, - { url = "https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de", size = 187556, upload_time = "2023-11-03T16:57:55.286Z" }, - { url = "https://files.pythonhosted.org/packages/4f/03/839da46999173226bead08794cbd7b4d37c9e6b02686ca74c93556b43258/contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0", size = 259253, upload_time = "2023-11-03T16:57:58.572Z" }, - { url = "https://files.pythonhosted.org/packages/f3/9e/8fb3f53144269d3fecdd8786d3a4686eeff55b9b35a3c0772a3f62f71e36/contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4", size = 242555, upload_time = "2023-11-03T16:58:01.48Z" }, - { url = "https://files.pythonhosted.org/packages/a6/85/9815ccb5a18ee8c9a46bd5ef20d02b292cd4a99c62553f38c87015f16d59/contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779", size = 288108, upload_time = "2023-11-03T16:58:05.546Z" }, - { url = "https://files.pythonhosted.org/packages/5a/d9/4df5c26bd0f496c8cd7940fd53db95d07deeb98518f02f805ce570590da8/contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316", size = 330810, upload_time = "2023-11-03T16:58:09.568Z" }, - { url = "https://files.pythonhosted.org/packages/67/d4/8aae9793a0cfde72959312521ebd3aa635c260c3d580448e8db6bdcdd1aa/contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399", size = 305290, upload_time = "2023-11-03T16:58:13.017Z" }, - { url = "https://files.pythonhosted.org/packages/20/84/ffddcdcc579cbf7213fd92a3578ca08a931a3bf879a22deb5a83ffc5002c/contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0", size = 303937, upload_time = "2023-11-03T16:58:16.426Z" }, - { url = "https://files.pythonhosted.org/packages/d8/ad/6e570cf525f909da94559ed716189f92f529bc7b5f78645733c44619a0e2/contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0", size = 801977, upload_time = "2023-11-03T16:58:23.539Z" }, - { url = "https://files.pythonhosted.org/packages/36/b4/55f23482c596eca36d16fc668b147865c56fcf90353f4c57f073d8d5e532/contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431", size = 827442, upload_time = "2023-11-03T16:58:30.724Z" }, - { url = "https://files.pythonhosted.org/packages/e9/47/9c081b1f11d6053cb0aa4c46b7de2ea2849a4a8d40de81c7bc3f99773b02/contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f", size = 165363, upload_time = "2023-11-03T16:58:33.54Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ae/a6353db548bff1a592b85ae6bb80275f0a51dc25a0410d059e5b33183e36/contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9", size = 187731, upload_time = "2023-11-03T16:58:36.585Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ea/f6e90933d82cc5aacf52f886a1c01f47f96eba99108ca2929c7b3ef45f82/contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8", size = 256873, upload-time = "2023-11-03T16:56:34.548Z" }, + { url = "https://files.pythonhosted.org/packages/fe/26/43821d61b7ee62c1809ec852bc572aaf4c27f101ebcebbbcce29a5ee0445/contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4", size = 242211, upload-time = "2023-11-03T16:56:38.028Z" }, + { url = "https://files.pythonhosted.org/packages/9b/99/c8fb63072a7573fe7682e1786a021f29f9c5f660a3aafcdce80b9ee8348d/contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f", size = 293195, upload-time = "2023-11-03T16:56:41.598Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a7/ae0b4bb8e0c865270d02ee619981413996dc10ddf1fd2689c938173ff62f/contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e", size = 332279, upload-time = "2023-11-03T16:56:46.08Z" }, + { url = "https://files.pythonhosted.org/packages/94/7c/682228b9085ff323fb7e946fe139072e5f21b71360cf91f36ea079d4ea95/contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9", size = 305326, upload-time = "2023-11-03T16:56:49.647Z" }, + { url = "https://files.pythonhosted.org/packages/58/56/e2c43dcfa1f9c7db4d5e3d6f5134b24ed953f4e2133a4b12f0062148db58/contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa", size = 310732, upload-time = "2023-11-03T16:56:53.773Z" }, + { url = "https://files.pythonhosted.org/packages/94/0b/8495c4582057abc8377f945f6e11a86f1c07ad7b32fd4fdc968478cd0324/contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9", size = 803420, upload-time = "2023-11-03T16:57:00.669Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1f/40399c7da649297147d404aedaa675cc60018f48ad284630c0d1406133e3/contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab", size = 829204, upload-time = "2023-11-03T16:57:07.813Z" }, + { url = "https://files.pythonhosted.org/packages/8b/01/4be433b60dce7cbce8315cbcdfc016e7d25430a8b94e272355dff79cc3a8/contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488", size = 165434, upload-time = "2023-11-03T16:57:10.601Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7c/168f8343f33d861305e18c56901ef1bb675d3c7f977f435ec72751a71a54/contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41", size = 186652, upload-time = "2023-11-03T16:57:13.57Z" }, + { url = "https://files.pythonhosted.org/packages/9b/54/1dafec3c84df1d29119037330f7289db84a679cb2d5283af4ef24d89f532/contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727", size = 258243, upload-time = "2023-11-03T16:57:16.604Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ac/26fa1057f62beaa2af4c55c6ac733b114a403b746cfe0ce3dc6e4aec921a/contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd", size = 243408, upload-time = "2023-11-03T16:57:20.021Z" }, + { url = "https://files.pythonhosted.org/packages/b7/33/cd0ecc80123f499d76d2fe2807cb4d5638ef8730735c580c8a8a03e1928e/contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a", size = 294142, upload-time = "2023-11-03T16:57:23.48Z" }, + { url = "https://files.pythonhosted.org/packages/6d/75/1b7bf20bf6394e01df2c4b4b3d44d3dc280c16ddaff72724639100bd4314/contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063", size = 333129, upload-time = "2023-11-03T16:57:27.141Z" }, + { url = "https://files.pythonhosted.org/packages/22/5b/fedd961dff1877e5d3b83c5201295cfdcdc2438884c2851aa7ecf6cec045/contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e", size = 307461, upload-time = "2023-11-03T16:57:30.537Z" }, + { url = "https://files.pythonhosted.org/packages/e2/83/29a63bbc72839cc6b24b5a0e3d004d4ed4e8439f26460ad9a34e39251904/contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686", size = 313352, upload-time = "2023-11-03T16:57:34.937Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c7/4bac0fc4f1e802ab47e75076d83d2e1448e0668ba6cc9000cf4e9d5bd94a/contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286", size = 804127, upload-time = "2023-11-03T16:57:42.201Z" }, + { url = "https://files.pythonhosted.org/packages/e3/47/b3fd5bdc2f6ec13502d57a5bc390ffe62648605ed1689c93b0015150a784/contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95", size = 829561, upload-time = "2023-11-03T16:57:49.667Z" }, + { url = "https://files.pythonhosted.org/packages/5c/04/be16038e754169caea4d02d82f8e5cd97dece593e5ac9e05735da0afd0c5/contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6", size = 166197, upload-time = "2023-11-03T16:57:52.682Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2a/d197a412ec474391ee878b1218cf2fe9c6e963903755887fc5654c06636a/contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de", size = 187556, upload-time = "2023-11-03T16:57:55.286Z" }, + { url = "https://files.pythonhosted.org/packages/4f/03/839da46999173226bead08794cbd7b4d37c9e6b02686ca74c93556b43258/contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0", size = 259253, upload-time = "2023-11-03T16:57:58.572Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9e/8fb3f53144269d3fecdd8786d3a4686eeff55b9b35a3c0772a3f62f71e36/contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4", size = 242555, upload-time = "2023-11-03T16:58:01.48Z" }, + { url = "https://files.pythonhosted.org/packages/a6/85/9815ccb5a18ee8c9a46bd5ef20d02b292cd4a99c62553f38c87015f16d59/contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779", size = 288108, upload-time = "2023-11-03T16:58:05.546Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d9/4df5c26bd0f496c8cd7940fd53db95d07deeb98518f02f805ce570590da8/contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316", size = 330810, upload-time = "2023-11-03T16:58:09.568Z" }, + { url = "https://files.pythonhosted.org/packages/67/d4/8aae9793a0cfde72959312521ebd3aa635c260c3d580448e8db6bdcdd1aa/contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399", size = 305290, upload-time = "2023-11-03T16:58:13.017Z" }, + { url = "https://files.pythonhosted.org/packages/20/84/ffddcdcc579cbf7213fd92a3578ca08a931a3bf879a22deb5a83ffc5002c/contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0", size = 303937, upload-time = "2023-11-03T16:58:16.426Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ad/6e570cf525f909da94559ed716189f92f529bc7b5f78645733c44619a0e2/contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0", size = 801977, upload-time = "2023-11-03T16:58:23.539Z" }, + { url = "https://files.pythonhosted.org/packages/36/b4/55f23482c596eca36d16fc668b147865c56fcf90353f4c57f073d8d5e532/contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431", size = 827442, upload-time = "2023-11-03T16:58:30.724Z" }, + { url = "https://files.pythonhosted.org/packages/e9/47/9c081b1f11d6053cb0aa4c46b7de2ea2849a4a8d40de81c7bc3f99773b02/contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f", size = 165363, upload-time = "2023-11-03T16:58:33.54Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ae/a6353db548bff1a592b85ae6bb80275f0a51dc25a0410d059e5b33183e36/contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9", size = 187731, upload-time = "2023-11-03T16:58:36.585Z" }, ] [[package]] name = "coverage" version = "7.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716, upload_time = "2024-10-20T22:57:39.682Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/12/3669b6382792783e92046730ad3327f53b2726f0603f4c311c4da4824222/coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", size = 798716, upload-time = "2024-10-20T22:57:39.682Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/93/4ad92f71e28ece5c0326e5f4a6630aa4928a8846654a65cfff69b49b95b9/coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", size = 206713, upload_time = "2024-10-20T22:56:03.877Z" }, - { url = "https://files.pythonhosted.org/packages/01/ae/747a580b1eda3f2e431d87de48f0604bd7bc92e52a1a95185a4aa585bc47/coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", size = 207149, upload_time = "2024-10-20T22:56:06.511Z" }, - { url = "https://files.pythonhosted.org/packages/07/1a/1f573f8a6145f6d4c9130bbc120e0024daf1b24cf2a78d7393fa6eb6aba7/coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", size = 235584, upload_time = "2024-10-20T22:56:07.678Z" }, - { url = "https://files.pythonhosted.org/packages/40/42/c8523f2e4db34aa9389caee0d3688b6ada7a84fcc782e943a868a7f302bd/coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", size = 233486, upload_time = "2024-10-20T22:56:09.496Z" }, - { url = "https://files.pythonhosted.org/packages/8d/95/565c310fffa16ede1a042e9ea1ca3962af0d8eb5543bc72df6b91dc0c3d5/coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", size = 234649, upload_time = "2024-10-20T22:56:11.326Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/3b550674d98968ec29c92e3e8650682be6c8b1fa7581a059e7e12e74c431/coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", size = 233744, upload_time = "2024-10-20T22:56:12.481Z" }, - { url = "https://files.pythonhosted.org/packages/0d/70/d66c7f51b3e33aabc5ea9f9624c1c9d9655472962270eb5e7b0d32707224/coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", size = 232204, upload_time = "2024-10-20T22:56:14.236Z" }, - { url = "https://files.pythonhosted.org/packages/23/2d/2b3a2dbed7a5f40693404c8a09e779d7c1a5fbed089d3e7224c002129ec8/coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", size = 233335, upload_time = "2024-10-20T22:56:15.521Z" }, - { url = "https://files.pythonhosted.org/packages/5a/4f/92d1d2ad720d698a4e71c176eacf531bfb8e0721d5ad560556f2c484a513/coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", size = 209435, upload_time = "2024-10-20T22:56:17.309Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b9/cdf158e7991e2287bcf9082670928badb73d310047facac203ff8dcd5ff3/coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", size = 210243, upload_time = "2024-10-20T22:56:18.366Z" }, - { url = "https://files.pythonhosted.org/packages/87/31/9c0cf84f0dfcbe4215b7eb95c31777cdc0483c13390e69584c8150c85175/coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", size = 206819, upload_time = "2024-10-20T22:56:20.132Z" }, - { url = "https://files.pythonhosted.org/packages/53/ed/a38401079ad320ad6e054a01ec2b61d270511aeb3c201c80e99c841229d5/coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", size = 207263, upload_time = "2024-10-20T22:56:21.88Z" }, - { url = "https://files.pythonhosted.org/packages/20/e7/c3ad33b179ab4213f0d70da25a9c214d52464efa11caeab438592eb1d837/coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", size = 239205, upload_time = "2024-10-20T22:56:23.03Z" }, - { url = "https://files.pythonhosted.org/packages/36/91/fc02e8d8e694f557752120487fd982f654ba1421bbaa5560debf96ddceda/coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", size = 236612, upload_time = "2024-10-20T22:56:24.882Z" }, - { url = "https://files.pythonhosted.org/packages/cc/57/cb08f0eda0389a9a8aaa4fc1f9fec7ac361c3e2d68efd5890d7042c18aa3/coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", size = 238479, upload_time = "2024-10-20T22:56:26.749Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c9/2c7681a9b3ca6e6f43d489c2e6653a53278ed857fd6e7010490c307b0a47/coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", size = 237405, upload_time = "2024-10-20T22:56:27.958Z" }, - { url = "https://files.pythonhosted.org/packages/b5/4e/ebfc6944b96317df8b537ae875d2e57c27b84eb98820bc0a1055f358f056/coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", size = 236038, upload_time = "2024-10-20T22:56:29.816Z" }, - { url = "https://files.pythonhosted.org/packages/13/f2/3a0bf1841a97c0654905e2ef531170f02c89fad2555879db8fe41a097871/coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", size = 236812, upload_time = "2024-10-20T22:56:31.654Z" }, - { url = "https://files.pythonhosted.org/packages/b9/9c/66bf59226b52ce6ed9541b02d33e80a6e816a832558fbdc1111a7bd3abd4/coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", size = 209400, upload_time = "2024-10-20T22:56:33.569Z" }, - { url = "https://files.pythonhosted.org/packages/2a/a0/b0790934c04dfc8d658d4a62acb8f7ca0efdf3818456fcad757b11c6479d/coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", size = 210243, upload_time = "2024-10-20T22:56:34.863Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013, upload_time = "2024-10-20T22:56:36.034Z" }, - { url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251, upload_time = "2024-10-20T22:56:38.054Z" }, - { url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268, upload_time = "2024-10-20T22:56:40.051Z" }, - { url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298, upload_time = "2024-10-20T22:56:41.929Z" }, - { url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367, upload_time = "2024-10-20T22:56:43.141Z" }, - { url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853, upload_time = "2024-10-20T22:56:44.33Z" }, - { url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160, upload_time = "2024-10-20T22:56:46.258Z" }, - { url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824, upload_time = "2024-10-20T22:56:48.666Z" }, - { url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639, upload_time = "2024-10-20T22:56:50.664Z" }, - { url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428, upload_time = "2024-10-20T22:56:52.468Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039, upload_time = "2024-10-20T22:56:53.656Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298, upload_time = "2024-10-20T22:56:54.979Z" }, - { url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813, upload_time = "2024-10-20T22:56:56.209Z" }, - { url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959, upload_time = "2024-10-20T22:56:58.06Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950, upload_time = "2024-10-20T22:56:59.329Z" }, - { url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610, upload_time = "2024-10-20T22:57:00.645Z" }, - { url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697, upload_time = "2024-10-20T22:57:01.944Z" }, - { url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541, upload_time = "2024-10-20T22:57:03.848Z" }, - { url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707, upload_time = "2024-10-20T22:57:05.123Z" }, - { url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439, upload_time = "2024-10-20T22:57:06.35Z" }, - { url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784, upload_time = "2024-10-20T22:57:07.857Z" }, - { url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058, upload_time = "2024-10-20T22:57:09.845Z" }, - { url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772, upload_time = "2024-10-20T22:57:11.147Z" }, - { url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490, upload_time = "2024-10-20T22:57:13.02Z" }, - { url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848, upload_time = "2024-10-20T22:57:14.927Z" }, - { url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340, upload_time = "2024-10-20T22:57:16.246Z" }, - { url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229, upload_time = "2024-10-20T22:57:17.546Z" }, - { url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510, upload_time = "2024-10-20T22:57:18.925Z" }, - { url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353, upload_time = "2024-10-20T22:57:20.891Z" }, - { url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502, upload_time = "2024-10-20T22:57:22.21Z" }, - { url = "https://files.pythonhosted.org/packages/cc/56/e1d75e8981a2a92c2a777e67c26efa96c66da59d645423146eb9ff3a851b/coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", size = 198954, upload_time = "2024-10-20T22:57:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/a5/93/4ad92f71e28ece5c0326e5f4a6630aa4928a8846654a65cfff69b49b95b9/coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", size = 206713, upload-time = "2024-10-20T22:56:03.877Z" }, + { url = "https://files.pythonhosted.org/packages/01/ae/747a580b1eda3f2e431d87de48f0604bd7bc92e52a1a95185a4aa585bc47/coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", size = 207149, upload-time = "2024-10-20T22:56:06.511Z" }, + { url = "https://files.pythonhosted.org/packages/07/1a/1f573f8a6145f6d4c9130bbc120e0024daf1b24cf2a78d7393fa6eb6aba7/coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", size = 235584, upload-time = "2024-10-20T22:56:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/40/42/c8523f2e4db34aa9389caee0d3688b6ada7a84fcc782e943a868a7f302bd/coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", size = 233486, upload-time = "2024-10-20T22:56:09.496Z" }, + { url = "https://files.pythonhosted.org/packages/8d/95/565c310fffa16ede1a042e9ea1ca3962af0d8eb5543bc72df6b91dc0c3d5/coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", size = 234649, upload-time = "2024-10-20T22:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/d5/81/3b550674d98968ec29c92e3e8650682be6c8b1fa7581a059e7e12e74c431/coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", size = 233744, upload-time = "2024-10-20T22:56:12.481Z" }, + { url = "https://files.pythonhosted.org/packages/0d/70/d66c7f51b3e33aabc5ea9f9624c1c9d9655472962270eb5e7b0d32707224/coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", size = 232204, upload-time = "2024-10-20T22:56:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/23/2d/2b3a2dbed7a5f40693404c8a09e779d7c1a5fbed089d3e7224c002129ec8/coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", size = 233335, upload-time = "2024-10-20T22:56:15.521Z" }, + { url = "https://files.pythonhosted.org/packages/5a/4f/92d1d2ad720d698a4e71c176eacf531bfb8e0721d5ad560556f2c484a513/coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", size = 209435, upload-time = "2024-10-20T22:56:17.309Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b9/cdf158e7991e2287bcf9082670928badb73d310047facac203ff8dcd5ff3/coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", size = 210243, upload-time = "2024-10-20T22:56:18.366Z" }, + { url = "https://files.pythonhosted.org/packages/87/31/9c0cf84f0dfcbe4215b7eb95c31777cdc0483c13390e69584c8150c85175/coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", size = 206819, upload-time = "2024-10-20T22:56:20.132Z" }, + { url = "https://files.pythonhosted.org/packages/53/ed/a38401079ad320ad6e054a01ec2b61d270511aeb3c201c80e99c841229d5/coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", size = 207263, upload-time = "2024-10-20T22:56:21.88Z" }, + { url = "https://files.pythonhosted.org/packages/20/e7/c3ad33b179ab4213f0d70da25a9c214d52464efa11caeab438592eb1d837/coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", size = 239205, upload-time = "2024-10-20T22:56:23.03Z" }, + { url = "https://files.pythonhosted.org/packages/36/91/fc02e8d8e694f557752120487fd982f654ba1421bbaa5560debf96ddceda/coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", size = 236612, upload-time = "2024-10-20T22:56:24.882Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/cb08f0eda0389a9a8aaa4fc1f9fec7ac361c3e2d68efd5890d7042c18aa3/coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", size = 238479, upload-time = "2024-10-20T22:56:26.749Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c9/2c7681a9b3ca6e6f43d489c2e6653a53278ed857fd6e7010490c307b0a47/coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", size = 237405, upload-time = "2024-10-20T22:56:27.958Z" }, + { url = "https://files.pythonhosted.org/packages/b5/4e/ebfc6944b96317df8b537ae875d2e57c27b84eb98820bc0a1055f358f056/coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", size = 236038, upload-time = "2024-10-20T22:56:29.816Z" }, + { url = "https://files.pythonhosted.org/packages/13/f2/3a0bf1841a97c0654905e2ef531170f02c89fad2555879db8fe41a097871/coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", size = 236812, upload-time = "2024-10-20T22:56:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9c/66bf59226b52ce6ed9541b02d33e80a6e816a832558fbdc1111a7bd3abd4/coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", size = 209400, upload-time = "2024-10-20T22:56:33.569Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a0/b0790934c04dfc8d658d4a62acb8f7ca0efdf3818456fcad757b11c6479d/coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", size = 210243, upload-time = "2024-10-20T22:56:34.863Z" }, + { url = "https://files.pythonhosted.org/packages/7d/e7/9291de916d084f41adddfd4b82246e68d61d6a75747f075f7e64628998d2/coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", size = 207013, upload-time = "2024-10-20T22:56:36.034Z" }, + { url = "https://files.pythonhosted.org/packages/27/03/932c2c5717a7fa80cd43c6a07d3177076d97b79f12f40f882f9916db0063/coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", size = 207251, upload-time = "2024-10-20T22:56:38.054Z" }, + { url = "https://files.pythonhosted.org/packages/d5/3f/0af47dcb9327f65a45455fbca846fe96eb57c153af46c4754a3ba678938a/coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", size = 240268, upload-time = "2024-10-20T22:56:40.051Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/37a9d81bbd4b23bc7d46ca820e16174c613579c66342faa390a271d2e18b/coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", size = 237298, upload-time = "2024-10-20T22:56:41.929Z" }, + { url = "https://files.pythonhosted.org/packages/c0/70/6b0627e5bd68204ee580126ed3513140b2298995c1233bd67404b4e44d0e/coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", size = 239367, upload-time = "2024-10-20T22:56:43.141Z" }, + { url = "https://files.pythonhosted.org/packages/3c/eb/634d7dfab24ac3b790bebaf9da0f4a5352cbc125ce6a9d5c6cf4c6cae3c7/coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", size = 238853, upload-time = "2024-10-20T22:56:44.33Z" }, + { url = "https://files.pythonhosted.org/packages/d9/0d/8e3ed00f1266ef7472a4e33458f42e39492e01a64281084fb3043553d3f1/coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", size = 237160, upload-time = "2024-10-20T22:56:46.258Z" }, + { url = "https://files.pythonhosted.org/packages/ce/9c/4337f468ef0ab7a2e0887a9c9da0e58e2eada6fc6cbee637a4acd5dfd8a9/coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", size = 238824, upload-time = "2024-10-20T22:56:48.666Z" }, + { url = "https://files.pythonhosted.org/packages/5e/09/3e94912b8dd37251377bb02727a33a67ee96b84bbbe092f132b401ca5dd9/coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", size = 209639, upload-time = "2024-10-20T22:56:50.664Z" }, + { url = "https://files.pythonhosted.org/packages/01/69/d4f3a4101171f32bc5b3caec8ff94c2c60f700107a6aaef7244b2c166793/coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", size = 210428, upload-time = "2024-10-20T22:56:52.468Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4d/2dede4f7cb5a70fb0bb40a57627fddf1dbdc6b9c1db81f7c4dcdcb19e2f4/coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", size = 207039, upload-time = "2024-10-20T22:56:53.656Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f9/d86368ae8c79e28f1fb458ebc76ae9ff3e8bd8069adc24e8f2fed03c58b7/coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", size = 207298, upload-time = "2024-10-20T22:56:54.979Z" }, + { url = "https://files.pythonhosted.org/packages/64/c5/b4cc3c3f64622c58fbfd4d8b9a7a8ce9d355f172f91fcabbba1f026852f6/coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", size = 239813, upload-time = "2024-10-20T22:56:56.209Z" }, + { url = "https://files.pythonhosted.org/packages/8a/86/14c42e60b70a79b26099e4d289ccdfefbc68624d096f4481163085aa614c/coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", size = 236959, upload-time = "2024-10-20T22:56:58.06Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f8/4436a643631a2fbab4b44d54f515028f6099bfb1cd95b13cfbf701e7f2f2/coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", size = 238950, upload-time = "2024-10-20T22:56:59.329Z" }, + { url = "https://files.pythonhosted.org/packages/49/50/1571810ddd01f99a0a8be464a4ac8b147f322cd1e8e296a1528984fc560b/coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", size = 238610, upload-time = "2024-10-20T22:57:00.645Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8c/6312d241fe7cbd1f0cade34a62fea6f333d1a261255d76b9a87074d8703c/coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", size = 236697, upload-time = "2024-10-20T22:57:01.944Z" }, + { url = "https://files.pythonhosted.org/packages/ce/5f/fef33dfd05d87ee9030f614c857deb6df6556b8f6a1c51bbbb41e24ee5ac/coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", size = 238541, upload-time = "2024-10-20T22:57:03.848Z" }, + { url = "https://files.pythonhosted.org/packages/a9/64/6a984b6e92e1ea1353b7ffa08e27f707a5e29b044622445859200f541e8c/coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", size = 209707, upload-time = "2024-10-20T22:57:05.123Z" }, + { url = "https://files.pythonhosted.org/packages/5c/60/ce5a9e942e9543783b3db5d942e0578b391c25cdd5e7f342d854ea83d6b7/coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", size = 210439, upload-time = "2024-10-20T22:57:06.35Z" }, + { url = "https://files.pythonhosted.org/packages/78/53/6719677e92c308207e7f10561a1b16ab8b5c00e9328efc9af7cfd6fb703e/coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", size = 207784, upload-time = "2024-10-20T22:57:07.857Z" }, + { url = "https://files.pythonhosted.org/packages/fa/dd/7054928930671fcb39ae6a83bb71d9ab5f0afb733172543ced4b09a115ca/coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", size = 208058, upload-time = "2024-10-20T22:57:09.845Z" }, + { url = "https://files.pythonhosted.org/packages/b5/7d/fd656ddc2b38301927b9eb3aae3fe827e7aa82e691923ed43721fd9423c9/coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", size = 250772, upload-time = "2024-10-20T22:57:11.147Z" }, + { url = "https://files.pythonhosted.org/packages/90/d0/eb9a3cc2100b83064bb086f18aedde3afffd7de6ead28f69736c00b7f302/coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", size = 246490, upload-time = "2024-10-20T22:57:13.02Z" }, + { url = "https://files.pythonhosted.org/packages/45/44/3f64f38f6faab8a0cfd2c6bc6eb4c6daead246b97cf5f8fc23bf3788f841/coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", size = 248848, upload-time = "2024-10-20T22:57:14.927Z" }, + { url = "https://files.pythonhosted.org/packages/5d/11/4c465a5f98656821e499f4b4619929bd5a34639c466021740ecdca42aa30/coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", size = 248340, upload-time = "2024-10-20T22:57:16.246Z" }, + { url = "https://files.pythonhosted.org/packages/f1/96/ebecda2d016cce9da812f404f720ca5df83c6b29f65dc80d2000d0078741/coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", size = 246229, upload-time = "2024-10-20T22:57:17.546Z" }, + { url = "https://files.pythonhosted.org/packages/16/d9/3d820c00066ae55d69e6d0eae11d6149a5ca7546de469ba9d597f01bf2d7/coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", size = 247510, upload-time = "2024-10-20T22:57:18.925Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c3/4fa1eb412bb288ff6bfcc163c11700ff06e02c5fad8513817186e460ed43/coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", size = 210353, upload-time = "2024-10-20T22:57:20.891Z" }, + { url = "https://files.pythonhosted.org/packages/7e/77/03fc2979d1538884d921c2013075917fc927f41cd8526909852fe4494112/coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", size = 211502, upload-time = "2024-10-20T22:57:22.21Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/e1d75e8981a2a92c2a777e67c26efa96c66da59d645423146eb9ff3a851b/coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", size = 198954, upload-time = "2024-10-20T22:57:38.28Z" }, ] [package.optional-dependencies] @@ -462,57 +462,57 @@ toml = [ name = "cycler" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload_time = "2023-10-07T05:32:18.335Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload_time = "2023-10-07T05:32:16.783Z" }, + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] [[package]] name = "cython" version = "3.0.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/09/ffb61f29b8e3d207c444032b21328327d753e274ea081bc74e009827cc81/Cython-3.0.8.tar.gz", hash = "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6", size = 2744096, upload_time = "2024-01-10T11:01:02.155Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/09/ffb61f29b8e3d207c444032b21328327d753e274ea081bc74e009827cc81/Cython-3.0.8.tar.gz", hash = "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6", size = 2744096, upload-time = "2024-01-10T11:01:02.155Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f4/d2542e186fe33ec1cc542770fb17466421ed54f4ffe04d00fe9549d0a467/Cython-3.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636", size = 3100459, upload_time = "2024-01-10T11:33:49.545Z" }, - { url = "https://files.pythonhosted.org/packages/fc/27/2652f395aa708fb3081148e0df3ab700bd7288636c65332ef7febad6a380/Cython-3.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520", size = 3456626, upload_time = "2024-01-10T11:01:44.897Z" }, - { url = "https://files.pythonhosted.org/packages/f9/bd/e8a1d26d04c08a67bcc383f2ea5493a4e77f37a8770ead00a238b08ad729/Cython-3.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39", size = 3621379, upload_time = "2024-01-10T11:01:48.777Z" }, - { url = "https://files.pythonhosted.org/packages/03/ae/ead7ec03d0062d439879d41b7830e4f2480213f7beabf2f7052a191cc6f7/Cython-3.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f", size = 3671873, upload_time = "2024-01-10T11:01:51.858Z" }, - { url = "https://files.pythonhosted.org/packages/63/b0/81dad725604d7b529c492f873a7fa1b5800704a9f26e100ed25e9fd8d057/Cython-3.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782", size = 3463832, upload_time = "2024-01-10T11:01:55.364Z" }, - { url = "https://files.pythonhosted.org/packages/13/cd/72b8e0af597ac1b376421847acf6d6fa252e60059a2a00dcf05ceb16d28f/Cython-3.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd", size = 3618325, upload_time = "2024-01-10T11:01:59.03Z" }, - { url = "https://files.pythonhosted.org/packages/ef/73/11a4355d8b8966504c751e5bcb25916c4140de27bb2ba1b54ff21994d7fe/Cython-3.0.8-cp310-cp310-win32.whl", hash = "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12", size = 2571305, upload_time = "2024-01-10T11:02:02.589Z" }, - { url = "https://files.pythonhosted.org/packages/18/15/fdc0c3552d20f9337b134a36d786da24e47998fc39f62cb61c1534f26123/Cython-3.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539", size = 2776113, upload_time = "2024-01-10T11:02:05.581Z" }, - { url = "https://files.pythonhosted.org/packages/db/a7/f4a0bc9a80e23b380daa2ebb4879bf434aaa0b3b91f7ad8a7f9762b4bd1b/Cython-3.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba", size = 3113615, upload_time = "2024-01-10T11:34:05.899Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e9/e9295df74246c165b91253a473bfa179debf739c9bee961cbb3ae56c2b79/Cython-3.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3", size = 3436320, upload_time = "2024-01-10T11:02:08.689Z" }, - { url = "https://files.pythonhosted.org/packages/26/2c/6a887c957aa53e44f928119dea628a5dfacc8e875424034f5fecac9daba4/Cython-3.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee", size = 3591755, upload_time = "2024-01-10T11:02:11.773Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b8/f9c97bae6281da50b3ecb1f7fef0f7f7851eae084609b364717a2b366bf1/Cython-3.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1", size = 3636099, upload_time = "2024-01-10T11:02:15.191Z" }, - { url = "https://files.pythonhosted.org/packages/17/ae/cd055c2c081c67a6fcad1d8d17d82bd6395b14c6741e3a938f40318c8bc5/Cython-3.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b", size = 3458119, upload_time = "2024-01-10T11:02:19.103Z" }, - { url = "https://files.pythonhosted.org/packages/72/ab/ac6f5548d6194f4bb2fc8c6c996aa7369f0fa1403e4d4de787d9e9309b27/Cython-3.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795", size = 3614418, upload_time = "2024-01-10T11:02:22.732Z" }, - { url = "https://files.pythonhosted.org/packages/70/e2/3e3e448b7a94887bec3235bcb71957b6681dc42b4536459f8f54d46fa936/Cython-3.0.8-cp311-cp311-win32.whl", hash = "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871", size = 2572819, upload_time = "2024-01-10T11:02:25.976Z" }, - { url = "https://files.pythonhosted.org/packages/85/7d/58635941dfbb5b4e197adb88080b9cbfb230dc3b75683698a530a1989bdb/Cython-3.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02", size = 2784167, upload_time = "2024-01-10T11:02:28.808Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8e/28f8c6109990eef7317ab7e43644092b49a88a39f9373dcd19318946df09/Cython-3.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f", size = 3135638, upload_time = "2024-01-10T11:34:22.889Z" }, - { url = "https://files.pythonhosted.org/packages/83/1f/4720cb682b8ed1ab9749dea35351a66dd29b6a022628cce038415660c384/Cython-3.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419", size = 3340052, upload_time = "2024-01-10T11:02:32.471Z" }, - { url = "https://files.pythonhosted.org/packages/8a/47/ec3fceb9e8f7d6fa130216b8740038e1df7c8e5f215bba363fcf1272a6c1/Cython-3.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6", size = 3510079, upload_time = "2024-01-10T11:02:35.312Z" }, - { url = "https://files.pythonhosted.org/packages/71/31/b458127851e248effb909e2791b55870914863cde7c60b94db5ee65d7867/Cython-3.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717", size = 3573972, upload_time = "2024-01-10T11:02:39.044Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d5/ca6513844d0634abd05ba12304053a454bb70441a9520afa9897d4300156/Cython-3.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658", size = 3356158, upload_time = "2024-01-10T11:02:42.125Z" }, - { url = "https://files.pythonhosted.org/packages/33/59/98a87b6264f4ad45c820db13c4ec657567476efde020c49443cc842a86af/Cython-3.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388", size = 3522312, upload_time = "2024-01-10T11:02:45.056Z" }, - { url = "https://files.pythonhosted.org/packages/2b/cb/132115d07a0b9d4f075e0741db70a5416b424dcd875b2bb0dd805e818222/Cython-3.0.8-cp312-cp312-win32.whl", hash = "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c", size = 2602579, upload_time = "2024-01-10T11:02:48.368Z" }, - { url = "https://files.pythonhosted.org/packages/b4/69/cb4620287cd9ef461103e122c0a2ae7f7ecf183e02510676fb5a15c95b05/Cython-3.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a", size = 2791268, upload_time = "2024-01-10T11:02:51.483Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7f/f584f5d15323feb897d42ef0e9d910649e2150d7a30cf7e7a8cc1d236e6f/Cython-3.0.8-py2.py3-none-any.whl", hash = "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6", size = 1168213, upload_time = "2024-01-10T11:00:56.857Z" }, + { url = "https://files.pythonhosted.org/packages/63/f4/d2542e186fe33ec1cc542770fb17466421ed54f4ffe04d00fe9549d0a467/Cython-3.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636", size = 3100459, upload-time = "2024-01-10T11:33:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/fc/27/2652f395aa708fb3081148e0df3ab700bd7288636c65332ef7febad6a380/Cython-3.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520", size = 3456626, upload-time = "2024-01-10T11:01:44.897Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bd/e8a1d26d04c08a67bcc383f2ea5493a4e77f37a8770ead00a238b08ad729/Cython-3.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39", size = 3621379, upload-time = "2024-01-10T11:01:48.777Z" }, + { url = "https://files.pythonhosted.org/packages/03/ae/ead7ec03d0062d439879d41b7830e4f2480213f7beabf2f7052a191cc6f7/Cython-3.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f", size = 3671873, upload-time = "2024-01-10T11:01:51.858Z" }, + { url = "https://files.pythonhosted.org/packages/63/b0/81dad725604d7b529c492f873a7fa1b5800704a9f26e100ed25e9fd8d057/Cython-3.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782", size = 3463832, upload-time = "2024-01-10T11:01:55.364Z" }, + { url = "https://files.pythonhosted.org/packages/13/cd/72b8e0af597ac1b376421847acf6d6fa252e60059a2a00dcf05ceb16d28f/Cython-3.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd", size = 3618325, upload-time = "2024-01-10T11:01:59.03Z" }, + { url = "https://files.pythonhosted.org/packages/ef/73/11a4355d8b8966504c751e5bcb25916c4140de27bb2ba1b54ff21994d7fe/Cython-3.0.8-cp310-cp310-win32.whl", hash = "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12", size = 2571305, upload-time = "2024-01-10T11:02:02.589Z" }, + { url = "https://files.pythonhosted.org/packages/18/15/fdc0c3552d20f9337b134a36d786da24e47998fc39f62cb61c1534f26123/Cython-3.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539", size = 2776113, upload-time = "2024-01-10T11:02:05.581Z" }, + { url = "https://files.pythonhosted.org/packages/db/a7/f4a0bc9a80e23b380daa2ebb4879bf434aaa0b3b91f7ad8a7f9762b4bd1b/Cython-3.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba", size = 3113615, upload-time = "2024-01-10T11:34:05.899Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/e9295df74246c165b91253a473bfa179debf739c9bee961cbb3ae56c2b79/Cython-3.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3", size = 3436320, upload-time = "2024-01-10T11:02:08.689Z" }, + { url = "https://files.pythonhosted.org/packages/26/2c/6a887c957aa53e44f928119dea628a5dfacc8e875424034f5fecac9daba4/Cython-3.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee", size = 3591755, upload-time = "2024-01-10T11:02:11.773Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b8/f9c97bae6281da50b3ecb1f7fef0f7f7851eae084609b364717a2b366bf1/Cython-3.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1", size = 3636099, upload-time = "2024-01-10T11:02:15.191Z" }, + { url = "https://files.pythonhosted.org/packages/17/ae/cd055c2c081c67a6fcad1d8d17d82bd6395b14c6741e3a938f40318c8bc5/Cython-3.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b", size = 3458119, upload-time = "2024-01-10T11:02:19.103Z" }, + { url = "https://files.pythonhosted.org/packages/72/ab/ac6f5548d6194f4bb2fc8c6c996aa7369f0fa1403e4d4de787d9e9309b27/Cython-3.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795", size = 3614418, upload-time = "2024-01-10T11:02:22.732Z" }, + { url = "https://files.pythonhosted.org/packages/70/e2/3e3e448b7a94887bec3235bcb71957b6681dc42b4536459f8f54d46fa936/Cython-3.0.8-cp311-cp311-win32.whl", hash = "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871", size = 2572819, upload-time = "2024-01-10T11:02:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/85/7d/58635941dfbb5b4e197adb88080b9cbfb230dc3b75683698a530a1989bdb/Cython-3.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02", size = 2784167, upload-time = "2024-01-10T11:02:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8e/28f8c6109990eef7317ab7e43644092b49a88a39f9373dcd19318946df09/Cython-3.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f", size = 3135638, upload-time = "2024-01-10T11:34:22.889Z" }, + { url = "https://files.pythonhosted.org/packages/83/1f/4720cb682b8ed1ab9749dea35351a66dd29b6a022628cce038415660c384/Cython-3.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419", size = 3340052, upload-time = "2024-01-10T11:02:32.471Z" }, + { url = "https://files.pythonhosted.org/packages/8a/47/ec3fceb9e8f7d6fa130216b8740038e1df7c8e5f215bba363fcf1272a6c1/Cython-3.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6", size = 3510079, upload-time = "2024-01-10T11:02:35.312Z" }, + { url = "https://files.pythonhosted.org/packages/71/31/b458127851e248effb909e2791b55870914863cde7c60b94db5ee65d7867/Cython-3.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717", size = 3573972, upload-time = "2024-01-10T11:02:39.044Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d5/ca6513844d0634abd05ba12304053a454bb70441a9520afa9897d4300156/Cython-3.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658", size = 3356158, upload-time = "2024-01-10T11:02:42.125Z" }, + { url = "https://files.pythonhosted.org/packages/33/59/98a87b6264f4ad45c820db13c4ec657567476efde020c49443cc842a86af/Cython-3.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388", size = 3522312, upload-time = "2024-01-10T11:02:45.056Z" }, + { url = "https://files.pythonhosted.org/packages/2b/cb/132115d07a0b9d4f075e0741db70a5416b424dcd875b2bb0dd805e818222/Cython-3.0.8-cp312-cp312-win32.whl", hash = "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c", size = 2602579, upload-time = "2024-01-10T11:02:48.368Z" }, + { url = "https://files.pythonhosted.org/packages/b4/69/cb4620287cd9ef461103e122c0a2ae7f7ecf183e02510676fb5a15c95b05/Cython-3.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a", size = 2791268, upload-time = "2024-01-10T11:02:51.483Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7f/f584f5d15323feb897d42ef0e9d910649e2150d7a30cf7e7a8cc1d236e6f/Cython-3.0.8-py2.py3-none-any.whl", hash = "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6", size = 1168213, upload-time = "2024-01-10T11:00:56.857Z" }, ] [[package]] name = "easydict" version = "1.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d2/deb3296d08097fedd622d423c0ec8b68b78c1704b3f1545326f6ce05c75c/easydict-1.11.tar.gz", hash = "sha256:dcb1d2ed28eb300c8e46cd371340373abc62f7c14d6dea74fdfc6f1069061c78", size = 6644, upload_time = "2023-10-23T23:01:37.686Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d2/deb3296d08097fedd622d423c0ec8b68b78c1704b3f1545326f6ce05c75c/easydict-1.11.tar.gz", hash = "sha256:dcb1d2ed28eb300c8e46cd371340373abc62f7c14d6dea74fdfc6f1069061c78", size = 6644, upload-time = "2023-10-23T23:01:37.686Z" } [[package]] name = "exceptiongroup" version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/1c/beef724eaf5b01bb44b6338c8c3494eff7cab376fab4904cfbbc3585dc79/exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68", size = 26264, upload_time = "2023-11-21T08:42:17.407Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/1c/beef724eaf5b01bb44b6338c8c3494eff7cab376fab4904cfbbc3585dc79/exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68", size = 26264, upload-time = "2023-11-21T08:42:17.407Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/9a/5028fd52db10e600f1c4674441b968cf2ea4959085bfb5b99fb1250e5f68/exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", size = 16210, upload_time = "2023-11-21T08:42:15.525Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9a/5028fd52db10e600f1c4674441b968cf2ea4959085bfb5b99fb1250e5f68/exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", size = 16210, upload-time = "2023-11-21T08:42:15.525Z" }, ] [[package]] @@ -524,18 +524,18 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload_time = "2025-03-23T22:55:43.822Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload-time = "2025-03-23T22:55:43.822Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload_time = "2025-03-23T22:55:42.101Z" }, + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" }, ] [[package]] name = "filelock" version = "3.13.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/70/41905c80dcfe71b22fb06827b8eae65781783d4a14194bce79d16a013263/filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", size = 14553, upload_time = "2023-10-30T18:29:39.035Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/70/41905c80dcfe71b22fb06827b8eae65781783d4a14194bce79d16a013263/filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", size = 14553, upload-time = "2023-10-30T18:29:39.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/54/84d42a0bee35edba99dee7b59a8d4970eccdd44b99fe728ed912106fc781/filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c", size = 11740, upload_time = "2023-10-30T18:29:37.267Z" }, + { url = "https://files.pythonhosted.org/packages/81/54/84d42a0bee35edba99dee7b59a8d4970eccdd44b99fe728ed912106fc781/filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c", size = 11740, upload-time = "2023-10-30T18:29:37.267Z" }, ] [[package]] @@ -549,9 +549,9 @@ dependencies = [ { name = "jinja2" }, { name = "werkzeug" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/09/c1a7354d3925a3c6c8cfdebf4245bae67d633ffda1ba415add06ffc839c5/flask-3.0.0.tar.gz", hash = "sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58", size = 674171, upload_time = "2023-09-30T14:36:12.918Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/09/c1a7354d3925a3c6c8cfdebf4245bae67d633ffda1ba415add06ffc839c5/flask-3.0.0.tar.gz", hash = "sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58", size = 674171, upload-time = "2023-09-30T14:36:12.918Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl", hash = "sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638", size = 99724, upload_time = "2023-09-30T14:36:10.961Z" }, + { url = "https://files.pythonhosted.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl", hash = "sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638", size = 99724, upload-time = "2023-09-30T14:36:10.961Z" }, ] [[package]] @@ -561,9 +561,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flask" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/6a/a8d56d60bcfa1ec3e4fdad81b45aafd508c3bd5c244a16526fa29139d7d4/flask_cors-4.0.1.tar.gz", hash = "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4", size = 30306, upload_time = "2024-05-04T19:49:43.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/6a/a8d56d60bcfa1ec3e4fdad81b45aafd508c3bd5c244a16526fa29139d7d4/flask_cors-4.0.1.tar.gz", hash = "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4", size = 30306, upload-time = "2024-05-04T19:49:43.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/52/2aa6285f104616f73ee1ad7905a16b2b35af0143034ad0cf7b64bcba715c/Flask_Cors-4.0.1-py2.py3-none-any.whl", hash = "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677", size = 14290, upload_time = "2024-05-04T19:49:41.721Z" }, + { url = "https://files.pythonhosted.org/packages/8b/52/2aa6285f104616f73ee1ad7905a16b2b35af0143034ad0cf7b64bcba715c/Flask_Cors-4.0.1-py2.py3-none-any.whl", hash = "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677", size = 14290, upload-time = "2024-05-04T19:49:41.721Z" }, ] [[package]] @@ -574,60 +574,60 @@ dependencies = [ { name = "flask" }, { name = "werkzeug" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/6e/2f4e13e373bb49e68c02c51ceadd22d172715a06716f9299d9df01b6ddb2/Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333", size = 48834, upload_time = "2023-10-30T14:53:21.151Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/6e/2f4e13e373bb49e68c02c51ceadd22d172715a06716f9299d9df01b6ddb2/Flask-Login-0.6.3.tar.gz", hash = "sha256:5e23d14a607ef12806c699590b89d0f0e0d67baeec599d75947bf9c147330333", size = 48834, upload-time = "2023-10-30T14:53:21.151Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/f5/67e9cc5c2036f58115f9fe0f00d203cf6780c3ff8ae0e705e7a9d9e8ff9e/Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d", size = 17303, upload_time = "2023-10-30T14:53:19.636Z" }, + { url = "https://files.pythonhosted.org/packages/59/f5/67e9cc5c2036f58115f9fe0f00d203cf6780c3ff8ae0e705e7a9d9e8ff9e/Flask_Login-0.6.3-py3-none-any.whl", hash = "sha256:849b25b82a436bf830a054e74214074af59097171562ab10bfa999e6b78aae5d", size = 17303, upload-time = "2023-10-30T14:53:19.636Z" }, ] [[package]] name = "flatbuffers" version = "23.5.26" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/6e/3e52cd294d8e7a61e010973cce076a0cb2c6c0dfd4d0b7a13648c1b98329/flatbuffers-23.5.26.tar.gz", hash = "sha256:9ea1144cac05ce5d86e2859f431c6cd5e66cd9c78c558317c7955fb8d4c78d89", size = 22114, upload_time = "2023-05-26T17:35:16.034Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/6e/3e52cd294d8e7a61e010973cce076a0cb2c6c0dfd4d0b7a13648c1b98329/flatbuffers-23.5.26.tar.gz", hash = "sha256:9ea1144cac05ce5d86e2859f431c6cd5e66cd9c78c558317c7955fb8d4c78d89", size = 22114, upload-time = "2023-05-26T17:35:16.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl", hash = "sha256:c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1", size = 26744, upload_time = "2023-05-26T17:35:14.269Z" }, + { url = "https://files.pythonhosted.org/packages/6f/12/d5c79ee252793ffe845d58a913197bfa02ae9a0b5c9bc3dc4b58d477b9e7/flatbuffers-23.5.26-py2.py3-none-any.whl", hash = "sha256:c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1", size = 26744, upload-time = "2023-05-26T17:35:14.269Z" }, ] [[package]] name = "fonttools" version = "4.47.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e5/cd/75d24afa673edf92fd04657fad7d3b5e20c4abc3cad5bc14e5e30051c1f0/fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3", size = 3410067, upload_time = "2024-01-11T11:22:45.293Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/cd/75d24afa673edf92fd04657fad7d3b5e20c4abc3cad5bc14e5e30051c1f0/fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3", size = 3410067, upload-time = "2024-01-11T11:22:45.293Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/30/02de0b7f3d72f2c4fce3e512b166c1bdbe5a687408474b61eb0114be921c/fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df", size = 2779949, upload_time = "2024-01-11T11:19:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/9a/52/1a5e1373afb78a040ea0c371ab8a79da121060a8e518968bb8f41457ca90/fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1", size = 2281336, upload_time = "2024-01-11T11:20:08.835Z" }, - { url = "https://files.pythonhosted.org/packages/c5/ce/9d3b5bf51aafee024566ebb374f5b040381d92660cb04647af3c5860c611/fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c", size = 4541692, upload_time = "2024-01-11T11:20:13.378Z" }, - { url = "https://files.pythonhosted.org/packages/e8/68/af41b7cfd35c7418e17b6a43bb106be4b0f0e5feb405a88dee29b186f2a7/fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8", size = 4600529, upload_time = "2024-01-11T11:20:17.27Z" }, - { url = "https://files.pythonhosted.org/packages/ab/7e/428dbb4cfc342b7a05cbc9d349e134e7fad6588f4ce2a7128e8e3e58ad3b/fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670", size = 4524215, upload_time = "2024-01-11T11:20:21.061Z" }, - { url = "https://files.pythonhosted.org/packages/a6/61/762fad1cc1debc4626f2eb373fa999591c63c231fce53d5073574a639531/fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c", size = 4584778, upload_time = "2024-01-11T11:20:25.815Z" }, - { url = "https://files.pythonhosted.org/packages/04/30/170ca22284c1d825470e8b5871d6b25d3a70e2f5b185ffb1647d5e11ee4d/fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0", size = 2131876, upload_time = "2024-01-11T11:20:30.261Z" }, - { url = "https://files.pythonhosted.org/packages/df/07/4a30437bed355b838b8ce31d14c5983334c31adc97e70c6ecff90c60d6d2/fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1", size = 2177937, upload_time = "2024-01-11T11:20:33.814Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1d/670372323642eada0f7743cfcdd156de6a28d37769c916421fec2f32c814/fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b", size = 2782908, upload_time = "2024-01-11T11:20:37.495Z" }, - { url = "https://files.pythonhosted.org/packages/c1/36/5f0bb863a6575db4c4b67fa9be7f98e4c551dd87638ef327bc180b988998/fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac", size = 2283501, upload_time = "2024-01-11T11:20:42.027Z" }, - { url = "https://files.pythonhosted.org/packages/bd/1e/95de682a86567426bcc40a56c9b118ffa97de6cbfcc293addf20994e329d/fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c", size = 4848039, upload_time = "2024-01-11T11:20:47.038Z" }, - { url = "https://files.pythonhosted.org/packages/ef/95/92a0b5fc844c1db734752f8a51431de519cd6b02e7e561efa9e9fd415544/fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70", size = 4893166, upload_time = "2024-01-11T11:20:50.855Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e6/ed9dd7ee1afd6cd70eb7237688118fe489dbde962e3765c91c86c095f84b/fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e", size = 4815529, upload_time = "2024-01-11T11:20:54.696Z" }, - { url = "https://files.pythonhosted.org/packages/6b/67/cdffa0b3cd8f863b45125c335bbd3d9dc16ec42f5a8d5b64dd1244c5ce6b/fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703", size = 4875414, upload_time = "2024-01-11T11:20:58.435Z" }, - { url = "https://files.pythonhosted.org/packages/b8/fb/41638e748c8f20f5483987afcf9be746d3ccb9e9600ca62128a27c791a82/fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c", size = 2130073, upload_time = "2024-01-11T11:21:02.056Z" }, - { url = "https://files.pythonhosted.org/packages/a0/ef/93321cf55180a778b4d97919b28739874c0afab90e7b9f5b232db70f47c2/fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9", size = 2178744, upload_time = "2024-01-11T11:21:05.88Z" }, - { url = "https://files.pythonhosted.org/packages/c0/bd/4dd1e8a9e632f325d9203ce543402f912f26efd213c8d9efec0180fbac64/fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635", size = 2754076, upload_time = "2024-01-11T11:21:09.745Z" }, - { url = "https://files.pythonhosted.org/packages/e6/4d/c2ebaac81dadbc3fc3c3c2fa5fe7b16429dc713b1b8ace49e11e92904d78/fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d", size = 2263784, upload_time = "2024-01-11T11:21:13.367Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f6/9d484cd275845c7e503a8669a5952a7fa089c7a881babb4dce5ebe6fc5d1/fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb", size = 4769142, upload_time = "2024-01-11T11:21:17.615Z" }, - { url = "https://files.pythonhosted.org/packages/7a/bf/c6ae0768a531b38245aac0bb8d30bc05d53d499e09fccdc5d72e7c8d28b6/fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07", size = 4853241, upload_time = "2024-01-11T11:21:21.16Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f0/c06709666cb7722447efb70ea456c302bd6eb3b997d30076401fb32bca4b/fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71", size = 4730447, upload_time = "2024-01-11T11:21:24.755Z" }, - { url = "https://files.pythonhosted.org/packages/3e/71/4c758ae5f4f8047904fc1c6bbbb828248c94cc7aa6406af3a62ede766f25/fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f", size = 4809265, upload_time = "2024-01-11T11:21:28.586Z" }, - { url = "https://files.pythonhosted.org/packages/81/f6/a6912c11280607d48947341e2167502605a3917925c835afcd7dfcabc289/fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085", size = 2118363, upload_time = "2024-01-11T11:21:33.245Z" }, - { url = "https://files.pythonhosted.org/packages/81/4b/42d0488765ea5aa308b4e8197cb75366b2124240a73e86f98b6107ccf282/fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4", size = 2165866, upload_time = "2024-01-11T11:21:37.23Z" }, - { url = "https://files.pythonhosted.org/packages/af/2f/c34b0f99d46766cf49566d1ee2ee3606e4c9880b5a7d734257dc61c804e9/fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184", size = 1063011, upload_time = "2024-01-11T11:22:41.676Z" }, + { url = "https://files.pythonhosted.org/packages/19/30/02de0b7f3d72f2c4fce3e512b166c1bdbe5a687408474b61eb0114be921c/fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df", size = 2779949, upload-time = "2024-01-11T11:19:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/9a/52/1a5e1373afb78a040ea0c371ab8a79da121060a8e518968bb8f41457ca90/fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1", size = 2281336, upload-time = "2024-01-11T11:20:08.835Z" }, + { url = "https://files.pythonhosted.org/packages/c5/ce/9d3b5bf51aafee024566ebb374f5b040381d92660cb04647af3c5860c611/fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c", size = 4541692, upload-time = "2024-01-11T11:20:13.378Z" }, + { url = "https://files.pythonhosted.org/packages/e8/68/af41b7cfd35c7418e17b6a43bb106be4b0f0e5feb405a88dee29b186f2a7/fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8", size = 4600529, upload-time = "2024-01-11T11:20:17.27Z" }, + { url = "https://files.pythonhosted.org/packages/ab/7e/428dbb4cfc342b7a05cbc9d349e134e7fad6588f4ce2a7128e8e3e58ad3b/fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670", size = 4524215, upload-time = "2024-01-11T11:20:21.061Z" }, + { url = "https://files.pythonhosted.org/packages/a6/61/762fad1cc1debc4626f2eb373fa999591c63c231fce53d5073574a639531/fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c", size = 4584778, upload-time = "2024-01-11T11:20:25.815Z" }, + { url = "https://files.pythonhosted.org/packages/04/30/170ca22284c1d825470e8b5871d6b25d3a70e2f5b185ffb1647d5e11ee4d/fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0", size = 2131876, upload-time = "2024-01-11T11:20:30.261Z" }, + { url = "https://files.pythonhosted.org/packages/df/07/4a30437bed355b838b8ce31d14c5983334c31adc97e70c6ecff90c60d6d2/fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1", size = 2177937, upload-time = "2024-01-11T11:20:33.814Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1d/670372323642eada0f7743cfcdd156de6a28d37769c916421fec2f32c814/fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b", size = 2782908, upload-time = "2024-01-11T11:20:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/c1/36/5f0bb863a6575db4c4b67fa9be7f98e4c551dd87638ef327bc180b988998/fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac", size = 2283501, upload-time = "2024-01-11T11:20:42.027Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1e/95de682a86567426bcc40a56c9b118ffa97de6cbfcc293addf20994e329d/fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c", size = 4848039, upload-time = "2024-01-11T11:20:47.038Z" }, + { url = "https://files.pythonhosted.org/packages/ef/95/92a0b5fc844c1db734752f8a51431de519cd6b02e7e561efa9e9fd415544/fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70", size = 4893166, upload-time = "2024-01-11T11:20:50.855Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/ed9dd7ee1afd6cd70eb7237688118fe489dbde962e3765c91c86c095f84b/fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e", size = 4815529, upload-time = "2024-01-11T11:20:54.696Z" }, + { url = "https://files.pythonhosted.org/packages/6b/67/cdffa0b3cd8f863b45125c335bbd3d9dc16ec42f5a8d5b64dd1244c5ce6b/fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703", size = 4875414, upload-time = "2024-01-11T11:20:58.435Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fb/41638e748c8f20f5483987afcf9be746d3ccb9e9600ca62128a27c791a82/fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c", size = 2130073, upload-time = "2024-01-11T11:21:02.056Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ef/93321cf55180a778b4d97919b28739874c0afab90e7b9f5b232db70f47c2/fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9", size = 2178744, upload-time = "2024-01-11T11:21:05.88Z" }, + { url = "https://files.pythonhosted.org/packages/c0/bd/4dd1e8a9e632f325d9203ce543402f912f26efd213c8d9efec0180fbac64/fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635", size = 2754076, upload-time = "2024-01-11T11:21:09.745Z" }, + { url = "https://files.pythonhosted.org/packages/e6/4d/c2ebaac81dadbc3fc3c3c2fa5fe7b16429dc713b1b8ace49e11e92904d78/fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d", size = 2263784, upload-time = "2024-01-11T11:21:13.367Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f6/9d484cd275845c7e503a8669a5952a7fa089c7a881babb4dce5ebe6fc5d1/fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb", size = 4769142, upload-time = "2024-01-11T11:21:17.615Z" }, + { url = "https://files.pythonhosted.org/packages/7a/bf/c6ae0768a531b38245aac0bb8d30bc05d53d499e09fccdc5d72e7c8d28b6/fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07", size = 4853241, upload-time = "2024-01-11T11:21:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f0/c06709666cb7722447efb70ea456c302bd6eb3b997d30076401fb32bca4b/fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71", size = 4730447, upload-time = "2024-01-11T11:21:24.755Z" }, + { url = "https://files.pythonhosted.org/packages/3e/71/4c758ae5f4f8047904fc1c6bbbb828248c94cc7aa6406af3a62ede766f25/fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f", size = 4809265, upload-time = "2024-01-11T11:21:28.586Z" }, + { url = "https://files.pythonhosted.org/packages/81/f6/a6912c11280607d48947341e2167502605a3917925c835afcd7dfcabc289/fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085", size = 2118363, upload-time = "2024-01-11T11:21:33.245Z" }, + { url = "https://files.pythonhosted.org/packages/81/4b/42d0488765ea5aa308b4e8197cb75366b2124240a73e86f98b6107ccf282/fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4", size = 2165866, upload-time = "2024-01-11T11:21:37.23Z" }, + { url = "https://files.pythonhosted.org/packages/af/2f/c34b0f99d46766cf49566d1ee2ee3606e4c9880b5a7d734257dc61c804e9/fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184", size = 1063011, upload-time = "2024-01-11T11:22:41.676Z" }, ] [[package]] name = "fsspec" version = "2023.12.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/08/cac914ff6ff46c4500fc4323a939dbe7a0f528cca04e7fd3e859611dea41/fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb", size = 167507, upload_time = "2023-12-11T21:19:54.832Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/08/cac914ff6ff46c4500fc4323a939dbe7a0f528cca04e7fd3e859611dea41/fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb", size = 167507, upload-time = "2023-12-11T21:19:54.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/25/fab23259a52ece5670dcb8452e1af34b89e6135ecc17cd4b54b4b479eac6/fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960", size = 168979, upload_time = "2023-12-11T21:19:52.446Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/fab23259a52ece5670dcb8452e1af34b89e6135ecc17cd4b54b4b479eac6/fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960", size = 168979, upload-time = "2023-12-11T21:19:52.446Z" }, ] [[package]] @@ -637,9 +637,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/d3/8650919bc3c7c6e90ee3fa7fd618bf373cbbe55dff043bd67353dbb20cd8/ftfy-6.3.1.tar.gz", hash = "sha256:9b3c3d90f84fb267fe64d375a07b7f8912d817cf86009ae134aa03e1819506ec", size = 308927, upload_time = "2024-10-26T00:50:35.149Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/d3/8650919bc3c7c6e90ee3fa7fd618bf373cbbe55dff043bd67353dbb20cd8/ftfy-6.3.1.tar.gz", hash = "sha256:9b3c3d90f84fb267fe64d375a07b7f8912d817cf86009ae134aa03e1819506ec", size = 308927, upload-time = "2024-10-26T00:50:35.149Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083", size = 44821, upload_time = "2024-10-26T00:50:33.425Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083", size = 44821, upload-time = "2024-10-26T00:50:33.425Z" }, ] [[package]] @@ -652,41 +652,41 @@ dependencies = [ { name = "zope-event" }, { name = "zope-interface" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/f0/be10ed5d7721ed2317d7feb59e167603217156c2a6d57f128523e24e673d/gevent-24.10.3.tar.gz", hash = "sha256:aa7ee1bd5cabb2b7ef35105f863b386c8d5e332f754b60cfc354148bd70d35d1", size = 6108837, upload_time = "2024-10-18T16:06:25.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/f0/be10ed5d7721ed2317d7feb59e167603217156c2a6d57f128523e24e673d/gevent-24.10.3.tar.gz", hash = "sha256:aa7ee1bd5cabb2b7ef35105f863b386c8d5e332f754b60cfc354148bd70d35d1", size = 6108837, upload-time = "2024-10-18T16:06:25.867Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/6f/a2100e7883c7bdfc2b45cb60b310ca748762a21596258b9dd01c5c093dbc/gevent-24.10.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d7a1ad0f2da582f5bd238bca067e1c6c482c30c15a6e4d14aaa3215cbb2232f3", size = 3014382, upload_time = "2024-10-18T15:37:34.041Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b1/460e4884ed6185d9eb9c4c2e9639d2b254197e46513301c0f63dec22dc90/gevent-24.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4e526fdc279c655c1e809b0c34b45844182c2a6b219802da5e411bd2cf5a8ad", size = 4853460, upload_time = "2024-10-18T16:19:39.515Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f6/7ded98760d381229183ecce8db2edcce96f13e23807d31a90c66dae85304/gevent-24.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57a5c4e0bdac482c5f02f240d0354e61362df73501ef6ebafce8ef635cad7527", size = 4977636, upload_time = "2024-10-18T16:18:45.464Z" }, - { url = "https://files.pythonhosted.org/packages/7d/21/7b928e6029eedb93ef94fc0aee701f497af2e601f0ec00aac0e72e3f450e/gevent-24.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d67daed8383326dc8b5e58d88e148d29b6b52274a489e383530b0969ae7b9cb9", size = 5058031, upload_time = "2024-10-18T16:23:10.719Z" }, - { url = "https://files.pythonhosted.org/packages/00/98/12c03fd004fbeeca01276ffc589f5a368fd741d02582ab7006d1bdef57e7/gevent-24.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e24ffea72e27987979c009536fd0868e52239b44afe6cf7135ce8aafd0f108e", size = 6683694, upload_time = "2024-10-18T15:59:35.475Z" }, - { url = "https://files.pythonhosted.org/packages/64/4c/ea14d971452d3da09e49267e052d8312f112c7835120aed78d22ef14efee/gevent-24.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c1d80090485da1ea3d99205fe97908b31188c1f4857f08b333ffaf2de2e89d18", size = 5286063, upload_time = "2024-10-18T16:38:24.113Z" }, - { url = "https://files.pythonhosted.org/packages/39/3f/397efff27e637d7306caa00d1560512c44028c25c70be1e72c46b79b1b66/gevent-24.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0c129f81d60cda614acb4b0c5731997ca05b031fb406fcb58ad53a7ade53b13", size = 6817462, upload_time = "2024-10-18T16:02:48.427Z" }, - { url = "https://files.pythonhosted.org/packages/aa/5d/19939eaa7c5b7c0f37e0a0665a911ddfe1e35c25c512446fc356a065c16e/gevent-24.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:26ca7a6b42d35129617025ac801135118333cad75856ffc3217b38e707383eba", size = 1566631, upload_time = "2024-10-18T16:08:38.489Z" }, - { url = "https://files.pythonhosted.org/packages/6e/01/1be5cf013826d8baae235976d6a94f3628014fd2db7c071aeec13f82b4d1/gevent-24.10.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:68c3a0d8402755eba7f69022e42e8021192a721ca8341908acc222ea597029b6", size = 2966909, upload_time = "2024-10-18T15:37:31.43Z" }, - { url = "https://files.pythonhosted.org/packages/fe/3e/7fa9ab023f24d8689e2c77951981f8ea1f25089e0349a0bf8b35ee9b9277/gevent-24.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d850a453d66336272be4f1d3a8126777f3efdaea62d053b4829857f91e09755", size = 4913247, upload_time = "2024-10-18T16:19:41.792Z" }, - { url = "https://files.pythonhosted.org/packages/db/63/6e40eaaa3c2abd1561faff11dc3e6781f8c25e975354b8835762834415af/gevent-24.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e58ee3723f1fbe07d66892f1caa7481c306f653a6829b6fd16cb23d618a5915", size = 5049036, upload_time = "2024-10-18T16:18:47.419Z" }, - { url = "https://files.pythonhosted.org/packages/94/89/158bc32cdc898dda0481040ac18650022e73133d93460c5af56ca622fe9a/gevent-24.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b52382124eca13135a3abe4f65c6bd428656975980a48e51b17aeab68bdb14db", size = 5107299, upload_time = "2024-10-18T16:23:12.296Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/1abe62ee350fdfac186d33f615d0d3a0b3b140e7ccf23c73547aa0deec44/gevent-24.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ca2266e08f43c0e22c028801dff7d92a0b102ef20e4caeb6a46abfb95f6a328", size = 6819625, upload_time = "2024-10-18T15:59:38.226Z" }, - { url = "https://files.pythonhosted.org/packages/92/8b/0b2fe0d36b7c4d463e46cc68eaf6c14488bd7d86cc37e995c64a0ff7d02f/gevent-24.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d758f0d4dbf32502ec87bb9b536ca8055090a16f8305f0ada3ce6f34e70f2fd7", size = 5474079, upload_time = "2024-10-18T16:38:26.866Z" }, - { url = "https://files.pythonhosted.org/packages/12/7b/9f5abbf0021a50321314f850697e0f46d2e5081168223af2d8544af9d19f/gevent-24.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0de6eb3d55c03138fda567d9bfed28487ce5d0928c5107549767a93efdf2be26", size = 6901323, upload_time = "2024-10-18T16:02:50.066Z" }, - { url = "https://files.pythonhosted.org/packages/8a/63/607715c621ae78ed581b7ba36d076df63feeb352993d521327f865056771/gevent-24.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:385710355eadecdb70428a5ae3e7e5a45dcf888baa1426884588be9d25ac4290", size = 1549468, upload_time = "2024-10-18T16:01:30.331Z" }, - { url = "https://files.pythonhosted.org/packages/d9/e4/4edbe17001bb3e6fade4ad2d85ca8f9e4eabcbde4aa29aa6889281616e3e/gevent-24.10.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ad8fb70aa0ebc935729c9699ac31b210a49b689a7b27b7ac9f91676475f3f53", size = 2970952, upload_time = "2024-10-18T15:37:31.389Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a6/ce0824fe9398ba6b00028a74840f12be1165d5feaacdc028ea953db3d6c3/gevent-24.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f18689f7a70d2ed0e75bad5036ec3c89690a493d4cfac8d7cdb258ac04b132bd", size = 5172230, upload_time = "2024-10-18T16:19:43.661Z" }, - { url = "https://files.pythonhosted.org/packages/25/d4/9002cfb585bfa52c860ed4b1349d1a6400bdf2df9f1bd21df5ff33eea33c/gevent-24.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f4f171d4d2018170454d84c934842e1b5f6ce7468ba298f6e7f7cff15000a3", size = 5338394, upload_time = "2024-10-18T16:18:49.371Z" }, - { url = "https://files.pythonhosted.org/packages/0c/98/222f1a14f22ad2d1cbcc37edb74095264c1f9c7ab49e6423693383462b8a/gevent-24.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7021e26d70189b33c27173d4173f27bf4685d6b6f1c0ea50e5335f8491cb110c", size = 5437989, upload_time = "2024-10-18T16:23:13.851Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e8/cbb46afea3c7ecdc7289e15cb4a6f89903f4f9754a27ca320d3e465abc78/gevent-24.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34aea15f9c79f27a8faeaa361bc1e72c773a9b54a1996a2ec4eefc8bcd59a824", size = 6838539, upload_time = "2024-10-18T15:59:40.489Z" }, - { url = "https://files.pythonhosted.org/packages/69/c3/e43e348f23da404a6d4368a14453ed097cdfca97d5212eaceb987d04a0e1/gevent-24.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8af65a4d4feaec6042c666d22c322a310fba3b47e841ad52f724b9c3ce5da48e", size = 5513842, upload_time = "2024-10-18T16:38:29.538Z" }, - { url = "https://files.pythonhosted.org/packages/c2/76/84b7c19c072a80900118717a85236859127d630cdf8b079fe42f19649f12/gevent-24.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:89c4115e3f5ada55f92b61701a46043fe42f702b5af863b029e4c1a76f6cc2d4", size = 6927374, upload_time = "2024-10-18T16:02:51.669Z" }, - { url = "https://files.pythonhosted.org/packages/5e/69/0ab1b04c363547058fb5035275c144957b80b36cb6aee715fe6181b0cee9/gevent-24.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:1ce6dab94c0b0d24425ba55712de2f8c9cb21267150ca63f5bb3a0e1f165da99", size = 1546701, upload_time = "2024-10-18T15:54:53.562Z" }, - { url = "https://files.pythonhosted.org/packages/f7/2d/c783583d7999cd2f2e7aa2d6a1c333d663003ca61255a89ff6a891be95f4/gevent-24.10.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:f147e38423fbe96e8731f60a63475b3d2cab2f3d10578d8ee9d10c507c58a2ff", size = 2962857, upload_time = "2024-10-18T15:37:33.098Z" }, - { url = "https://files.pythonhosted.org/packages/f3/77/d3ce96fd49406f61976e9a3b6c742b97bb274d3b30c68ff190c5b5f81afd/gevent-24.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e6984ec96fc95fd67488555c38ece3015be1f38b1bcceb27b7d6c36b343008", size = 5141676, upload_time = "2024-10-18T16:19:45.484Z" }, - { url = "https://files.pythonhosted.org/packages/49/f4/f99f893770c316b9d2f03bd684947126cbed0321b89fe5423838974c2025/gevent-24.10.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:051b22e2758accfddb0457728bfc9abf8c3f2ce6bca43f1ff6e07b5ed9e49bf4", size = 5310248, upload_time = "2024-10-18T16:18:51.175Z" }, - { url = "https://files.pythonhosted.org/packages/e3/0c/67257ba906f76ed82e8f0bd8c00c2a0687b360a1050b70db7e58dff749ab/gevent-24.10.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb5edb6433764119a664bbb148d2aea9990950aa89cc3498f475c2408d523ea3", size = 5407304, upload_time = "2024-10-18T16:23:15.348Z" }, - { url = "https://files.pythonhosted.org/packages/35/6c/3a72da7c224b0111728130c0f1abc3ee07feff91b37e0ea83db98f4a3eaf/gevent-24.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce417bcaaab496bc9c77f75566531e9d93816262037b8b2dbb88b0fdcd66587c", size = 6818624, upload_time = "2024-10-18T15:59:42.068Z" }, - { url = "https://files.pythonhosted.org/packages/a3/96/cc5f6ecba032a45fc312fe0db2908a893057fd81361eea93845d6c325556/gevent-24.10.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:1c3a828b033fb02b7c31da4d75014a1f82e6c072fc0523456569a57f8b025861", size = 5484356, upload_time = "2024-10-18T16:38:31.709Z" }, - { url = "https://files.pythonhosted.org/packages/7c/97/e680b2b2f0c291ae4db9813ffbf02c22c2a0f14c8f1a613971385e29ef67/gevent-24.10.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f2ae3efbbd120cdf4a68b7abc27a37e61e6f443c5a06ec2c6ad94c37cd8471ec", size = 6903191, upload_time = "2024-10-18T16:02:53.888Z" }, - { url = "https://files.pythonhosted.org/packages/1b/1c/b4181957da062d1c060974ec6cb798cc24aeeb28e8cd2ece84eb4b4991f7/gevent-24.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:9e1210334a9bc9f76c3d008e0785ca62214f8a54e1325f6c2ecab3b6a572a015", size = 1545117, upload_time = "2024-10-18T15:45:47.375Z" }, - { url = "https://files.pythonhosted.org/packages/89/2b/bf4af9950b8f9abd5b4025858f6311930de550e3498bbfeb47c914701a1d/gevent-24.10.3-pp310-pypy310_pp73-macosx_11_0_universal2.whl", hash = "sha256:e534e6a968d74463b11de6c9c67f4b4bf61775fb00f2e6e0f7fcdd412ceade18", size = 1271541, upload_time = "2024-10-18T15:37:53.146Z" }, + { url = "https://files.pythonhosted.org/packages/6b/6f/a2100e7883c7bdfc2b45cb60b310ca748762a21596258b9dd01c5c093dbc/gevent-24.10.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d7a1ad0f2da582f5bd238bca067e1c6c482c30c15a6e4d14aaa3215cbb2232f3", size = 3014382, upload-time = "2024-10-18T15:37:34.041Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b1/460e4884ed6185d9eb9c4c2e9639d2b254197e46513301c0f63dec22dc90/gevent-24.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4e526fdc279c655c1e809b0c34b45844182c2a6b219802da5e411bd2cf5a8ad", size = 4853460, upload-time = "2024-10-18T16:19:39.515Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f6/7ded98760d381229183ecce8db2edcce96f13e23807d31a90c66dae85304/gevent-24.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57a5c4e0bdac482c5f02f240d0354e61362df73501ef6ebafce8ef635cad7527", size = 4977636, upload-time = "2024-10-18T16:18:45.464Z" }, + { url = "https://files.pythonhosted.org/packages/7d/21/7b928e6029eedb93ef94fc0aee701f497af2e601f0ec00aac0e72e3f450e/gevent-24.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d67daed8383326dc8b5e58d88e148d29b6b52274a489e383530b0969ae7b9cb9", size = 5058031, upload-time = "2024-10-18T16:23:10.719Z" }, + { url = "https://files.pythonhosted.org/packages/00/98/12c03fd004fbeeca01276ffc589f5a368fd741d02582ab7006d1bdef57e7/gevent-24.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e24ffea72e27987979c009536fd0868e52239b44afe6cf7135ce8aafd0f108e", size = 6683694, upload-time = "2024-10-18T15:59:35.475Z" }, + { url = "https://files.pythonhosted.org/packages/64/4c/ea14d971452d3da09e49267e052d8312f112c7835120aed78d22ef14efee/gevent-24.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c1d80090485da1ea3d99205fe97908b31188c1f4857f08b333ffaf2de2e89d18", size = 5286063, upload-time = "2024-10-18T16:38:24.113Z" }, + { url = "https://files.pythonhosted.org/packages/39/3f/397efff27e637d7306caa00d1560512c44028c25c70be1e72c46b79b1b66/gevent-24.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0c129f81d60cda614acb4b0c5731997ca05b031fb406fcb58ad53a7ade53b13", size = 6817462, upload-time = "2024-10-18T16:02:48.427Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/19939eaa7c5b7c0f37e0a0665a911ddfe1e35c25c512446fc356a065c16e/gevent-24.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:26ca7a6b42d35129617025ac801135118333cad75856ffc3217b38e707383eba", size = 1566631, upload-time = "2024-10-18T16:08:38.489Z" }, + { url = "https://files.pythonhosted.org/packages/6e/01/1be5cf013826d8baae235976d6a94f3628014fd2db7c071aeec13f82b4d1/gevent-24.10.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:68c3a0d8402755eba7f69022e42e8021192a721ca8341908acc222ea597029b6", size = 2966909, upload-time = "2024-10-18T15:37:31.43Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3e/7fa9ab023f24d8689e2c77951981f8ea1f25089e0349a0bf8b35ee9b9277/gevent-24.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d850a453d66336272be4f1d3a8126777f3efdaea62d053b4829857f91e09755", size = 4913247, upload-time = "2024-10-18T16:19:41.792Z" }, + { url = "https://files.pythonhosted.org/packages/db/63/6e40eaaa3c2abd1561faff11dc3e6781f8c25e975354b8835762834415af/gevent-24.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e58ee3723f1fbe07d66892f1caa7481c306f653a6829b6fd16cb23d618a5915", size = 5049036, upload-time = "2024-10-18T16:18:47.419Z" }, + { url = "https://files.pythonhosted.org/packages/94/89/158bc32cdc898dda0481040ac18650022e73133d93460c5af56ca622fe9a/gevent-24.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b52382124eca13135a3abe4f65c6bd428656975980a48e51b17aeab68bdb14db", size = 5107299, upload-time = "2024-10-18T16:23:12.296Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/1abe62ee350fdfac186d33f615d0d3a0b3b140e7ccf23c73547aa0deec44/gevent-24.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ca2266e08f43c0e22c028801dff7d92a0b102ef20e4caeb6a46abfb95f6a328", size = 6819625, upload-time = "2024-10-18T15:59:38.226Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/0b2fe0d36b7c4d463e46cc68eaf6c14488bd7d86cc37e995c64a0ff7d02f/gevent-24.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d758f0d4dbf32502ec87bb9b536ca8055090a16f8305f0ada3ce6f34e70f2fd7", size = 5474079, upload-time = "2024-10-18T16:38:26.866Z" }, + { url = "https://files.pythonhosted.org/packages/12/7b/9f5abbf0021a50321314f850697e0f46d2e5081168223af2d8544af9d19f/gevent-24.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0de6eb3d55c03138fda567d9bfed28487ce5d0928c5107549767a93efdf2be26", size = 6901323, upload-time = "2024-10-18T16:02:50.066Z" }, + { url = "https://files.pythonhosted.org/packages/8a/63/607715c621ae78ed581b7ba36d076df63feeb352993d521327f865056771/gevent-24.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:385710355eadecdb70428a5ae3e7e5a45dcf888baa1426884588be9d25ac4290", size = 1549468, upload-time = "2024-10-18T16:01:30.331Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e4/4edbe17001bb3e6fade4ad2d85ca8f9e4eabcbde4aa29aa6889281616e3e/gevent-24.10.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ad8fb70aa0ebc935729c9699ac31b210a49b689a7b27b7ac9f91676475f3f53", size = 2970952, upload-time = "2024-10-18T15:37:31.389Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a6/ce0824fe9398ba6b00028a74840f12be1165d5feaacdc028ea953db3d6c3/gevent-24.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f18689f7a70d2ed0e75bad5036ec3c89690a493d4cfac8d7cdb258ac04b132bd", size = 5172230, upload-time = "2024-10-18T16:19:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/25/d4/9002cfb585bfa52c860ed4b1349d1a6400bdf2df9f1bd21df5ff33eea33c/gevent-24.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f4f171d4d2018170454d84c934842e1b5f6ce7468ba298f6e7f7cff15000a3", size = 5338394, upload-time = "2024-10-18T16:18:49.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/98/222f1a14f22ad2d1cbcc37edb74095264c1f9c7ab49e6423693383462b8a/gevent-24.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7021e26d70189b33c27173d4173f27bf4685d6b6f1c0ea50e5335f8491cb110c", size = 5437989, upload-time = "2024-10-18T16:23:13.851Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e8/cbb46afea3c7ecdc7289e15cb4a6f89903f4f9754a27ca320d3e465abc78/gevent-24.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34aea15f9c79f27a8faeaa361bc1e72c773a9b54a1996a2ec4eefc8bcd59a824", size = 6838539, upload-time = "2024-10-18T15:59:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/69/c3/e43e348f23da404a6d4368a14453ed097cdfca97d5212eaceb987d04a0e1/gevent-24.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8af65a4d4feaec6042c666d22c322a310fba3b47e841ad52f724b9c3ce5da48e", size = 5513842, upload-time = "2024-10-18T16:38:29.538Z" }, + { url = "https://files.pythonhosted.org/packages/c2/76/84b7c19c072a80900118717a85236859127d630cdf8b079fe42f19649f12/gevent-24.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:89c4115e3f5ada55f92b61701a46043fe42f702b5af863b029e4c1a76f6cc2d4", size = 6927374, upload-time = "2024-10-18T16:02:51.669Z" }, + { url = "https://files.pythonhosted.org/packages/5e/69/0ab1b04c363547058fb5035275c144957b80b36cb6aee715fe6181b0cee9/gevent-24.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:1ce6dab94c0b0d24425ba55712de2f8c9cb21267150ca63f5bb3a0e1f165da99", size = 1546701, upload-time = "2024-10-18T15:54:53.562Z" }, + { url = "https://files.pythonhosted.org/packages/f7/2d/c783583d7999cd2f2e7aa2d6a1c333d663003ca61255a89ff6a891be95f4/gevent-24.10.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:f147e38423fbe96e8731f60a63475b3d2cab2f3d10578d8ee9d10c507c58a2ff", size = 2962857, upload-time = "2024-10-18T15:37:33.098Z" }, + { url = "https://files.pythonhosted.org/packages/f3/77/d3ce96fd49406f61976e9a3b6c742b97bb274d3b30c68ff190c5b5f81afd/gevent-24.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e6984ec96fc95fd67488555c38ece3015be1f38b1bcceb27b7d6c36b343008", size = 5141676, upload-time = "2024-10-18T16:19:45.484Z" }, + { url = "https://files.pythonhosted.org/packages/49/f4/f99f893770c316b9d2f03bd684947126cbed0321b89fe5423838974c2025/gevent-24.10.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:051b22e2758accfddb0457728bfc9abf8c3f2ce6bca43f1ff6e07b5ed9e49bf4", size = 5310248, upload-time = "2024-10-18T16:18:51.175Z" }, + { url = "https://files.pythonhosted.org/packages/e3/0c/67257ba906f76ed82e8f0bd8c00c2a0687b360a1050b70db7e58dff749ab/gevent-24.10.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb5edb6433764119a664bbb148d2aea9990950aa89cc3498f475c2408d523ea3", size = 5407304, upload-time = "2024-10-18T16:23:15.348Z" }, + { url = "https://files.pythonhosted.org/packages/35/6c/3a72da7c224b0111728130c0f1abc3ee07feff91b37e0ea83db98f4a3eaf/gevent-24.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce417bcaaab496bc9c77f75566531e9d93816262037b8b2dbb88b0fdcd66587c", size = 6818624, upload-time = "2024-10-18T15:59:42.068Z" }, + { url = "https://files.pythonhosted.org/packages/a3/96/cc5f6ecba032a45fc312fe0db2908a893057fd81361eea93845d6c325556/gevent-24.10.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:1c3a828b033fb02b7c31da4d75014a1f82e6c072fc0523456569a57f8b025861", size = 5484356, upload-time = "2024-10-18T16:38:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/7c/97/e680b2b2f0c291ae4db9813ffbf02c22c2a0f14c8f1a613971385e29ef67/gevent-24.10.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f2ae3efbbd120cdf4a68b7abc27a37e61e6f443c5a06ec2c6ad94c37cd8471ec", size = 6903191, upload-time = "2024-10-18T16:02:53.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1c/b4181957da062d1c060974ec6cb798cc24aeeb28e8cd2ece84eb4b4991f7/gevent-24.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:9e1210334a9bc9f76c3d008e0785ca62214f8a54e1325f6c2ecab3b6a572a015", size = 1545117, upload-time = "2024-10-18T15:45:47.375Z" }, + { url = "https://files.pythonhosted.org/packages/89/2b/bf4af9950b8f9abd5b4025858f6311930de550e3498bbfeb47c914701a1d/gevent-24.10.3-pp310-pypy310_pp73-macosx_11_0_universal2.whl", hash = "sha256:e534e6a968d74463b11de6c9c67f4b4bf61775fb00f2e6e0f7fcdd412ceade18", size = 1271541, upload-time = "2024-10-18T15:37:53.146Z" }, ] [[package]] @@ -699,103 +699,103 @@ dependencies = [ { name = "gevent" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/14/d4eddae757de44985718a9e38d9e6f2a923d764ed97d0f1cbc1a8aa2b0ef/geventhttpclient-2.3.1.tar.gz", hash = "sha256:b40ddac8517c456818942c7812f555f84702105c82783238c9fcb8dc12675185", size = 69345, upload_time = "2024-04-18T21:39:50.83Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/14/d4eddae757de44985718a9e38d9e6f2a923d764ed97d0f1cbc1a8aa2b0ef/geventhttpclient-2.3.1.tar.gz", hash = "sha256:b40ddac8517c456818942c7812f555f84702105c82783238c9fcb8dc12675185", size = 69345, upload-time = "2024-04-18T21:39:50.83Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/a5/5e49d6a581b3f1399425e22961c6e341e90c12fa2193ed0adee9afbd864c/geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da22ab7bf5af4ba3d07cffee6de448b42696e53e7ac1fe97ed289037733bf1c2", size = 71729, upload_time = "2024-04-18T21:38:06.866Z" }, - { url = "https://files.pythonhosted.org/packages/eb/23/4ff584e5f344dae64b5bc588b65c4ea81083f9d662b9f64cf5f28e5ae9cc/geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2399e3d4e2fae8bbd91756189da6e9d84adf8f3eaace5eef0667874a705a29f8", size = 52062, upload_time = "2024-04-18T21:38:08.433Z" }, - { url = "https://files.pythonhosted.org/packages/bb/60/6bd8badb97b31a49f4c2b79466abce208a97dad95d447893c7546063fc8a/geventhttpclient-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e33e87d0d5b9f5782c4e6d3cb7e3592fea41af52713137d04776df7646d71b", size = 51645, upload_time = "2024-04-18T21:38:10.139Z" }, - { url = "https://files.pythonhosted.org/packages/e1/62/47d431bf05f74aa683d63163a11432bda8f576c86dec8c3bc9d6a156ee03/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c071db313866c3d0510feb6c0f40ec086ccf7e4a845701b6316c82c06e8b9b29", size = 117838, upload_time = "2024-04-18T21:38:12.036Z" }, - { url = "https://files.pythonhosted.org/packages/6c/8b/e7c9ae813bb41883a96ad9afcf86465219c3bb682daa8b09448481edef8a/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f36f0c6ef88a27e60af8369d9c2189fe372c6f2943182a7568e0f2ad33bb69f1", size = 123272, upload_time = "2024-04-18T21:38:13.704Z" }, - { url = "https://files.pythonhosted.org/packages/4d/26/71e9b2526009faadda9f588dac04f8bf837a5b97628ab44145efc3fa796e/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4624843c03a5337282a42247d987c2531193e57255ee307b36eeb4f243a0c21", size = 114319, upload_time = "2024-04-18T21:38:15.097Z" }, - { url = "https://files.pythonhosted.org/packages/34/8c/1da2960293c42b7a6b01dbe3204b569e4cdb55b8289cb1c7154826500f19/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d614573621ba827c417786057e1e20e9f96c4f6b3878c55b1b7b54e1026693bc", size = 112705, upload_time = "2024-04-18T21:38:17.005Z" }, - { url = "https://files.pythonhosted.org/packages/a7/a1/4d08ecf0f213fdc63f78a217f87c07c1cb9891e68cdf74c8cbca76298bdb/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5d51330a40ac9762879d0e296c279c1beae8cfa6484bb196ac829242c416b709", size = 121236, upload_time = "2024-04-18T21:38:18.831Z" }, - { url = "https://files.pythonhosted.org/packages/4f/f7/42ece3e1f54602c518d74364a214da3b35b6be267b335564b7e9f0d37705/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc9f2162d4e8cb86bb5322d99bfd552088a3eacd540a841298f06bb8bc1f1f03", size = 117859, upload_time = "2024-04-18T21:38:20.917Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8e/de026b3697bffe5fa1a4938a3882107e378eea826905acf8e46c69b71ffd/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e59d3397e63c65ecc7a7561a5289f0cf2e2c2252e29632741e792f57f5d124", size = 127268, upload_time = "2024-04-18T21:38:22.676Z" }, - { url = "https://files.pythonhosted.org/packages/54/bf/1ee99a322467e6825a24612d306a46ca94b51088170d1b5de0df1c82ab2a/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4436eef515b3e0c1d4a453ae32e047290e780a623c1eddb11026ae9d5fb03d42", size = 116426, upload_time = "2024-04-18T21:38:24.228Z" }, - { url = "https://files.pythonhosted.org/packages/72/54/10c8ec745b3dcbfd52af62977fec85829749c0325e1a5429d050a4b45e75/geventhttpclient-2.3.1-cp310-cp310-win32.whl", hash = "sha256:5d1cf7d8a4f8e15cc8fd7d88ac4cdb058d6274203a42587e594cc9f0850ac862", size = 47599, upload_time = "2024-04-18T21:38:26.385Z" }, - { url = "https://files.pythonhosted.org/packages/da/0d/36a47cdeaa83c3b4efdbd18d77720fa27dc40600998f4dedd7c4a1259862/geventhttpclient-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4deaebc121036f7ea95430c2d0f80ab085b15280e6ab677a6360b70e57020e7f", size = 48302, upload_time = "2024-04-18T21:38:28.297Z" }, - { url = "https://files.pythonhosted.org/packages/56/ad/1fcbbea0465f04d4425960e3737d4d8ae6407043cfc88688fb17b9064160/geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0ae055b9ce1704f2ce72c0847df28f4e14dbb3eea79256cda6c909d82688ea3", size = 71733, upload_time = "2024-04-18T21:38:30.357Z" }, - { url = "https://files.pythonhosted.org/packages/06/1a/10e547adb675beea407ff7117ecb4e5063534569ac14bb4360279d2888dd/geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f087af2ac439495b5388841d6f3c4de8d2573ca9870593d78f7b554aa5cfa7f5", size = 52060, upload_time = "2024-04-18T21:38:32.561Z" }, - { url = "https://files.pythonhosted.org/packages/e0/c0/9960ac6e8818a00702743cd2a9637d6f26909ac7ac59ca231f446e367b20/geventhttpclient-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76c367d175810facfe56281e516c9a5a4a191eff76641faaa30aa33882ed4b2f", size = 51649, upload_time = "2024-04-18T21:38:34.265Z" }, - { url = "https://files.pythonhosted.org/packages/58/3a/b032cd8f885dafdfa002a8a0e4e21b633713798ec08e19010b815fbfead6/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a58376d0d461fe0322ff2ad362553b437daee1eeb92b4c0e3b1ffef9e77defbe", size = 117987, upload_time = "2024-04-18T21:38:37.661Z" }, - { url = "https://files.pythonhosted.org/packages/94/36/6493a5cbc20c269a51186946947f3ca2eae687e05831289891027bd038c3/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f440cc704f8a9869848a109b2c401805c17c070539b2014e7b884ecfc8591e33", size = 123356, upload_time = "2024-04-18T21:38:39.705Z" }, - { url = "https://files.pythonhosted.org/packages/2f/07/b66d9a13b97a7e59d84b4faf704113aa963aaf3a0f71c9138c8740d57d5c/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f10c62994f9052f23948c19de930b2d1f063240462c8bd7077c2b3290e61f4fa", size = 114460, upload_time = "2024-04-18T21:38:40.947Z" }, - { url = "https://files.pythonhosted.org/packages/4e/72/1467b9e1ef63aecfe3b42333fb7607f66129dffaeca231f97e4be6f71803/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c45d9f3dd9627844c12e9ca347258c7be585bed54046336220e25ea6eac155", size = 112808, upload_time = "2024-04-18T21:38:42.684Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ef/64894efd67cb3459074c734736ecacff398cd841a5538dc70e3e77d35500/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:77c1a2c6e3854bf87cd5588b95174640c8a881716bd07fa0d131d082270a6795", size = 122049, upload_time = "2024-04-18T21:38:44.184Z" }, - { url = "https://files.pythonhosted.org/packages/c5/c8/1b13b4ea4bb88d7c2db56d070a52daf4757b3139afd83885e81455cb422f/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ce649d4e25c2d56023471df0bf1e8e2ab67dfe4ff12ce3e8fe7e6fae30cd672a", size = 118755, upload_time = "2024-04-18T21:38:45.654Z" }, - { url = "https://files.pythonhosted.org/packages/d1/06/95ac63fa1ee118a4d5824aa0a6b0dc3a2934a2f4ce695bf6747e1744d813/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:265d9f31b4ac8f688eebef0bd4c814ffb37a16f769ad0c8c8b8c24a84db8eab5", size = 128053, upload_time = "2024-04-18T21:38:47.247Z" }, - { url = "https://files.pythonhosted.org/packages/8a/27/3d6dbbd128e1b965bae198bffa4b5552cd635397e3d2bbcc7d9592890ca9/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2de436a9d61dae877e4e811fb3e2594e2a1df1b18f4280878f318aef48a562b9", size = 117316, upload_time = "2024-04-18T21:38:49.086Z" }, - { url = "https://files.pythonhosted.org/packages/ed/9a/8b65daf417ff982fa1928ebc6ebdfb081750d426f877f0056288aaa689e8/geventhttpclient-2.3.1-cp311-cp311-win32.whl", hash = "sha256:83e22178b9480b0a95edf0053d4f30b717d0b696b3c262beabe6964d9c5224b1", size = 47598, upload_time = "2024-04-18T21:38:50.919Z" }, - { url = "https://files.pythonhosted.org/packages/ab/83/ed0d14787861cf30beddd3aadc29ad07d75555de43c629ba514ddd2978d0/geventhttpclient-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:97b072a282233384c1302a7dee88ad8bfedc916f06b1bc1da54f84980f1406a9", size = 48301, upload_time = "2024-04-18T21:38:52.14Z" }, - { url = "https://files.pythonhosted.org/packages/82/ee/bf3d26170a518d2b1254f44202f2fa4490496b476ee24046ff6c34e79c08/geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e1c90abcc2735cd8dd2d2572a13da32f6625392dc04862decb5c6476a3ddee22", size = 71742, upload_time = "2024-04-18T21:38:54.167Z" }, - { url = "https://files.pythonhosted.org/packages/77/72/bd64b2a491094a3fbf7f3c314bb3c3918afb652783a8a9db07b86072da35/geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5deb41c2f51247b4e568c14964f59d7b8e537eff51900564c88af3200004e678", size = 52070, upload_time = "2024-04-18T21:38:55.484Z" }, - { url = "https://files.pythonhosted.org/packages/85/96/e25becfde16c5551ba04ed2beac1f018e2efc70275ec19ae3765ff634ff2/geventhttpclient-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c6f1a56a66a90c4beae2f009b5e9d42db9a58ced165aa35441ace04d69cb7b37", size = 51650, upload_time = "2024-04-18T21:38:57.022Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b8/fe6e938a369b3742103d04e5771e1ec7b18c047ac30b06a8e9704e2d34fc/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ee6e741849c29e3129b1ec3828ac3a5e5dcb043402f852ea92c52334fb8cabf", size = 118507, upload_time = "2024-04-18T21:38:58.936Z" }, - { url = "https://files.pythonhosted.org/packages/68/0b/381d01de049b02dc70addbcc1c8e24d15500bff6a9e89103c4aa8eb352c3/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d0972096a63b1ddaa73fa3dab2c7a136e3ab8bf7999a2f85a5dee851fa77cdd", size = 124061, upload_time = "2024-04-18T21:39:00.473Z" }, - { url = "https://files.pythonhosted.org/packages/c6/e6/7c97b5bf41cc403b2936a0887a85550b3153aa4b60c0c5062c49cd6286f2/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00675ba682fb7d19d659c14686fa8a52a65e3f301b56c2a4ee6333b380dd9467", size = 115060, upload_time = "2024-04-18T21:39:02.323Z" }, - { url = "https://files.pythonhosted.org/packages/45/1f/3e02464449c74a8146f27218471578c1dfabf18731cf047520b76e1b6331/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea77b67c186df90473416f4403839728f70ef6cf1689cec97b4f6bbde392a8a8", size = 113762, upload_time = "2024-04-18T21:39:03.769Z" }, - { url = "https://files.pythonhosted.org/packages/4f/a4/08551776f7d6b219d6f73ca25be88806007b16af51a1dbfed7192528e1c3/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ddcc3f0fdffd9a3801e1005b73026202cffed8199863fdef9315bea9a860a032", size = 122018, upload_time = "2024-04-18T21:39:05.781Z" }, - { url = "https://files.pythonhosted.org/packages/70/14/ba91417ac7cbce8d553f72c885a19c6b9d7f9dc7de81b7814551cf020a57/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c9f1ef4ec048563cc621a47ff01a4f10048ff8b676d7a4d75e5433ed8e703e56", size = 118884, upload_time = "2024-04-18T21:39:08.001Z" }, - { url = "https://files.pythonhosted.org/packages/7c/78/e1f2c30e11bda8347a74b3a7254f727ff53ea260244da77d76b96779a006/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:a364b30bec7a0a00dbe256e2b6807e4dc866bead7ac84aaa51ca5e2c3d15c258", size = 128224, upload_time = "2024-04-18T21:39:09.31Z" }, - { url = "https://files.pythonhosted.org/packages/ac/2f/b7fd96e9cfa9d9719b0c9feb50b4cbb341d1940e34fd3305006efa8c3e33/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:25d255383d3d6a6fbd643bb51ae1a7e4f6f7b0dbd5f3225b537d0bd0432eaf39", size = 117758, upload_time = "2024-04-18T21:39:11.287Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e0/1384c9a76379ab257b75df92283797861dcae592dd98e471df254f87c635/geventhttpclient-2.3.1-cp312-cp312-win32.whl", hash = "sha256:ad0b507e354d2f398186dcb12fe526d0594e7c9387b514fb843f7a14fdf1729a", size = 47595, upload_time = "2024-04-18T21:39:12.535Z" }, - { url = "https://files.pythonhosted.org/packages/54/e3/6b8dbb24e3941e20abbe7736e59290c5d4182057ea1d984d46c853208bcd/geventhttpclient-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:7924e0883bc2b177cfe27aa65af6bb9dd57f3e26905c7675a2d1f3ef69df7cca", size = 48271, upload_time = "2024-04-18T21:39:14.479Z" }, - { url = "https://files.pythonhosted.org/packages/ee/9f/251b1b7e665523137a8711f0f0029196cf18b57741135f01aea80a56f16c/geventhttpclient-2.3.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c31431e38df45b3c79bf3c9427c796adb8263d622bc6fa25e2f6ba916c2aad93", size = 49827, upload_time = "2024-04-18T21:39:36.14Z" }, - { url = "https://files.pythonhosted.org/packages/74/c7/ad4c23de669191e1c83cfa28c51d3b50fc246d72e1ee40d4d5b330532492/geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:855ab1e145575769b180b57accb0573a77cd6a7392f40a6ef7bc9a4926ebd77b", size = 54017, upload_time = "2024-04-18T21:39:37.577Z" }, - { url = "https://files.pythonhosted.org/packages/04/7b/59fc8c8fbd10596abfc46dc103654e3d9676de64229d8eee4b0a4ac2e890/geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a374aad77c01539e786d0c7829bec2eba034ccd45733c1bf9811ad18d2a8ecd", size = 58359, upload_time = "2024-04-18T21:39:39.437Z" }, - { url = "https://files.pythonhosted.org/packages/94/b7/743552b0ecda75458c83d55d62937e29c9ee9a42598f57d4025d5de70004/geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c1e97460608304f400485ac099736fff3566d3d8db2038533d466f8cf5de5a", size = 54262, upload_time = "2024-04-18T21:39:40.866Z" }, - { url = "https://files.pythonhosted.org/packages/18/60/10f6215b6cc76b5845a7f4b9c3d1f47d7ecd84ce8769b1e27e0482d605d7/geventhttpclient-2.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4f843f81ee44ba4c553a1b3f73115e0ad8f00044023c24db29f5b1df3da08465", size = 48343, upload_time = "2024-04-18T21:39:42.173Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a5/5e49d6a581b3f1399425e22961c6e341e90c12fa2193ed0adee9afbd864c/geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da22ab7bf5af4ba3d07cffee6de448b42696e53e7ac1fe97ed289037733bf1c2", size = 71729, upload-time = "2024-04-18T21:38:06.866Z" }, + { url = "https://files.pythonhosted.org/packages/eb/23/4ff584e5f344dae64b5bc588b65c4ea81083f9d662b9f64cf5f28e5ae9cc/geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2399e3d4e2fae8bbd91756189da6e9d84adf8f3eaace5eef0667874a705a29f8", size = 52062, upload-time = "2024-04-18T21:38:08.433Z" }, + { url = "https://files.pythonhosted.org/packages/bb/60/6bd8badb97b31a49f4c2b79466abce208a97dad95d447893c7546063fc8a/geventhttpclient-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e33e87d0d5b9f5782c4e6d3cb7e3592fea41af52713137d04776df7646d71b", size = 51645, upload-time = "2024-04-18T21:38:10.139Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/47d431bf05f74aa683d63163a11432bda8f576c86dec8c3bc9d6a156ee03/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c071db313866c3d0510feb6c0f40ec086ccf7e4a845701b6316c82c06e8b9b29", size = 117838, upload-time = "2024-04-18T21:38:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8b/e7c9ae813bb41883a96ad9afcf86465219c3bb682daa8b09448481edef8a/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f36f0c6ef88a27e60af8369d9c2189fe372c6f2943182a7568e0f2ad33bb69f1", size = 123272, upload-time = "2024-04-18T21:38:13.704Z" }, + { url = "https://files.pythonhosted.org/packages/4d/26/71e9b2526009faadda9f588dac04f8bf837a5b97628ab44145efc3fa796e/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4624843c03a5337282a42247d987c2531193e57255ee307b36eeb4f243a0c21", size = 114319, upload-time = "2024-04-18T21:38:15.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/8c/1da2960293c42b7a6b01dbe3204b569e4cdb55b8289cb1c7154826500f19/geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d614573621ba827c417786057e1e20e9f96c4f6b3878c55b1b7b54e1026693bc", size = 112705, upload-time = "2024-04-18T21:38:17.005Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a1/4d08ecf0f213fdc63f78a217f87c07c1cb9891e68cdf74c8cbca76298bdb/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5d51330a40ac9762879d0e296c279c1beae8cfa6484bb196ac829242c416b709", size = 121236, upload-time = "2024-04-18T21:38:18.831Z" }, + { url = "https://files.pythonhosted.org/packages/4f/f7/42ece3e1f54602c518d74364a214da3b35b6be267b335564b7e9f0d37705/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc9f2162d4e8cb86bb5322d99bfd552088a3eacd540a841298f06bb8bc1f1f03", size = 117859, upload-time = "2024-04-18T21:38:20.917Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8e/de026b3697bffe5fa1a4938a3882107e378eea826905acf8e46c69b71ffd/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:06e59d3397e63c65ecc7a7561a5289f0cf2e2c2252e29632741e792f57f5d124", size = 127268, upload-time = "2024-04-18T21:38:22.676Z" }, + { url = "https://files.pythonhosted.org/packages/54/bf/1ee99a322467e6825a24612d306a46ca94b51088170d1b5de0df1c82ab2a/geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4436eef515b3e0c1d4a453ae32e047290e780a623c1eddb11026ae9d5fb03d42", size = 116426, upload-time = "2024-04-18T21:38:24.228Z" }, + { url = "https://files.pythonhosted.org/packages/72/54/10c8ec745b3dcbfd52af62977fec85829749c0325e1a5429d050a4b45e75/geventhttpclient-2.3.1-cp310-cp310-win32.whl", hash = "sha256:5d1cf7d8a4f8e15cc8fd7d88ac4cdb058d6274203a42587e594cc9f0850ac862", size = 47599, upload-time = "2024-04-18T21:38:26.385Z" }, + { url = "https://files.pythonhosted.org/packages/da/0d/36a47cdeaa83c3b4efdbd18d77720fa27dc40600998f4dedd7c4a1259862/geventhttpclient-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:4deaebc121036f7ea95430c2d0f80ab085b15280e6ab677a6360b70e57020e7f", size = 48302, upload-time = "2024-04-18T21:38:28.297Z" }, + { url = "https://files.pythonhosted.org/packages/56/ad/1fcbbea0465f04d4425960e3737d4d8ae6407043cfc88688fb17b9064160/geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0ae055b9ce1704f2ce72c0847df28f4e14dbb3eea79256cda6c909d82688ea3", size = 71733, upload-time = "2024-04-18T21:38:30.357Z" }, + { url = "https://files.pythonhosted.org/packages/06/1a/10e547adb675beea407ff7117ecb4e5063534569ac14bb4360279d2888dd/geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f087af2ac439495b5388841d6f3c4de8d2573ca9870593d78f7b554aa5cfa7f5", size = 52060, upload-time = "2024-04-18T21:38:32.561Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c0/9960ac6e8818a00702743cd2a9637d6f26909ac7ac59ca231f446e367b20/geventhttpclient-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76c367d175810facfe56281e516c9a5a4a191eff76641faaa30aa33882ed4b2f", size = 51649, upload-time = "2024-04-18T21:38:34.265Z" }, + { url = "https://files.pythonhosted.org/packages/58/3a/b032cd8f885dafdfa002a8a0e4e21b633713798ec08e19010b815fbfead6/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a58376d0d461fe0322ff2ad362553b437daee1eeb92b4c0e3b1ffef9e77defbe", size = 117987, upload-time = "2024-04-18T21:38:37.661Z" }, + { url = "https://files.pythonhosted.org/packages/94/36/6493a5cbc20c269a51186946947f3ca2eae687e05831289891027bd038c3/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f440cc704f8a9869848a109b2c401805c17c070539b2014e7b884ecfc8591e33", size = 123356, upload-time = "2024-04-18T21:38:39.705Z" }, + { url = "https://files.pythonhosted.org/packages/2f/07/b66d9a13b97a7e59d84b4faf704113aa963aaf3a0f71c9138c8740d57d5c/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f10c62994f9052f23948c19de930b2d1f063240462c8bd7077c2b3290e61f4fa", size = 114460, upload-time = "2024-04-18T21:38:40.947Z" }, + { url = "https://files.pythonhosted.org/packages/4e/72/1467b9e1ef63aecfe3b42333fb7607f66129dffaeca231f97e4be6f71803/geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c45d9f3dd9627844c12e9ca347258c7be585bed54046336220e25ea6eac155", size = 112808, upload-time = "2024-04-18T21:38:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/64894efd67cb3459074c734736ecacff398cd841a5538dc70e3e77d35500/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:77c1a2c6e3854bf87cd5588b95174640c8a881716bd07fa0d131d082270a6795", size = 122049, upload-time = "2024-04-18T21:38:44.184Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c8/1b13b4ea4bb88d7c2db56d070a52daf4757b3139afd83885e81455cb422f/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ce649d4e25c2d56023471df0bf1e8e2ab67dfe4ff12ce3e8fe7e6fae30cd672a", size = 118755, upload-time = "2024-04-18T21:38:45.654Z" }, + { url = "https://files.pythonhosted.org/packages/d1/06/95ac63fa1ee118a4d5824aa0a6b0dc3a2934a2f4ce695bf6747e1744d813/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:265d9f31b4ac8f688eebef0bd4c814ffb37a16f769ad0c8c8b8c24a84db8eab5", size = 128053, upload-time = "2024-04-18T21:38:47.247Z" }, + { url = "https://files.pythonhosted.org/packages/8a/27/3d6dbbd128e1b965bae198bffa4b5552cd635397e3d2bbcc7d9592890ca9/geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2de436a9d61dae877e4e811fb3e2594e2a1df1b18f4280878f318aef48a562b9", size = 117316, upload-time = "2024-04-18T21:38:49.086Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/8b65daf417ff982fa1928ebc6ebdfb081750d426f877f0056288aaa689e8/geventhttpclient-2.3.1-cp311-cp311-win32.whl", hash = "sha256:83e22178b9480b0a95edf0053d4f30b717d0b696b3c262beabe6964d9c5224b1", size = 47598, upload-time = "2024-04-18T21:38:50.919Z" }, + { url = "https://files.pythonhosted.org/packages/ab/83/ed0d14787861cf30beddd3aadc29ad07d75555de43c629ba514ddd2978d0/geventhttpclient-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:97b072a282233384c1302a7dee88ad8bfedc916f06b1bc1da54f84980f1406a9", size = 48301, upload-time = "2024-04-18T21:38:52.14Z" }, + { url = "https://files.pythonhosted.org/packages/82/ee/bf3d26170a518d2b1254f44202f2fa4490496b476ee24046ff6c34e79c08/geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e1c90abcc2735cd8dd2d2572a13da32f6625392dc04862decb5c6476a3ddee22", size = 71742, upload-time = "2024-04-18T21:38:54.167Z" }, + { url = "https://files.pythonhosted.org/packages/77/72/bd64b2a491094a3fbf7f3c314bb3c3918afb652783a8a9db07b86072da35/geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5deb41c2f51247b4e568c14964f59d7b8e537eff51900564c88af3200004e678", size = 52070, upload-time = "2024-04-18T21:38:55.484Z" }, + { url = "https://files.pythonhosted.org/packages/85/96/e25becfde16c5551ba04ed2beac1f018e2efc70275ec19ae3765ff634ff2/geventhttpclient-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c6f1a56a66a90c4beae2f009b5e9d42db9a58ced165aa35441ace04d69cb7b37", size = 51650, upload-time = "2024-04-18T21:38:57.022Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b8/fe6e938a369b3742103d04e5771e1ec7b18c047ac30b06a8e9704e2d34fc/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ee6e741849c29e3129b1ec3828ac3a5e5dcb043402f852ea92c52334fb8cabf", size = 118507, upload-time = "2024-04-18T21:38:58.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/0b/381d01de049b02dc70addbcc1c8e24d15500bff6a9e89103c4aa8eb352c3/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d0972096a63b1ddaa73fa3dab2c7a136e3ab8bf7999a2f85a5dee851fa77cdd", size = 124061, upload-time = "2024-04-18T21:39:00.473Z" }, + { url = "https://files.pythonhosted.org/packages/c6/e6/7c97b5bf41cc403b2936a0887a85550b3153aa4b60c0c5062c49cd6286f2/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00675ba682fb7d19d659c14686fa8a52a65e3f301b56c2a4ee6333b380dd9467", size = 115060, upload-time = "2024-04-18T21:39:02.323Z" }, + { url = "https://files.pythonhosted.org/packages/45/1f/3e02464449c74a8146f27218471578c1dfabf18731cf047520b76e1b6331/geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea77b67c186df90473416f4403839728f70ef6cf1689cec97b4f6bbde392a8a8", size = 113762, upload-time = "2024-04-18T21:39:03.769Z" }, + { url = "https://files.pythonhosted.org/packages/4f/a4/08551776f7d6b219d6f73ca25be88806007b16af51a1dbfed7192528e1c3/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ddcc3f0fdffd9a3801e1005b73026202cffed8199863fdef9315bea9a860a032", size = 122018, upload-time = "2024-04-18T21:39:05.781Z" }, + { url = "https://files.pythonhosted.org/packages/70/14/ba91417ac7cbce8d553f72c885a19c6b9d7f9dc7de81b7814551cf020a57/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c9f1ef4ec048563cc621a47ff01a4f10048ff8b676d7a4d75e5433ed8e703e56", size = 118884, upload-time = "2024-04-18T21:39:08.001Z" }, + { url = "https://files.pythonhosted.org/packages/7c/78/e1f2c30e11bda8347a74b3a7254f727ff53ea260244da77d76b96779a006/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:a364b30bec7a0a00dbe256e2b6807e4dc866bead7ac84aaa51ca5e2c3d15c258", size = 128224, upload-time = "2024-04-18T21:39:09.31Z" }, + { url = "https://files.pythonhosted.org/packages/ac/2f/b7fd96e9cfa9d9719b0c9feb50b4cbb341d1940e34fd3305006efa8c3e33/geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:25d255383d3d6a6fbd643bb51ae1a7e4f6f7b0dbd5f3225b537d0bd0432eaf39", size = 117758, upload-time = "2024-04-18T21:39:11.287Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e0/1384c9a76379ab257b75df92283797861dcae592dd98e471df254f87c635/geventhttpclient-2.3.1-cp312-cp312-win32.whl", hash = "sha256:ad0b507e354d2f398186dcb12fe526d0594e7c9387b514fb843f7a14fdf1729a", size = 47595, upload-time = "2024-04-18T21:39:12.535Z" }, + { url = "https://files.pythonhosted.org/packages/54/e3/6b8dbb24e3941e20abbe7736e59290c5d4182057ea1d984d46c853208bcd/geventhttpclient-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:7924e0883bc2b177cfe27aa65af6bb9dd57f3e26905c7675a2d1f3ef69df7cca", size = 48271, upload-time = "2024-04-18T21:39:14.479Z" }, + { url = "https://files.pythonhosted.org/packages/ee/9f/251b1b7e665523137a8711f0f0029196cf18b57741135f01aea80a56f16c/geventhttpclient-2.3.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c31431e38df45b3c79bf3c9427c796adb8263d622bc6fa25e2f6ba916c2aad93", size = 49827, upload-time = "2024-04-18T21:39:36.14Z" }, + { url = "https://files.pythonhosted.org/packages/74/c7/ad4c23de669191e1c83cfa28c51d3b50fc246d72e1ee40d4d5b330532492/geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:855ab1e145575769b180b57accb0573a77cd6a7392f40a6ef7bc9a4926ebd77b", size = 54017, upload-time = "2024-04-18T21:39:37.577Z" }, + { url = "https://files.pythonhosted.org/packages/04/7b/59fc8c8fbd10596abfc46dc103654e3d9676de64229d8eee4b0a4ac2e890/geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a374aad77c01539e786d0c7829bec2eba034ccd45733c1bf9811ad18d2a8ecd", size = 58359, upload-time = "2024-04-18T21:39:39.437Z" }, + { url = "https://files.pythonhosted.org/packages/94/b7/743552b0ecda75458c83d55d62937e29c9ee9a42598f57d4025d5de70004/geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c1e97460608304f400485ac099736fff3566d3d8db2038533d466f8cf5de5a", size = 54262, upload-time = "2024-04-18T21:39:40.866Z" }, + { url = "https://files.pythonhosted.org/packages/18/60/10f6215b6cc76b5845a7f4b9c3d1f47d7ecd84ce8769b1e27e0482d605d7/geventhttpclient-2.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4f843f81ee44ba4c553a1b3f73115e0ad8f00044023c24db29f5b1df3da08465", size = 48343, upload-time = "2024-04-18T21:39:42.173Z" }, ] [[package]] name = "greenlet" version = "3.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022, upload_time = "2024-09-20T18:21:04.506Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/ff/df5fede753cc10f6a5be0931204ea30c35fa2f2ea7a35b25bdaf4fe40e46/greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", size = 186022, upload-time = "2024-09-20T18:21:04.506Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/90/5234a78dc0ef6496a6eb97b67a42a8e96742a56f7dc808cb954a85390448/greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", size = 271235, upload_time = "2024-09-20T17:07:18.761Z" }, - { url = "https://files.pythonhosted.org/packages/7c/16/cd631fa0ab7d06ef06387135b7549fdcc77d8d859ed770a0d28e47b20972/greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", size = 637168, upload_time = "2024-09-20T17:36:43.774Z" }, - { url = "https://files.pythonhosted.org/packages/2f/b1/aed39043a6fec33c284a2c9abd63ce191f4f1a07319340ffc04d2ed3256f/greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", size = 648826, upload_time = "2024-09-20T17:39:16.921Z" }, - { url = "https://files.pythonhosted.org/packages/76/25/40e0112f7f3ebe54e8e8ed91b2b9f970805143efef16d043dfc15e70f44b/greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", size = 644443, upload_time = "2024-09-20T17:44:21.896Z" }, - { url = "https://files.pythonhosted.org/packages/fb/2f/3850b867a9af519794784a7eeed1dd5bc68ffbcc5b28cef703711025fd0a/greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", size = 643295, upload_time = "2024-09-20T17:08:37.951Z" }, - { url = "https://files.pythonhosted.org/packages/cf/69/79e4d63b9387b48939096e25115b8af7cd8a90397a304f92436bcb21f5b2/greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", size = 599544, upload_time = "2024-09-20T17:08:27.894Z" }, - { url = "https://files.pythonhosted.org/packages/46/1d/44dbcb0e6c323bd6f71b8c2f4233766a5faf4b8948873225d34a0b7efa71/greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", size = 1125456, upload_time = "2024-09-20T17:44:11.755Z" }, - { url = "https://files.pythonhosted.org/packages/e0/1d/a305dce121838d0278cee39d5bb268c657f10a5363ae4b726848f833f1bb/greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", size = 1149111, upload_time = "2024-09-20T17:09:22.104Z" }, - { url = "https://files.pythonhosted.org/packages/96/28/d62835fb33fb5652f2e98d34c44ad1a0feacc8b1d3f1aecab035f51f267d/greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", size = 298392, upload_time = "2024-09-20T17:28:51.988Z" }, - { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479, upload_time = "2024-09-20T17:07:22.332Z" }, - { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404, upload_time = "2024-09-20T17:36:45.588Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813, upload_time = "2024-09-20T17:39:19.052Z" }, - { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517, upload_time = "2024-09-20T17:44:24.101Z" }, - { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831, upload_time = "2024-09-20T17:08:40.577Z" }, - { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413, upload_time = "2024-09-20T17:08:31.728Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619, upload_time = "2024-09-20T17:44:14.222Z" }, - { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198, upload_time = "2024-09-20T17:09:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930, upload_time = "2024-09-20T17:25:18.656Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260, upload_time = "2024-09-20T17:08:07.301Z" }, - { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064, upload_time = "2024-09-20T17:36:47.628Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420, upload_time = "2024-09-20T17:39:21.258Z" }, - { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035, upload_time = "2024-09-20T17:44:26.501Z" }, - { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105, upload_time = "2024-09-20T17:08:42.048Z" }, - { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077, upload_time = "2024-09-20T17:08:33.707Z" }, - { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975, upload_time = "2024-09-20T17:44:15.989Z" }, - { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955, upload_time = "2024-09-20T17:09:25.539Z" }, - { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655, upload_time = "2024-09-20T17:21:22.427Z" }, - { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990, upload_time = "2024-09-20T17:08:26.312Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175, upload_time = "2024-09-20T17:36:48.983Z" }, - { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425, upload_time = "2024-09-20T17:39:22.705Z" }, - { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736, upload_time = "2024-09-20T17:44:28.544Z" }, - { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347, upload_time = "2024-09-20T17:08:45.56Z" }, - { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583, upload_time = "2024-09-20T17:08:36.85Z" }, - { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039, upload_time = "2024-09-20T17:44:18.287Z" }, - { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716, upload_time = "2024-09-20T17:09:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490, upload_time = "2024-09-20T17:17:09.501Z" }, - { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731, upload_time = "2024-09-20T17:36:50.376Z" }, - { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304, upload_time = "2024-09-20T17:39:24.55Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537, upload_time = "2024-09-20T17:44:31.102Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506, upload_time = "2024-09-20T17:08:47.852Z" }, - { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753, upload_time = "2024-09-20T17:08:38.079Z" }, - { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731, upload_time = "2024-09-20T17:44:20.556Z" }, - { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload_time = "2024-09-20T17:09:28.753Z" }, + { url = "https://files.pythonhosted.org/packages/25/90/5234a78dc0ef6496a6eb97b67a42a8e96742a56f7dc808cb954a85390448/greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", size = 271235, upload-time = "2024-09-20T17:07:18.761Z" }, + { url = "https://files.pythonhosted.org/packages/7c/16/cd631fa0ab7d06ef06387135b7549fdcc77d8d859ed770a0d28e47b20972/greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", size = 637168, upload-time = "2024-09-20T17:36:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b1/aed39043a6fec33c284a2c9abd63ce191f4f1a07319340ffc04d2ed3256f/greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", size = 648826, upload-time = "2024-09-20T17:39:16.921Z" }, + { url = "https://files.pythonhosted.org/packages/76/25/40e0112f7f3ebe54e8e8ed91b2b9f970805143efef16d043dfc15e70f44b/greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", size = 644443, upload-time = "2024-09-20T17:44:21.896Z" }, + { url = "https://files.pythonhosted.org/packages/fb/2f/3850b867a9af519794784a7eeed1dd5bc68ffbcc5b28cef703711025fd0a/greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", size = 643295, upload-time = "2024-09-20T17:08:37.951Z" }, + { url = "https://files.pythonhosted.org/packages/cf/69/79e4d63b9387b48939096e25115b8af7cd8a90397a304f92436bcb21f5b2/greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", size = 599544, upload-time = "2024-09-20T17:08:27.894Z" }, + { url = "https://files.pythonhosted.org/packages/46/1d/44dbcb0e6c323bd6f71b8c2f4233766a5faf4b8948873225d34a0b7efa71/greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", size = 1125456, upload-time = "2024-09-20T17:44:11.755Z" }, + { url = "https://files.pythonhosted.org/packages/e0/1d/a305dce121838d0278cee39d5bb268c657f10a5363ae4b726848f833f1bb/greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", size = 1149111, upload-time = "2024-09-20T17:09:22.104Z" }, + { url = "https://files.pythonhosted.org/packages/96/28/d62835fb33fb5652f2e98d34c44ad1a0feacc8b1d3f1aecab035f51f267d/greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", size = 298392, upload-time = "2024-09-20T17:28:51.988Z" }, + { url = "https://files.pythonhosted.org/packages/28/62/1c2665558618553c42922ed47a4e6d6527e2fa3516a8256c2f431c5d0441/greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", size = 272479, upload-time = "2024-09-20T17:07:22.332Z" }, + { url = "https://files.pythonhosted.org/packages/76/9d/421e2d5f07285b6e4e3a676b016ca781f63cfe4a0cd8eaecf3fd6f7a71ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", size = 640404, upload-time = "2024-09-20T17:36:45.588Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/6e05f5c59262a584e502dd3d261bbdd2c97ab5416cc9c0b91ea38932a901/greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", size = 652813, upload-time = "2024-09-20T17:39:19.052Z" }, + { url = "https://files.pythonhosted.org/packages/49/93/d5f93c84241acdea15a8fd329362c2c71c79e1a507c3f142a5d67ea435ae/greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", size = 648517, upload-time = "2024-09-20T17:44:24.101Z" }, + { url = "https://files.pythonhosted.org/packages/15/85/72f77fc02d00470c86a5c982b8daafdf65d38aefbbe441cebff3bf7037fc/greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", size = 647831, upload-time = "2024-09-20T17:08:40.577Z" }, + { url = "https://files.pythonhosted.org/packages/f7/4b/1c9695aa24f808e156c8f4813f685d975ca73c000c2a5056c514c64980f6/greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", size = 602413, upload-time = "2024-09-20T17:08:31.728Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ad6e5b31ef330f03b12559d19fda2606a522d3849cde46b24f223d6d1619/greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", size = 1129619, upload-time = "2024-09-20T17:44:14.222Z" }, + { url = "https://files.pythonhosted.org/packages/f4/fb/201e1b932e584066e0f0658b538e73c459b34d44b4bd4034f682423bc801/greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", size = 1155198, upload-time = "2024-09-20T17:09:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/12/da/b9ed5e310bb8b89661b80cbcd4db5a067903bbcd7fc854923f5ebb4144f0/greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", size = 298930, upload-time = "2024-09-20T17:25:18.656Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", size = 274260, upload-time = "2024-09-20T17:08:07.301Z" }, + { url = "https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", size = 649064, upload-time = "2024-09-20T17:36:47.628Z" }, + { url = "https://files.pythonhosted.org/packages/51/41/467b12a8c7c1303d20abcca145db2be4e6cd50a951fa30af48b6ec607581/greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", size = 663420, upload-time = "2024-09-20T17:39:21.258Z" }, + { url = "https://files.pythonhosted.org/packages/27/8f/2a93cd9b1e7107d5c7b3b7816eeadcac2ebcaf6d6513df9abaf0334777f6/greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", size = 658035, upload-time = "2024-09-20T17:44:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/57/5c/7c6f50cb12be092e1dccb2599be5a942c3416dbcfb76efcf54b3f8be4d8d/greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", size = 660105, upload-time = "2024-09-20T17:08:42.048Z" }, + { url = "https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", size = 613077, upload-time = "2024-09-20T17:08:33.707Z" }, + { url = "https://files.pythonhosted.org/packages/19/c5/36384a06f748044d06bdd8776e231fadf92fc896bd12cb1c9f5a1bda9578/greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", size = 1135975, upload-time = "2024-09-20T17:44:15.989Z" }, + { url = "https://files.pythonhosted.org/packages/38/f9/c0a0eb61bdf808d23266ecf1d63309f0e1471f284300ce6dac0ae1231881/greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", size = 1163955, upload-time = "2024-09-20T17:09:25.539Z" }, + { url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", size = 299655, upload-time = "2024-09-20T17:21:22.427Z" }, + { url = "https://files.pythonhosted.org/packages/f3/57/0db4940cd7bb461365ca8d6fd53e68254c9dbbcc2b452e69d0d41f10a85e/greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", size = 272990, upload-time = "2024-09-20T17:08:26.312Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ec/423d113c9f74e5e402e175b157203e9102feeb7088cee844d735b28ef963/greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", size = 649175, upload-time = "2024-09-20T17:36:48.983Z" }, + { url = "https://files.pythonhosted.org/packages/a9/46/ddbd2db9ff209186b7b7c621d1432e2f21714adc988703dbdd0e65155c77/greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", size = 663425, upload-time = "2024-09-20T17:39:22.705Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f9/9c82d6b2b04aa37e38e74f0c429aece5eeb02bab6e3b98e7db89b23d94c6/greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", size = 657736, upload-time = "2024-09-20T17:44:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/d9/42/b87bc2a81e3a62c3de2b0d550bf91a86939442b7ff85abb94eec3fc0e6aa/greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", size = 660347, upload-time = "2024-09-20T17:08:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/37/fa/71599c3fd06336cdc3eac52e6871cfebab4d9d70674a9a9e7a482c318e99/greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", size = 615583, upload-time = "2024-09-20T17:08:36.85Z" }, + { url = "https://files.pythonhosted.org/packages/4e/96/e9ef85de031703ee7a4483489b40cf307f93c1824a02e903106f2ea315fe/greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", size = 1133039, upload-time = "2024-09-20T17:44:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/87/76/b2b6362accd69f2d1889db61a18c94bc743e961e3cab344c2effaa4b4a25/greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", size = 1160716, upload-time = "2024-09-20T17:09:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", size = 299490, upload-time = "2024-09-20T17:17:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/5f/17/bea55bf36990e1638a2af5ba10c1640273ef20f627962cf97107f1e5d637/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", size = 643731, upload-time = "2024-09-20T17:36:50.376Z" }, + { url = "https://files.pythonhosted.org/packages/78/d2/aa3d2157f9ab742a08e0fd8f77d4699f37c22adfbfeb0c610a186b5f75e0/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", size = 649304, upload-time = "2024-09-20T17:39:24.55Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8e/d0aeffe69e53ccff5a28fa86f07ad1d2d2d6537a9506229431a2a02e2f15/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", size = 646537, upload-time = "2024-09-20T17:44:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/05/79/e15408220bbb989469c8871062c97c6c9136770657ba779711b90870d867/greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", size = 642506, upload-time = "2024-09-20T17:08:47.852Z" }, + { url = "https://files.pythonhosted.org/packages/18/87/470e01a940307796f1d25f8167b551a968540fbe0551c0ebb853cb527dd6/greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", size = 602753, upload-time = "2024-09-20T17:08:38.079Z" }, + { url = "https://files.pythonhosted.org/packages/e2/72/576815ba674eddc3c25028238f74d7b8068902b3968cbe456771b166455e/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", size = 1122731, upload-time = "2024-09-20T17:44:20.556Z" }, + { url = "https://files.pythonhosted.org/packages/ac/38/08cc303ddddc4b3d7c628c3039a61a3aae36c241ed01393d00c2fd663473/greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", size = 1142112, upload-time = "2024-09-20T17:09:28.753Z" }, ] [[package]] @@ -805,18 +805,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031, upload_time = "2024-08-10T20:25:27.378Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031, upload-time = "2024-08-10T20:25:27.378Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029, upload_time = "2024-08-10T20:25:24.996Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029, upload-time = "2024-08-10T20:25:24.996Z" }, ] [[package]] name = "h11" version = "0.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418, upload_time = "2022-09-25T15:40:01.519Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418, upload-time = "2022-09-25T15:40:01.519Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload_time = "2022-09-25T15:39:59.68Z" }, + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload-time = "2022-09-25T15:39:59.68Z" }, ] [[package]] @@ -827,45 +827,45 @@ dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/56/78a38490b834fa0942cbe6d39bd8a7fd76316e8940319305a98d2b320366/httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535", size = 81036, upload_time = "2023-11-10T13:37:42.496Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/56/78a38490b834fa0942cbe6d39bd8a7fd76316e8940319305a98d2b320366/httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535", size = 81036, upload-time = "2023-11-10T13:37:42.496Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/ba/78b0a99c4da0ff8b0f59defa2f13ca4668189b134bd9840b6202a93d9a0f/httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7", size = 76943, upload_time = "2023-11-10T13:37:40.937Z" }, + { url = "https://files.pythonhosted.org/packages/56/ba/78b0a99c4da0ff8b0f59defa2f13ca4668189b134bd9840b6202a93d9a0f/httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7", size = 76943, upload-time = "2023-11-10T13:37:40.937Z" }, ] [[package]] name = "httptools" version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload_time = "2024-10-16T19:45:08.902Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload-time = "2024-10-16T19:45:08.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/6f/972f8eb0ea7d98a1c6be436e2142d51ad2a64ee18e02b0e7ff1f62171ab1/httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0", size = 198780, upload_time = "2024-10-16T19:44:06.882Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b0/17c672b4bc5c7ba7f201eada4e96c71d0a59fbc185e60e42580093a86f21/httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da", size = 103297, upload_time = "2024-10-16T19:44:08.129Z" }, - { url = "https://files.pythonhosted.org/packages/92/5e/b4a826fe91971a0b68e8c2bd4e7db3e7519882f5a8ccdb1194be2b3ab98f/httptools-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deee0e3343f98ee8047e9f4c5bc7cedbf69f5734454a94c38ee829fb2d5fa3c1", size = 443130, upload_time = "2024-10-16T19:44:09.45Z" }, - { url = "https://files.pythonhosted.org/packages/b0/51/ce61e531e40289a681a463e1258fa1e05e0be54540e40d91d065a264cd8f/httptools-0.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca80b7485c76f768a3bc83ea58373f8db7b015551117375e4918e2aa77ea9b50", size = 442148, upload_time = "2024-10-16T19:44:11.539Z" }, - { url = "https://files.pythonhosted.org/packages/ea/9e/270b7d767849b0c96f275c695d27ca76c30671f8eb8cc1bab6ced5c5e1d0/httptools-0.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90d96a385fa941283ebd231464045187a31ad932ebfa541be8edf5b3c2328959", size = 415949, upload_time = "2024-10-16T19:44:13.388Z" }, - { url = "https://files.pythonhosted.org/packages/81/86/ced96e3179c48c6f656354e106934e65c8963d48b69be78f355797f0e1b3/httptools-0.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:59e724f8b332319e2875efd360e61ac07f33b492889284a3e05e6d13746876f4", size = 417591, upload_time = "2024-10-16T19:44:15.258Z" }, - { url = "https://files.pythonhosted.org/packages/75/73/187a3f620ed3175364ddb56847d7a608a6fc42d551e133197098c0143eca/httptools-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:c26f313951f6e26147833fc923f78f95604bbec812a43e5ee37f26dc9e5a686c", size = 88344, upload_time = "2024-10-16T19:44:16.54Z" }, - { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload_time = "2024-10-16T19:44:18.427Z" }, - { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload_time = "2024-10-16T19:44:19.515Z" }, - { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload_time = "2024-10-16T19:44:21.067Z" }, - { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload_time = "2024-10-16T19:44:22.958Z" }, - { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload_time = "2024-10-16T19:44:24.513Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload_time = "2024-10-16T19:44:26.295Z" }, - { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload_time = "2024-10-16T19:44:29.188Z" }, - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload_time = "2024-10-16T19:44:30.175Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload_time = "2024-10-16T19:44:31.786Z" }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload_time = "2024-10-16T19:44:32.825Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload_time = "2024-10-16T19:44:33.974Z" }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload_time = "2024-10-16T19:44:35.111Z" }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload_time = "2024-10-16T19:44:36.253Z" }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload_time = "2024-10-16T19:44:37.357Z" }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload_time = "2024-10-16T19:44:38.738Z" }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload_time = "2024-10-16T19:44:39.818Z" }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload_time = "2024-10-16T19:44:41.189Z" }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload_time = "2024-10-16T19:44:42.384Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload_time = "2024-10-16T19:44:43.959Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload_time = "2024-10-16T19:44:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload_time = "2024-10-16T19:44:46.46Z" }, + { url = "https://files.pythonhosted.org/packages/3b/6f/972f8eb0ea7d98a1c6be436e2142d51ad2a64ee18e02b0e7ff1f62171ab1/httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0", size = 198780, upload-time = "2024-10-16T19:44:06.882Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/17c672b4bc5c7ba7f201eada4e96c71d0a59fbc185e60e42580093a86f21/httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da", size = 103297, upload-time = "2024-10-16T19:44:08.129Z" }, + { url = "https://files.pythonhosted.org/packages/92/5e/b4a826fe91971a0b68e8c2bd4e7db3e7519882f5a8ccdb1194be2b3ab98f/httptools-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deee0e3343f98ee8047e9f4c5bc7cedbf69f5734454a94c38ee829fb2d5fa3c1", size = 443130, upload-time = "2024-10-16T19:44:09.45Z" }, + { url = "https://files.pythonhosted.org/packages/b0/51/ce61e531e40289a681a463e1258fa1e05e0be54540e40d91d065a264cd8f/httptools-0.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca80b7485c76f768a3bc83ea58373f8db7b015551117375e4918e2aa77ea9b50", size = 442148, upload-time = "2024-10-16T19:44:11.539Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9e/270b7d767849b0c96f275c695d27ca76c30671f8eb8cc1bab6ced5c5e1d0/httptools-0.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:90d96a385fa941283ebd231464045187a31ad932ebfa541be8edf5b3c2328959", size = 415949, upload-time = "2024-10-16T19:44:13.388Z" }, + { url = "https://files.pythonhosted.org/packages/81/86/ced96e3179c48c6f656354e106934e65c8963d48b69be78f355797f0e1b3/httptools-0.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:59e724f8b332319e2875efd360e61ac07f33b492889284a3e05e6d13746876f4", size = 417591, upload-time = "2024-10-16T19:44:15.258Z" }, + { url = "https://files.pythonhosted.org/packages/75/73/187a3f620ed3175364ddb56847d7a608a6fc42d551e133197098c0143eca/httptools-0.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:c26f313951f6e26147833fc923f78f95604bbec812a43e5ee37f26dc9e5a686c", size = 88344, upload-time = "2024-10-16T19:44:16.54Z" }, + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload-time = "2024-10-16T19:44:18.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload-time = "2024-10-16T19:44:19.515Z" }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload-time = "2024-10-16T19:44:21.067Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload-time = "2024-10-16T19:44:22.958Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload-time = "2024-10-16T19:44:24.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload-time = "2024-10-16T19:44:26.295Z" }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload-time = "2024-10-16T19:44:29.188Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload-time = "2024-10-16T19:44:30.175Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload-time = "2024-10-16T19:44:31.786Z" }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload-time = "2024-10-16T19:44:32.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload-time = "2024-10-16T19:44:33.974Z" }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload-time = "2024-10-16T19:44:35.111Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload-time = "2024-10-16T19:44:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload-time = "2024-10-16T19:44:37.357Z" }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload-time = "2024-10-16T19:44:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload-time = "2024-10-16T19:44:39.818Z" }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload-time = "2024-10-16T19:44:41.189Z" }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload-time = "2024-10-16T19:44:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload-time = "2024-10-16T19:44:43.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload-time = "2024-10-16T19:44:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload-time = "2024-10-16T19:44:46.46Z" }, ] [[package]] @@ -878,9 +878,9 @@ dependencies = [ { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload_time = "2024-12-06T15:37:23.222Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload_time = "2024-12-06T15:37:21.509Z" }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, ] [[package]] @@ -896,9 +896,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/22/8eb91736b1dcb83d879bd49050a09df29a57cc5cd9f38e48a4b1c45ee890/huggingface_hub-0.30.2.tar.gz", hash = "sha256:9a7897c5b6fd9dad3168a794a8998d6378210f5b9688d0dfc180b1a228dc2466", size = 400868, upload_time = "2025-04-08T08:32:45.26Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/22/8eb91736b1dcb83d879bd49050a09df29a57cc5cd9f38e48a4b1c45ee890/huggingface_hub-0.30.2.tar.gz", hash = "sha256:9a7897c5b6fd9dad3168a794a8998d6378210f5b9688d0dfc180b1a228dc2466", size = 400868, upload-time = "2025-04-08T08:32:45.26Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/27/1fb384a841e9661faad1c31cbfa62864f59632e876df5d795234da51c395/huggingface_hub-0.30.2-py3-none-any.whl", hash = "sha256:68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28", size = 481433, upload_time = "2025-04-08T08:32:43.305Z" }, + { url = "https://files.pythonhosted.org/packages/93/27/1fb384a841e9661faad1c31cbfa62864f59632e876df5d795234da51c395/huggingface_hub-0.30.2-py3-none-any.whl", hash = "sha256:68ff05969927058cfa41df4f2155d4bb48f5f54f719dd0390103eefa9b191e28", size = 481433, upload-time = "2025-04-08T08:32:43.305Z" }, ] [[package]] @@ -908,18 +908,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyreadline3", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload_time = "2021-09-17T21:40:43.31Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload_time = "2021-09-17T21:40:39.897Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, ] [[package]] name = "idna" version = "3.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426, upload_time = "2023-11-25T15:40:54.902Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426, upload-time = "2023-11-25T15:40:54.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload_time = "2023-11-25T15:40:52.604Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" }, ] [[package]] @@ -930,9 +930,9 @@ dependencies = [ { name = "numpy" }, { name = "pillow" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/38/f4c568318c656352d211eec6954460dc3af0b7583a6682308f8a66e4c19b/imageio-2.33.1.tar.gz", hash = "sha256:78722d40b137bd98f5ec7312119f8aea9ad2049f76f434748eb306b6937cc1ce", size = 387374, upload_time = "2023-12-11T02:26:44.715Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/38/f4c568318c656352d211eec6954460dc3af0b7583a6682308f8a66e4c19b/imageio-2.33.1.tar.gz", hash = "sha256:78722d40b137bd98f5ec7312119f8aea9ad2049f76f434748eb306b6937cc1ce", size = 387374, upload-time = "2023-12-11T02:26:44.715Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/69/3aaa69cb0748e33e644fda114c9abd3186ce369edd4fca11107e9f39c6a7/imageio-2.33.1-py3-none-any.whl", hash = "sha256:c5094c48ccf6b2e6da8b4061cd95e1209380afafcbeae4a4e280938cce227e1d", size = 313345, upload_time = "2023-12-11T02:26:42.724Z" }, + { url = "https://files.pythonhosted.org/packages/c0/69/3aaa69cb0748e33e644fda114c9abd3186ce369edd4fca11107e9f39c6a7/imageio-2.33.1-py3-none-any.whl", hash = "sha256:c5094c48ccf6b2e6da8b4061cd95e1209380afafcbeae4a4e280938cce227e1d", size = 313345, upload-time = "2023-12-11T02:26:42.724Z" }, ] [[package]] @@ -1089,9 +1089,9 @@ types = [ name = "iniconfig" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload_time = "2023-01-07T11:08:11.254Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646, upload-time = "2023-01-07T11:08:11.254Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload_time = "2023-01-07T11:08:09.864Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" }, ] [[package]] @@ -1113,15 +1113,15 @@ dependencies = [ { name = "scipy" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/8d/0f4af90999ca96cf8cb846eb5ae27c5ef5b390f9c090dd19e4fa76364c13/insightface-0.7.3.tar.gz", hash = "sha256:f191f719612ebb37018f41936814500544cd0f86e6fcd676c023f354c668ddf7", size = 439490, upload_time = "2023-04-02T08:01:54.541Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/8d/0f4af90999ca96cf8cb846eb5ae27c5ef5b390f9c090dd19e4fa76364c13/insightface-0.7.3.tar.gz", hash = "sha256:f191f719612ebb37018f41936814500544cd0f86e6fcd676c023f354c668ddf7", size = 439490, upload-time = "2023-04-02T08:01:54.541Z" } [[package]] name = "itsdangerous" version = "2.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/a1/d3fb83e7a61fa0c0d3d08ad0a94ddbeff3731c05212617dff3a94e097f08/itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a", size = 56143, upload_time = "2022-03-24T15:12:15.102Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/a1/d3fb83e7a61fa0c0d3d08ad0a94ddbeff3731c05212617dff3a94e097f08/itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a", size = 56143, upload-time = "2022-03-24T15:12:15.102Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44", size = 15749, upload_time = "2022-03-24T15:12:13.2Z" }, + { url = "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44", size = 15749, upload-time = "2022-03-24T15:12:13.2Z" }, ] [[package]] @@ -1131,80 +1131,80 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245, upload_time = "2024-05-05T23:42:02.455Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", size = 240245, upload-time = "2024-05-05T23:42:02.455Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271, upload_time = "2024-05-05T23:41:59.928Z" }, + { url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", size = 133271, upload-time = "2024-05-05T23:41:59.928Z" }, ] [[package]] name = "joblib" version = "1.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/0f/d3b33b9f106dddef461f6df1872b7881321b247f3d255b87f61a7636f7fe/joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1", size = 1987720, upload_time = "2023-08-09T09:23:40.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/0f/d3b33b9f106dddef461f6df1872b7881321b247f3d255b87f61a7636f7fe/joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1", size = 1987720, upload-time = "2023-08-09T09:23:40.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/40/d551139c85db202f1f384ba8bcf96aca2f329440a844f924c8a0040b6d02/joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9", size = 302207, upload_time = "2023-08-09T09:23:34.583Z" }, + { url = "https://files.pythonhosted.org/packages/10/40/d551139c85db202f1f384ba8bcf96aca2f329440a844f924c8a0040b6d02/joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9", size = 302207, upload-time = "2023-08-09T09:23:34.583Z" }, ] [[package]] name = "kiwisolver" version = "1.4.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/2d/226779e405724344fc678fcc025b812587617ea1a48b9442628b688e85ea/kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", size = 97552, upload_time = "2023-08-24T09:30:39.861Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2d/226779e405724344fc678fcc025b812587617ea1a48b9442628b688e85ea/kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", size = 97552, upload-time = "2023-08-24T09:30:39.861Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/56/cb02dcefdaab40df636b91e703b172966b444605a0ea313549f3ffc05bd3/kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", size = 127397, upload_time = "2023-08-24T09:28:18.105Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c1/d084f8edb26533a191415d5173157080837341f9a06af9dd1a75f727abb4/kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", size = 68125, upload_time = "2023-08-24T09:28:19.218Z" }, - { url = "https://files.pythonhosted.org/packages/23/11/6fb190bae4b279d712a834e7b1da89f6dcff6791132f7399aa28a57c3565/kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", size = 66211, upload_time = "2023-08-24T09:28:20.241Z" }, - { url = "https://files.pythonhosted.org/packages/b3/13/5e9e52feb33e9e063f76b2c5eb09cb977f5bba622df3210081bfb26ec9a3/kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", size = 1637145, upload_time = "2023-08-24T09:28:21.439Z" }, - { url = "https://files.pythonhosted.org/packages/6f/40/4ab1fdb57fced80ce5903f04ae1aed7c1d5939dda4fd0c0aa526c12fe28a/kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", size = 1617849, upload_time = "2023-08-24T09:28:23.004Z" }, - { url = "https://files.pythonhosted.org/packages/49/ca/61ef43bd0832c7253b370735b0c38972c140c8774889b884372a629a8189/kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", size = 1400921, upload_time = "2023-08-24T09:28:24.331Z" }, - { url = "https://files.pythonhosted.org/packages/68/6f/854f6a845c00b4257482468e08d8bc386f4929ee499206142378ba234419/kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", size = 1513009, upload_time = "2023-08-24T09:28:25.636Z" }, - { url = "https://files.pythonhosted.org/packages/50/65/76f303377167d12eb7a9b423d6771b39fe5c4373e4a42f075805b1f581ae/kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", size = 1444819, upload_time = "2023-08-24T09:28:27.547Z" }, - { url = "https://files.pythonhosted.org/packages/7e/ee/98cdf9dde129551467138b6e18cc1cc901e75ecc7ffb898c6f49609f33b1/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", size = 1817054, upload_time = "2023-08-24T09:28:28.839Z" }, - { url = "https://files.pythonhosted.org/packages/e6/5b/ab569016ec4abc7b496f6cb8a3ab511372c99feb6a23d948cda97e0db6da/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", size = 1918613, upload_time = "2023-08-24T09:28:30.351Z" }, - { url = "https://files.pythonhosted.org/packages/93/ac/39b9f99d2474b1ac7af1ddfe5756ddf9b6a8f24c5f3a32cd4c010317fc6b/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", size = 1872650, upload_time = "2023-08-24T09:28:32.303Z" }, - { url = "https://files.pythonhosted.org/packages/40/5b/be568548266516b114d1776120281ea9236c732fb6032a1f8f3b1e5e921c/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", size = 1827415, upload_time = "2023-08-24T09:28:34.141Z" }, - { url = "https://files.pythonhosted.org/packages/d4/80/c0c13d2a17a12937a19ef378bf35e94399fd171ed6ec05bcee0f038e1eaf/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", size = 1838094, upload_time = "2023-08-24T09:28:35.97Z" }, - { url = "https://files.pythonhosted.org/packages/70/d1/5ab93ee00ca5af708929cc12fbe665b6f1ed4ad58088e70dc00e87e0d107/kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", size = 46585, upload_time = "2023-08-24T09:28:37.326Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a1/8a9c9be45c642fa12954855d8b3a02d9fd8551165a558835a19508fec2e6/kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", size = 56095, upload_time = "2023-08-24T09:28:38.325Z" }, - { url = "https://files.pythonhosted.org/packages/2a/eb/9e099ad7c47c279995d2d20474e1821100a5f10f847739bd65b1c1f02442/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", size = 127403, upload_time = "2023-08-24T09:28:39.3Z" }, - { url = "https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", size = 68156, upload_time = "2023-08-24T09:28:40.301Z" }, - { url = "https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", size = 66166, upload_time = "2023-08-24T09:28:41.235Z" }, - { url = "https://files.pythonhosted.org/packages/f1/68/f472bf16c9141bb1bea5c0b8c66c68fc1ccb048efdbd8f0872b92125724e/kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", size = 1334300, upload_time = "2023-08-24T09:28:42.409Z" }, - { url = "https://files.pythonhosted.org/packages/8d/26/b4569d1f29751fca22ee915b4ebfef5974f4ef239b3335fc072882bd62d9/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", size = 1426579, upload_time = "2023-08-24T09:28:43.677Z" }, - { url = "https://files.pythonhosted.org/packages/f3/a3/804fc7c8bf233806ec0321c9da35971578620f2ab4fafe67d76100b3ce52/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", size = 1541360, upload_time = "2023-08-24T09:28:45.939Z" }, - { url = "https://files.pythonhosted.org/packages/07/ef/286e1d26524854f6fbd6540e8364d67a8857d61038ac743e11edc42fe217/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", size = 1470091, upload_time = "2023-08-24T09:28:47.959Z" }, - { url = "https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", size = 1426259, upload_time = "2023-08-24T09:28:49.224Z" }, - { url = "https://files.pythonhosted.org/packages/d0/f3/a0925611c9d6c2f37c5935a39203cadec6883aa914e013b46c84c4c2e641/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", size = 1847516, upload_time = "2023-08-24T09:28:50.979Z" }, - { url = "https://files.pythonhosted.org/packages/da/85/82d59bb8f7c4c9bb2785138b72462cb1b161668f8230c58bbb28c0403cd5/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", size = 1946228, upload_time = "2023-08-24T09:28:52.812Z" }, - { url = "https://files.pythonhosted.org/packages/34/3c/6a37f444c0233993881e5db3a6a1775925d4d9d2f2609bb325bb1348ed94/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", size = 1901716, upload_time = "2023-08-24T09:28:54.115Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7e/180425790efc00adfd47db14e1e341cb4826516982334129012b971121a6/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", size = 1852871, upload_time = "2023-08-24T09:28:55.433Z" }, - { url = "https://files.pythonhosted.org/packages/1b/9a/13c68b2edb1fa74321e60893a9a5829788e135138e68060cf44e2d92d2c3/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f", size = 1870265, upload_time = "2023-08-24T09:28:56.855Z" }, - { url = "https://files.pythonhosted.org/packages/9f/0a/fa56a0fdee5da2b4c79899c0f6bd1aefb29d9438c2d66430e78793571c6b/kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", size = 46649, upload_time = "2023-08-24T09:28:58.021Z" }, - { url = "https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", size = 56116, upload_time = "2023-08-24T09:28:58.994Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7a/debbce859be1a2711eb8437818107137192007b88d17b5cfdb556f457b42/kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", size = 125484, upload_time = "2023-08-24T09:28:59.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e0/bf8df75ba93b9e035cc6757dd5dcaf63084fdc1c846ae134e818bd7e0f03/kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", size = 67332, upload_time = "2023-08-24T09:29:01.733Z" }, - { url = "https://files.pythonhosted.org/packages/26/61/58bb691f6880588be3a4801d199bd776032ece07203faf3e4a8b377f7d9b/kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", size = 64987, upload_time = "2023-08-24T09:29:02.789Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a3/96ac5413068b237c006f54dd8d70114e8756d70e3da7613c5aef20627e22/kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", size = 1370613, upload_time = "2023-08-24T09:29:03.912Z" }, - { url = "https://files.pythonhosted.org/packages/4d/12/f48539e6e17068b59c7f12f4d6214b973431b8e3ac83af525cafd27cebec/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", size = 1463183, upload_time = "2023-08-24T09:29:05.244Z" }, - { url = "https://files.pythonhosted.org/packages/f3/70/26c99be8eb034cc8e3f62e0760af1fbdc97a842a7cbc252f7978507d41c2/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", size = 1581248, upload_time = "2023-08-24T09:29:06.531Z" }, - { url = "https://files.pythonhosted.org/packages/17/f6/f75f20e543639b09b2de7fc864274a5a9b96cda167a6210a1d9d19306b9d/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", size = 1508815, upload_time = "2023-08-24T09:29:07.867Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d5/bc0f22ac108743062ab703f8d6d71c9c7b077b8839fa358700bfb81770b8/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", size = 1466042, upload_time = "2023-08-24T09:29:09.403Z" }, - { url = "https://files.pythonhosted.org/packages/75/18/98142500f21d6838bcab49ec919414a1f0c6d049d21ddadf139124db6a70/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", size = 1885159, upload_time = "2023-08-24T09:29:10.66Z" }, - { url = "https://files.pythonhosted.org/packages/21/49/a241eff9e0ee013368c1d17957f9d345b0957493c3a43d82ebb558c90b0a/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", size = 1981694, upload_time = "2023-08-24T09:29:12.469Z" }, - { url = "https://files.pythonhosted.org/packages/90/90/9490c3de4788123041b1d600d64434f1eed809a2ce9f688075a22166b289/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", size = 1941579, upload_time = "2023-08-24T09:29:13.743Z" }, - { url = "https://files.pythonhosted.org/packages/b7/bb/a0cc488ef2aa92d7d304318c8549d3ec8dfe6dd3c2c67a44e3922b77bc4f/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", size = 1888168, upload_time = "2023-08-24T09:29:15.097Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e9/9c0de8e45fef3d63f85eed3b1757f9aa511065942866331ef8b99421f433/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", size = 1908464, upload_time = "2023-08-24T09:29:16.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/60/4f0fd50b08f5be536ea0cef518ac7255d9dab43ca40f3b93b60e3ddf80dd/kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", size = 46473, upload_time = "2023-08-24T09:29:17.956Z" }, - { url = "https://files.pythonhosted.org/packages/63/50/2746566bdf4a6a842d117367d05c90cfb87ac04e9e2845aa1fa21f071362/kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", size = 56004, upload_time = "2023-08-24T09:29:19.329Z" }, + { url = "https://files.pythonhosted.org/packages/f1/56/cb02dcefdaab40df636b91e703b172966b444605a0ea313549f3ffc05bd3/kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", size = 127397, upload-time = "2023-08-24T09:28:18.105Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c1/d084f8edb26533a191415d5173157080837341f9a06af9dd1a75f727abb4/kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", size = 68125, upload-time = "2023-08-24T09:28:19.218Z" }, + { url = "https://files.pythonhosted.org/packages/23/11/6fb190bae4b279d712a834e7b1da89f6dcff6791132f7399aa28a57c3565/kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", size = 66211, upload-time = "2023-08-24T09:28:20.241Z" }, + { url = "https://files.pythonhosted.org/packages/b3/13/5e9e52feb33e9e063f76b2c5eb09cb977f5bba622df3210081bfb26ec9a3/kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", size = 1637145, upload-time = "2023-08-24T09:28:21.439Z" }, + { url = "https://files.pythonhosted.org/packages/6f/40/4ab1fdb57fced80ce5903f04ae1aed7c1d5939dda4fd0c0aa526c12fe28a/kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", size = 1617849, upload-time = "2023-08-24T09:28:23.004Z" }, + { url = "https://files.pythonhosted.org/packages/49/ca/61ef43bd0832c7253b370735b0c38972c140c8774889b884372a629a8189/kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", size = 1400921, upload-time = "2023-08-24T09:28:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/68/6f/854f6a845c00b4257482468e08d8bc386f4929ee499206142378ba234419/kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", size = 1513009, upload-time = "2023-08-24T09:28:25.636Z" }, + { url = "https://files.pythonhosted.org/packages/50/65/76f303377167d12eb7a9b423d6771b39fe5c4373e4a42f075805b1f581ae/kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", size = 1444819, upload-time = "2023-08-24T09:28:27.547Z" }, + { url = "https://files.pythonhosted.org/packages/7e/ee/98cdf9dde129551467138b6e18cc1cc901e75ecc7ffb898c6f49609f33b1/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", size = 1817054, upload-time = "2023-08-24T09:28:28.839Z" }, + { url = "https://files.pythonhosted.org/packages/e6/5b/ab569016ec4abc7b496f6cb8a3ab511372c99feb6a23d948cda97e0db6da/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", size = 1918613, upload-time = "2023-08-24T09:28:30.351Z" }, + { url = "https://files.pythonhosted.org/packages/93/ac/39b9f99d2474b1ac7af1ddfe5756ddf9b6a8f24c5f3a32cd4c010317fc6b/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", size = 1872650, upload-time = "2023-08-24T09:28:32.303Z" }, + { url = "https://files.pythonhosted.org/packages/40/5b/be568548266516b114d1776120281ea9236c732fb6032a1f8f3b1e5e921c/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", size = 1827415, upload-time = "2023-08-24T09:28:34.141Z" }, + { url = "https://files.pythonhosted.org/packages/d4/80/c0c13d2a17a12937a19ef378bf35e94399fd171ed6ec05bcee0f038e1eaf/kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", size = 1838094, upload-time = "2023-08-24T09:28:35.97Z" }, + { url = "https://files.pythonhosted.org/packages/70/d1/5ab93ee00ca5af708929cc12fbe665b6f1ed4ad58088e70dc00e87e0d107/kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", size = 46585, upload-time = "2023-08-24T09:28:37.326Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a1/8a9c9be45c642fa12954855d8b3a02d9fd8551165a558835a19508fec2e6/kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", size = 56095, upload-time = "2023-08-24T09:28:38.325Z" }, + { url = "https://files.pythonhosted.org/packages/2a/eb/9e099ad7c47c279995d2d20474e1821100a5f10f847739bd65b1c1f02442/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", size = 127403, upload-time = "2023-08-24T09:28:39.3Z" }, + { url = "https://files.pythonhosted.org/packages/a6/94/695922e71288855fc7cace3bdb52edda9d7e50edba77abb0c9d7abb51e96/kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", size = 68156, upload-time = "2023-08-24T09:28:40.301Z" }, + { url = "https://files.pythonhosted.org/packages/4a/fe/23d7fa78f7c66086d196406beb1fb2eaf629dd7adc01c3453033303d17fa/kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", size = 66166, upload-time = "2023-08-24T09:28:41.235Z" }, + { url = "https://files.pythonhosted.org/packages/f1/68/f472bf16c9141bb1bea5c0b8c66c68fc1ccb048efdbd8f0872b92125724e/kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", size = 1334300, upload-time = "2023-08-24T09:28:42.409Z" }, + { url = "https://files.pythonhosted.org/packages/8d/26/b4569d1f29751fca22ee915b4ebfef5974f4ef239b3335fc072882bd62d9/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", size = 1426579, upload-time = "2023-08-24T09:28:43.677Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a3/804fc7c8bf233806ec0321c9da35971578620f2ab4fafe67d76100b3ce52/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", size = 1541360, upload-time = "2023-08-24T09:28:45.939Z" }, + { url = "https://files.pythonhosted.org/packages/07/ef/286e1d26524854f6fbd6540e8364d67a8857d61038ac743e11edc42fe217/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", size = 1470091, upload-time = "2023-08-24T09:28:47.959Z" }, + { url = "https://files.pythonhosted.org/packages/17/ba/17a706b232308e65f57deeccae503c268292e6a091313f6ce833a23093ea/kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", size = 1426259, upload-time = "2023-08-24T09:28:49.224Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f3/a0925611c9d6c2f37c5935a39203cadec6883aa914e013b46c84c4c2e641/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", size = 1847516, upload-time = "2023-08-24T09:28:50.979Z" }, + { url = "https://files.pythonhosted.org/packages/da/85/82d59bb8f7c4c9bb2785138b72462cb1b161668f8230c58bbb28c0403cd5/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", size = 1946228, upload-time = "2023-08-24T09:28:52.812Z" }, + { url = "https://files.pythonhosted.org/packages/34/3c/6a37f444c0233993881e5db3a6a1775925d4d9d2f2609bb325bb1348ed94/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", size = 1901716, upload-time = "2023-08-24T09:28:54.115Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7e/180425790efc00adfd47db14e1e341cb4826516982334129012b971121a6/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", size = 1852871, upload-time = "2023-08-24T09:28:55.433Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9a/13c68b2edb1fa74321e60893a9a5829788e135138e68060cf44e2d92d2c3/kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f", size = 1870265, upload-time = "2023-08-24T09:28:56.855Z" }, + { url = "https://files.pythonhosted.org/packages/9f/0a/fa56a0fdee5da2b4c79899c0f6bd1aefb29d9438c2d66430e78793571c6b/kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", size = 46649, upload-time = "2023-08-24T09:28:58.021Z" }, + { url = "https://files.pythonhosted.org/packages/1e/37/d3c2d4ba2719059a0f12730947bbe1ad5ee8bff89e8c35319dcb2c9ddb4c/kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", size = 56116, upload-time = "2023-08-24T09:28:58.994Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7a/debbce859be1a2711eb8437818107137192007b88d17b5cfdb556f457b42/kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", size = 125484, upload-time = "2023-08-24T09:28:59.975Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e0/bf8df75ba93b9e035cc6757dd5dcaf63084fdc1c846ae134e818bd7e0f03/kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", size = 67332, upload-time = "2023-08-24T09:29:01.733Z" }, + { url = "https://files.pythonhosted.org/packages/26/61/58bb691f6880588be3a4801d199bd776032ece07203faf3e4a8b377f7d9b/kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", size = 64987, upload-time = "2023-08-24T09:29:02.789Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a3/96ac5413068b237c006f54dd8d70114e8756d70e3da7613c5aef20627e22/kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", size = 1370613, upload-time = "2023-08-24T09:29:03.912Z" }, + { url = "https://files.pythonhosted.org/packages/4d/12/f48539e6e17068b59c7f12f4d6214b973431b8e3ac83af525cafd27cebec/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", size = 1463183, upload-time = "2023-08-24T09:29:05.244Z" }, + { url = "https://files.pythonhosted.org/packages/f3/70/26c99be8eb034cc8e3f62e0760af1fbdc97a842a7cbc252f7978507d41c2/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", size = 1581248, upload-time = "2023-08-24T09:29:06.531Z" }, + { url = "https://files.pythonhosted.org/packages/17/f6/f75f20e543639b09b2de7fc864274a5a9b96cda167a6210a1d9d19306b9d/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", size = 1508815, upload-time = "2023-08-24T09:29:07.867Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d5/bc0f22ac108743062ab703f8d6d71c9c7b077b8839fa358700bfb81770b8/kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", size = 1466042, upload-time = "2023-08-24T09:29:09.403Z" }, + { url = "https://files.pythonhosted.org/packages/75/18/98142500f21d6838bcab49ec919414a1f0c6d049d21ddadf139124db6a70/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", size = 1885159, upload-time = "2023-08-24T09:29:10.66Z" }, + { url = "https://files.pythonhosted.org/packages/21/49/a241eff9e0ee013368c1d17957f9d345b0957493c3a43d82ebb558c90b0a/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", size = 1981694, upload-time = "2023-08-24T09:29:12.469Z" }, + { url = "https://files.pythonhosted.org/packages/90/90/9490c3de4788123041b1d600d64434f1eed809a2ce9f688075a22166b289/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", size = 1941579, upload-time = "2023-08-24T09:29:13.743Z" }, + { url = "https://files.pythonhosted.org/packages/b7/bb/a0cc488ef2aa92d7d304318c8549d3ec8dfe6dd3c2c67a44e3922b77bc4f/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", size = 1888168, upload-time = "2023-08-24T09:29:15.097Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e9/9c0de8e45fef3d63f85eed3b1757f9aa511065942866331ef8b99421f433/kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", size = 1908464, upload-time = "2023-08-24T09:29:16.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/60/4f0fd50b08f5be536ea0cef518ac7255d9dab43ca40f3b93b60e3ddf80dd/kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", size = 46473, upload-time = "2023-08-24T09:29:17.956Z" }, + { url = "https://files.pythonhosted.org/packages/63/50/2746566bdf4a6a842d117367d05c90cfb87ac04e9e2845aa1fa21f071362/kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", size = 56004, upload-time = "2023-08-24T09:29:19.329Z" }, ] [[package]] name = "lazy-loader" version = "0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0e/3a/1630a735bfdf9eb857a3b9a53317a1e1658ea97a1b4b39dcb0f71dae81f8/lazy_loader-0.3.tar.gz", hash = "sha256:3b68898e34f5b2a29daaaac172c6555512d0f32074f147e2254e4a6d9d838f37", size = 12268, upload_time = "2023-06-30T21:12:55.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0e/3a/1630a735bfdf9eb857a3b9a53317a1e1658ea97a1b4b39dcb0f71dae81f8/lazy_loader-0.3.tar.gz", hash = "sha256:3b68898e34f5b2a29daaaac172c6555512d0f32074f147e2254e4a6d9d838f37", size = 12268, upload-time = "2023-06-30T21:12:55.362Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/c3/65b3814e155836acacf720e5be3b5757130346670ac454fee29d3eda1381/lazy_loader-0.3-py3-none-any.whl", hash = "sha256:1e9e76ee8631e264c62ce10006718e80b2cfc74340d17d1031e0f84af7478554", size = 9087, upload_time = "2023-06-30T21:12:51.09Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c3/65b3814e155836acacf720e5be3b5757130346670ac454fee29d3eda1381/lazy_loader-0.3-py3-none-any.whl", hash = "sha256:1e9e76ee8631e264c62ce10006718e80b2cfc74340d17d1031e0f84af7478554", size = 9087, upload-time = "2023-06-30T21:12:51.09Z" }, ] [[package]] @@ -1229,9 +1229,9 @@ dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, { name = "werkzeug" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/90/55d4fbc8911e5e6ec4072caaca9e8b7b2b11279435c0d1330c9966b0c898/locust-2.36.2.tar.gz", hash = "sha256:604aff7535f5a83b7f666d32373b2dc74ad260c7c3d1dc274f4c82844be72eb6", size = 2251110, upload_time = "2025-04-25T14:03:35.919Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/90/55d4fbc8911e5e6ec4072caaca9e8b7b2b11279435c0d1330c9966b0c898/locust-2.36.2.tar.gz", hash = "sha256:604aff7535f5a83b7f666d32373b2dc74ad260c7c3d1dc274f4c82844be72eb6", size = 2251110, upload-time = "2025-04-25T14:03:35.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/f5/99dab104be69122eee3513dcdc6e0b32d59ca1f4cfd8715470c5f3aa7643/locust-2.36.2-py3-none-any.whl", hash = "sha256:74239f493f44035b25a87a0665deadf41d213b3dcd45774398e511dec15e26eb", size = 2267937, upload_time = "2025-04-25T14:03:33.671Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f5/99dab104be69122eee3513dcdc6e0b32d59ca1f4cfd8715470c5f3aa7643/locust-2.36.2-py3-none-any.whl", hash = "sha256:74239f493f44035b25a87a0665deadf41d213b3dcd45774398e511dec15e26eb", size = 2267937, upload-time = "2025-04-25T14:03:33.671Z" }, ] [[package]] @@ -1245,9 +1245,9 @@ dependencies = [ { name = "python-socketio", extra = ["client"] }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/47/1ec2478f3d4e526fb8d667b01a75b22093b2e66aea665b5369dd656ceec9/locust_cloud-1.20.7.tar.gz", hash = "sha256:24c16b767adffab51b97f489bcf142e16e2439354fb4296ecbb3e87ad20e220a", size = 448622, upload_time = "2025-04-28T11:01:49.381Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/47/1ec2478f3d4e526fb8d667b01a75b22093b2e66aea665b5369dd656ceec9/locust_cloud-1.20.7.tar.gz", hash = "sha256:24c16b767adffab51b97f489bcf142e16e2439354fb4296ecbb3e87ad20e220a", size = 448622, upload-time = "2025-04-28T11:01:49.381Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/07/62b5b174c77d4281235405f1ffd439f12a877e434e007a24a5299c461e39/locust_cloud-1.20.7-py3-none-any.whl", hash = "sha256:f38214e77993d0ee87114dafa857e1689789ed4bfe4ae57c2b9dc754674f08bc", size = 406619, upload_time = "2025-04-28T11:01:43.135Z" }, + { url = "https://files.pythonhosted.org/packages/8c/07/62b5b174c77d4281235405f1ffd439f12a877e434e007a24a5299c461e39/locust_cloud-1.20.7-py3-none-any.whl", hash = "sha256:f38214e77993d0ee87114dafa857e1689789ed4bfe4ae57c2b9dc754674f08bc", size = 406619, upload-time = "2025-04-28T11:01:43.135Z" }, ] [[package]] @@ -1257,47 +1257,47 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markupsafe" version = "2.1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/7c/59a3248f411813f8ccba92a55feaac4bf360d29e2ff05ee7d8e1ef2d7dbf/MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", size = 19132, upload_time = "2023-06-02T21:43:45.578Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/7c/59a3248f411813f8ccba92a55feaac4bf360d29e2ff05ee7d8e1ef2d7dbf/MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", size = 19132, upload-time = "2023-06-02T21:43:45.578Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/1d/713d443799d935f4d26a4f1510c9e61b1d288592fb869845e5cc92a1e055/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", size = 17846, upload_time = "2023-06-02T21:42:33.954Z" }, - { url = "https://files.pythonhosted.org/packages/f7/9c/86cbd8e0e1d81f0ba420f20539dd459c50537c7751e28102dbfee2b6f28c/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", size = 13720, upload_time = "2023-06-02T21:42:35.102Z" }, - { url = "https://files.pythonhosted.org/packages/a6/56/f1d4ee39e898a9e63470cbb7fae1c58cce6874f25f54220b89213a47f273/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", size = 26498, upload_time = "2023-06-02T21:42:36.608Z" }, - { url = "https://files.pythonhosted.org/packages/12/b3/d9ed2c0971e1435b8a62354b18d3060b66c8cb1d368399ec0b9baa7c0ee5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", size = 25691, upload_time = "2023-06-02T21:42:37.778Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b7/c5ba9b7ad9ad21fc4a60df226615cf43ead185d328b77b0327d603d00cc5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", size = 25366, upload_time = "2023-06-02T21:42:39.441Z" }, - { url = "https://files.pythonhosted.org/packages/71/61/f5673d7aac2cf7f203859008bb3fc2b25187aa330067c5e9955e5c5ebbab/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", size = 30505, upload_time = "2023-06-02T21:42:41.088Z" }, - { url = "https://files.pythonhosted.org/packages/47/26/932140621773bfd4df3223fbdd9e78de3477f424f0d2987c313b1cb655ff/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", size = 29616, upload_time = "2023-06-02T21:42:42.273Z" }, - { url = "https://files.pythonhosted.org/packages/3c/c8/74d13c999cbb49e3460bf769025659a37ef4a8e884de629720ab4e42dcdb/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", size = 29891, upload_time = "2023-06-02T21:42:43.635Z" }, - { url = "https://files.pythonhosted.org/packages/96/e4/4db3b1abc5a1fe7295aa0683eafd13832084509c3b8236f3faf8dd4eff75/MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", size = 16525, upload_time = "2023-06-02T21:42:45.271Z" }, - { url = "https://files.pythonhosted.org/packages/84/a8/c4aebb8a14a1d39d5135eb8233a0b95831cdc42c4088358449c3ed657044/MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", size = 17083, upload_time = "2023-06-02T21:42:46.948Z" }, - { url = "https://files.pythonhosted.org/packages/fe/09/c31503cb8150cf688c1534a7135cc39bb9092f8e0e6369ec73494d16ee0e/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", size = 17862, upload_time = "2023-06-02T21:42:48.569Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c7/171f5ac6b065e1425e8fabf4a4dfbeca76fd8070072c6a41bd5c07d90d8b/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", size = 13738, upload_time = "2023-06-02T21:42:49.727Z" }, - { url = "https://files.pythonhosted.org/packages/a2/f7/9175ad1b8152092f7c3b78c513c1bdfe9287e0564447d1c2d3d1a2471540/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", size = 28891, upload_time = "2023-06-02T21:42:51.33Z" }, - { url = "https://files.pythonhosted.org/packages/fe/21/2eff1de472ca6c99ec3993eab11308787b9879af9ca8bbceb4868cf4f2ca/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", size = 28096, upload_time = "2023-06-02T21:42:52.966Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a0/103f94793c3bf829a18d2415117334ece115aeca56f2df1c47fa02c6dbd6/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", size = 27631, upload_time = "2023-06-02T21:42:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/43/70/f24470f33b2035b035ef0c0ffebf57006beb2272cf3df068fc5154e04ead/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", size = 33863, upload_time = "2023-06-02T21:42:55.777Z" }, - { url = "https://files.pythonhosted.org/packages/32/d4/ce98c4ca713d91c4a17c1a184785cc00b9e9c25699d618956c2b9999500a/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", size = 32591, upload_time = "2023-06-02T21:42:57.415Z" }, - { url = "https://files.pythonhosted.org/packages/bb/82/f88ccb3ca6204a4536cf7af5abdad7c3657adac06ab33699aa67279e0744/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", size = 33186, upload_time = "2023-06-02T21:42:59.107Z" }, - { url = "https://files.pythonhosted.org/packages/44/53/93405d37bb04a10c43b1bdd6f548097478d494d7eadb4b364e3e1337f0cc/MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", size = 16537, upload_time = "2023-06-02T21:43:00.927Z" }, - { url = "https://files.pythonhosted.org/packages/be/bb/08b85bc194034efbf572e70c3951549c8eca0ada25363afc154386b5390a/MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", size = 17089, upload_time = "2023-06-02T21:43:02.355Z" }, - { url = "https://files.pythonhosted.org/packages/89/5a/ee546f2aa73a1d6fcfa24272f356fe06d29acca81e76b8d32ca53e429a2e/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", size = 17849, upload_time = "2023-09-07T16:00:43.795Z" }, - { url = "https://files.pythonhosted.org/packages/3a/72/9f683a059bde096776e8acf9aa34cbbba21ddc399861fe3953790d4f2cde/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", size = 13700, upload_time = "2023-09-07T16:00:45.384Z" }, - { url = "https://files.pythonhosted.org/packages/9d/78/92f15eb9b1e8f1668a9787ba103cf6f8d19a9efed8150245404836145c24/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11", size = 29319, upload_time = "2023-09-07T16:00:46.48Z" }, - { url = "https://files.pythonhosted.org/packages/51/94/9a04085114ff2c24f7424dbc890a281d73c5a74ea935dc2e69c66a3bd558/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", size = 28314, upload_time = "2023-09-07T16:00:47.64Z" }, - { url = "https://files.pythonhosted.org/packages/ec/53/fcb3214bd370185e223b209ce6bb010fb887ea57173ca4f75bd211b24e10/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", size = 27696, upload_time = "2023-09-07T16:00:48.92Z" }, - { url = "https://files.pythonhosted.org/packages/e7/33/54d29854716725d7826079b8984dd235fac76dab1c32321e555d493e61f5/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", size = 33746, upload_time = "2023-09-07T16:00:50.081Z" }, - { url = "https://files.pythonhosted.org/packages/11/40/ea7f85e2681d29bc9301c757257de561923924f24de1802d9c3baa396bb4/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", size = 32131, upload_time = "2023-09-07T16:00:51.822Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/bc770c37ecd58638c18f8ec85df205dacb818ccf933692082fd93010a4bc/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", size = 32878, upload_time = "2023-09-07T16:00:53.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/74/bf95630aab0a9ed6a67556cd4e54f6aeb0e74f4cb0fd2f229154873a4be4/MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", size = 16426, upload_time = "2023-09-07T16:00:55.987Z" }, - { url = "https://files.pythonhosted.org/packages/44/44/dbaf65876e258facd65f586dde158387ab89963e7f2235551afc9c2e24c2/MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", size = 16979, upload_time = "2023-09-07T16:00:57.77Z" }, + { url = "https://files.pythonhosted.org/packages/20/1d/713d443799d935f4d26a4f1510c9e61b1d288592fb869845e5cc92a1e055/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", size = 17846, upload-time = "2023-06-02T21:42:33.954Z" }, + { url = "https://files.pythonhosted.org/packages/f7/9c/86cbd8e0e1d81f0ba420f20539dd459c50537c7751e28102dbfee2b6f28c/MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", size = 13720, upload-time = "2023-06-02T21:42:35.102Z" }, + { url = "https://files.pythonhosted.org/packages/a6/56/f1d4ee39e898a9e63470cbb7fae1c58cce6874f25f54220b89213a47f273/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", size = 26498, upload-time = "2023-06-02T21:42:36.608Z" }, + { url = "https://files.pythonhosted.org/packages/12/b3/d9ed2c0971e1435b8a62354b18d3060b66c8cb1d368399ec0b9baa7c0ee5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", size = 25691, upload-time = "2023-06-02T21:42:37.778Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b7/c5ba9b7ad9ad21fc4a60df226615cf43ead185d328b77b0327d603d00cc5/MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", size = 25366, upload-time = "2023-06-02T21:42:39.441Z" }, + { url = "https://files.pythonhosted.org/packages/71/61/f5673d7aac2cf7f203859008bb3fc2b25187aa330067c5e9955e5c5ebbab/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", size = 30505, upload-time = "2023-06-02T21:42:41.088Z" }, + { url = "https://files.pythonhosted.org/packages/47/26/932140621773bfd4df3223fbdd9e78de3477f424f0d2987c313b1cb655ff/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", size = 29616, upload-time = "2023-06-02T21:42:42.273Z" }, + { url = "https://files.pythonhosted.org/packages/3c/c8/74d13c999cbb49e3460bf769025659a37ef4a8e884de629720ab4e42dcdb/MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", size = 29891, upload-time = "2023-06-02T21:42:43.635Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/4db3b1abc5a1fe7295aa0683eafd13832084509c3b8236f3faf8dd4eff75/MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", size = 16525, upload-time = "2023-06-02T21:42:45.271Z" }, + { url = "https://files.pythonhosted.org/packages/84/a8/c4aebb8a14a1d39d5135eb8233a0b95831cdc42c4088358449c3ed657044/MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", size = 17083, upload-time = "2023-06-02T21:42:46.948Z" }, + { url = "https://files.pythonhosted.org/packages/fe/09/c31503cb8150cf688c1534a7135cc39bb9092f8e0e6369ec73494d16ee0e/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", size = 17862, upload-time = "2023-06-02T21:42:48.569Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/171f5ac6b065e1425e8fabf4a4dfbeca76fd8070072c6a41bd5c07d90d8b/MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", size = 13738, upload-time = "2023-06-02T21:42:49.727Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f7/9175ad1b8152092f7c3b78c513c1bdfe9287e0564447d1c2d3d1a2471540/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", size = 28891, upload-time = "2023-06-02T21:42:51.33Z" }, + { url = "https://files.pythonhosted.org/packages/fe/21/2eff1de472ca6c99ec3993eab11308787b9879af9ca8bbceb4868cf4f2ca/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", size = 28096, upload-time = "2023-06-02T21:42:52.966Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a0/103f94793c3bf829a18d2415117334ece115aeca56f2df1c47fa02c6dbd6/MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", size = 27631, upload-time = "2023-06-02T21:42:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/43/70/f24470f33b2035b035ef0c0ffebf57006beb2272cf3df068fc5154e04ead/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", size = 33863, upload-time = "2023-06-02T21:42:55.777Z" }, + { url = "https://files.pythonhosted.org/packages/32/d4/ce98c4ca713d91c4a17c1a184785cc00b9e9c25699d618956c2b9999500a/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", size = 32591, upload-time = "2023-06-02T21:42:57.415Z" }, + { url = "https://files.pythonhosted.org/packages/bb/82/f88ccb3ca6204a4536cf7af5abdad7c3657adac06ab33699aa67279e0744/MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", size = 33186, upload-time = "2023-06-02T21:42:59.107Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/93405d37bb04a10c43b1bdd6f548097478d494d7eadb4b364e3e1337f0cc/MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", size = 16537, upload-time = "2023-06-02T21:43:00.927Z" }, + { url = "https://files.pythonhosted.org/packages/be/bb/08b85bc194034efbf572e70c3951549c8eca0ada25363afc154386b5390a/MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", size = 17089, upload-time = "2023-06-02T21:43:02.355Z" }, + { url = "https://files.pythonhosted.org/packages/89/5a/ee546f2aa73a1d6fcfa24272f356fe06d29acca81e76b8d32ca53e429a2e/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", size = 17849, upload-time = "2023-09-07T16:00:43.795Z" }, + { url = "https://files.pythonhosted.org/packages/3a/72/9f683a059bde096776e8acf9aa34cbbba21ddc399861fe3953790d4f2cde/MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", size = 13700, upload-time = "2023-09-07T16:00:45.384Z" }, + { url = "https://files.pythonhosted.org/packages/9d/78/92f15eb9b1e8f1668a9787ba103cf6f8d19a9efed8150245404836145c24/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11", size = 29319, upload-time = "2023-09-07T16:00:46.48Z" }, + { url = "https://files.pythonhosted.org/packages/51/94/9a04085114ff2c24f7424dbc890a281d73c5a74ea935dc2e69c66a3bd558/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", size = 28314, upload-time = "2023-09-07T16:00:47.64Z" }, + { url = "https://files.pythonhosted.org/packages/ec/53/fcb3214bd370185e223b209ce6bb010fb887ea57173ca4f75bd211b24e10/MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", size = 27696, upload-time = "2023-09-07T16:00:48.92Z" }, + { url = "https://files.pythonhosted.org/packages/e7/33/54d29854716725d7826079b8984dd235fac76dab1c32321e555d493e61f5/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", size = 33746, upload-time = "2023-09-07T16:00:50.081Z" }, + { url = "https://files.pythonhosted.org/packages/11/40/ea7f85e2681d29bc9301c757257de561923924f24de1802d9c3baa396bb4/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", size = 32131, upload-time = "2023-09-07T16:00:51.822Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/bc770c37ecd58638c18f8ec85df205dacb818ccf933692082fd93010a4bc/MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", size = 32878, upload-time = "2023-09-07T16:00:53.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/74/bf95630aab0a9ed6a67556cd4e54f6aeb0e74f4cb0fd2f229154873a4be4/MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", size = 16426, upload-time = "2023-09-07T16:00:55.987Z" }, + { url = "https://files.pythonhosted.org/packages/44/44/dbaf65876e258facd65f586dde158387ab89963e7f2235551afc9c2e24c2/MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", size = 16979, upload-time = "2023-09-07T16:00:57.77Z" }, ] [[package]] @@ -1315,85 +1315,85 @@ dependencies = [ { name = "pyparsing" }, { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/ab/38a0e94cb01dacb50f06957c2bed1c83b8f9dac6618988a37b2487862944/matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1", size = 35866957, upload_time = "2023-11-17T21:16:40.15Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/ab/38a0e94cb01dacb50f06957c2bed1c83b8f9dac6618988a37b2487862944/matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1", size = 35866957, upload-time = "2023-11-17T21:16:40.15Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/92/d0/fc5f6796a1956f5b9a33555611d01a3cec038f000c3d70ecb051b1631ac4/matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7", size = 7590640, upload_time = "2023-11-17T21:17:02.834Z" }, - { url = "https://files.pythonhosted.org/packages/57/44/007b592809f50883c910db9ec4b81b16dfa0136407250fb581824daabf03/matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367", size = 7484350, upload_time = "2023-11-17T21:17:12.281Z" }, - { url = "https://files.pythonhosted.org/packages/01/87/c7b24f3048234fe10184560263be2173311376dc3d1fa329de7f012d6ce5/matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18", size = 11382388, upload_time = "2023-11-17T21:17:26.461Z" }, - { url = "https://files.pythonhosted.org/packages/19/e5/a4ea514515f270224435c69359abb7a3d152ed31b9ee3ba5e63017461945/matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31", size = 11611959, upload_time = "2023-11-17T21:17:40.541Z" }, - { url = "https://files.pythonhosted.org/packages/09/23/ab5a562c9acb81e351b084bea39f65b153918417fb434619cf5a19f44a55/matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a", size = 9536938, upload_time = "2023-11-17T21:17:49.925Z" }, - { url = "https://files.pythonhosted.org/packages/46/37/b5e27ab30ecc0a3694c8a78287b5ef35dad0c3095c144fcc43081170bfd6/matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a", size = 7643836, upload_time = "2023-11-17T21:17:58.379Z" }, - { url = "https://files.pythonhosted.org/packages/a9/0d/53afb186adafc7326d093b8333e8a79974c495095771659f4304626c4bc7/matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63", size = 7593458, upload_time = "2023-11-17T21:18:06.141Z" }, - { url = "https://files.pythonhosted.org/packages/ce/25/a557ee10ac9dce1300850024707ce1850a6958f1673a9194be878b99d631/matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8", size = 7486840, upload_time = "2023-11-17T21:18:13.706Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3d/72712b3895ee180f6e342638a8591c31912fbcc09ce9084cc256da16d0a0/matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6", size = 11387332, upload_time = "2023-11-17T21:18:23.699Z" }, - { url = "https://files.pythonhosted.org/packages/92/1a/cd3e0c90d1a763ad90073e13b189b4702f11becf4e71dbbad70a7a149811/matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788", size = 11616911, upload_time = "2023-11-17T21:18:35.27Z" }, - { url = "https://files.pythonhosted.org/packages/78/4a/bad239071477305a3758eb4810615e310a113399cddd7682998be9f01e97/matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0", size = 9549260, upload_time = "2023-11-17T21:18:44.836Z" }, - { url = "https://files.pythonhosted.org/packages/26/5a/27fd341e4510257789f19a4b4be8bb90d1113b8f176c3dab562b4f21466e/matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717", size = 7645742, upload_time = "2023-11-17T21:18:53.448Z" }, - { url = "https://files.pythonhosted.org/packages/e4/1b/864d28d5a72d586ac137f4ca54d5afc8b869720e30d508dbd9adcce4d231/matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627", size = 7590988, upload_time = "2023-11-17T21:19:01.119Z" }, - { url = "https://files.pythonhosted.org/packages/9a/b0/dd2b60f2dd90fbc21d1d3129c36a453c322d7995d5e3589f5b3c59ee528d/matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4", size = 7483594, upload_time = "2023-11-17T21:19:09.865Z" }, - { url = "https://files.pythonhosted.org/packages/33/da/9942533ad9f96753bde0e5a5d48eacd6c21de8ea1ad16570e31bda8a017f/matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d", size = 11380843, upload_time = "2023-11-17T21:19:20.46Z" }, - { url = "https://files.pythonhosted.org/packages/fc/52/bfd36eb4745a3b21b3946c2c3a15679b620e14574fe2b98e9451b65ef578/matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331", size = 11604608, upload_time = "2023-11-17T21:19:31.363Z" }, - { url = "https://files.pythonhosted.org/packages/6d/8c/0cdfbf604d4ea3dfa77435176c51e233cc408ad8f3efbf8d2c9f57cbdafb/matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213", size = 9545252, upload_time = "2023-11-17T21:19:42.271Z" }, - { url = "https://files.pythonhosted.org/packages/2e/51/c77a14869b7eb9d6fb440e811b754fc3950d6868c38ace57d0632b674415/matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630", size = 7645067, upload_time = "2023-11-17T21:19:50.091Z" }, + { url = "https://files.pythonhosted.org/packages/92/d0/fc5f6796a1956f5b9a33555611d01a3cec038f000c3d70ecb051b1631ac4/matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7", size = 7590640, upload-time = "2023-11-17T21:17:02.834Z" }, + { url = "https://files.pythonhosted.org/packages/57/44/007b592809f50883c910db9ec4b81b16dfa0136407250fb581824daabf03/matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367", size = 7484350, upload-time = "2023-11-17T21:17:12.281Z" }, + { url = "https://files.pythonhosted.org/packages/01/87/c7b24f3048234fe10184560263be2173311376dc3d1fa329de7f012d6ce5/matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18", size = 11382388, upload-time = "2023-11-17T21:17:26.461Z" }, + { url = "https://files.pythonhosted.org/packages/19/e5/a4ea514515f270224435c69359abb7a3d152ed31b9ee3ba5e63017461945/matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31", size = 11611959, upload-time = "2023-11-17T21:17:40.541Z" }, + { url = "https://files.pythonhosted.org/packages/09/23/ab5a562c9acb81e351b084bea39f65b153918417fb434619cf5a19f44a55/matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a", size = 9536938, upload-time = "2023-11-17T21:17:49.925Z" }, + { url = "https://files.pythonhosted.org/packages/46/37/b5e27ab30ecc0a3694c8a78287b5ef35dad0c3095c144fcc43081170bfd6/matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a", size = 7643836, upload-time = "2023-11-17T21:17:58.379Z" }, + { url = "https://files.pythonhosted.org/packages/a9/0d/53afb186adafc7326d093b8333e8a79974c495095771659f4304626c4bc7/matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63", size = 7593458, upload-time = "2023-11-17T21:18:06.141Z" }, + { url = "https://files.pythonhosted.org/packages/ce/25/a557ee10ac9dce1300850024707ce1850a6958f1673a9194be878b99d631/matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8", size = 7486840, upload-time = "2023-11-17T21:18:13.706Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3d/72712b3895ee180f6e342638a8591c31912fbcc09ce9084cc256da16d0a0/matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6", size = 11387332, upload-time = "2023-11-17T21:18:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/92/1a/cd3e0c90d1a763ad90073e13b189b4702f11becf4e71dbbad70a7a149811/matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788", size = 11616911, upload-time = "2023-11-17T21:18:35.27Z" }, + { url = "https://files.pythonhosted.org/packages/78/4a/bad239071477305a3758eb4810615e310a113399cddd7682998be9f01e97/matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0", size = 9549260, upload-time = "2023-11-17T21:18:44.836Z" }, + { url = "https://files.pythonhosted.org/packages/26/5a/27fd341e4510257789f19a4b4be8bb90d1113b8f176c3dab562b4f21466e/matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717", size = 7645742, upload-time = "2023-11-17T21:18:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1b/864d28d5a72d586ac137f4ca54d5afc8b869720e30d508dbd9adcce4d231/matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627", size = 7590988, upload-time = "2023-11-17T21:19:01.119Z" }, + { url = "https://files.pythonhosted.org/packages/9a/b0/dd2b60f2dd90fbc21d1d3129c36a453c322d7995d5e3589f5b3c59ee528d/matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4", size = 7483594, upload-time = "2023-11-17T21:19:09.865Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/9942533ad9f96753bde0e5a5d48eacd6c21de8ea1ad16570e31bda8a017f/matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d", size = 11380843, upload-time = "2023-11-17T21:19:20.46Z" }, + { url = "https://files.pythonhosted.org/packages/fc/52/bfd36eb4745a3b21b3946c2c3a15679b620e14574fe2b98e9451b65ef578/matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331", size = 11604608, upload-time = "2023-11-17T21:19:31.363Z" }, + { url = "https://files.pythonhosted.org/packages/6d/8c/0cdfbf604d4ea3dfa77435176c51e233cc408ad8f3efbf8d2c9f57cbdafb/matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213", size = 9545252, upload-time = "2023-11-17T21:19:42.271Z" }, + { url = "https://files.pythonhosted.org/packages/2e/51/c77a14869b7eb9d6fb440e811b754fc3950d6868c38ace57d0632b674415/matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630", size = 7645067, upload-time = "2023-11-17T21:19:50.091Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "mpmath" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload_time = "2023-03-07T16:47:11.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload_time = "2023-03-07T16:47:09.197Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, ] [[package]] name = "msgpack" version = "1.0.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c2/d5/5662032db1571110b5b51647aed4b56dfbd01bfae789fa566a2be1f385d1/msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87", size = 166311, upload_time = "2023-09-28T13:20:36.726Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/d5/5662032db1571110b5b51647aed4b56dfbd01bfae789fa566a2be1f385d1/msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87", size = 166311, upload-time = "2023-09-28T13:20:36.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/3a/2e2e902afcd751738e38d88af976fc4010b16e8e821945f4cbf32f75f9c3/msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862", size = 304827, upload_time = "2023-09-28T13:18:30.258Z" }, - { url = "https://files.pythonhosted.org/packages/86/a6/490792a524a82e855bdf3885ecb73d7b3a0b17744b3cf4a40aea13ceca38/msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329", size = 234959, upload_time = "2023-09-28T13:18:32.146Z" }, - { url = "https://files.pythonhosted.org/packages/ad/72/d39ed43bfb2ec6968d768318477adb90c474bdc59b2437170c6697ee4115/msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b", size = 231970, upload_time = "2023-09-28T13:18:34.134Z" }, - { url = "https://files.pythonhosted.org/packages/a2/90/2d769e693654f036acfb462b54dacb3ae345699999897ca34f6bd9534fe9/msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6", size = 522440, upload_time = "2023-09-28T13:18:35.866Z" }, - { url = "https://files.pythonhosted.org/packages/46/95/d0440400485eab1bf50f1efe5118967b539f3191d994c3dfc220657594cd/msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee", size = 530797, upload_time = "2023-09-28T13:18:37.653Z" }, - { url = "https://files.pythonhosted.org/packages/76/33/35df717bc095c6e938b3c65ed117b95048abc24d1614427685123fb2f0af/msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d", size = 520372, upload_time = "2023-09-28T13:18:39.685Z" }, - { url = "https://files.pythonhosted.org/packages/af/d1/abbdd58a43827fbec5d98427a7a535c620890289b9d927154465313d6967/msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d", size = 527287, upload_time = "2023-09-28T13:18:41.051Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ac/66625b05091b97ca2c7418eb2d2af152f033d969519f9315556a4ed800fe/msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1", size = 560715, upload_time = "2023-09-28T13:18:42.883Z" }, - { url = "https://files.pythonhosted.org/packages/de/4e/a0e8611f94bac32d2c1c4ad05bb1c0ae61132e3398e0b44a93e6d7830968/msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681", size = 532614, upload_time = "2023-09-28T13:18:44.679Z" }, - { url = "https://files.pythonhosted.org/packages/9b/07/0b3f089684ca330602b2994248eda2898a7232e4b63882b9271164ef672e/msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9", size = 216340, upload_time = "2023-09-28T13:18:46.588Z" }, - { url = "https://files.pythonhosted.org/packages/4b/14/c62fbc8dff118f1558e43b9469d56a1f37bbb35febadc3163efaedd01500/msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415", size = 222828, upload_time = "2023-09-28T13:18:47.875Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b3/309de40dc7406b7f3492332c5ee2b492a593c2a9bb97ea48ebf2f5279999/msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84", size = 305096, upload_time = "2023-09-28T13:18:49.678Z" }, - { url = "https://files.pythonhosted.org/packages/15/56/a677cd761a2cefb2e3ffe7e684633294dccb161d78e8ea6da9277e45b4a2/msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93", size = 235210, upload_time = "2023-09-28T13:18:51.039Z" }, - { url = "https://files.pythonhosted.org/packages/f5/4e/1ab4a982cbd90f988e49f849fc1212f2c04a59870c59daabf8950617e2aa/msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8", size = 231952, upload_time = "2023-09-28T13:18:52.871Z" }, - { url = "https://files.pythonhosted.org/packages/6d/74/bd02044eb628c7361ad2bd8c1a6147af5c6c2bbceb77b3b1da20f4a8a9c5/msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46", size = 549511, upload_time = "2023-09-28T13:18:54.422Z" }, - { url = "https://files.pythonhosted.org/packages/df/09/dee50913ba5cc047f7fd7162f09453a676e7935c84b3bf3a398e12108677/msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b", size = 557980, upload_time = "2023-09-28T13:18:56.058Z" }, - { url = "https://files.pythonhosted.org/packages/26/a5/78a7d87f5f8ffe4c32167afa15d4957db649bab4822f909d8d765339bbab/msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e", size = 545547, upload_time = "2023-09-28T13:18:57.396Z" }, - { url = "https://files.pythonhosted.org/packages/d4/53/698c10913947f97f6fe7faad86a34e6aa1b66cea2df6f99105856bd346d9/msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002", size = 554669, upload_time = "2023-09-28T13:18:58.957Z" }, - { url = "https://files.pythonhosted.org/packages/f5/3f/9730c6cb574b15d349b80cd8523a7df4b82058528339f952ea1c32ac8a10/msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c", size = 583353, upload_time = "2023-09-28T13:19:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/4c/bc/dc184d943692671149848438fb3bed3a3de288ce7998cb91bc98f40f201b/msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e", size = 557455, upload_time = "2023-09-28T13:19:03.201Z" }, - { url = "https://files.pythonhosted.org/packages/cf/7b/1bc69d4a56c8d2f4f2dfbe4722d40344af9a85b6fb3b09cfb350ba6a42f6/msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1", size = 216367, upload_time = "2023-09-28T13:19:04.554Z" }, - { url = "https://files.pythonhosted.org/packages/b4/3d/c8dd23050eefa3d9b9c5b8329ed3308c2f2f80f65825e9ea4b7fa621cdab/msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82", size = 222860, upload_time = "2023-09-28T13:19:06.397Z" }, - { url = "https://files.pythonhosted.org/packages/d7/47/20dff6b4512cf3575550c8801bc53fe7d540f4efef9c5c37af51760fcdcf/msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b", size = 305759, upload_time = "2023-09-28T13:19:08.148Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8a/34f1726d2c9feccec3d946776e9bce8f20ae09d8b91899fc20b296c942af/msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4", size = 235330, upload_time = "2023-09-28T13:19:09.417Z" }, - { url = "https://files.pythonhosted.org/packages/9c/f6/e64c72577d6953789c3cb051b059a4b56317056b3c65013952338ed8a34e/msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee", size = 232537, upload_time = "2023-09-28T13:19:10.898Z" }, - { url = "https://files.pythonhosted.org/packages/89/75/1ed3a96e12941873fd957e016cc40c0c178861a872bd45e75b9a188eb422/msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5", size = 546561, upload_time = "2023-09-28T13:19:12.779Z" }, - { url = "https://files.pythonhosted.org/packages/e5/0a/c6a1390f9c6a31da0fecbbfdb86b1cb39ad302d9e24f9cca3d9e14c364f0/msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672", size = 559009, upload_time = "2023-09-28T13:19:14.373Z" }, - { url = "https://files.pythonhosted.org/packages/a5/74/99f6077754665613ea1f37b3d91c10129f6976b7721ab4d0973023808e5a/msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075", size = 543882, upload_time = "2023-09-28T13:19:16.277Z" }, - { url = "https://files.pythonhosted.org/packages/9c/7e/dc0dc8de2bf27743b31691149258f9b1bd4bf3c44c105df3df9b97081cd1/msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba", size = 546949, upload_time = "2023-09-28T13:19:18.114Z" }, - { url = "https://files.pythonhosted.org/packages/78/61/91bae9474def032f6c333d62889bbeda9e1554c6b123375ceeb1767efd78/msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c", size = 579836, upload_time = "2023-09-28T13:19:19.729Z" }, - { url = "https://files.pythonhosted.org/packages/5d/4d/d98592099d4f18945f89cf3e634dc0cb128bb33b1b93f85a84173d35e181/msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5", size = 556587, upload_time = "2023-09-28T13:19:21.666Z" }, - { url = "https://files.pythonhosted.org/packages/5e/44/6556ffe169bf2c0e974e2ea25fb82a7e55ebcf52a81b03a5e01820de5f84/msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9", size = 216509, upload_time = "2023-09-28T13:19:23.161Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c1/63903f30d51d165e132e5221a2a4a1bbfab7508b68131c871d70bffac78a/msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf", size = 223287, upload_time = "2023-09-28T13:19:25.097Z" }, + { url = "https://files.pythonhosted.org/packages/41/3a/2e2e902afcd751738e38d88af976fc4010b16e8e821945f4cbf32f75f9c3/msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862", size = 304827, upload-time = "2023-09-28T13:18:30.258Z" }, + { url = "https://files.pythonhosted.org/packages/86/a6/490792a524a82e855bdf3885ecb73d7b3a0b17744b3cf4a40aea13ceca38/msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329", size = 234959, upload-time = "2023-09-28T13:18:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/ad/72/d39ed43bfb2ec6968d768318477adb90c474bdc59b2437170c6697ee4115/msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b", size = 231970, upload-time = "2023-09-28T13:18:34.134Z" }, + { url = "https://files.pythonhosted.org/packages/a2/90/2d769e693654f036acfb462b54dacb3ae345699999897ca34f6bd9534fe9/msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6", size = 522440, upload-time = "2023-09-28T13:18:35.866Z" }, + { url = "https://files.pythonhosted.org/packages/46/95/d0440400485eab1bf50f1efe5118967b539f3191d994c3dfc220657594cd/msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee", size = 530797, upload-time = "2023-09-28T13:18:37.653Z" }, + { url = "https://files.pythonhosted.org/packages/76/33/35df717bc095c6e938b3c65ed117b95048abc24d1614427685123fb2f0af/msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d", size = 520372, upload-time = "2023-09-28T13:18:39.685Z" }, + { url = "https://files.pythonhosted.org/packages/af/d1/abbdd58a43827fbec5d98427a7a535c620890289b9d927154465313d6967/msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d", size = 527287, upload-time = "2023-09-28T13:18:41.051Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ac/66625b05091b97ca2c7418eb2d2af152f033d969519f9315556a4ed800fe/msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1", size = 560715, upload-time = "2023-09-28T13:18:42.883Z" }, + { url = "https://files.pythonhosted.org/packages/de/4e/a0e8611f94bac32d2c1c4ad05bb1c0ae61132e3398e0b44a93e6d7830968/msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681", size = 532614, upload-time = "2023-09-28T13:18:44.679Z" }, + { url = "https://files.pythonhosted.org/packages/9b/07/0b3f089684ca330602b2994248eda2898a7232e4b63882b9271164ef672e/msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9", size = 216340, upload-time = "2023-09-28T13:18:46.588Z" }, + { url = "https://files.pythonhosted.org/packages/4b/14/c62fbc8dff118f1558e43b9469d56a1f37bbb35febadc3163efaedd01500/msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415", size = 222828, upload-time = "2023-09-28T13:18:47.875Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b3/309de40dc7406b7f3492332c5ee2b492a593c2a9bb97ea48ebf2f5279999/msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84", size = 305096, upload-time = "2023-09-28T13:18:49.678Z" }, + { url = "https://files.pythonhosted.org/packages/15/56/a677cd761a2cefb2e3ffe7e684633294dccb161d78e8ea6da9277e45b4a2/msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93", size = 235210, upload-time = "2023-09-28T13:18:51.039Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4e/1ab4a982cbd90f988e49f849fc1212f2c04a59870c59daabf8950617e2aa/msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8", size = 231952, upload-time = "2023-09-28T13:18:52.871Z" }, + { url = "https://files.pythonhosted.org/packages/6d/74/bd02044eb628c7361ad2bd8c1a6147af5c6c2bbceb77b3b1da20f4a8a9c5/msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46", size = 549511, upload-time = "2023-09-28T13:18:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/df/09/dee50913ba5cc047f7fd7162f09453a676e7935c84b3bf3a398e12108677/msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b", size = 557980, upload-time = "2023-09-28T13:18:56.058Z" }, + { url = "https://files.pythonhosted.org/packages/26/a5/78a7d87f5f8ffe4c32167afa15d4957db649bab4822f909d8d765339bbab/msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e", size = 545547, upload-time = "2023-09-28T13:18:57.396Z" }, + { url = "https://files.pythonhosted.org/packages/d4/53/698c10913947f97f6fe7faad86a34e6aa1b66cea2df6f99105856bd346d9/msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002", size = 554669, upload-time = "2023-09-28T13:18:58.957Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3f/9730c6cb574b15d349b80cd8523a7df4b82058528339f952ea1c32ac8a10/msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c", size = 583353, upload-time = "2023-09-28T13:19:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/4c/bc/dc184d943692671149848438fb3bed3a3de288ce7998cb91bc98f40f201b/msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e", size = 557455, upload-time = "2023-09-28T13:19:03.201Z" }, + { url = "https://files.pythonhosted.org/packages/cf/7b/1bc69d4a56c8d2f4f2dfbe4722d40344af9a85b6fb3b09cfb350ba6a42f6/msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1", size = 216367, upload-time = "2023-09-28T13:19:04.554Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/c8dd23050eefa3d9b9c5b8329ed3308c2f2f80f65825e9ea4b7fa621cdab/msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82", size = 222860, upload-time = "2023-09-28T13:19:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d7/47/20dff6b4512cf3575550c8801bc53fe7d540f4efef9c5c37af51760fcdcf/msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b", size = 305759, upload-time = "2023-09-28T13:19:08.148Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8a/34f1726d2c9feccec3d946776e9bce8f20ae09d8b91899fc20b296c942af/msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4", size = 235330, upload-time = "2023-09-28T13:19:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f6/e64c72577d6953789c3cb051b059a4b56317056b3c65013952338ed8a34e/msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee", size = 232537, upload-time = "2023-09-28T13:19:10.898Z" }, + { url = "https://files.pythonhosted.org/packages/89/75/1ed3a96e12941873fd957e016cc40c0c178861a872bd45e75b9a188eb422/msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5", size = 546561, upload-time = "2023-09-28T13:19:12.779Z" }, + { url = "https://files.pythonhosted.org/packages/e5/0a/c6a1390f9c6a31da0fecbbfdb86b1cb39ad302d9e24f9cca3d9e14c364f0/msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672", size = 559009, upload-time = "2023-09-28T13:19:14.373Z" }, + { url = "https://files.pythonhosted.org/packages/a5/74/99f6077754665613ea1f37b3d91c10129f6976b7721ab4d0973023808e5a/msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075", size = 543882, upload-time = "2023-09-28T13:19:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7e/dc0dc8de2bf27743b31691149258f9b1bd4bf3c44c105df3df9b97081cd1/msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba", size = 546949, upload-time = "2023-09-28T13:19:18.114Z" }, + { url = "https://files.pythonhosted.org/packages/78/61/91bae9474def032f6c333d62889bbeda9e1554c6b123375ceeb1767efd78/msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c", size = 579836, upload-time = "2023-09-28T13:19:19.729Z" }, + { url = "https://files.pythonhosted.org/packages/5d/4d/d98592099d4f18945f89cf3e634dc0cb128bb33b1b93f85a84173d35e181/msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5", size = 556587, upload-time = "2023-09-28T13:19:21.666Z" }, + { url = "https://files.pythonhosted.org/packages/5e/44/6556ffe169bf2c0e974e2ea25fb82a7e55ebcf52a81b03a5e01820de5f84/msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9", size = 216509, upload-time = "2023-09-28T13:19:23.161Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c1/63903f30d51d165e132e5221a2a4a1bbfab7508b68131c871d70bffac78a/msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf", size = 223287, upload-time = "2023-09-28T13:19:25.097Z" }, ] [[package]] @@ -1405,83 +1405,83 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload_time = "2025-02-05T03:50:34.655Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload-time = "2025-02-05T03:50:34.655Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/f8/65a7ce8d0e09b6329ad0c8d40330d100ea343bd4dd04c4f8ae26462d0a17/mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", size = 10738433, upload_time = "2025-02-05T03:49:29.145Z" }, - { url = "https://files.pythonhosted.org/packages/b4/95/9c0ecb8eacfe048583706249439ff52105b3f552ea9c4024166c03224270/mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", size = 9861472, upload_time = "2025-02-05T03:49:16.986Z" }, - { url = "https://files.pythonhosted.org/packages/84/09/9ec95e982e282e20c0d5407bc65031dfd0f0f8ecc66b69538296e06fcbee/mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", size = 11611424, upload_time = "2025-02-05T03:49:46.908Z" }, - { url = "https://files.pythonhosted.org/packages/78/13/f7d14e55865036a1e6a0a69580c240f43bc1f37407fe9235c0d4ef25ffb0/mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", size = 12365450, upload_time = "2025-02-05T03:50:05.89Z" }, - { url = "https://files.pythonhosted.org/packages/48/e1/301a73852d40c241e915ac6d7bcd7fedd47d519246db2d7b86b9d7e7a0cb/mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", size = 12551765, upload_time = "2025-02-05T03:49:33.56Z" }, - { url = "https://files.pythonhosted.org/packages/77/ba/c37bc323ae5fe7f3f15a28e06ab012cd0b7552886118943e90b15af31195/mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", size = 9274701, upload_time = "2025-02-05T03:49:38.981Z" }, - { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338, upload_time = "2025-02-05T03:50:17.287Z" }, - { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540, upload_time = "2025-02-05T03:49:51.21Z" }, - { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051, upload_time = "2025-02-05T03:50:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751, upload_time = "2025-02-05T03:49:42.408Z" }, - { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783, upload_time = "2025-02-05T03:49:07.707Z" }, - { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618, upload_time = "2025-02-05T03:49:54.581Z" }, - { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981, upload_time = "2025-02-05T03:50:28.25Z" }, - { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175, upload_time = "2025-02-05T03:50:13.411Z" }, - { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675, upload_time = "2025-02-05T03:50:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020, upload_time = "2025-02-05T03:48:48.705Z" }, - { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582, upload_time = "2025-02-05T03:49:03.628Z" }, - { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614, upload_time = "2025-02-05T03:50:00.313Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592, upload_time = "2025-02-05T03:48:55.789Z" }, - { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611, upload_time = "2025-02-05T03:48:44.581Z" }, - { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443, upload_time = "2025-02-05T03:49:25.514Z" }, - { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541, upload_time = "2025-02-05T03:49:57.623Z" }, - { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348, upload_time = "2025-02-05T03:48:52.361Z" }, - { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648, upload_time = "2025-02-05T03:49:11.395Z" }, - { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777, upload_time = "2025-02-05T03:50:08.348Z" }, + { url = "https://files.pythonhosted.org/packages/68/f8/65a7ce8d0e09b6329ad0c8d40330d100ea343bd4dd04c4f8ae26462d0a17/mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13", size = 10738433, upload-time = "2025-02-05T03:49:29.145Z" }, + { url = "https://files.pythonhosted.org/packages/b4/95/9c0ecb8eacfe048583706249439ff52105b3f552ea9c4024166c03224270/mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559", size = 9861472, upload-time = "2025-02-05T03:49:16.986Z" }, + { url = "https://files.pythonhosted.org/packages/84/09/9ec95e982e282e20c0d5407bc65031dfd0f0f8ecc66b69538296e06fcbee/mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b", size = 11611424, upload-time = "2025-02-05T03:49:46.908Z" }, + { url = "https://files.pythonhosted.org/packages/78/13/f7d14e55865036a1e6a0a69580c240f43bc1f37407fe9235c0d4ef25ffb0/mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3", size = 12365450, upload-time = "2025-02-05T03:50:05.89Z" }, + { url = "https://files.pythonhosted.org/packages/48/e1/301a73852d40c241e915ac6d7bcd7fedd47d519246db2d7b86b9d7e7a0cb/mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b", size = 12551765, upload-time = "2025-02-05T03:49:33.56Z" }, + { url = "https://files.pythonhosted.org/packages/77/ba/c37bc323ae5fe7f3f15a28e06ab012cd0b7552886118943e90b15af31195/mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828", size = 9274701, upload-time = "2025-02-05T03:49:38.981Z" }, + { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338, upload-time = "2025-02-05T03:50:17.287Z" }, + { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540, upload-time = "2025-02-05T03:49:51.21Z" }, + { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051, upload-time = "2025-02-05T03:50:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751, upload-time = "2025-02-05T03:49:42.408Z" }, + { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783, upload-time = "2025-02-05T03:49:07.707Z" }, + { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618, upload-time = "2025-02-05T03:49:54.581Z" }, + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981, upload-time = "2025-02-05T03:50:28.25Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175, upload-time = "2025-02-05T03:50:13.411Z" }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675, upload-time = "2025-02-05T03:50:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020, upload-time = "2025-02-05T03:48:48.705Z" }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582, upload-time = "2025-02-05T03:49:03.628Z" }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614, upload-time = "2025-02-05T03:50:00.313Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592, upload-time = "2025-02-05T03:48:55.789Z" }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611, upload-time = "2025-02-05T03:48:44.581Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443, upload-time = "2025-02-05T03:49:25.514Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541, upload-time = "2025-02-05T03:49:57.623Z" }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348, upload-time = "2025-02-05T03:48:52.361Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648, upload-time = "2025-02-05T03:49:11.395Z" }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777, upload-time = "2025-02-05T03:50:08.348Z" }, ] [[package]] name = "mypy-extensions" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload_time = "2023-02-04T12:11:27.157Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433, upload-time = "2023-02-04T12:11:27.157Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload_time = "2023-02-04T12:11:25.002Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695, upload-time = "2023-02-04T12:11:25.002Z" }, ] [[package]] name = "networkx" version = "3.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928, upload_time = "2023-10-28T08:41:39.364Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928, upload-time = "2023-10-28T08:41:39.364Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772, upload_time = "2023-10-28T08:41:36.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772, upload-time = "2023-10-28T08:41:36.945Z" }, ] [[package]] name = "numpy" version = "1.26.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload_time = "2024-02-06T00:26:44.495Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468, upload_time = "2024-02-05T23:48:01.194Z" }, - { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411, upload_time = "2024-02-05T23:48:29.038Z" }, - { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016, upload_time = "2024-02-05T23:48:54.098Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889, upload_time = "2024-02-05T23:49:25.361Z" }, - { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746, upload_time = "2024-02-05T23:49:51.983Z" }, - { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620, upload_time = "2024-02-05T23:50:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659, upload_time = "2024-02-05T23:50:35.834Z" }, - { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905, upload_time = "2024-02-05T23:51:03.701Z" }, - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload_time = "2024-02-05T23:51:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload_time = "2024-02-05T23:52:15.314Z" }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload_time = "2024-02-05T23:52:47.569Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload_time = "2024-02-05T23:53:15.637Z" }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload_time = "2024-02-05T23:53:42.16Z" }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload_time = "2024-02-05T23:54:11.696Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload_time = "2024-02-05T23:54:26.453Z" }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload_time = "2024-02-05T23:54:53.933Z" }, - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload_time = "2024-02-05T23:55:32.801Z" }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload_time = "2024-02-05T23:55:56.28Z" }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload_time = "2024-02-05T23:56:20.368Z" }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload_time = "2024-02-05T23:56:56.054Z" }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload_time = "2024-02-05T23:57:21.56Z" }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload_time = "2024-02-05T23:57:56.585Z" }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload_time = "2024-02-05T23:58:08.963Z" }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload_time = "2024-02-05T23:58:36.364Z" }, + { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468, upload-time = "2024-02-05T23:48:01.194Z" }, + { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411, upload-time = "2024-02-05T23:48:29.038Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016, upload-time = "2024-02-05T23:48:54.098Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889, upload-time = "2024-02-05T23:49:25.361Z" }, + { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746, upload-time = "2024-02-05T23:49:51.983Z" }, + { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620, upload-time = "2024-02-05T23:50:22.515Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659, upload-time = "2024-02-05T23:50:35.834Z" }, + { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905, upload-time = "2024-02-05T23:51:03.701Z" }, + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, ] [[package]] @@ -1492,26 +1492,26 @@ dependencies = [ { name = "numpy" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fe/0978403c8d710ece2f34006367e78de80410743fe0e7680c8f33f2dab20d/onnx-1.16.0.tar.gz", hash = "sha256:237c6987c6c59d9f44b6136f5819af79574f8d96a760a1fa843bede11f3822f7", size = 12303017, upload_time = "2024-03-25T15:33:46.091Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/fe/0978403c8d710ece2f34006367e78de80410743fe0e7680c8f33f2dab20d/onnx-1.16.0.tar.gz", hash = "sha256:237c6987c6c59d9f44b6136f5819af79574f8d96a760a1fa843bede11f3822f7", size = 12303017, upload-time = "2024-03-25T15:33:46.091Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/0b/f4705e4a3fa6fd0de971302fdae17ad176b024eca8c24360f0e37c00f9df/onnx-1.16.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:9eadbdce25b19d6216f426d6d99b8bc877a65ed92cbef9707751c6669190ba4f", size = 16514483, upload_time = "2024-03-25T15:25:07.947Z" }, - { url = "https://files.pythonhosted.org/packages/b8/1c/50310a559857951fc6e069cf5d89deebe34287997d1c5928bca435456f62/onnx-1.16.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:034ae21a2aaa2e9c14119a840d2926d213c27aad29e5e3edaa30145a745048e1", size = 15012939, upload_time = "2024-03-25T15:25:11.632Z" }, - { url = "https://files.pythonhosted.org/packages/ef/6e/96be6692ebcd8da568084d753f386ce08efa1f99b216f346ee281edd6cc3/onnx-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec22a43d74eb1f2303373e2fbe7fbcaa45fb225f4eb146edfed1356ada7a9aea", size = 15791856, upload_time = "2024-03-25T15:25:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/49/5f/d8e1a24247f506a77cbe22341c72ca91bea3b468c5d6bca2047d885ea3c6/onnx-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298f28a2b5ac09145fa958513d3d1e6b349ccf86a877dbdcccad57713fe360b3", size = 15922279, upload_time = "2024-03-25T15:25:18.939Z" }, - { url = "https://files.pythonhosted.org/packages/cb/14/562e4ac22cdf41f4465e3b114ef1a9467d513eeff0b9c2285c2da5db6ed1/onnx-1.16.0-cp310-cp310-win32.whl", hash = "sha256:66300197b52beca08bc6262d43c103289c5d45fde43fb51922ed1eb83658cf0c", size = 14335703, upload_time = "2024-03-25T15:25:22.611Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e2/471ff83b3862967791d67f630000afce038756afbdf0665a3d767677c851/onnx-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae0029f5e47bf70a1a62e7f88c80bca4ef39b844a89910039184221775df5e43", size = 14435099, upload_time = "2024-03-25T15:25:25.05Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b8/7accf3f93eee498711f0b7f07f6e93906e031622473e85ce9cd3578f6a92/onnx-1.16.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:f51179d4af3372b4f3800c558d204b592c61e4b4a18b8f61e0eea7f46211221a", size = 16514376, upload_time = "2024-03-25T15:25:27.899Z" }, - { url = "https://files.pythonhosted.org/packages/cc/24/a328236b594d5fea23f70a3a8139e730cb43334f0b24693831c47c9064f0/onnx-1.16.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5202559070afec5144332db216c20f2fff8323cf7f6512b0ca11b215eacc5bf3", size = 15012839, upload_time = "2024-03-25T15:25:31.16Z" }, - { url = "https://files.pythonhosted.org/packages/80/12/57187bab3f830a47fa65eafe4fbaef01dfdf5042cf82a41fa440fab68766/onnx-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77579e7c15b4df39d29465b216639a5f9b74026bdd9e4b6306cd19a32dcfe67c", size = 15791944, upload_time = "2024-03-25T15:25:34.778Z" }, - { url = "https://files.pythonhosted.org/packages/df/48/63f68b65d041aedffab41eea930563ca52aab70dbaa7d4820501618c1a70/onnx-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e60ca76ac24b65c25860d0f2d2cdd96d6320d062a01dd8ce87c5743603789b8", size = 15922450, upload_time = "2024-03-25T15:25:37.983Z" }, - { url = "https://files.pythonhosted.org/packages/08/1b/4bdf4534f5ff08973725ba5409f95bbf64e2789cd20be615880dae689973/onnx-1.16.0-cp311-cp311-win32.whl", hash = "sha256:81b4ee01bc554e8a2b11ac6439882508a5377a1c6b452acd69a1eebb83571117", size = 14335808, upload_time = "2024-03-25T15:25:40.523Z" }, - { url = "https://files.pythonhosted.org/packages/aa/d0/0514d02d2e84e7bb48a105877eae4065e54d7dabb60d0b60214fe2677346/onnx-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:7449241e70b847b9c3eb8dae622df8c1b456d11032a9d7e26e0ee8a698d5bf86", size = 14434905, upload_time = "2024-03-25T15:25:42.905Z" }, - { url = "https://files.pythonhosted.org/packages/42/87/577adadda30ee08041e81ef02a331ca9d1a8df93a2e4c4c53ec56fbbc2ac/onnx-1.16.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:03a627488b1a9975d95d6a55582af3e14c7f3bb87444725b999935ddd271d352", size = 16516304, upload_time = "2024-03-25T15:25:45.875Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1b/6e1ea37e081cc49a28f0e4d3830b4c8525081354cf9f5529c6c92268fc77/onnx-1.16.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c392faeabd9283ee344ccb4b067d1fea9dfc614fa1f0de7c47589efd79e15e78", size = 15016538, upload_time = "2024-03-25T15:25:49.396Z" }, - { url = "https://files.pythonhosted.org/packages/6d/07/f8fefd5eb0984be42ef677f0b7db7527edc4529224a34a3c31f7b12ec80d/onnx-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0efeb46985de08f0efe758cb54ad3457e821a05c2eaf5ba2ccb8cd1602c08084", size = 15790415, upload_time = "2024-03-25T15:25:51.929Z" }, - { url = "https://files.pythonhosted.org/packages/11/71/c219ce6d4b5205c77405af7f2de2511ad4eeffbfeb77a422151e893de0ea/onnx-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf14a3d32234f23e44abb73a755cb96a423fac7f004e8f046f36b10214151ee", size = 15922224, upload_time = "2024-03-25T15:25:55.049Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a4/554a6e5741b42406c5b1970d04685d7f2012019d4178408ed4b3ec953033/onnx-1.16.0-cp312-cp312-win32.whl", hash = "sha256:62a2e27ae8ba5fc9b4a2620301446a517b5ffaaf8566611de7a7c2160f5bcf4c", size = 14336234, upload_time = "2024-03-25T15:25:57.998Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a1/8aecec497010ad34e7656408df1868d94483c5c56bc991f4088c06150896/onnx-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:3e0860fea94efde777e81a6f68f65761ed5e5f3adea2e050d7fbe373a9ae05b3", size = 14436591, upload_time = "2024-03-25T15:26:01.252Z" }, + { url = "https://files.pythonhosted.org/packages/c8/0b/f4705e4a3fa6fd0de971302fdae17ad176b024eca8c24360f0e37c00f9df/onnx-1.16.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:9eadbdce25b19d6216f426d6d99b8bc877a65ed92cbef9707751c6669190ba4f", size = 16514483, upload-time = "2024-03-25T15:25:07.947Z" }, + { url = "https://files.pythonhosted.org/packages/b8/1c/50310a559857951fc6e069cf5d89deebe34287997d1c5928bca435456f62/onnx-1.16.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:034ae21a2aaa2e9c14119a840d2926d213c27aad29e5e3edaa30145a745048e1", size = 15012939, upload-time = "2024-03-25T15:25:11.632Z" }, + { url = "https://files.pythonhosted.org/packages/ef/6e/96be6692ebcd8da568084d753f386ce08efa1f99b216f346ee281edd6cc3/onnx-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec22a43d74eb1f2303373e2fbe7fbcaa45fb225f4eb146edfed1356ada7a9aea", size = 15791856, upload-time = "2024-03-25T15:25:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/49/5f/d8e1a24247f506a77cbe22341c72ca91bea3b468c5d6bca2047d885ea3c6/onnx-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298f28a2b5ac09145fa958513d3d1e6b349ccf86a877dbdcccad57713fe360b3", size = 15922279, upload-time = "2024-03-25T15:25:18.939Z" }, + { url = "https://files.pythonhosted.org/packages/cb/14/562e4ac22cdf41f4465e3b114ef1a9467d513eeff0b9c2285c2da5db6ed1/onnx-1.16.0-cp310-cp310-win32.whl", hash = "sha256:66300197b52beca08bc6262d43c103289c5d45fde43fb51922ed1eb83658cf0c", size = 14335703, upload-time = "2024-03-25T15:25:22.611Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e2/471ff83b3862967791d67f630000afce038756afbdf0665a3d767677c851/onnx-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae0029f5e47bf70a1a62e7f88c80bca4ef39b844a89910039184221775df5e43", size = 14435099, upload-time = "2024-03-25T15:25:25.05Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b8/7accf3f93eee498711f0b7f07f6e93906e031622473e85ce9cd3578f6a92/onnx-1.16.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:f51179d4af3372b4f3800c558d204b592c61e4b4a18b8f61e0eea7f46211221a", size = 16514376, upload-time = "2024-03-25T15:25:27.899Z" }, + { url = "https://files.pythonhosted.org/packages/cc/24/a328236b594d5fea23f70a3a8139e730cb43334f0b24693831c47c9064f0/onnx-1.16.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5202559070afec5144332db216c20f2fff8323cf7f6512b0ca11b215eacc5bf3", size = 15012839, upload-time = "2024-03-25T15:25:31.16Z" }, + { url = "https://files.pythonhosted.org/packages/80/12/57187bab3f830a47fa65eafe4fbaef01dfdf5042cf82a41fa440fab68766/onnx-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77579e7c15b4df39d29465b216639a5f9b74026bdd9e4b6306cd19a32dcfe67c", size = 15791944, upload-time = "2024-03-25T15:25:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/df/48/63f68b65d041aedffab41eea930563ca52aab70dbaa7d4820501618c1a70/onnx-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e60ca76ac24b65c25860d0f2d2cdd96d6320d062a01dd8ce87c5743603789b8", size = 15922450, upload-time = "2024-03-25T15:25:37.983Z" }, + { url = "https://files.pythonhosted.org/packages/08/1b/4bdf4534f5ff08973725ba5409f95bbf64e2789cd20be615880dae689973/onnx-1.16.0-cp311-cp311-win32.whl", hash = "sha256:81b4ee01bc554e8a2b11ac6439882508a5377a1c6b452acd69a1eebb83571117", size = 14335808, upload-time = "2024-03-25T15:25:40.523Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d0/0514d02d2e84e7bb48a105877eae4065e54d7dabb60d0b60214fe2677346/onnx-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:7449241e70b847b9c3eb8dae622df8c1b456d11032a9d7e26e0ee8a698d5bf86", size = 14434905, upload-time = "2024-03-25T15:25:42.905Z" }, + { url = "https://files.pythonhosted.org/packages/42/87/577adadda30ee08041e81ef02a331ca9d1a8df93a2e4c4c53ec56fbbc2ac/onnx-1.16.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:03a627488b1a9975d95d6a55582af3e14c7f3bb87444725b999935ddd271d352", size = 16516304, upload-time = "2024-03-25T15:25:45.875Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1b/6e1ea37e081cc49a28f0e4d3830b4c8525081354cf9f5529c6c92268fc77/onnx-1.16.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c392faeabd9283ee344ccb4b067d1fea9dfc614fa1f0de7c47589efd79e15e78", size = 15016538, upload-time = "2024-03-25T15:25:49.396Z" }, + { url = "https://files.pythonhosted.org/packages/6d/07/f8fefd5eb0984be42ef677f0b7db7527edc4529224a34a3c31f7b12ec80d/onnx-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0efeb46985de08f0efe758cb54ad3457e821a05c2eaf5ba2ccb8cd1602c08084", size = 15790415, upload-time = "2024-03-25T15:25:51.929Z" }, + { url = "https://files.pythonhosted.org/packages/11/71/c219ce6d4b5205c77405af7f2de2511ad4eeffbfeb77a422151e893de0ea/onnx-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddf14a3d32234f23e44abb73a755cb96a423fac7f004e8f046f36b10214151ee", size = 15922224, upload-time = "2024-03-25T15:25:55.049Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/554a6e5741b42406c5b1970d04685d7f2012019d4178408ed4b3ec953033/onnx-1.16.0-cp312-cp312-win32.whl", hash = "sha256:62a2e27ae8ba5fc9b4a2620301446a517b5ffaaf8566611de7a7c2160f5bcf4c", size = 14336234, upload-time = "2024-03-25T15:25:57.998Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a1/8aecec497010ad34e7656408df1868d94483c5c56bc991f4088c06150896/onnx-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:3e0860fea94efde777e81a6f68f65761ed5e5f3adea2e050d7fbe373a9ae05b3", size = 14436591, upload-time = "2024-03-25T15:26:01.252Z" }, ] [[package]] @@ -1527,27 +1527,27 @@ dependencies = [ { name = "sympy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/28/99f903b0eb1cd6f3faa0e343217d9fb9f47b84bca98bd9859884631336ee/onnxruntime-1.20.1-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:e50ba5ff7fed4f7d9253a6baf801ca2883cc08491f9d32d78a80da57256a5439", size = 30996314, upload_time = "2024-11-21T00:48:31.43Z" }, - { url = "https://files.pythonhosted.org/packages/6d/c6/c4c0860bee2fde6037bdd9dcd12d323f6e38cf00fcc9a5065b394337fc55/onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b2908b50101a19e99c4d4e97ebb9905561daf61829403061c1adc1b588bc0de", size = 11954010, upload_time = "2024-11-21T00:48:35.254Z" }, - { url = "https://files.pythonhosted.org/packages/63/47/3dc0b075ab539f16b3d8b09df6b504f51836086ee709690a6278d791737d/onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d82daaec24045a2e87598b8ac2b417b1cce623244e80e663882e9fe1aae86410", size = 13330452, upload_time = "2024-11-21T00:48:40.02Z" }, - { url = "https://files.pythonhosted.org/packages/27/ef/80fab86289ecc01a734b7ddf115dfb93d8b2e004bd1e1977e12881c72b12/onnxruntime-1.20.1-cp310-cp310-win32.whl", hash = "sha256:4c4b251a725a3b8cf2aab284f7d940c26094ecd9d442f07dd81ab5470e99b83f", size = 9813849, upload_time = "2024-11-21T00:48:43.569Z" }, - { url = "https://files.pythonhosted.org/packages/a9/e6/33ab10066c9875a29d55e66ae97c3bf91b9b9b987179455d67c32261a49c/onnxruntime-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3b616bb53a77a9463707bb313637223380fc327f5064c9a782e8ec69c22e6a2", size = 11329702, upload_time = "2024-11-21T00:48:46.599Z" }, - { url = "https://files.pythonhosted.org/packages/95/8d/2634e2959b34aa8a0037989f4229e9abcfa484e9c228f99633b3241768a6/onnxruntime-1.20.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:06bfbf02ca9ab5f28946e0f912a562a5f005301d0c419283dc57b3ed7969bb7b", size = 30998725, upload_time = "2024-11-21T00:48:51.013Z" }, - { url = "https://files.pythonhosted.org/packages/a5/da/c44bf9bd66cd6d9018a921f053f28d819445c4d84b4dd4777271b0fe52a2/onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6243e34d74423bdd1edf0ae9596dd61023b260f546ee17d701723915f06a9f7", size = 11955227, upload_time = "2024-11-21T00:48:54.556Z" }, - { url = "https://files.pythonhosted.org/packages/11/ac/4120dfb74c8e45cce1c664fc7f7ce010edd587ba67ac41489f7432eb9381/onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eec64c0269dcdb8d9a9a53dc4d64f87b9e0c19801d9321246a53b7eb5a7d1bc", size = 13331703, upload_time = "2024-11-21T00:48:57.97Z" }, - { url = "https://files.pythonhosted.org/packages/12/f1/cefacac137f7bb7bfba57c50c478150fcd3c54aca72762ac2c05ce0532c1/onnxruntime-1.20.1-cp311-cp311-win32.whl", hash = "sha256:a19bc6e8c70e2485a1725b3d517a2319603acc14c1f1a017dda0afe6d4665b41", size = 9813977, upload_time = "2024-11-21T00:49:00.519Z" }, - { url = "https://files.pythonhosted.org/packages/2c/2d/2d4d202c0bcfb3a4cc2b171abb9328672d7f91d7af9ea52572722c6d8d96/onnxruntime-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:8508887eb1c5f9537a4071768723ec7c30c28eb2518a00d0adcd32c89dea3221", size = 11329895, upload_time = "2024-11-21T00:49:03.845Z" }, - { url = "https://files.pythonhosted.org/packages/e5/39/9335e0874f68f7d27103cbffc0e235e32e26759202df6085716375c078bb/onnxruntime-1.20.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:22b0655e2bf4f2161d52706e31f517a0e54939dc393e92577df51808a7edc8c9", size = 31007580, upload_time = "2024-11-21T00:49:07.029Z" }, - { url = "https://files.pythonhosted.org/packages/c5/9d/a42a84e10f1744dd27c6f2f9280cc3fb98f869dd19b7cd042e391ee2ab61/onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f56e898815963d6dc4ee1c35fc6c36506466eff6d16f3cb9848cea4e8c8172", size = 11952833, upload_time = "2024-11-21T00:49:10.563Z" }, - { url = "https://files.pythonhosted.org/packages/47/42/2f71f5680834688a9c81becbe5c5bb996fd33eaed5c66ae0606c3b1d6a02/onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb71a814f66517a65628c9e4a2bb530a6edd2cd5d87ffa0af0f6f773a027d99e", size = 13333903, upload_time = "2024-11-21T00:49:12.984Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f1/aabfdf91d013320aa2fc46cf43c88ca0182860ff15df872b4552254a9680/onnxruntime-1.20.1-cp312-cp312-win32.whl", hash = "sha256:bd386cc9ee5f686ee8a75ba74037750aca55183085bf1941da8efcfe12d5b120", size = 9814562, upload_time = "2024-11-21T00:49:15.453Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/76979e0b744307d488c79e41051117634b956612cc731f1028eb17ee7294/onnxruntime-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:19c2d843eb074f385e8bbb753a40df780511061a63f9def1b216bf53860223fb", size = 11331482, upload_time = "2024-11-21T00:49:19.412Z" }, - { url = "https://files.pythonhosted.org/packages/f7/71/c5d980ac4189589267a06f758bd6c5667d07e55656bed6c6c0580733ad07/onnxruntime-1.20.1-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:cc01437a32d0042b606f462245c8bbae269e5442797f6213e36ce61d5abdd8cc", size = 31007574, upload_time = "2024-11-21T00:49:23.225Z" }, - { url = "https://files.pythonhosted.org/packages/81/0d/13bbd9489be2a6944f4a940084bfe388f1100472f38c07080a46fbd4ab96/onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb44b08e017a648924dbe91b82d89b0c105b1adcfe31e90d1dc06b8677ad37be", size = 11951459, upload_time = "2024-11-21T00:49:26.269Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ea/4454ae122874fd52bbb8a961262de81c5f932edeb1b72217f594c700d6ef/onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bda6aebdf7917c1d811f21d41633df00c58aff2bef2f598f69289c1f1dabc4b3", size = 13331620, upload_time = "2024-11-21T00:49:28.875Z" }, - { url = "https://files.pythonhosted.org/packages/d8/e0/50db43188ca1c945decaa8fc2a024c33446d31afed40149897d4f9de505f/onnxruntime-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:d30367df7e70f1d9fc5a6a68106f5961686d39b54d3221f760085524e8d38e16", size = 11331758, upload_time = "2024-11-21T00:49:31.417Z" }, - { url = "https://files.pythonhosted.org/packages/d8/55/3821c5fd60b52a6c82a00bba18531793c93c4addfe64fbf061e235c5617a/onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9158465745423b2b5d97ed25aa7740c7d38d2993ee2e5c3bfacb0c4145c49d8", size = 11950342, upload_time = "2024-11-21T00:49:34.164Z" }, - { url = "https://files.pythonhosted.org/packages/14/56/fd990ca222cef4f9f4a9400567b9a15b220dee2eafffb16b2adbc55c8281/onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0df6f2df83d61f46e842dbcde610ede27218947c33e994545a22333491e72a3b", size = 13337040, upload_time = "2024-11-21T00:49:37.271Z" }, + { url = "https://files.pythonhosted.org/packages/4e/28/99f903b0eb1cd6f3faa0e343217d9fb9f47b84bca98bd9859884631336ee/onnxruntime-1.20.1-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:e50ba5ff7fed4f7d9253a6baf801ca2883cc08491f9d32d78a80da57256a5439", size = 30996314, upload-time = "2024-11-21T00:48:31.43Z" }, + { url = "https://files.pythonhosted.org/packages/6d/c6/c4c0860bee2fde6037bdd9dcd12d323f6e38cf00fcc9a5065b394337fc55/onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b2908b50101a19e99c4d4e97ebb9905561daf61829403061c1adc1b588bc0de", size = 11954010, upload-time = "2024-11-21T00:48:35.254Z" }, + { url = "https://files.pythonhosted.org/packages/63/47/3dc0b075ab539f16b3d8b09df6b504f51836086ee709690a6278d791737d/onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d82daaec24045a2e87598b8ac2b417b1cce623244e80e663882e9fe1aae86410", size = 13330452, upload-time = "2024-11-21T00:48:40.02Z" }, + { url = "https://files.pythonhosted.org/packages/27/ef/80fab86289ecc01a734b7ddf115dfb93d8b2e004bd1e1977e12881c72b12/onnxruntime-1.20.1-cp310-cp310-win32.whl", hash = "sha256:4c4b251a725a3b8cf2aab284f7d940c26094ecd9d442f07dd81ab5470e99b83f", size = 9813849, upload-time = "2024-11-21T00:48:43.569Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e6/33ab10066c9875a29d55e66ae97c3bf91b9b9b987179455d67c32261a49c/onnxruntime-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3b616bb53a77a9463707bb313637223380fc327f5064c9a782e8ec69c22e6a2", size = 11329702, upload-time = "2024-11-21T00:48:46.599Z" }, + { url = "https://files.pythonhosted.org/packages/95/8d/2634e2959b34aa8a0037989f4229e9abcfa484e9c228f99633b3241768a6/onnxruntime-1.20.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:06bfbf02ca9ab5f28946e0f912a562a5f005301d0c419283dc57b3ed7969bb7b", size = 30998725, upload-time = "2024-11-21T00:48:51.013Z" }, + { url = "https://files.pythonhosted.org/packages/a5/da/c44bf9bd66cd6d9018a921f053f28d819445c4d84b4dd4777271b0fe52a2/onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6243e34d74423bdd1edf0ae9596dd61023b260f546ee17d701723915f06a9f7", size = 11955227, upload-time = "2024-11-21T00:48:54.556Z" }, + { url = "https://files.pythonhosted.org/packages/11/ac/4120dfb74c8e45cce1c664fc7f7ce010edd587ba67ac41489f7432eb9381/onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eec64c0269dcdb8d9a9a53dc4d64f87b9e0c19801d9321246a53b7eb5a7d1bc", size = 13331703, upload-time = "2024-11-21T00:48:57.97Z" }, + { url = "https://files.pythonhosted.org/packages/12/f1/cefacac137f7bb7bfba57c50c478150fcd3c54aca72762ac2c05ce0532c1/onnxruntime-1.20.1-cp311-cp311-win32.whl", hash = "sha256:a19bc6e8c70e2485a1725b3d517a2319603acc14c1f1a017dda0afe6d4665b41", size = 9813977, upload-time = "2024-11-21T00:49:00.519Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2d/2d4d202c0bcfb3a4cc2b171abb9328672d7f91d7af9ea52572722c6d8d96/onnxruntime-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:8508887eb1c5f9537a4071768723ec7c30c28eb2518a00d0adcd32c89dea3221", size = 11329895, upload-time = "2024-11-21T00:49:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/e5/39/9335e0874f68f7d27103cbffc0e235e32e26759202df6085716375c078bb/onnxruntime-1.20.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:22b0655e2bf4f2161d52706e31f517a0e54939dc393e92577df51808a7edc8c9", size = 31007580, upload-time = "2024-11-21T00:49:07.029Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9d/a42a84e10f1744dd27c6f2f9280cc3fb98f869dd19b7cd042e391ee2ab61/onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f56e898815963d6dc4ee1c35fc6c36506466eff6d16f3cb9848cea4e8c8172", size = 11952833, upload-time = "2024-11-21T00:49:10.563Z" }, + { url = "https://files.pythonhosted.org/packages/47/42/2f71f5680834688a9c81becbe5c5bb996fd33eaed5c66ae0606c3b1d6a02/onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb71a814f66517a65628c9e4a2bb530a6edd2cd5d87ffa0af0f6f773a027d99e", size = 13333903, upload-time = "2024-11-21T00:49:12.984Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f1/aabfdf91d013320aa2fc46cf43c88ca0182860ff15df872b4552254a9680/onnxruntime-1.20.1-cp312-cp312-win32.whl", hash = "sha256:bd386cc9ee5f686ee8a75ba74037750aca55183085bf1941da8efcfe12d5b120", size = 9814562, upload-time = "2024-11-21T00:49:15.453Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/76979e0b744307d488c79e41051117634b956612cc731f1028eb17ee7294/onnxruntime-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:19c2d843eb074f385e8bbb753a40df780511061a63f9def1b216bf53860223fb", size = 11331482, upload-time = "2024-11-21T00:49:19.412Z" }, + { url = "https://files.pythonhosted.org/packages/f7/71/c5d980ac4189589267a06f758bd6c5667d07e55656bed6c6c0580733ad07/onnxruntime-1.20.1-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:cc01437a32d0042b606f462245c8bbae269e5442797f6213e36ce61d5abdd8cc", size = 31007574, upload-time = "2024-11-21T00:49:23.225Z" }, + { url = "https://files.pythonhosted.org/packages/81/0d/13bbd9489be2a6944f4a940084bfe388f1100472f38c07080a46fbd4ab96/onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb44b08e017a648924dbe91b82d89b0c105b1adcfe31e90d1dc06b8677ad37be", size = 11951459, upload-time = "2024-11-21T00:49:26.269Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/4454ae122874fd52bbb8a961262de81c5f932edeb1b72217f594c700d6ef/onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bda6aebdf7917c1d811f21d41633df00c58aff2bef2f598f69289c1f1dabc4b3", size = 13331620, upload-time = "2024-11-21T00:49:28.875Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e0/50db43188ca1c945decaa8fc2a024c33446d31afed40149897d4f9de505f/onnxruntime-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:d30367df7e70f1d9fc5a6a68106f5961686d39b54d3221f760085524e8d38e16", size = 11331758, upload-time = "2024-11-21T00:49:31.417Z" }, + { url = "https://files.pythonhosted.org/packages/d8/55/3821c5fd60b52a6c82a00bba18531793c93c4addfe64fbf061e235c5617a/onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9158465745423b2b5d97ed25aa7740c7d38d2993ee2e5c3bfacb0c4145c49d8", size = 11950342, upload-time = "2024-11-21T00:49:34.164Z" }, + { url = "https://files.pythonhosted.org/packages/14/56/fd990ca222cef4f9f4a9400567b9a15b220dee2eafffb16b2adbc55c8281/onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0df6f2df83d61f46e842dbcde610ede27218947c33e994545a22333491e72a3b", size = 13337040, upload-time = "2024-11-21T00:49:37.271Z" }, ] [[package]] @@ -1584,10 +1584,10 @@ dependencies = [ { name = "sympy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/57/e9a080f2477b2a4c16925f766e4615fc545098b0f4e20cf8ad803e7a9672/onnxruntime_openvino-1.18.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:565b874d21bcd48126da7d62f57db019f5ec0e1f82ae9b0740afa2ad91f8d331", size = 41971800, upload_time = "2024-06-25T06:30:37.042Z" }, - { url = "https://files.pythonhosted.org/packages/34/7d/b75913bce58f4ee9bf6a02d1b513b9fc82303a496ec698e6fb1f9d597cb4/onnxruntime_openvino-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:7f1931060f710a6c8e32121bb73044c4772ef5925802fc8776d3fe1e87ab3f75", size = 5963263, upload_time = "2024-06-24T13:38:15.906Z" }, - { url = "https://files.pythonhosted.org/packages/7e/d3/8299b7285dc8fa7bd986b6f0d7c50b7f0fd13db50dd3b88b93ec269b1e08/onnxruntime_openvino-1.18.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb1723d386f70a8e26398d983ebe35d2c25ba56e9cdb382670ebbf1f5139f8ba", size = 41971927, upload_time = "2024-06-25T06:30:43.765Z" }, - { url = "https://files.pythonhosted.org/packages/88/d9/ca0bfd7ed37153d9664ccdcfb4d0e5b1963563553b05cb4338b46968feb2/onnxruntime_openvino-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:874a1e263dd86674593e5a879257650b06a8609c4d5768c3d8ed8dc4ae874b9c", size = 5963464, upload_time = "2024-06-24T13:38:18.437Z" }, + { url = "https://files.pythonhosted.org/packages/b3/57/e9a080f2477b2a4c16925f766e4615fc545098b0f4e20cf8ad803e7a9672/onnxruntime_openvino-1.18.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:565b874d21bcd48126da7d62f57db019f5ec0e1f82ae9b0740afa2ad91f8d331", size = 41971800, upload-time = "2024-06-25T06:30:37.042Z" }, + { url = "https://files.pythonhosted.org/packages/34/7d/b75913bce58f4ee9bf6a02d1b513b9fc82303a496ec698e6fb1f9d597cb4/onnxruntime_openvino-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:7f1931060f710a6c8e32121bb73044c4772ef5925802fc8776d3fe1e87ab3f75", size = 5963263, upload-time = "2024-06-24T13:38:15.906Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d3/8299b7285dc8fa7bd986b6f0d7c50b7f0fd13db50dd3b88b93ec269b1e08/onnxruntime_openvino-1.18.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb1723d386f70a8e26398d983ebe35d2c25ba56e9cdb382670ebbf1f5139f8ba", size = 41971927, upload-time = "2024-06-25T06:30:43.765Z" }, + { url = "https://files.pythonhosted.org/packages/88/d9/ca0bfd7ed37153d9664ccdcfb4d0e5b1963563553b05cb4338b46968feb2/onnxruntime_openvino-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:874a1e263dd86674593e5a879257650b06a8609c4d5768c3d8ed8dc4ae874b9c", size = 5963464, upload-time = "2024-06-24T13:38:18.437Z" }, ] [[package]] @@ -1597,171 +1597,175 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929, upload_time = "2025-01-16T13:53:40.22Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929, upload-time = "2025-01-16T13:53:40.22Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460, upload_time = "2025-01-16T13:52:57.015Z" }, - { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330, upload_time = "2025-01-16T13:55:45.731Z" }, - { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060, upload_time = "2025-01-16T13:51:59.625Z" }, - { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856, upload_time = "2025-01-16T13:53:29.654Z" }, - { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425, upload_time = "2025-01-16T13:52:49.048Z" }, - { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386, upload_time = "2025-01-16T13:52:56.418Z" }, + { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460, upload-time = "2025-01-16T13:52:57.015Z" }, + { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330, upload-time = "2025-01-16T13:55:45.731Z" }, + { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060, upload-time = "2025-01-16T13:51:59.625Z" }, + { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856, upload-time = "2025-01-16T13:53:29.654Z" }, + { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425, upload-time = "2025-01-16T13:52:49.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386, upload-time = "2025-01-16T13:52:56.418Z" }, ] [[package]] name = "orjson" -version = "3.10.16" +version = "3.10.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415, upload_time = "2025-03-24T17:00:23.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/0b/fea456a3ffe74e70ba30e01ec183a9b26bec4d497f61dcfce1b601059c60/orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53", size = 5422810, upload-time = "2025-04-29T23:30:08.423Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/a6/22cb9b03baf167bc2d659c9e74d7580147f36e6a155e633801badfd5a74d/orjson-3.10.16-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4cb473b8e79154fa778fb56d2d73763d977be3dcc140587e07dbc545bbfc38f8", size = 249179, upload_time = "2025-03-24T16:58:41.294Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/3e68cc33020a6ebd8f359b8628b69d2132cd84fea68155c33057e502ee51/orjson-3.10.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:622a8e85eeec1948690409a19ca1c7d9fd8ff116f4861d261e6ae2094fe59a00", size = 138510, upload_time = "2025-03-24T16:58:43.732Z" }, - { url = "https://files.pythonhosted.org/packages/dc/12/63bee7764ce12052f7c1a1393ce7f26dc392c93081eb8754dd3dce9b7c6b/orjson-3.10.16-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c682d852d0ce77613993dc967e90e151899fe2d8e71c20e9be164080f468e370", size = 132373, upload_time = "2025-03-24T16:58:45.094Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d5/2998c2f319adcd572f2b03ba2083e8176863d1055d8d713683ddcf927b71/orjson-3.10.16-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c520ae736acd2e32df193bcff73491e64c936f3e44a2916b548da048a48b46b", size = 136774, upload_time = "2025-03-24T16:58:46.273Z" }, - { url = "https://files.pythonhosted.org/packages/00/03/88c236ae307bd0604623204d4a835e15fbf9c75b8535c8f13ef45abd413f/orjson-3.10.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:134f87c76bfae00f2094d85cfab261b289b76d78c6da8a7a3b3c09d362fd1e06", size = 138030, upload_time = "2025-03-24T16:58:47.921Z" }, - { url = "https://files.pythonhosted.org/packages/66/ba/3e256ddfeb364f98fd6ac65774844090d356158b2d1de8998db2bf984503/orjson-3.10.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b59afde79563e2cf37cfe62ee3b71c063fd5546c8e662d7fcfc2a3d5031a5c4c", size = 142677, upload_time = "2025-03-24T16:58:49.191Z" }, - { url = "https://files.pythonhosted.org/packages/2c/71/73a1214bd27baa2ea5184fff4aa6193a114dfb0aa5663dad48fe63e8cd29/orjson-3.10.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:113602f8241daaff05d6fad25bd481d54c42d8d72ef4c831bb3ab682a54d9e15", size = 132798, upload_time = "2025-03-24T16:58:50.746Z" }, - { url = "https://files.pythonhosted.org/packages/53/ac/0b2f41c0a1e8c095439d0fab3b33103cf41a39be8e6aa2c56298a6034259/orjson-3.10.16-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4fc0077d101f8fab4031e6554fc17b4c2ad8fdbc56ee64a727f3c95b379e31da", size = 135450, upload_time = "2025-03-24T16:58:52.481Z" }, - { url = "https://files.pythonhosted.org/packages/d9/ca/7524c7b0bc815d426ca134dab54cad519802287b808a3846b047a5b2b7a3/orjson-3.10.16-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:9c6bf6ff180cd69e93f3f50380224218cfab79953a868ea3908430bcfaf9cb5e", size = 412356, upload_time = "2025-03-24T16:58:54.17Z" }, - { url = "https://files.pythonhosted.org/packages/05/1d/3ae2367c255276bf16ff7e1b210dd0af18bc8da20c4e4295755fc7de1268/orjson-3.10.16-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5673eadfa952f95a7cd76418ff189df11b0a9c34b1995dff43a6fdbce5d63bf4", size = 152769, upload_time = "2025-03-24T16:58:55.821Z" }, - { url = "https://files.pythonhosted.org/packages/d3/2d/8eb10b6b1d30bb69c35feb15e5ba5ac82466cf743d562e3e8047540efd2f/orjson-3.10.16-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5fe638a423d852b0ae1e1a79895851696cb0d9fa0946fdbfd5da5072d9bb9551", size = 137223, upload_time = "2025-03-24T16:58:57.136Z" }, - { url = "https://files.pythonhosted.org/packages/47/42/f043717930cb2de5fbebe47f308f101bed9ec2b3580b1f99c8284b2f5fe8/orjson-3.10.16-cp310-cp310-win32.whl", hash = "sha256:33af58f479b3c6435ab8f8b57999874b4b40c804c7a36b5cc6b54d8f28e1d3dd", size = 141734, upload_time = "2025-03-24T16:58:58.516Z" }, - { url = "https://files.pythonhosted.org/packages/67/99/795ad7282b425b9fddcfb8a31bded5dcf84dba78ecb1e7ae716e84e794da/orjson-3.10.16-cp310-cp310-win_amd64.whl", hash = "sha256:0338356b3f56d71293c583350af26f053017071836b07e064e92819ecf1aa055", size = 133779, upload_time = "2025-03-24T16:59:00.254Z" }, - { url = "https://files.pythonhosted.org/packages/97/29/43f91a5512b5d2535594438eb41c5357865fd5e64dec745d90a588820c75/orjson-3.10.16-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44fcbe1a1884f8bc9e2e863168b0f84230c3d634afe41c678637d2728ea8e739", size = 249180, upload_time = "2025-03-24T16:59:01.507Z" }, - { url = "https://files.pythonhosted.org/packages/0c/36/2a72d55e266473c19a86d97b7363bb8bf558ab450f75205689a287d5ce61/orjson-3.10.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78177bf0a9d0192e0b34c3d78bcff7fe21d1b5d84aeb5ebdfe0dbe637b885225", size = 138510, upload_time = "2025-03-24T16:59:02.876Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ad/f86d6f55c1a68b57ff6ea7966bce5f4e5163f2e526ddb7db9fc3c2c8d1c4/orjson-3.10.16-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12824073a010a754bb27330cad21d6e9b98374f497f391b8707752b96f72e741", size = 132373, upload_time = "2025-03-24T16:59:04.103Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8b/d18f2711493a809f3082a88fda89342bc8e16767743b909cd3c34989fba3/orjson-3.10.16-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddd41007e56284e9867864aa2f29f3136bb1dd19a49ca43c0b4eda22a579cf53", size = 136773, upload_time = "2025-03-24T16:59:05.636Z" }, - { url = "https://files.pythonhosted.org/packages/a1/dc/ce025f002f8e0749e3f057c4d773a4d4de32b7b4c1fc5a50b429e7532586/orjson-3.10.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0877c4d35de639645de83666458ca1f12560d9fa7aa9b25d8bb8f52f61627d14", size = 138029, upload_time = "2025-03-24T16:59:06.99Z" }, - { url = "https://files.pythonhosted.org/packages/0e/1b/cf9df85852b91160029d9f26014230366a2b4deb8cc51fabe68e250a8c1a/orjson-3.10.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a09a539e9cc3beead3e7107093b4ac176d015bec64f811afb5965fce077a03c", size = 142677, upload_time = "2025-03-24T16:59:08.22Z" }, - { url = "https://files.pythonhosted.org/packages/92/18/5b1e1e995bffad49dc4311a0bdfd874bc6f135fd20f0e1f671adc2c9910e/orjson-3.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b98bc9b40610fec971d9a4d67bb2ed02eec0a8ae35f8ccd2086320c28526ca", size = 132800, upload_time = "2025-03-24T16:59:09.529Z" }, - { url = "https://files.pythonhosted.org/packages/d6/eb/467f25b580e942fcca1344adef40633b7f05ac44a65a63fc913f9a805d58/orjson-3.10.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0ce243f5a8739f3a18830bc62dc2e05b69a7545bafd3e3249f86668b2bcd8e50", size = 135451, upload_time = "2025-03-24T16:59:10.823Z" }, - { url = "https://files.pythonhosted.org/packages/8d/4b/9d10888038975cb375982e9339d9495bac382d5c976c500b8d6f2c8e2e4e/orjson-3.10.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:64792c0025bae049b3074c6abe0cf06f23c8e9f5a445f4bab31dc5ca23dbf9e1", size = 412358, upload_time = "2025-03-24T16:59:12.113Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e2/cfbcfcc4fbe619e0ca9bdbbfccb2d62b540bbfe41e0ee77d44a628594f59/orjson-3.10.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea53f7e68eec718b8e17e942f7ca56c6bd43562eb19db3f22d90d75e13f0431d", size = 152772, upload_time = "2025-03-24T16:59:13.919Z" }, - { url = "https://files.pythonhosted.org/packages/b9/d6/627a1b00569be46173007c11dde3da4618c9bfe18409325b0e3e2a82fe29/orjson-3.10.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a741ba1a9488c92227711bde8c8c2b63d7d3816883268c808fbeada00400c164", size = 137225, upload_time = "2025-03-24T16:59:15.355Z" }, - { url = "https://files.pythonhosted.org/packages/0a/7b/a73c67b505021af845b9f05c7c848793258ea141fa2058b52dd9b067c2b4/orjson-3.10.16-cp311-cp311-win32.whl", hash = "sha256:c7ed2c61bb8226384c3fdf1fb01c51b47b03e3f4536c985078cccc2fd19f1619", size = 141733, upload_time = "2025-03-24T16:59:16.791Z" }, - { url = "https://files.pythonhosted.org/packages/f4/22/5e8217c48d68c0adbfb181e749d6a733761074e598b083c69a1383d18147/orjson-3.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:cd67d8b3e0e56222a2e7b7f7da9031e30ecd1fe251c023340b9f12caca85ab60", size = 133784, upload_time = "2025-03-24T16:59:18.106Z" }, - { url = "https://files.pythonhosted.org/packages/5d/15/67ce9d4c959c83f112542222ea3b9209c1d424231d71d74c4890ea0acd2b/orjson-3.10.16-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6d3444abbfa71ba21bb042caa4b062535b122248259fdb9deea567969140abca", size = 249325, upload_time = "2025-03-24T16:59:19.784Z" }, - { url = "https://files.pythonhosted.org/packages/da/2c/1426b06f30a1b9ada74b6f512c1ddf9d2760f53f61cdb59efeb9ad342133/orjson-3.10.16-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:30245c08d818fdcaa48b7d5b81499b8cae09acabb216fe61ca619876b128e184", size = 133621, upload_time = "2025-03-24T16:59:21.207Z" }, - { url = "https://files.pythonhosted.org/packages/9e/88/18d26130954bc73bee3be10f95371ea1dfb8679e0e2c46b0f6d8c6289402/orjson-3.10.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0ba1d0baa71bf7579a4ccdcf503e6f3098ef9542106a0eca82395898c8a500a", size = 138270, upload_time = "2025-03-24T16:59:22.514Z" }, - { url = "https://files.pythonhosted.org/packages/4f/f9/6d8b64fcd58fae072e80ee7981be8ba0d7c26ace954e5cd1d027fc80518f/orjson-3.10.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb0beefa5ef3af8845f3a69ff2a4aa62529b5acec1cfe5f8a6b4141033fd46ef", size = 132346, upload_time = "2025-03-24T16:59:24.277Z" }, - { url = "https://files.pythonhosted.org/packages/16/3f/2513fd5bc786f40cd12af569c23cae6381aeddbefeed2a98f0a666eb5d0d/orjson-3.10.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6daa0e1c9bf2e030e93c98394de94506f2a4d12e1e9dadd7c53d5e44d0f9628e", size = 136845, upload_time = "2025-03-24T16:59:25.588Z" }, - { url = "https://files.pythonhosted.org/packages/6d/42/b0e7b36720f5ab722b48e8ccf06514d4f769358dd73c51abd8728ef58d0b/orjson-3.10.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da9019afb21e02410ef600e56666652b73eb3e4d213a0ec919ff391a7dd52aa", size = 138078, upload_time = "2025-03-24T16:59:27.288Z" }, - { url = "https://files.pythonhosted.org/packages/a3/a8/d220afb8a439604be74fc755dbc740bded5ed14745ca536b304ed32eb18a/orjson-3.10.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daeb3a1ee17b69981d3aae30c3b4e786b0f8c9e6c71f2b48f1aef934f63f38f4", size = 142712, upload_time = "2025-03-24T16:59:28.613Z" }, - { url = "https://files.pythonhosted.org/packages/8c/88/7e41e9883c00f84f92fe357a8371edae816d9d7ef39c67b5106960c20389/orjson-3.10.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fed80eaf0e20a31942ae5d0728849862446512769692474be5e6b73123a23b", size = 133136, upload_time = "2025-03-24T16:59:29.987Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ca/61116095307ad0be828ea26093febaf59e38596d84a9c8d765c3c5e4934f/orjson-3.10.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73390ed838f03764540a7bdc4071fe0123914c2cc02fb6abf35182d5fd1b7a42", size = 135258, upload_time = "2025-03-24T16:59:31.339Z" }, - { url = "https://files.pythonhosted.org/packages/dc/1b/09493cf7d801505f094c9295f79c98c1e0af2ac01c7ed8d25b30fcb19ada/orjson-3.10.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a22bba012a0c94ec02a7768953020ab0d3e2b884760f859176343a36c01adf87", size = 412326, upload_time = "2025-03-24T16:59:32.709Z" }, - { url = "https://files.pythonhosted.org/packages/ea/02/125d7bbd7f7a500190ddc8ae5d2d3c39d87ed3ed28f5b37cfe76962c678d/orjson-3.10.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5385bbfdbc90ff5b2635b7e6bebf259652db00a92b5e3c45b616df75b9058e88", size = 152800, upload_time = "2025-03-24T16:59:34.134Z" }, - { url = "https://files.pythonhosted.org/packages/f9/09/7658a9e3e793d5b3b00598023e0fb6935d0e7bbb8ff72311c5415a8ce677/orjson-3.10.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02c6279016346e774dd92625d46c6c40db687b8a0d685aadb91e26e46cc33e1e", size = 137516, upload_time = "2025-03-24T16:59:35.446Z" }, - { url = "https://files.pythonhosted.org/packages/29/87/32b7a4831e909d347278101a48d4cf9f3f25901b2295e7709df1651f65a1/orjson-3.10.16-cp312-cp312-win32.whl", hash = "sha256:7ca55097a11426db80f79378e873a8c51f4dde9ffc22de44850f9696b7eb0e8c", size = 141759, upload_time = "2025-03-24T16:59:37.509Z" }, - { url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl", hash = "sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6", size = 133944, upload_time = "2025-03-24T16:59:38.814Z" }, - { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289, upload_time = "2025-03-24T16:59:40.117Z" }, - { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640, upload_time = "2025-03-24T16:59:41.469Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286, upload_time = "2025-03-24T16:59:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307, upload_time = "2025-03-24T16:59:44.143Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739, upload_time = "2025-03-24T16:59:45.995Z" }, - { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076, upload_time = "2025-03-24T16:59:47.776Z" }, - { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643, upload_time = "2025-03-24T16:59:49.258Z" }, - { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168, upload_time = "2025-03-24T16:59:51.027Z" }, - { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271, upload_time = "2025-03-24T16:59:52.449Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444, upload_time = "2025-03-24T16:59:53.825Z" }, - { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737, upload_time = "2025-03-24T16:59:55.599Z" }, - { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482, upload_time = "2025-03-24T16:59:57.045Z" }, - { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714, upload_time = "2025-03-24T16:59:58.666Z" }, - { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954, upload_time = "2025-03-24T17:00:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/27/16/2ceb9fb7bc2b11b1e4a3ea27794256e93dee2309ebe297fd131a778cd150/orjson-3.10.18-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a45e5d68066b408e4bc383b6e4ef05e717c65219a9e1390abc6155a520cac402", size = 248927, upload-time = "2025-04-29T23:28:08.643Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e1/d3c0a2bba5b9906badd121da449295062b289236c39c3a7801f92c4682b0/orjson-3.10.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be3b9b143e8b9db05368b13b04c84d37544ec85bb97237b3a923f076265ec89c", size = 136995, upload-time = "2025-04-29T23:28:11.503Z" }, + { url = "https://files.pythonhosted.org/packages/d7/51/698dd65e94f153ee5ecb2586c89702c9e9d12f165a63e74eb9ea1299f4e1/orjson-3.10.18-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9b0aa09745e2c9b3bf779b096fa71d1cc2d801a604ef6dd79c8b1bfef52b2f92", size = 132893, upload-time = "2025-04-29T23:28:12.751Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e5/155ce5a2c43a85e790fcf8b985400138ce5369f24ee6770378ee6b691036/orjson-3.10.18-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53a245c104d2792e65c8d225158f2b8262749ffe64bc7755b00024757d957a13", size = 137017, upload-time = "2025-04-29T23:28:14.498Z" }, + { url = "https://files.pythonhosted.org/packages/46/bb/6141ec3beac3125c0b07375aee01b5124989907d61c72c7636136e4bd03e/orjson-3.10.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9495ab2611b7f8a0a8a505bcb0f0cbdb5469caafe17b0e404c3c746f9900469", size = 138290, upload-time = "2025-04-29T23:28:16.211Z" }, + { url = "https://files.pythonhosted.org/packages/77/36/6961eca0b66b7809d33c4ca58c6bd4c23a1b914fb23aba2fa2883f791434/orjson-3.10.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73be1cbcebadeabdbc468f82b087df435843c809cd079a565fb16f0f3b23238f", size = 142828, upload-time = "2025-04-29T23:28:18.065Z" }, + { url = "https://files.pythonhosted.org/packages/8b/2f/0c646d5fd689d3be94f4d83fa9435a6c4322c9b8533edbb3cd4bc8c5f69a/orjson-3.10.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8936ee2679e38903df158037a2f1c108129dee218975122e37847fb1d4ac68", size = 132806, upload-time = "2025-04-29T23:28:19.782Z" }, + { url = "https://files.pythonhosted.org/packages/ea/af/65907b40c74ef4c3674ef2bcfa311c695eb934710459841b3c2da212215c/orjson-3.10.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7115fcbc8525c74e4c2b608129bef740198e9a120ae46184dac7683191042056", size = 135005, upload-time = "2025-04-29T23:28:21.367Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d1/68bd20ac6a32cd1f1b10d23e7cc58ee1e730e80624e3031d77067d7150fc/orjson-3.10.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:771474ad34c66bc4d1c01f645f150048030694ea5b2709b87d3bda273ffe505d", size = 413418, upload-time = "2025-04-29T23:28:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/c701ec0bcc3e80e5cb6e319c628ef7b768aaa24b0f3b4c599df2eaacfa24/orjson-3.10.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7c14047dbbea52886dd87169f21939af5d55143dad22d10db6a7514f058156a8", size = 153288, upload-time = "2025-04-29T23:28:25.02Z" }, + { url = "https://files.pythonhosted.org/packages/d9/31/5e1aa99a10893a43cfc58009f9da840990cc8a9ebb75aa452210ba18587e/orjson-3.10.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641481b73baec8db14fdf58f8967e52dc8bda1f2aba3aa5f5c1b07ed6df50b7f", size = 137181, upload-time = "2025-04-29T23:28:26.318Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8c/daba0ac1b8690011d9242a0f37235f7d17df6d0ad941021048523b76674e/orjson-3.10.18-cp310-cp310-win32.whl", hash = "sha256:607eb3ae0909d47280c1fc657c4284c34b785bae371d007595633f4b1a2bbe06", size = 142694, upload-time = "2025-04-29T23:28:28.092Z" }, + { url = "https://files.pythonhosted.org/packages/16/62/8b687724143286b63e1d0fab3ad4214d54566d80b0ba9d67c26aaf28a2f8/orjson-3.10.18-cp310-cp310-win_amd64.whl", hash = "sha256:8770432524ce0eca50b7efc2a9a5f486ee0113a5fbb4231526d414e6254eba92", size = 134600, upload-time = "2025-04-29T23:28:29.422Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/c54a948ce9a4278794f669a353551ce7db4ffb656c69a6e1f2264d563e50/orjson-3.10.18-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e0a183ac3b8e40471e8d843105da6fbe7c070faab023be3b08188ee3f85719b8", size = 248929, upload-time = "2025-04-29T23:28:30.716Z" }, + { url = "https://files.pythonhosted.org/packages/9e/60/a9c674ef1dd8ab22b5b10f9300e7e70444d4e3cda4b8258d6c2488c32143/orjson-3.10.18-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5ef7c164d9174362f85238d0cd4afdeeb89d9e523e4651add6a5d458d6f7d42d", size = 133364, upload-time = "2025-04-29T23:28:32.392Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4e/f7d1bdd983082216e414e6d7ef897b0c2957f99c545826c06f371d52337e/orjson-3.10.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd14c5d99cdc7bf93f22b12ec3b294931518aa019e2a147e8aa2f31fd3240f7", size = 136995, upload-time = "2025-04-29T23:28:34.024Z" }, + { url = "https://files.pythonhosted.org/packages/17/89/46b9181ba0ea251c9243b0c8ce29ff7c9796fa943806a9c8b02592fce8ea/orjson-3.10.18-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b672502323b6cd133c4af6b79e3bea36bad2d16bca6c1f645903fce83909a7a", size = 132894, upload-time = "2025-04-29T23:28:35.318Z" }, + { url = "https://files.pythonhosted.org/packages/ca/dd/7bce6fcc5b8c21aef59ba3c67f2166f0a1a9b0317dcca4a9d5bd7934ecfd/orjson-3.10.18-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51f8c63be6e070ec894c629186b1c0fe798662b8687f3d9fdfa5e401c6bd7679", size = 137016, upload-time = "2025-04-29T23:28:36.674Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4a/b8aea1c83af805dcd31c1f03c95aabb3e19a016b2a4645dd822c5686e94d/orjson-3.10.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9478ade5313d724e0495d167083c6f3be0dd2f1c9c8a38db9a9e912cdaf947", size = 138290, upload-time = "2025-04-29T23:28:38.3Z" }, + { url = "https://files.pythonhosted.org/packages/36/d6/7eb05c85d987b688707f45dcf83c91abc2251e0dd9fb4f7be96514f838b1/orjson-3.10.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187aefa562300a9d382b4b4eb9694806e5848b0cedf52037bb5c228c61bb66d4", size = 142829, upload-time = "2025-04-29T23:28:39.657Z" }, + { url = "https://files.pythonhosted.org/packages/d2/78/ddd3ee7873f2b5f90f016bc04062713d567435c53ecc8783aab3a4d34915/orjson-3.10.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da552683bc9da222379c7a01779bddd0ad39dd699dd6300abaf43eadee38334", size = 132805, upload-time = "2025-04-29T23:28:40.969Z" }, + { url = "https://files.pythonhosted.org/packages/8c/09/c8e047f73d2c5d21ead9c180203e111cddeffc0848d5f0f974e346e21c8e/orjson-3.10.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e450885f7b47a0231979d9c49b567ed1c4e9f69240804621be87c40bc9d3cf17", size = 135008, upload-time = "2025-04-29T23:28:42.284Z" }, + { url = "https://files.pythonhosted.org/packages/0c/4b/dccbf5055ef8fb6eda542ab271955fc1f9bf0b941a058490293f8811122b/orjson-3.10.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5e3c9cc2ba324187cd06287ca24f65528f16dfc80add48dc99fa6c836bb3137e", size = 413419, upload-time = "2025-04-29T23:28:43.673Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f3/1eac0c5e2d6d6790bd2025ebfbefcbd37f0d097103d76f9b3f9302af5a17/orjson-3.10.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:50ce016233ac4bfd843ac5471e232b865271d7d9d44cf9d33773bcd883ce442b", size = 153292, upload-time = "2025-04-29T23:28:45.573Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b4/ef0abf64c8f1fabf98791819ab502c2c8c1dc48b786646533a93637d8999/orjson-3.10.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b3ceff74a8f7ffde0b2785ca749fc4e80e4315c0fd887561144059fb1c138aa7", size = 137182, upload-time = "2025-04-29T23:28:47.229Z" }, + { url = "https://files.pythonhosted.org/packages/a9/a3/6ea878e7b4a0dc5c888d0370d7752dcb23f402747d10e2257478d69b5e63/orjson-3.10.18-cp311-cp311-win32.whl", hash = "sha256:fdba703c722bd868c04702cac4cb8c6b8ff137af2623bc0ddb3b3e6a2c8996c1", size = 142695, upload-time = "2025-04-29T23:28:48.564Z" }, + { url = "https://files.pythonhosted.org/packages/79/2a/4048700a3233d562f0e90d5572a849baa18ae4e5ce4c3ba6247e4ece57b0/orjson-3.10.18-cp311-cp311-win_amd64.whl", hash = "sha256:c28082933c71ff4bc6ccc82a454a2bffcef6e1d7379756ca567c772e4fb3278a", size = 134603, upload-time = "2025-04-29T23:28:50.442Z" }, + { url = "https://files.pythonhosted.org/packages/03/45/10d934535a4993d27e1c84f1810e79ccf8b1b7418cef12151a22fe9bb1e1/orjson-3.10.18-cp311-cp311-win_arm64.whl", hash = "sha256:a6c7c391beaedd3fa63206e5c2b7b554196f14debf1ec9deb54b5d279b1b46f5", size = 131400, upload-time = "2025-04-29T23:28:51.838Z" }, + { url = "https://files.pythonhosted.org/packages/21/1a/67236da0916c1a192d5f4ccbe10ec495367a726996ceb7614eaa687112f2/orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753", size = 249184, upload-time = "2025-04-29T23:28:53.612Z" }, + { url = "https://files.pythonhosted.org/packages/b3/bc/c7f1db3b1d094dc0c6c83ed16b161a16c214aaa77f311118a93f647b32dc/orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17", size = 133279, upload-time = "2025-04-29T23:28:55.055Z" }, + { url = "https://files.pythonhosted.org/packages/af/84/664657cd14cc11f0d81e80e64766c7ba5c9b7fc1ec304117878cc1b4659c/orjson-3.10.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:559eb40a70a7494cd5beab2d73657262a74a2c59aff2068fdba8f0424ec5b39d", size = 136799, upload-time = "2025-04-29T23:28:56.828Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bb/f50039c5bb05a7ab024ed43ba25d0319e8722a0ac3babb0807e543349978/orjson-3.10.18-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3c29eb9a81e2fbc6fd7ddcfba3e101ba92eaff455b8d602bf7511088bbc0eae", size = 132791, upload-time = "2025-04-29T23:28:58.751Z" }, + { url = "https://files.pythonhosted.org/packages/93/8c/ee74709fc072c3ee219784173ddfe46f699598a1723d9d49cbc78d66df65/orjson-3.10.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6612787e5b0756a171c7d81ba245ef63a3533a637c335aa7fcb8e665f4a0966f", size = 137059, upload-time = "2025-04-29T23:29:00.129Z" }, + { url = "https://files.pythonhosted.org/packages/6a/37/e6d3109ee004296c80426b5a62b47bcadd96a3deab7443e56507823588c5/orjson-3.10.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ac6bd7be0dcab5b702c9d43d25e70eb456dfd2e119d512447468f6405b4a69c", size = 138359, upload-time = "2025-04-29T23:29:01.704Z" }, + { url = "https://files.pythonhosted.org/packages/4f/5d/387dafae0e4691857c62bd02839a3bf3fa648eebd26185adfac58d09f207/orjson-3.10.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f72f100cee8dde70100406d5c1abba515a7df926d4ed81e20a9730c062fe9ad", size = 142853, upload-time = "2025-04-29T23:29:03.576Z" }, + { url = "https://files.pythonhosted.org/packages/27/6f/875e8e282105350b9a5341c0222a13419758545ae32ad6e0fcf5f64d76aa/orjson-3.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca85398d6d093dd41dc0983cbf54ab8e6afd1c547b6b8a311643917fbf4e0c", size = 133131, upload-time = "2025-04-29T23:29:05.753Z" }, + { url = "https://files.pythonhosted.org/packages/48/b2/73a1f0b4790dcb1e5a45f058f4f5dcadc8a85d90137b50d6bbc6afd0ae50/orjson-3.10.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22748de2a07fcc8781a70edb887abf801bb6142e6236123ff93d12d92db3d406", size = 134834, upload-time = "2025-04-29T23:29:07.35Z" }, + { url = "https://files.pythonhosted.org/packages/56/f5/7ed133a5525add9c14dbdf17d011dd82206ca6840811d32ac52a35935d19/orjson-3.10.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a83c9954a4107b9acd10291b7f12a6b29e35e8d43a414799906ea10e75438e6", size = 413368, upload-time = "2025-04-29T23:29:09.301Z" }, + { url = "https://files.pythonhosted.org/packages/11/7c/439654221ed9c3324bbac7bdf94cf06a971206b7b62327f11a52544e4982/orjson-3.10.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:303565c67a6c7b1f194c94632a4a39918e067bd6176a48bec697393865ce4f06", size = 153359, upload-time = "2025-04-29T23:29:10.813Z" }, + { url = "https://files.pythonhosted.org/packages/48/e7/d58074fa0cc9dd29a8fa2a6c8d5deebdfd82c6cfef72b0e4277c4017563a/orjson-3.10.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:86314fdb5053a2f5a5d881f03fca0219bfdf832912aa88d18676a5175c6916b5", size = 137466, upload-time = "2025-04-29T23:29:12.26Z" }, + { url = "https://files.pythonhosted.org/packages/57/4d/fe17581cf81fb70dfcef44e966aa4003360e4194d15a3f38cbffe873333a/orjson-3.10.18-cp312-cp312-win32.whl", hash = "sha256:187ec33bbec58c76dbd4066340067d9ece6e10067bb0cc074a21ae3300caa84e", size = 142683, upload-time = "2025-04-29T23:29:13.865Z" }, + { url = "https://files.pythonhosted.org/packages/e6/22/469f62d25ab5f0f3aee256ea732e72dc3aab6d73bac777bd6277955bceef/orjson-3.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:f9f94cf6d3f9cd720d641f8399e390e7411487e493962213390d1ae45c7814fc", size = 134754, upload-time = "2025-04-29T23:29:15.338Z" }, + { url = "https://files.pythonhosted.org/packages/10/b0/1040c447fac5b91bc1e9c004b69ee50abb0c1ffd0d24406e1350c58a7fcb/orjson-3.10.18-cp312-cp312-win_arm64.whl", hash = "sha256:3d600be83fe4514944500fa8c2a0a77099025ec6482e8087d7659e891f23058a", size = 131218, upload-time = "2025-04-29T23:29:17.324Z" }, + { url = "https://files.pythonhosted.org/packages/04/f0/8aedb6574b68096f3be8f74c0b56d36fd94bcf47e6c7ed47a7bd1474aaa8/orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147", size = 249087, upload-time = "2025-04-29T23:29:19.083Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f7/7118f965541aeac6844fcb18d6988e111ac0d349c9b80cda53583e758908/orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c", size = 133273, upload-time = "2025-04-29T23:29:20.602Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d9/839637cc06eaf528dd8127b36004247bf56e064501f68df9ee6fd56a88ee/orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103", size = 136779, upload-time = "2025-04-29T23:29:22.062Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/f226ecfef31a1f0e7d6bf9a31a0bbaf384c7cbe3fce49cc9c2acc51f902a/orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595", size = 132811, upload-time = "2025-04-29T23:29:23.602Z" }, + { url = "https://files.pythonhosted.org/packages/73/2d/371513d04143c85b681cf8f3bce743656eb5b640cb1f461dad750ac4b4d4/orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc", size = 137018, upload-time = "2025-04-29T23:29:25.094Z" }, + { url = "https://files.pythonhosted.org/packages/69/cb/a4d37a30507b7a59bdc484e4a3253c8141bf756d4e13fcc1da760a0b00cb/orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc", size = 138368, upload-time = "2025-04-29T23:29:26.609Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ae/cd10883c48d912d216d541eb3db8b2433415fde67f620afe6f311f5cd2ca/orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049", size = 142840, upload-time = "2025-04-29T23:29:28.153Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4c/2bda09855c6b5f2c055034c9eda1529967b042ff8d81a05005115c4e6772/orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58", size = 133135, upload-time = "2025-04-29T23:29:29.726Z" }, + { url = "https://files.pythonhosted.org/packages/13/4a/35971fd809a8896731930a80dfff0b8ff48eeb5d8b57bb4d0d525160017f/orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034", size = 134810, upload-time = "2025-04-29T23:29:31.269Z" }, + { url = "https://files.pythonhosted.org/packages/99/70/0fa9e6310cda98365629182486ff37a1c6578e34c33992df271a476ea1cd/orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1", size = 413491, upload-time = "2025-04-29T23:29:33.315Z" }, + { url = "https://files.pythonhosted.org/packages/32/cb/990a0e88498babddb74fb97855ae4fbd22a82960e9b06eab5775cac435da/orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012", size = 153277, upload-time = "2025-04-29T23:29:34.946Z" }, + { url = "https://files.pythonhosted.org/packages/92/44/473248c3305bf782a384ed50dd8bc2d3cde1543d107138fd99b707480ca1/orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f", size = 137367, upload-time = "2025-04-29T23:29:36.52Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fd/7f1d3edd4ffcd944a6a40e9f88af2197b619c931ac4d3cfba4798d4d3815/orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea", size = 142687, upload-time = "2025-04-29T23:29:38.292Z" }, + { url = "https://files.pythonhosted.org/packages/4b/03/c75c6ad46be41c16f4cfe0352a2d1450546f3c09ad2c9d341110cd87b025/orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52", size = 134794, upload-time = "2025-04-29T23:29:40.349Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/f53038a5a72cc4fd0b56c1eafb4ef64aec9685460d5ac34de98ca78b6e29/orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3", size = 131186, upload-time = "2025-04-29T23:29:41.922Z" }, ] [[package]] name = "packaging" version = "23.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", size = 146714, upload_time = "2023-10-01T13:50:05.279Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", size = 146714, upload-time = "2023-10-01T13:50:05.279Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", size = 53011, upload_time = "2023-10-01T13:50:03.745Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", size = 53011, upload-time = "2023-10-01T13:50:03.745Z" }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload_time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload_time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] [[package]] name = "pillow" version = "10.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059, upload_time = "2024-07-01T09:48:43.583Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059, upload-time = "2024-07-01T09:48:43.583Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/69/a31cccd538ca0b5272be2a38347f8839b97a14be104ea08b0db92f749c74/pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", size = 3509271, upload_time = "2024-07-01T09:45:22.07Z" }, - { url = "https://files.pythonhosted.org/packages/9a/9e/4143b907be8ea0bce215f2ae4f7480027473f8b61fcedfda9d851082a5d2/pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", size = 3375658, upload_time = "2024-07-01T09:45:25.292Z" }, - { url = "https://files.pythonhosted.org/packages/8a/25/1fc45761955f9359b1169aa75e241551e74ac01a09f487adaaf4c3472d11/pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", size = 4332075, upload_time = "2024-07-01T09:45:27.94Z" }, - { url = "https://files.pythonhosted.org/packages/5e/dd/425b95d0151e1d6c951f45051112394f130df3da67363b6bc75dc4c27aba/pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", size = 4444808, upload_time = "2024-07-01T09:45:30.305Z" }, - { url = "https://files.pythonhosted.org/packages/b1/84/9a15cc5726cbbfe7f9f90bfb11f5d028586595907cd093815ca6644932e3/pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", size = 4356290, upload_time = "2024-07-01T09:45:32.868Z" }, - { url = "https://files.pythonhosted.org/packages/b5/5b/6651c288b08df3b8c1e2f8c1152201e0b25d240e22ddade0f1e242fc9fa0/pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", size = 4525163, upload_time = "2024-07-01T09:45:35.279Z" }, - { url = "https://files.pythonhosted.org/packages/07/8b/34854bf11a83c248505c8cb0fcf8d3d0b459a2246c8809b967963b6b12ae/pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", size = 4463100, upload_time = "2024-07-01T09:45:37.74Z" }, - { url = "https://files.pythonhosted.org/packages/78/63/0632aee4e82476d9cbe5200c0cdf9ba41ee04ed77887432845264d81116d/pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", size = 4592880, upload_time = "2024-07-01T09:45:39.89Z" }, - { url = "https://files.pythonhosted.org/packages/df/56/b8663d7520671b4398b9d97e1ed9f583d4afcbefbda3c6188325e8c297bd/pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", size = 2235218, upload_time = "2024-07-01T09:45:42.771Z" }, - { url = "https://files.pythonhosted.org/packages/f4/72/0203e94a91ddb4a9d5238434ae6c1ca10e610e8487036132ea9bf806ca2a/pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", size = 2554487, upload_time = "2024-07-01T09:45:45.176Z" }, - { url = "https://files.pythonhosted.org/packages/bd/52/7e7e93d7a6e4290543f17dc6f7d3af4bd0b3dd9926e2e8a35ac2282bc5f4/pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1", size = 2243219, upload_time = "2024-07-01T09:45:47.274Z" }, - { url = "https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", size = 3509265, upload_time = "2024-07-01T09:45:49.812Z" }, - { url = "https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", size = 3375655, upload_time = "2024-07-01T09:45:52.462Z" }, - { url = "https://files.pythonhosted.org/packages/73/d5/c4011a76f4207a3c151134cd22a1415741e42fa5ddecec7c0182887deb3d/pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", size = 4340304, upload_time = "2024-07-01T09:45:55.006Z" }, - { url = "https://files.pythonhosted.org/packages/ac/10/c67e20445a707f7a610699bba4fe050583b688d8cd2d202572b257f46600/pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", size = 4452804, upload_time = "2024-07-01T09:45:58.437Z" }, - { url = "https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", size = 4365126, upload_time = "2024-07-01T09:46:00.713Z" }, - { url = "https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", size = 4533541, upload_time = "2024-07-01T09:46:03.235Z" }, - { url = "https://files.pythonhosted.org/packages/f4/7c/01b8dbdca5bc6785573f4cee96e2358b0918b7b2c7b60d8b6f3abf87a070/pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", size = 4471616, upload_time = "2024-07-01T09:46:05.356Z" }, - { url = "https://files.pythonhosted.org/packages/c8/57/2899b82394a35a0fbfd352e290945440e3b3785655a03365c0ca8279f351/pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", size = 4600802, upload_time = "2024-07-01T09:46:08.145Z" }, - { url = "https://files.pythonhosted.org/packages/4d/d7/a44f193d4c26e58ee5d2d9db3d4854b2cfb5b5e08d360a5e03fe987c0086/pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", size = 2235213, upload_time = "2024-07-01T09:46:10.211Z" }, - { url = "https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", size = 2554498, upload_time = "2024-07-01T09:46:12.685Z" }, - { url = "https://files.pythonhosted.org/packages/d4/c8/310ac16ac2b97e902d9eb438688de0d961660a87703ad1561fd3dfbd2aa0/pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", size = 2243219, upload_time = "2024-07-01T09:46:14.83Z" }, - { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350, upload_time = "2024-07-01T09:46:17.177Z" }, - { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980, upload_time = "2024-07-01T09:46:19.169Z" }, - { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799, upload_time = "2024-07-01T09:46:21.883Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973, upload_time = "2024-07-01T09:46:24.321Z" }, - { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054, upload_time = "2024-07-01T09:46:26.825Z" }, - { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484, upload_time = "2024-07-01T09:46:29.355Z" }, - { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375, upload_time = "2024-07-01T09:46:31.756Z" }, - { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773, upload_time = "2024-07-01T09:46:33.73Z" }, - { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690, upload_time = "2024-07-01T09:46:36.587Z" }, - { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951, upload_time = "2024-07-01T09:46:38.777Z" }, - { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427, upload_time = "2024-07-01T09:46:43.15Z" }, - { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685, upload_time = "2024-07-01T09:46:45.194Z" }, - { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883, upload_time = "2024-07-01T09:46:47.331Z" }, - { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837, upload_time = "2024-07-01T09:46:49.647Z" }, - { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562, upload_time = "2024-07-01T09:46:51.811Z" }, - { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761, upload_time = "2024-07-01T09:46:53.961Z" }, - { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767, upload_time = "2024-07-01T09:46:56.664Z" }, - { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989, upload_time = "2024-07-01T09:46:58.977Z" }, - { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255, upload_time = "2024-07-01T09:47:01.189Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603, upload_time = "2024-07-01T09:47:03.918Z" }, - { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972, upload_time = "2024-07-01T09:47:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375, upload_time = "2024-07-01T09:47:09.065Z" }, - { url = "https://files.pythonhosted.org/packages/38/30/095d4f55f3a053392f75e2eae45eba3228452783bab3d9a920b951ac495c/pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", size = 3493889, upload_time = "2024-07-01T09:48:04.815Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e8/4ff79788803a5fcd5dc35efdc9386af153569853767bff74540725b45863/pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", size = 3346160, upload_time = "2024-07-01T09:48:07.206Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ac/4184edd511b14f760c73f5bb8a5d6fd85c591c8aff7c2229677a355c4179/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", size = 3435020, upload_time = "2024-07-01T09:48:09.66Z" }, - { url = "https://files.pythonhosted.org/packages/da/21/1749cd09160149c0a246a81d646e05f35041619ce76f6493d6a96e8d1103/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", size = 3490539, upload_time = "2024-07-01T09:48:12.529Z" }, - { url = "https://files.pythonhosted.org/packages/b6/f5/f71fe1888b96083b3f6dfa0709101f61fc9e972c0c8d04e9d93ccef2a045/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", size = 3476125, upload_time = "2024-07-01T09:48:14.891Z" }, - { url = "https://files.pythonhosted.org/packages/96/b9/c0362c54290a31866c3526848583a2f45a535aa9d725fd31e25d318c805f/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", size = 3579373, upload_time = "2024-07-01T09:48:17.601Z" }, - { url = "https://files.pythonhosted.org/packages/52/3b/ce7a01026a7cf46e5452afa86f97a5e88ca97f562cafa76570178ab56d8d/pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", size = 2554661, upload_time = "2024-07-01T09:48:20.293Z" }, + { url = "https://files.pythonhosted.org/packages/0e/69/a31cccd538ca0b5272be2a38347f8839b97a14be104ea08b0db92f749c74/pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", size = 3509271, upload-time = "2024-07-01T09:45:22.07Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9e/4143b907be8ea0bce215f2ae4f7480027473f8b61fcedfda9d851082a5d2/pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", size = 3375658, upload-time = "2024-07-01T09:45:25.292Z" }, + { url = "https://files.pythonhosted.org/packages/8a/25/1fc45761955f9359b1169aa75e241551e74ac01a09f487adaaf4c3472d11/pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", size = 4332075, upload-time = "2024-07-01T09:45:27.94Z" }, + { url = "https://files.pythonhosted.org/packages/5e/dd/425b95d0151e1d6c951f45051112394f130df3da67363b6bc75dc4c27aba/pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", size = 4444808, upload-time = "2024-07-01T09:45:30.305Z" }, + { url = "https://files.pythonhosted.org/packages/b1/84/9a15cc5726cbbfe7f9f90bfb11f5d028586595907cd093815ca6644932e3/pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", size = 4356290, upload-time = "2024-07-01T09:45:32.868Z" }, + { url = "https://files.pythonhosted.org/packages/b5/5b/6651c288b08df3b8c1e2f8c1152201e0b25d240e22ddade0f1e242fc9fa0/pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", size = 4525163, upload-time = "2024-07-01T09:45:35.279Z" }, + { url = "https://files.pythonhosted.org/packages/07/8b/34854bf11a83c248505c8cb0fcf8d3d0b459a2246c8809b967963b6b12ae/pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", size = 4463100, upload-time = "2024-07-01T09:45:37.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/63/0632aee4e82476d9cbe5200c0cdf9ba41ee04ed77887432845264d81116d/pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", size = 4592880, upload-time = "2024-07-01T09:45:39.89Z" }, + { url = "https://files.pythonhosted.org/packages/df/56/b8663d7520671b4398b9d97e1ed9f583d4afcbefbda3c6188325e8c297bd/pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", size = 2235218, upload-time = "2024-07-01T09:45:42.771Z" }, + { url = "https://files.pythonhosted.org/packages/f4/72/0203e94a91ddb4a9d5238434ae6c1ca10e610e8487036132ea9bf806ca2a/pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", size = 2554487, upload-time = "2024-07-01T09:45:45.176Z" }, + { url = "https://files.pythonhosted.org/packages/bd/52/7e7e93d7a6e4290543f17dc6f7d3af4bd0b3dd9926e2e8a35ac2282bc5f4/pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1", size = 2243219, upload-time = "2024-07-01T09:45:47.274Z" }, + { url = "https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", size = 3509265, upload-time = "2024-07-01T09:45:49.812Z" }, + { url = "https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", size = 3375655, upload-time = "2024-07-01T09:45:52.462Z" }, + { url = "https://files.pythonhosted.org/packages/73/d5/c4011a76f4207a3c151134cd22a1415741e42fa5ddecec7c0182887deb3d/pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", size = 4340304, upload-time = "2024-07-01T09:45:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/ac/10/c67e20445a707f7a610699bba4fe050583b688d8cd2d202572b257f46600/pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", size = 4452804, upload-time = "2024-07-01T09:45:58.437Z" }, + { url = "https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", size = 4365126, upload-time = "2024-07-01T09:46:00.713Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", size = 4533541, upload-time = "2024-07-01T09:46:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7c/01b8dbdca5bc6785573f4cee96e2358b0918b7b2c7b60d8b6f3abf87a070/pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", size = 4471616, upload-time = "2024-07-01T09:46:05.356Z" }, + { url = "https://files.pythonhosted.org/packages/c8/57/2899b82394a35a0fbfd352e290945440e3b3785655a03365c0ca8279f351/pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", size = 4600802, upload-time = "2024-07-01T09:46:08.145Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d7/a44f193d4c26e58ee5d2d9db3d4854b2cfb5b5e08d360a5e03fe987c0086/pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", size = 2235213, upload-time = "2024-07-01T09:46:10.211Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", size = 2554498, upload-time = "2024-07-01T09:46:12.685Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c8/310ac16ac2b97e902d9eb438688de0d961660a87703ad1561fd3dfbd2aa0/pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", size = 2243219, upload-time = "2024-07-01T09:46:14.83Z" }, + { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350, upload-time = "2024-07-01T09:46:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980, upload-time = "2024-07-01T09:46:19.169Z" }, + { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799, upload-time = "2024-07-01T09:46:21.883Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973, upload-time = "2024-07-01T09:46:24.321Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054, upload-time = "2024-07-01T09:46:26.825Z" }, + { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484, upload-time = "2024-07-01T09:46:29.355Z" }, + { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375, upload-time = "2024-07-01T09:46:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773, upload-time = "2024-07-01T09:46:33.73Z" }, + { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690, upload-time = "2024-07-01T09:46:36.587Z" }, + { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951, upload-time = "2024-07-01T09:46:38.777Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427, upload-time = "2024-07-01T09:46:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685, upload-time = "2024-07-01T09:46:45.194Z" }, + { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883, upload-time = "2024-07-01T09:46:47.331Z" }, + { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837, upload-time = "2024-07-01T09:46:49.647Z" }, + { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562, upload-time = "2024-07-01T09:46:51.811Z" }, + { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761, upload-time = "2024-07-01T09:46:53.961Z" }, + { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767, upload-time = "2024-07-01T09:46:56.664Z" }, + { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989, upload-time = "2024-07-01T09:46:58.977Z" }, + { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255, upload-time = "2024-07-01T09:47:01.189Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603, upload-time = "2024-07-01T09:47:03.918Z" }, + { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972, upload-time = "2024-07-01T09:47:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375, upload-time = "2024-07-01T09:47:09.065Z" }, + { url = "https://files.pythonhosted.org/packages/38/30/095d4f55f3a053392f75e2eae45eba3228452783bab3d9a920b951ac495c/pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", size = 3493889, upload-time = "2024-07-01T09:48:04.815Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e8/4ff79788803a5fcd5dc35efdc9386af153569853767bff74540725b45863/pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", size = 3346160, upload-time = "2024-07-01T09:48:07.206Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ac/4184edd511b14f760c73f5bb8a5d6fd85c591c8aff7c2229677a355c4179/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", size = 3435020, upload-time = "2024-07-01T09:48:09.66Z" }, + { url = "https://files.pythonhosted.org/packages/da/21/1749cd09160149c0a246a81d646e05f35041619ce76f6493d6a96e8d1103/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", size = 3490539, upload-time = "2024-07-01T09:48:12.529Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f5/f71fe1888b96083b3f6dfa0709101f61fc9e972c0c8d04e9d93ccef2a045/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", size = 3476125, upload-time = "2024-07-01T09:48:14.891Z" }, + { url = "https://files.pythonhosted.org/packages/96/b9/c0362c54290a31866c3526848583a2f45a535aa9d725fd31e25d318c805f/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", size = 3579373, upload-time = "2024-07-01T09:48:17.601Z" }, + { url = "https://files.pythonhosted.org/packages/52/3b/ce7a01026a7cf46e5452afa86f97a5e88ca97f562cafa76570178ab56d8d/pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", size = 2554661, upload-time = "2024-07-01T09:48:20.293Z" }, ] [[package]] name = "platformdirs" version = "4.3.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291, upload_time = "2025-03-19T20:36:10.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291, upload-time = "2025-03-19T20:36:10.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499, upload_time = "2025-03-19T20:36:09.038Z" }, + { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499, upload-time = "2025-03-19T20:36:09.038Z" }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload_time = "2024-04-20T21:34:42.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload_time = "2024-04-20T21:34:40.434Z" }, + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, ] [[package]] @@ -1771,51 +1775,51 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/c0/5e9c4d2a643a00a6f67578ef35485173de273a4567279e4f0c200c01386b/prettytable-3.9.0.tar.gz", hash = "sha256:f4ed94803c23073a90620b201965e5dc0bccf1760b7a7eaf3158cab8aaffdf34", size = 47874, upload_time = "2023-09-11T14:04:14.548Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/c0/5e9c4d2a643a00a6f67578ef35485173de273a4567279e4f0c200c01386b/prettytable-3.9.0.tar.gz", hash = "sha256:f4ed94803c23073a90620b201965e5dc0bccf1760b7a7eaf3158cab8aaffdf34", size = 47874, upload-time = "2023-09-11T14:04:14.548Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/81/316b6a55a0d1f327d04cc7b0ba9d04058cb62de6c3a4d4b0df280cbe3b0b/prettytable-3.9.0-py3-none-any.whl", hash = "sha256:a71292ab7769a5de274b146b276ce938786f56c31cf7cea88b6f3775d82fe8c8", size = 27772, upload_time = "2023-09-11T14:03:45.582Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/316b6a55a0d1f327d04cc7b0ba9d04058cb62de6c3a4d4b0df280cbe3b0b/prettytable-3.9.0-py3-none-any.whl", hash = "sha256:a71292ab7769a5de274b146b276ce938786f56c31cf7cea88b6f3775d82fe8c8", size = 27772, upload-time = "2023-09-11T14:03:45.582Z" }, ] [[package]] name = "protobuf" version = "4.25.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/a5/05ea470f4e793c9408bc975ce1c6957447e3134ce7f7a58c13be8b2c216f/protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e", size = 380282, upload_time = "2024-01-10T19:37:42.958Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/a5/05ea470f4e793c9408bc975ce1c6957447e3134ce7f7a58c13be8b2c216f/protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e", size = 380282, upload-time = "2024-01-10T19:37:42.958Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/2f/01f63896ddf22cbb0173ab51f54fde70b0208ca6c2f5e8416950977930e1/protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6", size = 392408, upload_time = "2024-01-10T19:37:23.466Z" }, - { url = "https://files.pythonhosted.org/packages/c1/00/c3ae19cabb36cfabc94ff0b102aac21b471c9f91a1357f8aafffb9efe8e0/protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9", size = 413397, upload_time = "2024-01-10T19:37:26.321Z" }, - { url = "https://files.pythonhosted.org/packages/b3/81/0017aefacf23273d4efd1154ef958a27eed9c177c4cc09d2d4ba398fb47f/protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d", size = 394159, upload_time = "2024-01-10T19:37:28.932Z" }, - { url = "https://files.pythonhosted.org/packages/23/17/405ba44f60a693dfe96c7a18e843707cffa0fcfad80bd8fc4f227f499ea5/protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62", size = 293698, upload_time = "2024-01-10T19:37:30.666Z" }, - { url = "https://files.pythonhosted.org/packages/81/9e/63501b8d5b4e40c7260049836bd15ec3270c936e83bc57b85e4603cc212c/protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020", size = 294609, upload_time = "2024-01-10T19:37:32.777Z" }, - { url = "https://files.pythonhosted.org/packages/ff/52/5d23df1fe3b368133ec3e2436fb3dd4ccedf44c8d5ac7f4a88087c75180b/protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830", size = 156463, upload_time = "2024-01-10T19:37:41.24Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/01f63896ddf22cbb0173ab51f54fde70b0208ca6c2f5e8416950977930e1/protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6", size = 392408, upload-time = "2024-01-10T19:37:23.466Z" }, + { url = "https://files.pythonhosted.org/packages/c1/00/c3ae19cabb36cfabc94ff0b102aac21b471c9f91a1357f8aafffb9efe8e0/protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9", size = 413397, upload-time = "2024-01-10T19:37:26.321Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/0017aefacf23273d4efd1154ef958a27eed9c177c4cc09d2d4ba398fb47f/protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d", size = 394159, upload-time = "2024-01-10T19:37:28.932Z" }, + { url = "https://files.pythonhosted.org/packages/23/17/405ba44f60a693dfe96c7a18e843707cffa0fcfad80bd8fc4f227f499ea5/protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62", size = 293698, upload-time = "2024-01-10T19:37:30.666Z" }, + { url = "https://files.pythonhosted.org/packages/81/9e/63501b8d5b4e40c7260049836bd15ec3270c936e83bc57b85e4603cc212c/protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020", size = 294609, upload-time = "2024-01-10T19:37:32.777Z" }, + { url = "https://files.pythonhosted.org/packages/ff/52/5d23df1fe3b368133ec3e2436fb3dd4ccedf44c8d5ac7f4a88087c75180b/protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830", size = 156463, upload-time = "2024-01-10T19:37:41.24Z" }, ] [[package]] name = "psutil" version = "5.9.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a0/d0/c9ae661a302931735237791f04cb7086ac244377f78692ba3b3eae3a9619/psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c", size = 498429, upload_time = "2023-12-17T11:25:21.22Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/d0/c9ae661a302931735237791f04cb7086ac244377f78692ba3b3eae3a9619/psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c", size = 498429, upload-time = "2023-12-17T11:25:21.22Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/63/86a4ccc640b4ee1193800f57bbd20b766853c0cdbdbb248a27cdfafe6cbf/psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e", size = 245972, upload_time = "2023-12-17T11:25:48.202Z" }, - { url = "https://files.pythonhosted.org/packages/58/80/cc6666b3968646f2d94de66bbc63d701d501f4aa04de43dd7d1f5dc477dd/psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284", size = 282514, upload_time = "2023-12-17T11:25:51.371Z" }, - { url = "https://files.pythonhosted.org/packages/be/fa/f1f626620e3b47e6237dcc64cb8cc1472f139e99422e5b9fa5bbcf457f48/psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe", size = 285469, upload_time = "2023-12-17T11:25:54.25Z" }, - { url = "https://files.pythonhosted.org/packages/7c/b8/dc6ebfc030b47cccc5f5229eeb15e64142b4782796c3ce169ccd60b4d511/psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68", size = 248406, upload_time = "2023-12-17T12:38:50.326Z" }, - { url = "https://files.pythonhosted.org/packages/50/28/92b74d95dd991c837813ffac0c79a581a3d129eb0fa7c1dd616d9901e0f3/psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414", size = 252245, upload_time = "2023-12-17T12:39:00.686Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8a/000d0e80156f0b96c55bda6c60f5ed6543d7b5e893ccab83117e50de1400/psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340", size = 246739, upload_time = "2023-12-17T11:25:57.305Z" }, + { url = "https://files.pythonhosted.org/packages/6c/63/86a4ccc640b4ee1193800f57bbd20b766853c0cdbdbb248a27cdfafe6cbf/psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e", size = 245972, upload-time = "2023-12-17T11:25:48.202Z" }, + { url = "https://files.pythonhosted.org/packages/58/80/cc6666b3968646f2d94de66bbc63d701d501f4aa04de43dd7d1f5dc477dd/psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284", size = 282514, upload-time = "2023-12-17T11:25:51.371Z" }, + { url = "https://files.pythonhosted.org/packages/be/fa/f1f626620e3b47e6237dcc64cb8cc1472f139e99422e5b9fa5bbcf457f48/psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe", size = 285469, upload-time = "2023-12-17T11:25:54.25Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b8/dc6ebfc030b47cccc5f5229eeb15e64142b4782796c3ce169ccd60b4d511/psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68", size = 248406, upload-time = "2023-12-17T12:38:50.326Z" }, + { url = "https://files.pythonhosted.org/packages/50/28/92b74d95dd991c837813ffac0c79a581a3d129eb0fa7c1dd616d9901e0f3/psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414", size = 252245, upload-time = "2023-12-17T12:39:00.686Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8a/000d0e80156f0b96c55bda6c60f5ed6543d7b5e893ccab83117e50de1400/psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340", size = 246739, upload-time = "2023-12-17T11:25:57.305Z" }, ] [[package]] name = "pycparser" version = "2.21" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206", size = 170877, upload_time = "2021-11-06T12:48:46.095Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206", size = 170877, upload-time = "2021-11-06T12:48:46.095Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", size = 118697, upload_time = "2021-11-06T12:50:13.61Z" }, + { url = "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", size = 118697, upload-time = "2021-11-06T12:50:13.61Z" }, ] [[package]] name = "pydantic" -version = "2.11.3" +version = "2.11.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -1823,96 +1827,96 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload_time = "2025-04-08T13:27:06.399Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540, upload-time = "2025-04-29T20:38:55.02Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload_time = "2025-04-08T13:27:03.789Z" }, + { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900, upload-time = "2025-04-29T20:38:52.724Z" }, ] [[package]] name = "pydantic-core" -version = "2.33.1" +version = "2.33.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload_time = "2025-04-02T09:49:41.8Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/ea/5f572806ab4d4223d11551af814d243b0e3e02cc6913def4d1fe4a5ca41c/pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", size = 2044021, upload_time = "2025-04-02T09:46:45.065Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d1/f86cc96d2aa80e3881140d16d12ef2b491223f90b28b9a911346c04ac359/pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", size = 1861742, upload_time = "2025-04-02T09:46:46.684Z" }, - { url = "https://files.pythonhosted.org/packages/37/08/fbd2cd1e9fc735a0df0142fac41c114ad9602d1c004aea340169ae90973b/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", size = 1910414, upload_time = "2025-04-02T09:46:48.263Z" }, - { url = "https://files.pythonhosted.org/packages/7f/73/3ac217751decbf8d6cb9443cec9b9eb0130eeada6ae56403e11b486e277e/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", size = 1996848, upload_time = "2025-04-02T09:46:49.441Z" }, - { url = "https://files.pythonhosted.org/packages/9a/f5/5c26b265cdcff2661e2520d2d1e9db72d117ea00eb41e00a76efe68cb009/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", size = 2141055, upload_time = "2025-04-02T09:46:50.602Z" }, - { url = "https://files.pythonhosted.org/packages/5d/14/a9c3cee817ef2f8347c5ce0713e91867a0dceceefcb2973942855c917379/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", size = 2753806, upload_time = "2025-04-02T09:46:52.116Z" }, - { url = "https://files.pythonhosted.org/packages/f2/68/866ce83a51dd37e7c604ce0050ff6ad26de65a7799df89f4db87dd93d1d6/pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", size = 2007777, upload_time = "2025-04-02T09:46:53.675Z" }, - { url = "https://files.pythonhosted.org/packages/b6/a8/36771f4404bb3e49bd6d4344da4dede0bf89cc1e01f3b723c47248a3761c/pydantic_core-2.33.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", size = 2122803, upload_time = "2025-04-02T09:46:55.789Z" }, - { url = "https://files.pythonhosted.org/packages/18/9c/730a09b2694aa89360d20756369822d98dc2f31b717c21df33b64ffd1f50/pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", size = 2086755, upload_time = "2025-04-02T09:46:56.956Z" }, - { url = "https://files.pythonhosted.org/packages/54/8e/2dccd89602b5ec31d1c58138d02340ecb2ebb8c2cac3cc66b65ce3edb6ce/pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", size = 2257358, upload_time = "2025-04-02T09:46:58.445Z" }, - { url = "https://files.pythonhosted.org/packages/d1/9c/126e4ac1bfad8a95a9837acdd0963695d69264179ba4ede8b8c40d741702/pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091", size = 2257916, upload_time = "2025-04-02T09:46:59.726Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ba/91eea2047e681a6853c81c20aeca9dcdaa5402ccb7404a2097c2adf9d038/pydantic_core-2.33.1-cp310-cp310-win32.whl", hash = "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", size = 1923823, upload_time = "2025-04-02T09:47:01.278Z" }, - { url = "https://files.pythonhosted.org/packages/94/c0/fcdf739bf60d836a38811476f6ecd50374880b01e3014318b6e809ddfd52/pydantic_core-2.33.1-cp310-cp310-win_amd64.whl", hash = "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", size = 1952494, upload_time = "2025-04-02T09:47:02.976Z" }, - { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload_time = "2025-04-02T09:47:04.199Z" }, - { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload_time = "2025-04-02T09:47:05.686Z" }, - { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload_time = "2025-04-02T09:47:07.042Z" }, - { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload_time = "2025-04-02T09:47:08.63Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload_time = "2025-04-02T09:47:10.267Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload_time = "2025-04-02T09:47:11.724Z" }, - { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload_time = "2025-04-02T09:47:13.099Z" }, - { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload_time = "2025-04-02T09:47:14.355Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload_time = "2025-04-02T09:47:15.676Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload_time = "2025-04-02T09:47:17Z" }, - { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload_time = "2025-04-02T09:47:18.631Z" }, - { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload_time = "2025-04-02T09:47:20.34Z" }, - { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload_time = "2025-04-02T09:47:22.029Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload_time = "2025-04-02T09:47:23.385Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload_time = "2025-04-02T09:47:25.394Z" }, - { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload_time = "2025-04-02T09:47:27.417Z" }, - { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload_time = "2025-04-02T09:47:29.006Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload_time = "2025-04-02T09:47:33.464Z" }, - { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload_time = "2025-04-02T09:47:34.812Z" }, - { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload_time = "2025-04-02T09:47:37.315Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload_time = "2025-04-02T09:47:39.013Z" }, - { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload_time = "2025-04-02T09:47:40.427Z" }, - { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload_time = "2025-04-02T09:47:42.01Z" }, - { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload_time = "2025-04-02T09:47:43.425Z" }, - { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload_time = "2025-04-02T09:47:44.979Z" }, - { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload_time = "2025-04-02T09:47:46.843Z" }, - { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload_time = "2025-04-02T09:47:48.404Z" }, - { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload_time = "2025-04-02T09:47:49.839Z" }, - { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload_time = "2025-04-02T09:47:51.648Z" }, - { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload_time = "2025-04-02T09:47:53.149Z" }, - { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload_time = "2025-04-02T09:47:55.006Z" }, - { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload_time = "2025-04-02T09:47:56.532Z" }, - { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload_time = "2025-04-02T09:47:58.088Z" }, - { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload_time = "2025-04-02T09:47:59.591Z" }, - { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload_time = "2025-04-02T09:48:01.397Z" }, - { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload_time = "2025-04-02T09:48:03.056Z" }, - { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload_time = "2025-04-02T09:48:04.662Z" }, - { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload_time = "2025-04-02T09:48:06.226Z" }, - { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload_time = "2025-04-02T09:48:08.114Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload_time = "2025-04-02T09:48:09.708Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload_time = "2025-04-02T09:48:11.288Z" }, - { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload_time = "2025-04-02T09:48:12.861Z" }, - { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload_time = "2025-04-02T09:48:14.553Z" }, - { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload_time = "2025-04-02T09:48:16.222Z" }, - { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload_time = "2025-04-02T09:48:17.97Z" }, - { url = "https://files.pythonhosted.org/packages/9c/c7/8b311d5adb0fe00a93ee9b4e92a02b0ec08510e9838885ef781ccbb20604/pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", size = 2041659, upload_time = "2025-04-02T09:48:45.342Z" }, - { url = "https://files.pythonhosted.org/packages/8a/d6/4f58d32066a9e26530daaf9adc6664b01875ae0691570094968aaa7b8fcc/pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", size = 1873294, upload_time = "2025-04-02T09:48:47.548Z" }, - { url = "https://files.pythonhosted.org/packages/f7/3f/53cc9c45d9229da427909c751f8ed2bf422414f7664ea4dde2d004f596ba/pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", size = 1903771, upload_time = "2025-04-02T09:48:49.468Z" }, - { url = "https://files.pythonhosted.org/packages/f0/49/bf0783279ce674eb9903fb9ae43f6c614cb2f1c4951370258823f795368b/pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", size = 2083558, upload_time = "2025-04-02T09:48:51.409Z" }, - { url = "https://files.pythonhosted.org/packages/9c/5b/0d998367687f986c7d8484a2c476d30f07bf5b8b1477649a6092bd4c540e/pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", size = 2118038, upload_time = "2025-04-02T09:48:53.702Z" }, - { url = "https://files.pythonhosted.org/packages/b3/33/039287d410230ee125daee57373ac01940d3030d18dba1c29cd3089dc3ca/pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", size = 2079315, upload_time = "2025-04-02T09:48:55.555Z" }, - { url = "https://files.pythonhosted.org/packages/1f/85/6d8b2646d99c062d7da2d0ab2faeb0d6ca9cca4c02da6076376042a20da3/pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", size = 2249063, upload_time = "2025-04-02T09:48:57.479Z" }, - { url = "https://files.pythonhosted.org/packages/17/d7/c37d208d5738f7b9ad8f22ae8a727d88ebf9c16c04ed2475122cc3f7224a/pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", size = 2254631, upload_time = "2025-04-02T09:48:59.581Z" }, - { url = "https://files.pythonhosted.org/packages/13/e0/bafa46476d328e4553b85ab9b2f7409e7aaef0ce4c937c894821c542d347/pydantic_core-2.33.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", size = 2080877, upload_time = "2025-04-02T09:49:01.52Z" }, - { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload_time = "2025-04-02T09:49:03.419Z" }, - { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload_time = "2025-04-02T09:49:05.391Z" }, - { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload_time = "2025-04-02T09:49:07.352Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload_time = "2025-04-02T09:49:09.304Z" }, - { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload_time = "2025-04-02T09:49:11.25Z" }, - { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload_time = "2025-04-02T09:49:13.292Z" }, - { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload_time = "2025-04-02T09:49:15.597Z" }, - { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload_time = "2025-04-02T09:49:17.61Z" }, - { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload_time = "2025-04-02T09:49:19.559Z" }, + { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817, upload-time = "2025-04-23T18:30:43.919Z" }, + { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357, upload-time = "2025-04-23T18:30:46.372Z" }, + { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011, upload-time = "2025-04-23T18:30:47.591Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730, upload-time = "2025-04-23T18:30:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178, upload-time = "2025-04-23T18:30:50.907Z" }, + { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462, upload-time = "2025-04-23T18:30:52.083Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652, upload-time = "2025-04-23T18:30:53.389Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306, upload-time = "2025-04-23T18:30:54.661Z" }, + { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720, upload-time = "2025-04-23T18:30:56.11Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915, upload-time = "2025-04-23T18:30:57.501Z" }, + { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884, upload-time = "2025-04-23T18:30:58.867Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496, upload-time = "2025-04-23T18:31:00.078Z" }, + { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019, upload-time = "2025-04-23T18:31:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982, upload-time = "2025-04-23T18:32:53.14Z" }, + { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412, upload-time = "2025-04-23T18:32:55.52Z" }, + { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749, upload-time = "2025-04-23T18:32:57.546Z" }, + { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527, upload-time = "2025-04-23T18:32:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225, upload-time = "2025-04-23T18:33:04.51Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490, upload-time = "2025-04-23T18:33:06.391Z" }, + { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525, upload-time = "2025-04-23T18:33:08.44Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446, upload-time = "2025-04-23T18:33:10.313Z" }, + { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] [[package]] @@ -1924,36 +1928,36 @@ dependencies = [ { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234, upload_time = "2025-04-18T16:44:48.265Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234, upload-time = "2025-04-18T16:44:48.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356, upload_time = "2025-04-18T16:44:46.617Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356, upload-time = "2025-04-18T16:44:46.617Z" }, ] [[package]] name = "pygments" version = "2.17.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/55/59/8bccf4157baf25e4aa5a0bb7fa3ba8600907de105ebc22b0c78cfbf6f565/pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367", size = 4827772, upload_time = "2023-11-21T20:43:53.875Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/59/8bccf4157baf25e4aa5a0bb7fa3ba8600907de105ebc22b0c78cfbf6f565/pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367", size = 4827772, upload-time = "2023-11-21T20:43:53.875Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", size = 1179756, upload_time = "2023-11-21T20:43:49.423Z" }, + { url = "https://files.pythonhosted.org/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", size = 1179756, upload-time = "2023-11-21T20:43:49.423Z" }, ] [[package]] name = "pyparsing" version = "3.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/37/fe/65c989f70bd630b589adfbbcd6ed238af22319e90f059946c26b4835e44b/pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db", size = 884814, upload_time = "2023-07-30T15:07:02.617Z" } +sdist = { url = "https://files.pythonhosted.org/packages/37/fe/65c989f70bd630b589adfbbcd6ed238af22319e90f059946c26b4835e44b/pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db", size = 884814, upload-time = "2023-07-30T15:07:02.617Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", size = 103139, upload_time = "2023-07-30T15:06:59.829Z" }, + { url = "https://files.pythonhosted.org/packages/39/92/8486ede85fcc088f1b3dba4ce92dd29d126fd96b0008ea213167940a2475/pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", size = 103139, upload-time = "2023-07-30T15:06:59.829Z" }, ] [[package]] name = "pyreadline3" version = "3.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/86/3d61a61f36a0067874a00cb4dceb9028d34b6060e47828f7fc86fb9f7ee9/pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae", size = 86465, upload_time = "2022-01-24T20:05:11.66Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/86/3d61a61f36a0067874a00cb4dceb9028d34b6060e47828f7fc86fb9f7ee9/pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae", size = 86465, upload-time = "2022-01-24T20:05:11.66Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/fc/a3c13ded7b3057680c8ae95a9b6cc83e63657c38e0005c400a5d018a33a7/pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb", size = 95203, upload_time = "2022-01-24T20:05:10.442Z" }, + { url = "https://files.pythonhosted.org/packages/56/fc/a3c13ded7b3057680c8ae95a9b6cc83e63657c38e0005c400a5d018a33a7/pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb", size = 95203, upload-time = "2022-01-24T20:05:10.442Z" }, ] [[package]] @@ -1968,9 +1972,9 @@ dependencies = [ { name = "pluggy" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload_time = "2025-03-02T12:54:54.503Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload_time = "2025-03-02T12:54:52.069Z" }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, ] [[package]] @@ -1980,9 +1984,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156, upload_time = "2025-03-25T06:22:28.883Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156, upload-time = "2025-03-25T06:22:28.883Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694, upload_time = "2025-03-25T06:22:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694, upload-time = "2025-03-25T06:22:27.807Z" }, ] [[package]] @@ -1993,9 +1997,9 @@ dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857, upload_time = "2025-04-05T14:07:51.592Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857, upload-time = "2025-04-05T14:07:51.592Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841, upload_time = "2025-04-05T14:07:49.641Z" }, + { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841, upload-time = "2025-04-05T14:07:49.641Z" }, ] [[package]] @@ -2005,9 +2009,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814, upload_time = "2024-03-21T22:14:04.964Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c6/90/a955c3ab35ccd41ad4de556596fa86685bf4fc5ffcc62d22d856cfd4e29a/pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0", size = 32814, upload-time = "2024-03-21T22:14:04.964Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863, upload_time = "2024-03-21T22:14:02.694Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3b/b26f90f74e2986a82df6e7ac7e319b8ea7ccece1caec9f8ab6104dc70603/pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f", size = 9863, upload-time = "2024-03-21T22:14:02.694Z" }, ] [[package]] @@ -2017,18 +2021,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", size = 357324, upload_time = "2021-07-14T08:19:19.783Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", size = 357324, upload-time = "2021-07-14T08:19:19.783Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", size = 247702, upload_time = "2021-07-14T08:19:18.161Z" }, + { url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", size = 247702, upload-time = "2021-07-14T08:19:18.161Z" }, ] [[package]] name = "python-dotenv" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/31/06/1ef763af20d0572c032fa22882cfbfb005fba6e7300715a37840858c919e/python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", size = 37399, upload_time = "2023-02-24T06:46:37.282Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/06/1ef763af20d0572c032fa22882cfbfb005fba6e7300715a37840858c919e/python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", size = 37399, upload-time = "2023-02-24T06:46:37.282Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/2f/62ea1c8b593f4e093cc1a7768f0d46112107e790c3e478532329e434f00b/python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a", size = 19482, upload_time = "2023-02-24T06:46:36.009Z" }, + { url = "https://files.pythonhosted.org/packages/44/2f/62ea1c8b593f4e093cc1a7768f0d46112107e790c3e478532329e434f00b/python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a", size = 19482, upload-time = "2023-02-24T06:46:36.009Z" }, ] [[package]] @@ -2038,18 +2042,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "simple-websocket" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/e1/eee1129544b7f78fa2afa9fa0fce153cdcb21015b9b331d1b8adf90f45cb/python_engineio-4.12.0.tar.gz", hash = "sha256:f42a36a868d7063aa10ddccf6bd6117a169b6bd00d7ca53999772093b62014f9", size = 91503, upload_time = "2025-04-12T15:30:23.905Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/e1/eee1129544b7f78fa2afa9fa0fce153cdcb21015b9b331d1b8adf90f45cb/python_engineio-4.12.0.tar.gz", hash = "sha256:f42a36a868d7063aa10ddccf6bd6117a169b6bd00d7ca53999772093b62014f9", size = 91503, upload-time = "2025-04-12T15:30:23.905Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/f7/0aeea75424c47633c1d98557a2323be23bed31fa950f00161b34a5150d06/python_engineio-4.12.0-py3-none-any.whl", hash = "sha256:a0c47c129c39777e8ebc6d18011efd50db2144e4e8f08983acae8a3614626535", size = 59319, upload_time = "2025-04-12T15:30:22.325Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f7/0aeea75424c47633c1d98557a2323be23bed31fa950f00161b34a5150d06/python_engineio-4.12.0-py3-none-any.whl", hash = "sha256:a0c47c129c39777e8ebc6d18011efd50db2144e4e8f08983acae8a3614626535", size = 59319, upload-time = "2025-04-12T15:30:22.325Z" }, ] [[package]] name = "python-multipart" version = "0.0.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload_time = "2024-12-16T19:45:46.972Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload-time = "2024-12-16T19:45:46.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload_time = "2024-12-16T19:45:44.423Z" }, + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" }, ] [[package]] @@ -2060,9 +2064,9 @@ dependencies = [ { name = "bidict" }, { name = "python-engineio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/1a/396d50ccf06ee539fa758ce5623b59a9cb27637fc4b2dc07ed08bf495e77/python_socketio-5.13.0.tar.gz", hash = "sha256:ac4e19a0302ae812e23b712ec8b6427ca0521f7c582d6abb096e36e24a263029", size = 121125, upload_time = "2025-04-12T15:46:59.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/1a/396d50ccf06ee539fa758ce5623b59a9cb27637fc4b2dc07ed08bf495e77/python_socketio-5.13.0.tar.gz", hash = "sha256:ac4e19a0302ae812e23b712ec8b6427ca0521f7c582d6abb096e36e24a263029", size = 121125, upload-time = "2025-04-12T15:46:59.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.whl", hash = "sha256:51f68d6499f2df8524668c24bcec13ba1414117cfb3a90115c559b601ab10caf", size = 77800, upload_time = "2025-04-12T15:46:58.412Z" }, + { url = "https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.whl", hash = "sha256:51f68d6499f2df8524668c24bcec13ba1414117cfb3a90115c559b601ab10caf", size = 77800, upload-time = "2025-04-12T15:46:58.412Z" }, ] [package.optional-dependencies] @@ -2076,45 +2080,45 @@ name = "pywin32" version = "306" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/dc/28c668097edfaf4eac4617ef7adf081b9cf50d254672fcf399a70f5efc41/pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d", size = 8506422, upload_time = "2023-03-26T03:27:46.303Z" }, - { url = "https://files.pythonhosted.org/packages/d3/d6/891894edec688e72c2e308b3243fad98b4066e1839fd2fe78f04129a9d31/pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8", size = 9226392, upload_time = "2023-03-26T03:27:53.591Z" }, - { url = "https://files.pythonhosted.org/packages/8b/1e/fc18ad83ca553e01b97aa8393ff10e33c1fb57801db05488b83282ee9913/pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407", size = 8507689, upload_time = "2023-03-25T23:50:08.499Z" }, - { url = "https://files.pythonhosted.org/packages/7e/9e/ad6b1ae2a5ad1066dc509350e0fbf74d8d50251a51e420a2a8feaa0cecbd/pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e", size = 9227547, upload_time = "2023-03-25T23:50:20.331Z" }, - { url = "https://files.pythonhosted.org/packages/91/20/f744bff1da8f43388498503634378dbbefbe493e65675f2cc52f7185c2c2/pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a", size = 10388324, upload_time = "2023-03-25T23:50:30.904Z" }, - { url = "https://files.pythonhosted.org/packages/14/91/17e016d5923e178346aabda3dfec6629d1a26efe587d19667542105cf0a6/pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b", size = 8507705, upload_time = "2023-03-25T23:50:40.279Z" }, - { url = "https://files.pythonhosted.org/packages/83/1c/25b79fc3ec99b19b0a0730cc47356f7e2959863bf9f3cd314332bddb4f68/pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e", size = 9227429, upload_time = "2023-03-25T23:50:50.222Z" }, - { url = "https://files.pythonhosted.org/packages/1c/43/e3444dc9a12f8365d9603c2145d16bf0a2f8180f343cf87be47f5579e547/pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040", size = 10388145, upload_time = "2023-03-25T23:51:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/08/dc/28c668097edfaf4eac4617ef7adf081b9cf50d254672fcf399a70f5efc41/pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d", size = 8506422, upload-time = "2023-03-26T03:27:46.303Z" }, + { url = "https://files.pythonhosted.org/packages/d3/d6/891894edec688e72c2e308b3243fad98b4066e1839fd2fe78f04129a9d31/pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8", size = 9226392, upload-time = "2023-03-26T03:27:53.591Z" }, + { url = "https://files.pythonhosted.org/packages/8b/1e/fc18ad83ca553e01b97aa8393ff10e33c1fb57801db05488b83282ee9913/pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407", size = 8507689, upload-time = "2023-03-25T23:50:08.499Z" }, + { url = "https://files.pythonhosted.org/packages/7e/9e/ad6b1ae2a5ad1066dc509350e0fbf74d8d50251a51e420a2a8feaa0cecbd/pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e", size = 9227547, upload-time = "2023-03-25T23:50:20.331Z" }, + { url = "https://files.pythonhosted.org/packages/91/20/f744bff1da8f43388498503634378dbbefbe493e65675f2cc52f7185c2c2/pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a", size = 10388324, upload-time = "2023-03-25T23:50:30.904Z" }, + { url = "https://files.pythonhosted.org/packages/14/91/17e016d5923e178346aabda3dfec6629d1a26efe587d19667542105cf0a6/pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b", size = 8507705, upload-time = "2023-03-25T23:50:40.279Z" }, + { url = "https://files.pythonhosted.org/packages/83/1c/25b79fc3ec99b19b0a0730cc47356f7e2959863bf9f3cd314332bddb4f68/pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e", size = 9227429, upload-time = "2023-03-25T23:50:50.222Z" }, + { url = "https://files.pythonhosted.org/packages/1c/43/e3444dc9a12f8365d9603c2145d16bf0a2f8180f343cf87be47f5579e547/pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040", size = 10388145, upload-time = "2023-03-25T23:51:01.401Z" }, ] [[package]] name = "pyyaml" version = "6.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", size = 125201, upload_time = "2023-07-18T00:00:23.308Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", size = 125201, upload-time = "2023-07-18T00:00:23.308Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", size = 189447, upload_time = "2023-07-17T23:57:04.325Z" }, - { url = "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", size = 169264, upload_time = "2023-07-17T23:57:07.787Z" }, - { url = "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", size = 677003, upload_time = "2023-07-17T23:57:13.144Z" }, - { url = "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", size = 699070, upload_time = "2023-07-17T23:57:19.402Z" }, - { url = "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", size = 705525, upload_time = "2023-07-17T23:57:25.272Z" }, - { url = "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", size = 707514, upload_time = "2023-08-28T18:43:20.945Z" }, - { url = "https://files.pythonhosted.org/packages/b6/a0/b6700da5d49e9fed49dc3243d3771b598dad07abb37cc32e524607f96adc/PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", size = 130488, upload_time = "2023-07-17T23:57:28.144Z" }, - { url = "https://files.pythonhosted.org/packages/24/97/9b59b43431f98d01806b288532da38099cc6f2fea0f3d712e21e269c0279/PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", size = 145338, upload_time = "2023-07-17T23:57:31.118Z" }, - { url = "https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", size = 187867, upload_time = "2023-07-17T23:57:34.35Z" }, - { url = "https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", size = 167530, upload_time = "2023-07-17T23:57:36.975Z" }, - { url = "https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", size = 732244, upload_time = "2023-07-17T23:57:43.774Z" }, - { url = "https://files.pythonhosted.org/packages/06/92/e0224aa6ebf9dc54a06a4609da37da40bb08d126f5535d81bff6b417b2ae/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", size = 752871, upload_time = "2023-07-17T23:57:51.921Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", size = 757729, upload_time = "2023-07-17T23:57:59.865Z" }, - { url = "https://files.pythonhosted.org/packages/03/5c/c4671451b2f1d76ebe352c0945d4cd13500adb5d05f5a51ee296d80152f7/PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", size = 748528, upload_time = "2023-08-28T18:43:23.207Z" }, - { url = "https://files.pythonhosted.org/packages/73/9c/766e78d1efc0d1fca637a6b62cea1b4510a7fb93617eb805223294fef681/PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", size = 130286, upload_time = "2023-07-17T23:58:02.964Z" }, - { url = "https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", size = 144699, upload_time = "2023-07-17T23:58:05.586Z" }, - { url = "https://files.pythonhosted.org/packages/bc/06/1b305bf6aa704343be85444c9d011f626c763abb40c0edc1cad13bfd7f86/PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", size = 178692, upload_time = "2023-08-28T18:43:24.924Z" }, - { url = "https://files.pythonhosted.org/packages/84/02/404de95ced348b73dd84f70e15a41843d817ff8c1744516bf78358f2ffd2/PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", size = 165622, upload_time = "2023-08-28T18:43:26.54Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4c/4a2908632fc980da6d918b9de9c1d9d7d7e70b2672b1ad5166ed27841ef7/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", size = 696937, upload_time = "2024-01-18T20:40:22.92Z" }, - { url = "https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", size = 724969, upload_time = "2023-08-28T18:43:28.56Z" }, - { url = "https://files.pythonhosted.org/packages/4f/78/77b40157b6cb5f2d3d31a3d9b2efd1ba3505371f76730d267e8b32cf4b7f/PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", size = 712604, upload_time = "2023-08-28T18:43:30.206Z" }, - { url = "https://files.pythonhosted.org/packages/2e/97/3e0e089ee85e840f4b15bfa00e4e63d84a3691ababbfea92d6f820ea6f21/PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", size = 126098, upload_time = "2023-08-28T18:43:31.835Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/fbade56564ad486809c27b322d0f7e6a89c01f6b4fe208402e90d4443a99/PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", size = 138675, upload_time = "2023-08-28T18:43:33.613Z" }, + { url = "https://files.pythonhosted.org/packages/96/06/4beb652c0fe16834032e54f0956443d4cc797fe645527acee59e7deaa0a2/PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", size = 189447, upload-time = "2023-07-17T23:57:04.325Z" }, + { url = "https://files.pythonhosted.org/packages/5b/07/10033a403b23405a8fc48975444463d3d10a5c2736b7eb2550b07b367429/PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f", size = 169264, upload-time = "2023-07-17T23:57:07.787Z" }, + { url = "https://files.pythonhosted.org/packages/f1/26/55e4f21db1f72eaef092015d9017c11510e7e6301c62a6cfee91295d13c6/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", size = 677003, upload-time = "2023-07-17T23:57:13.144Z" }, + { url = "https://files.pythonhosted.org/packages/ba/91/090818dfa62e85181f3ae23dd1e8b7ea7f09684864a900cab72d29c57346/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", size = 699070, upload-time = "2023-07-17T23:57:19.402Z" }, + { url = "https://files.pythonhosted.org/packages/29/61/bf33c6c85c55bc45a29eee3195848ff2d518d84735eb0e2d8cb42e0d285e/PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", size = 705525, upload-time = "2023-07-17T23:57:25.272Z" }, + { url = "https://files.pythonhosted.org/packages/07/91/45dfd0ef821a7f41d9d0136ea3608bb5b1653e42fd56a7970532cb5c003f/PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", size = 707514, upload-time = "2023-08-28T18:43:20.945Z" }, + { url = "https://files.pythonhosted.org/packages/b6/a0/b6700da5d49e9fed49dc3243d3771b598dad07abb37cc32e524607f96adc/PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", size = 130488, upload-time = "2023-07-17T23:57:28.144Z" }, + { url = "https://files.pythonhosted.org/packages/24/97/9b59b43431f98d01806b288532da38099cc6f2fea0f3d712e21e269c0279/PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", size = 145338, upload-time = "2023-07-17T23:57:31.118Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0d/26fb23e8863e0aeaac0c64e03fd27367ad2ae3f3cccf3798ee98ce160368/PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", size = 187867, upload-time = "2023-07-17T23:57:34.35Z" }, + { url = "https://files.pythonhosted.org/packages/28/09/55f715ddbf95a054b764b547f617e22f1d5e45d83905660e9a088078fe67/PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", size = 167530, upload-time = "2023-07-17T23:57:36.975Z" }, + { url = "https://files.pythonhosted.org/packages/5e/94/7d5ee059dfb92ca9e62f4057dcdec9ac08a9e42679644854dc01177f8145/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", size = 732244, upload-time = "2023-07-17T23:57:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/06/92/e0224aa6ebf9dc54a06a4609da37da40bb08d126f5535d81bff6b417b2ae/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", size = 752871, upload-time = "2023-07-17T23:57:51.921Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5e/efd033ab7199a0b2044dab3b9f7a4f6670e6a52c089de572e928d2873b06/PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", size = 757729, upload-time = "2023-07-17T23:57:59.865Z" }, + { url = "https://files.pythonhosted.org/packages/03/5c/c4671451b2f1d76ebe352c0945d4cd13500adb5d05f5a51ee296d80152f7/PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", size = 748528, upload-time = "2023-08-28T18:43:23.207Z" }, + { url = "https://files.pythonhosted.org/packages/73/9c/766e78d1efc0d1fca637a6b62cea1b4510a7fb93617eb805223294fef681/PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", size = 130286, upload-time = "2023-07-17T23:58:02.964Z" }, + { url = "https://files.pythonhosted.org/packages/b3/34/65bb4b2d7908044963ebf614fe0fdb080773fc7030d7e39c8d3eddcd4257/PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", size = 144699, upload-time = "2023-07-17T23:58:05.586Z" }, + { url = "https://files.pythonhosted.org/packages/bc/06/1b305bf6aa704343be85444c9d011f626c763abb40c0edc1cad13bfd7f86/PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", size = 178692, upload-time = "2023-08-28T18:43:24.924Z" }, + { url = "https://files.pythonhosted.org/packages/84/02/404de95ced348b73dd84f70e15a41843d817ff8c1744516bf78358f2ffd2/PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", size = 165622, upload-time = "2023-08-28T18:43:26.54Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4c/4a2908632fc980da6d918b9de9c1d9d7d7e70b2672b1ad5166ed27841ef7/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", size = 696937, upload-time = "2024-01-18T20:40:22.92Z" }, + { url = "https://files.pythonhosted.org/packages/b4/33/720548182ffa8344418126017aa1d4ab4aeec9a2275f04ce3f3573d8ace8/PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", size = 724969, upload-time = "2023-08-28T18:43:28.56Z" }, + { url = "https://files.pythonhosted.org/packages/4f/78/77b40157b6cb5f2d3d31a3d9b2efd1ba3505371f76730d267e8b32cf4b7f/PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", size = 712604, upload-time = "2023-08-28T18:43:30.206Z" }, + { url = "https://files.pythonhosted.org/packages/2e/97/3e0e089ee85e840f4b15bfa00e4e63d84a3691ababbfea92d6f820ea6f21/PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", size = 126098, upload-time = "2023-08-28T18:43:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/fbade56564ad486809c27b322d0f7e6a89c01f6b4fe208402e90d4443a99/PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", size = 138675, upload-time = "2023-08-28T18:43:33.613Z" }, ] [[package]] @@ -2124,46 +2128,46 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/33/1a3683fc9a4bd64d8ccc0290da75c8f042184a1a49c146d28398414d3341/pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226", size = 1402339, upload_time = "2023-12-05T07:34:47.976Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/33/1a3683fc9a4bd64d8ccc0290da75c8f042184a1a49c146d28398414d3341/pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226", size = 1402339, upload-time = "2023-12-05T07:34:47.976Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/f4/901edb48b2b2c00ad73de0db2ee76e24ce5903ef815ad0ad10e14555d989/pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4", size = 1872310, upload_time = "2023-12-05T07:48:13.713Z" }, - { url = "https://files.pythonhosted.org/packages/5e/46/2de69c7c79fd78bf4c22a9e8165fa6312f5d49410f1be6ddab51a6fe7236/pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0", size = 1249619, upload_time = "2023-12-05T07:50:38.691Z" }, - { url = "https://files.pythonhosted.org/packages/d1/f5/d6b9755713843bf9701ae86bf6fd97ec294a52cf2af719cd14fdf9392f65/pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e", size = 897360, upload_time = "2023-12-05T07:42:26.268Z" }, - { url = "https://files.pythonhosted.org/packages/7c/88/c1aef8820f12e710d136024d231e70e24684a01314aa1814f0758960ba01/pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872", size = 1156959, upload_time = "2023-12-05T07:44:29.904Z" }, - { url = "https://files.pythonhosted.org/packages/82/1b/b25d2c4ac3b4dae238c98e63395dbb88daf11968b168948d3c6289c3e95c/pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d", size = 1100585, upload_time = "2023-12-05T07:45:05.518Z" }, - { url = "https://files.pythonhosted.org/packages/67/bf/6bc0977acd934b66eacab79cec303ecf08ae4a6150d57c628aa919615488/pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75", size = 1109267, upload_time = "2023-12-05T07:39:51.21Z" }, - { url = "https://files.pythonhosted.org/packages/64/fb/4f07424e56c6a5fb47306d9ba744c3c250250c2e7272f9c81efbf8daaccf/pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6", size = 1431853, upload_time = "2023-12-05T07:41:09.261Z" }, - { url = "https://files.pythonhosted.org/packages/a2/10/2b88c1d4beb59a1d45c13983c4b7c5dcd6ef7988db3c03d23b0cabc5adca/pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979", size = 1766212, upload_time = "2023-12-05T07:49:05.926Z" }, - { url = "https://files.pythonhosted.org/packages/bc/ab/c9a22eacfd5bd82620501ae426a3dd6ffa374ac335b21e54209d7a93d3fb/pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08", size = 1653737, upload_time = "2023-12-05T07:49:09.096Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e5/71bd89e47eedb7ebec31ef9a49dcdb0517dbbb063bd5de363980a6911eb1/pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886", size = 906288, upload_time = "2023-12-05T07:42:05.509Z" }, - { url = "https://files.pythonhosted.org/packages/9d/5f/2defc8a579e8b5679d92720ab3a4cb93e3a77d923070bf4c1a103d3ae478/pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6", size = 1170923, upload_time = "2023-12-05T07:44:54.296Z" }, - { url = "https://files.pythonhosted.org/packages/35/de/7579518bc58cebf92568b48e354a702fb52525d0fab166dc544f2a0615dc/pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c", size = 1870360, upload_time = "2023-12-05T07:48:16.153Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f9/58b6cc9a110b1832f666fa6b5a67dc4d520fabfc680ca87a8167b2061d5d/pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1", size = 1249008, upload_time = "2023-12-05T07:50:40.442Z" }, - { url = "https://files.pythonhosted.org/packages/bc/4a/ac6469c01813cb3652ab4e30ec4a37815cc9949afc18af33f64e2ec704aa/pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348", size = 904394, upload_time = "2023-12-05T07:42:27.815Z" }, - { url = "https://files.pythonhosted.org/packages/77/b7/8cee519b11bdd3f76c1a6eb537ab13c1bfef2964d725717705c86f524e4c/pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642", size = 1161453, upload_time = "2023-12-05T07:44:32.003Z" }, - { url = "https://files.pythonhosted.org/packages/b6/1d/c35a956a44b333b064ae1b1c588c2dfa0e01b7ec90884c1972bfcef119c3/pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840", size = 1105501, upload_time = "2023-12-05T07:45:07.18Z" }, - { url = "https://files.pythonhosted.org/packages/18/d1/b3d1e985318ed7287737ea9e6b6e21748cc7c89accc2443347cd2c8d5f0f/pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d", size = 1109513, upload_time = "2023-12-05T07:39:53.338Z" }, - { url = "https://files.pythonhosted.org/packages/14/9b/341cdfb47440069010101403298dc24d449150370c6cb322e73bfa1949bd/pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b", size = 1433541, upload_time = "2023-12-05T07:41:10.786Z" }, - { url = "https://files.pythonhosted.org/packages/fa/52/c6d4e76e020c554e965459d41a98201b4d45277a288648f53a4e5a2429cc/pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b", size = 1766133, upload_time = "2023-12-05T07:49:11.204Z" }, - { url = "https://files.pythonhosted.org/packages/1d/6d/0cbd8dd5b8979fd6b9cf1852ed067b9d2cd6fa0c09c3bafe6874d2d2e03c/pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3", size = 1653636, upload_time = "2023-12-05T07:49:13.787Z" }, - { url = "https://files.pythonhosted.org/packages/f5/af/d90eed9cf3840685d54d4a35d5f9e242a8a48b5410d41146f14c1e098302/pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097", size = 904865, upload_time = "2023-12-05T07:42:07.189Z" }, - { url = "https://files.pythonhosted.org/packages/20/d2/09443dc73053ad01c846d7fb77e09fe9d93c09d4e900215f3c8b7b56bfec/pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9", size = 1171332, upload_time = "2023-12-05T07:44:56.111Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f0/d71cf69dc039c9adc8b625efc3bad3684f3660a570e47f0f0c64df787b41/pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a", size = 1871111, upload_time = "2023-12-05T07:48:17.868Z" }, - { url = "https://files.pythonhosted.org/packages/68/62/d365773edf56ad71993579ee574105f02f83530caf600ebf28bea15d88d0/pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e", size = 1248844, upload_time = "2023-12-05T07:50:42.922Z" }, - { url = "https://files.pythonhosted.org/packages/72/55/cc3163e20f40615a49245fa7041badec6103e8ee7e482dbb0feea00a7b84/pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27", size = 899373, upload_time = "2023-12-05T07:42:29.595Z" }, - { url = "https://files.pythonhosted.org/packages/40/aa/ae292bd85deda637230970bbc53c1dc53696a99e82fc7cd6d373ec173853/pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30", size = 1160901, upload_time = "2023-12-05T07:44:33.819Z" }, - { url = "https://files.pythonhosted.org/packages/93/b7/6e291eafbbbc66d0e87658dd21383ec2b4ab35edcfb283902c580a6db76f/pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee", size = 1101147, upload_time = "2023-12-05T07:45:10.058Z" }, - { url = "https://files.pythonhosted.org/packages/3a/f1/e296d5a507eac519d1fe1382851b1a4575f690bc2b2d2c8eca2ed7e4bd1f/pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537", size = 1105315, upload_time = "2023-12-05T07:39:55.851Z" }, - { url = "https://files.pythonhosted.org/packages/56/63/5c2abb556ab4cf013d98e01782d5bd642238a0ed9b019e965a7d7e957f56/pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181", size = 1427747, upload_time = "2023-12-05T07:41:13.219Z" }, - { url = "https://files.pythonhosted.org/packages/b1/71/5dba5f6b12ef54fb977c9b9279075e151c04fc0dd6851e9663d9e66b593f/pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe", size = 1762221, upload_time = "2023-12-05T07:49:16.352Z" }, - { url = "https://files.pythonhosted.org/packages/cf/49/54d7e8bb3df82a3509325b11491d33450dc91580d4826b62fa5e554bb9cf/pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737", size = 1649505, upload_time = "2023-12-05T07:49:18.952Z" }, - { url = "https://files.pythonhosted.org/packages/34/14/58e5037229bc37963e2ce804c2c075a3a541e3f84bf1c231e7c9779d36f1/pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d", size = 954891, upload_time = "2023-12-05T07:42:09.208Z" }, - { url = "https://files.pythonhosted.org/packages/2c/2d/04fab685ef3a8e6e955220fd2a54dc99efaee960a88675bf5c92cd277164/pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7", size = 1252773, upload_time = "2023-12-05T07:44:58.16Z" }, - { url = "https://files.pythonhosted.org/packages/6b/fe/ed38fe12c540bafc1cae32c3ff638e9df32528f5cf91b5e400e6a8f5b3ec/pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05", size = 963654, upload_time = "2023-12-05T07:47:03.874Z" }, - { url = "https://files.pythonhosted.org/packages/44/97/a760a2dff0672c408f22f726f2ea10a7a516ffa5001ca5a3641e355a45f9/pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8", size = 609436, upload_time = "2023-12-05T07:42:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/41/81/ace39daa19c78b2f4fc12ef217d9d5f1ac658d5828d692bbbb68240cd55b/pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e", size = 843396, upload_time = "2023-12-05T07:44:43.727Z" }, - { url = "https://files.pythonhosted.org/packages/4c/43/150b0b203f5461a9aeadaa925c55167e2b4215c9322b6911a64360d2243e/pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4", size = 800856, upload_time = "2023-12-05T07:45:21.117Z" }, - { url = "https://files.pythonhosted.org/packages/5f/91/a618b56aaabe40dddcd25db85624d7408768fd32f5bfcf81bc0af5b1ce75/pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d", size = 413836, upload_time = "2023-12-05T07:53:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f4/901edb48b2b2c00ad73de0db2ee76e24ce5903ef815ad0ad10e14555d989/pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4", size = 1872310, upload-time = "2023-12-05T07:48:13.713Z" }, + { url = "https://files.pythonhosted.org/packages/5e/46/2de69c7c79fd78bf4c22a9e8165fa6312f5d49410f1be6ddab51a6fe7236/pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0", size = 1249619, upload-time = "2023-12-05T07:50:38.691Z" }, + { url = "https://files.pythonhosted.org/packages/d1/f5/d6b9755713843bf9701ae86bf6fd97ec294a52cf2af719cd14fdf9392f65/pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e", size = 897360, upload-time = "2023-12-05T07:42:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/7c/88/c1aef8820f12e710d136024d231e70e24684a01314aa1814f0758960ba01/pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872", size = 1156959, upload-time = "2023-12-05T07:44:29.904Z" }, + { url = "https://files.pythonhosted.org/packages/82/1b/b25d2c4ac3b4dae238c98e63395dbb88daf11968b168948d3c6289c3e95c/pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d", size = 1100585, upload-time = "2023-12-05T07:45:05.518Z" }, + { url = "https://files.pythonhosted.org/packages/67/bf/6bc0977acd934b66eacab79cec303ecf08ae4a6150d57c628aa919615488/pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75", size = 1109267, upload-time = "2023-12-05T07:39:51.21Z" }, + { url = "https://files.pythonhosted.org/packages/64/fb/4f07424e56c6a5fb47306d9ba744c3c250250c2e7272f9c81efbf8daaccf/pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6", size = 1431853, upload-time = "2023-12-05T07:41:09.261Z" }, + { url = "https://files.pythonhosted.org/packages/a2/10/2b88c1d4beb59a1d45c13983c4b7c5dcd6ef7988db3c03d23b0cabc5adca/pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979", size = 1766212, upload-time = "2023-12-05T07:49:05.926Z" }, + { url = "https://files.pythonhosted.org/packages/bc/ab/c9a22eacfd5bd82620501ae426a3dd6ffa374ac335b21e54209d7a93d3fb/pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08", size = 1653737, upload-time = "2023-12-05T07:49:09.096Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e5/71bd89e47eedb7ebec31ef9a49dcdb0517dbbb063bd5de363980a6911eb1/pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886", size = 906288, upload-time = "2023-12-05T07:42:05.509Z" }, + { url = "https://files.pythonhosted.org/packages/9d/5f/2defc8a579e8b5679d92720ab3a4cb93e3a77d923070bf4c1a103d3ae478/pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6", size = 1170923, upload-time = "2023-12-05T07:44:54.296Z" }, + { url = "https://files.pythonhosted.org/packages/35/de/7579518bc58cebf92568b48e354a702fb52525d0fab166dc544f2a0615dc/pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c", size = 1870360, upload-time = "2023-12-05T07:48:16.153Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f9/58b6cc9a110b1832f666fa6b5a67dc4d520fabfc680ca87a8167b2061d5d/pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1", size = 1249008, upload-time = "2023-12-05T07:50:40.442Z" }, + { url = "https://files.pythonhosted.org/packages/bc/4a/ac6469c01813cb3652ab4e30ec4a37815cc9949afc18af33f64e2ec704aa/pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348", size = 904394, upload-time = "2023-12-05T07:42:27.815Z" }, + { url = "https://files.pythonhosted.org/packages/77/b7/8cee519b11bdd3f76c1a6eb537ab13c1bfef2964d725717705c86f524e4c/pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642", size = 1161453, upload-time = "2023-12-05T07:44:32.003Z" }, + { url = "https://files.pythonhosted.org/packages/b6/1d/c35a956a44b333b064ae1b1c588c2dfa0e01b7ec90884c1972bfcef119c3/pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840", size = 1105501, upload-time = "2023-12-05T07:45:07.18Z" }, + { url = "https://files.pythonhosted.org/packages/18/d1/b3d1e985318ed7287737ea9e6b6e21748cc7c89accc2443347cd2c8d5f0f/pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d", size = 1109513, upload-time = "2023-12-05T07:39:53.338Z" }, + { url = "https://files.pythonhosted.org/packages/14/9b/341cdfb47440069010101403298dc24d449150370c6cb322e73bfa1949bd/pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b", size = 1433541, upload-time = "2023-12-05T07:41:10.786Z" }, + { url = "https://files.pythonhosted.org/packages/fa/52/c6d4e76e020c554e965459d41a98201b4d45277a288648f53a4e5a2429cc/pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b", size = 1766133, upload-time = "2023-12-05T07:49:11.204Z" }, + { url = "https://files.pythonhosted.org/packages/1d/6d/0cbd8dd5b8979fd6b9cf1852ed067b9d2cd6fa0c09c3bafe6874d2d2e03c/pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3", size = 1653636, upload-time = "2023-12-05T07:49:13.787Z" }, + { url = "https://files.pythonhosted.org/packages/f5/af/d90eed9cf3840685d54d4a35d5f9e242a8a48b5410d41146f14c1e098302/pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097", size = 904865, upload-time = "2023-12-05T07:42:07.189Z" }, + { url = "https://files.pythonhosted.org/packages/20/d2/09443dc73053ad01c846d7fb77e09fe9d93c09d4e900215f3c8b7b56bfec/pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9", size = 1171332, upload-time = "2023-12-05T07:44:56.111Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f0/d71cf69dc039c9adc8b625efc3bad3684f3660a570e47f0f0c64df787b41/pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a", size = 1871111, upload-time = "2023-12-05T07:48:17.868Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/d365773edf56ad71993579ee574105f02f83530caf600ebf28bea15d88d0/pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e", size = 1248844, upload-time = "2023-12-05T07:50:42.922Z" }, + { url = "https://files.pythonhosted.org/packages/72/55/cc3163e20f40615a49245fa7041badec6103e8ee7e482dbb0feea00a7b84/pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27", size = 899373, upload-time = "2023-12-05T07:42:29.595Z" }, + { url = "https://files.pythonhosted.org/packages/40/aa/ae292bd85deda637230970bbc53c1dc53696a99e82fc7cd6d373ec173853/pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30", size = 1160901, upload-time = "2023-12-05T07:44:33.819Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/6e291eafbbbc66d0e87658dd21383ec2b4ab35edcfb283902c580a6db76f/pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee", size = 1101147, upload-time = "2023-12-05T07:45:10.058Z" }, + { url = "https://files.pythonhosted.org/packages/3a/f1/e296d5a507eac519d1fe1382851b1a4575f690bc2b2d2c8eca2ed7e4bd1f/pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537", size = 1105315, upload-time = "2023-12-05T07:39:55.851Z" }, + { url = "https://files.pythonhosted.org/packages/56/63/5c2abb556ab4cf013d98e01782d5bd642238a0ed9b019e965a7d7e957f56/pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181", size = 1427747, upload-time = "2023-12-05T07:41:13.219Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/5dba5f6b12ef54fb977c9b9279075e151c04fc0dd6851e9663d9e66b593f/pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe", size = 1762221, upload-time = "2023-12-05T07:49:16.352Z" }, + { url = "https://files.pythonhosted.org/packages/cf/49/54d7e8bb3df82a3509325b11491d33450dc91580d4826b62fa5e554bb9cf/pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737", size = 1649505, upload-time = "2023-12-05T07:49:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/34/14/58e5037229bc37963e2ce804c2c075a3a541e3f84bf1c231e7c9779d36f1/pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d", size = 954891, upload-time = "2023-12-05T07:42:09.208Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2d/04fab685ef3a8e6e955220fd2a54dc99efaee960a88675bf5c92cd277164/pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7", size = 1252773, upload-time = "2023-12-05T07:44:58.16Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fe/ed38fe12c540bafc1cae32c3ff638e9df32528f5cf91b5e400e6a8f5b3ec/pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05", size = 963654, upload-time = "2023-12-05T07:47:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/44/97/a760a2dff0672c408f22f726f2ea10a7a516ffa5001ca5a3641e355a45f9/pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8", size = 609436, upload-time = "2023-12-05T07:42:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/41/81/ace39daa19c78b2f4fc12ef217d9d5f1ac658d5828d692bbbb68240cd55b/pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e", size = 843396, upload-time = "2023-12-05T07:44:43.727Z" }, + { url = "https://files.pythonhosted.org/packages/4c/43/150b0b203f5461a9aeadaa925c55167e2b4215c9322b6911a64360d2243e/pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4", size = 800856, upload-time = "2023-12-05T07:45:21.117Z" }, + { url = "https://files.pythonhosted.org/packages/5f/91/a618b56aaabe40dddcd25db85624d7408768fd32f5bfcf81bc0af5b1ce75/pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d", size = 413836, upload-time = "2023-12-05T07:53:22.583Z" }, ] [[package]] @@ -2176,9 +2180,9 @@ dependencies = [ { name = "scikit-learn" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/2d/bab8babd9dc9a9e4df6eb115540cee4322c1a74078fb6f3b3ebc452a22b3/qudida-0.0.4.tar.gz", hash = "sha256:db198e2887ab0c9aa0023e565afbff41dfb76b361f85fd5e13f780d75ba18cc8", size = 3100, upload_time = "2021-08-09T16:47:55.807Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/2d/bab8babd9dc9a9e4df6eb115540cee4322c1a74078fb6f3b3ebc452a22b3/qudida-0.0.4.tar.gz", hash = "sha256:db198e2887ab0c9aa0023e565afbff41dfb76b361f85fd5e13f780d75ba18cc8", size = 3100, upload-time = "2021-08-09T16:47:55.807Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/a1/a5f4bebaa31d109003909809d88aeb0d4b201463a9ea29308d9e4f9e7655/qudida-0.0.4-py3-none-any.whl", hash = "sha256:4519714c40cd0f2e6c51e1735edae8f8b19f4efe1f33be13e9d644ca5f736dd6", size = 3478, upload_time = "2021-08-09T16:47:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a1/a5f4bebaa31d109003909809d88aeb0d4b201463a9ea29308d9e4f9e7655/qudida-0.0.4-py3-none-any.whl", hash = "sha256:4519714c40cd0f2e6c51e1735edae8f8b19f4efe1f33be13e9d644ca5f736dd6", size = 3478, upload-time = "2021-08-09T16:47:54.637Z" }, ] [[package]] @@ -2191,9 +2195,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload_time = "2024-05-29T15:37:49.536Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, ] [[package]] @@ -2205,9 +2209,9 @@ dependencies = [ { name = "pygments" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload_time = "2024-11-01T16:43:57.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload-time = "2024-11-01T16:43:57.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload_time = "2024-11-01T16:43:55.817Z" }, + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload-time = "2024-11-01T16:43:55.817Z" }, ] [[package]] @@ -2220,9 +2224,9 @@ dependencies = [ { name = "ruamel-yaml" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/77/6af374a4a8cd2aee762a1fb8a3050dcf3f129134bbdc4bb6bed755c4325b/rknn_toolkit_lite2-2.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b6733689bd09a262bcb6ba4744e690dd4b37ebeac4ed427cf45242c4b4ce9a4", size = 559372, upload_time = "2024-11-11T03:51:20.599Z" }, - { url = "https://files.pythonhosted.org/packages/9b/0c/76ff1eb09d09ce4394a6959d2343a321d28dd9e604348ffdafceafdc344c/rknn_toolkit_lite2-2.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e4fefe355dc34a155680e4bcb9e4abb37ebc271f045ec9e0a4a3a018bc5beb", size = 569149, upload_time = "2024-11-11T03:51:22.838Z" }, - { url = "https://files.pythonhosted.org/packages/0d/6e/8679562028051b02312212defc6e8c07248953f10dd7ad506e941b575bf3/rknn_toolkit_lite2-2.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37394371d1561f470c553f39869d7c35ff93405dffe3d0d72babf297a2b0aee9", size = 527457, upload_time = "2024-11-11T03:51:25.456Z" }, + { url = "https://files.pythonhosted.org/packages/ed/77/6af374a4a8cd2aee762a1fb8a3050dcf3f129134bbdc4bb6bed755c4325b/rknn_toolkit_lite2-2.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b6733689bd09a262bcb6ba4744e690dd4b37ebeac4ed427cf45242c4b4ce9a4", size = 559372, upload-time = "2024-11-11T03:51:20.599Z" }, + { url = "https://files.pythonhosted.org/packages/9b/0c/76ff1eb09d09ce4394a6959d2343a321d28dd9e604348ffdafceafdc344c/rknn_toolkit_lite2-2.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e4fefe355dc34a155680e4bcb9e4abb37ebc271f045ec9e0a4a3a018bc5beb", size = 569149, upload-time = "2024-11-11T03:51:22.838Z" }, + { url = "https://files.pythonhosted.org/packages/0d/6e/8679562028051b02312212defc6e8c07248953f10dd7ad506e941b575bf3/rknn_toolkit_lite2-2.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37394371d1561f470c553f39869d7c35ff93405dffe3d0d72babf297a2b0aee9", size = 527457, upload-time = "2024-11-11T03:51:25.456Z" }, ] [[package]] @@ -2232,78 +2236,78 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "python_full_version < '3.13' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447, upload_time = "2025-01-06T14:08:51.334Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447, upload-time = "2025-01-06T14:08:51.334Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729, upload_time = "2025-01-06T14:08:47.471Z" }, + { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729, upload-time = "2025-01-06T14:08:47.471Z" }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload-time = "2024-10-20T10:10:56.22Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/57/40a958e863e299f0c74ef32a3bde9f2d1ea8d69669368c0c502a0997f57f/ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5", size = 131301, upload_time = "2024-10-20T10:12:35.876Z" }, - { url = "https://files.pythonhosted.org/packages/98/a8/29a3eb437b12b95f50a6bcc3d7d7214301c6c529d8fdc227247fa84162b5/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969", size = 633728, upload_time = "2024-10-20T10:12:37.858Z" }, - { url = "https://files.pythonhosted.org/packages/35/6d/ae05a87a3ad540259c3ad88d71275cbd1c0f2d30ae04c65dcbfb6dcd4b9f/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df", size = 722230, upload_time = "2024-10-20T10:12:39.457Z" }, - { url = "https://files.pythonhosted.org/packages/7f/b7/20c6f3c0b656fe609675d69bc135c03aac9e3865912444be6339207b6648/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76", size = 686712, upload_time = "2024-10-20T10:12:41.119Z" }, - { url = "https://files.pythonhosted.org/packages/cd/11/d12dbf683471f888d354dac59593873c2b45feb193c5e3e0f2ebf85e68b9/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6", size = 663936, upload_time = "2024-10-21T11:26:37.419Z" }, - { url = "https://files.pythonhosted.org/packages/72/14/4c268f5077db5c83f743ee1daeb236269fa8577133a5cfa49f8b382baf13/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd", size = 696580, upload_time = "2024-10-21T11:26:39.503Z" }, - { url = "https://files.pythonhosted.org/packages/30/fc/8cd12f189c6405a4c1cf37bd633aa740a9538c8e40497c231072d0fef5cf/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a", size = 663393, upload_time = "2024-12-11T19:58:13.873Z" }, - { url = "https://files.pythonhosted.org/packages/80/29/c0a017b704aaf3cbf704989785cd9c5d5b8ccec2dae6ac0c53833c84e677/ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da", size = 100326, upload_time = "2024-10-20T10:12:42.967Z" }, - { url = "https://files.pythonhosted.org/packages/3a/65/fa39d74db4e2d0cd252355732d966a460a41cd01c6353b820a0952432839/ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28", size = 118079, upload_time = "2024-10-20T10:12:44.117Z" }, - { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224, upload_time = "2024-10-20T10:12:45.162Z" }, - { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480, upload_time = "2024-10-20T10:12:46.758Z" }, - { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068, upload_time = "2024-10-20T10:12:48.605Z" }, - { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012, upload_time = "2024-10-20T10:12:51.124Z" }, - { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352, upload_time = "2024-10-21T11:26:41.438Z" }, - { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344, upload_time = "2024-10-21T11:26:43.62Z" }, - { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498, upload_time = "2024-12-11T19:58:15.592Z" }, - { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205, upload_time = "2024-10-20T10:12:52.865Z" }, - { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185, upload_time = "2024-10-20T10:12:54.652Z" }, - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, + { url = "https://files.pythonhosted.org/packages/70/57/40a958e863e299f0c74ef32a3bde9f2d1ea8d69669368c0c502a0997f57f/ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5", size = 131301, upload-time = "2024-10-20T10:12:35.876Z" }, + { url = "https://files.pythonhosted.org/packages/98/a8/29a3eb437b12b95f50a6bcc3d7d7214301c6c529d8fdc227247fa84162b5/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969", size = 633728, upload-time = "2024-10-20T10:12:37.858Z" }, + { url = "https://files.pythonhosted.org/packages/35/6d/ae05a87a3ad540259c3ad88d71275cbd1c0f2d30ae04c65dcbfb6dcd4b9f/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df", size = 722230, upload-time = "2024-10-20T10:12:39.457Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b7/20c6f3c0b656fe609675d69bc135c03aac9e3865912444be6339207b6648/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76", size = 686712, upload-time = "2024-10-20T10:12:41.119Z" }, + { url = "https://files.pythonhosted.org/packages/cd/11/d12dbf683471f888d354dac59593873c2b45feb193c5e3e0f2ebf85e68b9/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6", size = 663936, upload-time = "2024-10-21T11:26:37.419Z" }, + { url = "https://files.pythonhosted.org/packages/72/14/4c268f5077db5c83f743ee1daeb236269fa8577133a5cfa49f8b382baf13/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd", size = 696580, upload-time = "2024-10-21T11:26:39.503Z" }, + { url = "https://files.pythonhosted.org/packages/30/fc/8cd12f189c6405a4c1cf37bd633aa740a9538c8e40497c231072d0fef5cf/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a", size = 663393, upload-time = "2024-12-11T19:58:13.873Z" }, + { url = "https://files.pythonhosted.org/packages/80/29/c0a017b704aaf3cbf704989785cd9c5d5b8ccec2dae6ac0c53833c84e677/ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da", size = 100326, upload-time = "2024-10-20T10:12:42.967Z" }, + { url = "https://files.pythonhosted.org/packages/3a/65/fa39d74db4e2d0cd252355732d966a460a41cd01c6353b820a0952432839/ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28", size = 118079, upload-time = "2024-10-20T10:12:44.117Z" }, + { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224, upload-time = "2024-10-20T10:12:45.162Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480, upload-time = "2024-10-20T10:12:46.758Z" }, + { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068, upload-time = "2024-10-20T10:12:48.605Z" }, + { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012, upload-time = "2024-10-20T10:12:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352, upload-time = "2024-10-21T11:26:41.438Z" }, + { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344, upload-time = "2024-10-21T11:26:43.62Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498, upload-time = "2024-12-11T19:58:15.592Z" }, + { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205, upload-time = "2024-10-20T10:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185, upload-time = "2024-10-20T10:12:54.652Z" }, + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload-time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload-time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload-time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload-time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload-time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload-time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload-time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload-time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload-time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload-time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload-time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload-time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload-time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload-time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload-time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload-time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload-time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload-time = "2024-10-20T10:13:10.66Z" }, ] [[package]] name = "ruff" -version = "0.11.7" +version = "0.11.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5b/89/6f9c9674818ac2e9cc2f2b35b704b7768656e6b7c139064fc7ba8fbc99f1/ruff-0.11.7.tar.gz", hash = "sha256:655089ad3224070736dc32844fde783454f8558e71f501cb207485fe4eee23d4", size = 4054861, upload_time = "2025-04-24T18:49:37.007Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/f6/adcf73711f31c9f5393862b4281c875a462d9f639f4ccdf69dc368311c20/ruff-0.11.8.tar.gz", hash = "sha256:6d742d10626f9004b781f4558154bb226620a7242080e11caeffab1a40e99df8", size = 4086399, upload-time = "2025-05-01T14:53:24.459Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/ec/21927cb906c5614b786d1621dba405e3d44f6e473872e6df5d1a6bca0455/ruff-0.11.7-py3-none-linux_armv6l.whl", hash = "sha256:d29e909d9a8d02f928d72ab7837b5cbc450a5bdf578ab9ebee3263d0a525091c", size = 10245403, upload_time = "2025-04-24T18:48:40.459Z" }, - { url = "https://files.pythonhosted.org/packages/e2/af/fec85b6c2c725bcb062a354dd7cbc1eed53c33ff3aa665165871c9c16ddf/ruff-0.11.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dd1fb86b168ae349fb01dd497d83537b2c5541fe0626e70c786427dd8363aaee", size = 11007166, upload_time = "2025-04-24T18:48:44.742Z" }, - { url = "https://files.pythonhosted.org/packages/31/9a/2d0d260a58e81f388800343a45898fd8df73c608b8261c370058b675319a/ruff-0.11.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d3d7d2e140a6fbbc09033bce65bd7ea29d6a0adeb90b8430262fbacd58c38ada", size = 10378076, upload_time = "2025-04-24T18:48:47.918Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c4/9b09b45051404d2e7dd6d9dbcbabaa5ab0093f9febcae664876a77b9ad53/ruff-0.11.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4809df77de390a1c2077d9b7945d82f44b95d19ceccf0c287c56e4dc9b91ca64", size = 10557138, upload_time = "2025-04-24T18:48:51.707Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5e/f62a1b6669870a591ed7db771c332fabb30f83c967f376b05e7c91bccd14/ruff-0.11.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3a0c2e169e6b545f8e2dba185eabbd9db4f08880032e75aa0e285a6d3f48201", size = 10095726, upload_time = "2025-04-24T18:48:54.243Z" }, - { url = "https://files.pythonhosted.org/packages/45/59/a7aa8e716f4cbe07c3500a391e58c52caf665bb242bf8be42c62adef649c/ruff-0.11.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49b888200a320dd96a68e86736cf531d6afba03e4f6cf098401406a257fcf3d6", size = 11672265, upload_time = "2025-04-24T18:48:57.639Z" }, - { url = "https://files.pythonhosted.org/packages/dd/e3/101a8b707481f37aca5f0fcc3e42932fa38b51add87bfbd8e41ab14adb24/ruff-0.11.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2b19cdb9cf7dae00d5ee2e7c013540cdc3b31c4f281f1dacb5a799d610e90db4", size = 12331418, upload_time = "2025-04-24T18:49:00.697Z" }, - { url = "https://files.pythonhosted.org/packages/dd/71/037f76cbe712f5cbc7b852e4916cd3cf32301a30351818d32ab71580d1c0/ruff-0.11.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64e0ee994c9e326b43539d133a36a455dbaab477bc84fe7bfbd528abe2f05c1e", size = 11794506, upload_time = "2025-04-24T18:49:03.545Z" }, - { url = "https://files.pythonhosted.org/packages/ca/de/e450b6bab1fc60ef263ef8fcda077fb4977601184877dce1c59109356084/ruff-0.11.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bad82052311479a5865f52c76ecee5d468a58ba44fb23ee15079f17dd4c8fd63", size = 13939084, upload_time = "2025-04-24T18:49:07.159Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2c/1e364cc92970075d7d04c69c928430b23e43a433f044474f57e425cbed37/ruff-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7940665e74e7b65d427b82bffc1e46710ec7f30d58b4b2d5016e3f0321436502", size = 11450441, upload_time = "2025-04-24T18:49:11.41Z" }, - { url = "https://files.pythonhosted.org/packages/9d/7d/1b048eb460517ff9accd78bca0fa6ae61df2b276010538e586f834f5e402/ruff-0.11.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:169027e31c52c0e36c44ae9a9c7db35e505fee0b39f8d9fca7274a6305295a92", size = 10441060, upload_time = "2025-04-24T18:49:14.184Z" }, - { url = "https://files.pythonhosted.org/packages/3a/57/8dc6ccfd8380e5ca3d13ff7591e8ba46a3b330323515a4996b991b10bd5d/ruff-0.11.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:305b93f9798aee582e91e34437810439acb28b5fc1fee6b8205c78c806845a94", size = 10058689, upload_time = "2025-04-24T18:49:17.559Z" }, - { url = "https://files.pythonhosted.org/packages/23/bf/20487561ed72654147817885559ba2aa705272d8b5dee7654d3ef2dbf912/ruff-0.11.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a681db041ef55550c371f9cd52a3cf17a0da4c75d6bd691092dfc38170ebc4b6", size = 11073703, upload_time = "2025-04-24T18:49:20.247Z" }, - { url = "https://files.pythonhosted.org/packages/9d/27/04f2db95f4ef73dccedd0c21daf9991cc3b7f29901a4362057b132075aa4/ruff-0.11.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:07f1496ad00a4a139f4de220b0c97da6d4c85e0e4aa9b2624167b7d4d44fd6b6", size = 11532822, upload_time = "2025-04-24T18:49:23.765Z" }, - { url = "https://files.pythonhosted.org/packages/e1/72/43b123e4db52144c8add336581de52185097545981ff6e9e58a21861c250/ruff-0.11.7-py3-none-win32.whl", hash = "sha256:f25dfb853ad217e6e5f1924ae8a5b3f6709051a13e9dad18690de6c8ff299e26", size = 10362436, upload_time = "2025-04-24T18:49:27.377Z" }, - { url = "https://files.pythonhosted.org/packages/c5/a0/3e58cd76fdee53d5c8ce7a56d84540833f924ccdf2c7d657cb009e604d82/ruff-0.11.7-py3-none-win_amd64.whl", hash = "sha256:0a931d85959ceb77e92aea4bbedfded0a31534ce191252721128f77e5ae1f98a", size = 11566676, upload_time = "2025-04-24T18:49:30.938Z" }, - { url = "https://files.pythonhosted.org/packages/68/ca/69d7c7752bce162d1516e5592b1cc6b6668e9328c0d270609ddbeeadd7cf/ruff-0.11.7-py3-none-win_arm64.whl", hash = "sha256:778c1e5d6f9e91034142dfd06110534ca13220bfaad5c3735f6cb844654f6177", size = 10677936, upload_time = "2025-04-24T18:49:34.392Z" }, + { url = "https://files.pythonhosted.org/packages/9f/60/c6aa9062fa518a9f86cb0b85248245cddcd892a125ca00441df77d79ef88/ruff-0.11.8-py3-none-linux_armv6l.whl", hash = "sha256:896a37516c594805e34020c4a7546c8f8a234b679a7716a3f08197f38913e1a3", size = 10272473, upload-time = "2025-05-01T14:52:37.252Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/0325e50d106dc87c00695f7bcd5044c6d252ed5120ebf423773e00270f50/ruff-0.11.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ab86d22d3d721a40dd3ecbb5e86ab03b2e053bc93c700dc68d1c3346b36ce835", size = 11040862, upload-time = "2025-05-01T14:52:41.022Z" }, + { url = "https://files.pythonhosted.org/packages/e6/27/b87ea1a7be37fef0adbc7fd987abbf90b6607d96aa3fc67e2c5b858e1e53/ruff-0.11.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:258f3585057508d317610e8a412788cf726efeefa2fec4dba4001d9e6f90d46c", size = 10385273, upload-time = "2025-05-01T14:52:43.551Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f7/3346161570d789045ed47a86110183f6ac3af0e94e7fd682772d89f7f1a1/ruff-0.11.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727d01702f7c30baed3fc3a34901a640001a2828c793525043c29f7614994a8c", size = 10578330, upload-time = "2025-05-01T14:52:45.48Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c3/327fb950b4763c7b3784f91d3038ef10c13b2d42322d4ade5ce13a2f9edb/ruff-0.11.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3dca977cc4fc8f66e89900fa415ffe4dbc2e969da9d7a54bfca81a128c5ac219", size = 10122223, upload-time = "2025-05-01T14:52:47.675Z" }, + { url = "https://files.pythonhosted.org/packages/de/c7/ba686bce9adfeb6c61cb1bbadc17d58110fe1d602f199d79d4c880170f19/ruff-0.11.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c657fa987d60b104d2be8b052d66da0a2a88f9bd1d66b2254333e84ea2720c7f", size = 11697353, upload-time = "2025-05-01T14:52:50.264Z" }, + { url = "https://files.pythonhosted.org/packages/53/8e/a4fb4a1ddde3c59e73996bb3ac51844ff93384d533629434b1def7a336b0/ruff-0.11.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f2e74b021d0de5eceb8bd32919f6ff8a9b40ee62ed97becd44993ae5b9949474", size = 12375936, upload-time = "2025-05-01T14:52:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/ad/a1/9529cb1e2936e2479a51aeb011307e7229225df9ac64ae064d91ead54571/ruff-0.11.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9b5ef39820abc0f2c62111f7045009e46b275f5b99d5e59dda113c39b7f4f38", size = 11850083, upload-time = "2025-05-01T14:52:55.424Z" }, + { url = "https://files.pythonhosted.org/packages/3e/94/8f7eac4c612673ae15a4ad2bc0ee62e03c68a2d4f458daae3de0e47c67ba/ruff-0.11.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1dba3135ca503727aa4648152c0fa67c3b1385d3dc81c75cd8a229c4b2a1458", size = 14005834, upload-time = "2025-05-01T14:52:58.056Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7c/6f63b46b2be870cbf3f54c9c4154d13fac4b8827f22fa05ac835c10835b2/ruff-0.11.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f024d32e62faad0f76b2d6afd141b8c171515e4fb91ce9fd6464335c81244e5", size = 11503713, upload-time = "2025-05-01T14:53:01.244Z" }, + { url = "https://files.pythonhosted.org/packages/3a/91/57de411b544b5fe072779678986a021d87c3ee5b89551f2ca41200c5d643/ruff-0.11.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d365618d3ad747432e1ae50d61775b78c055fee5936d77fb4d92c6f559741948", size = 10457182, upload-time = "2025-05-01T14:53:03.726Z" }, + { url = "https://files.pythonhosted.org/packages/01/49/cfe73e0ce5ecdd3e6f1137bf1f1be03dcc819d1bfe5cff33deb40c5926db/ruff-0.11.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4d9aaa91035bdf612c8ee7266153bcf16005c7c7e2f5878406911c92a31633cb", size = 10101027, upload-time = "2025-05-01T14:53:06.555Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/a5cfe47c62b3531675795f38a0ef1c52ff8de62eaddf370d46634391a3fb/ruff-0.11.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0eba551324733efc76116d9f3a0d52946bc2751f0cd30661564117d6fd60897c", size = 11111298, upload-time = "2025-05-01T14:53:08.825Z" }, + { url = "https://files.pythonhosted.org/packages/36/98/f76225f87e88f7cb669ae92c062b11c0a1e91f32705f829bd426f8e48b7b/ruff-0.11.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:161eb4cff5cfefdb6c9b8b3671d09f7def2f960cee33481dd898caf2bcd02304", size = 11566884, upload-time = "2025-05-01T14:53:11.626Z" }, + { url = "https://files.pythonhosted.org/packages/de/7e/fff70b02e57852fda17bd43f99dda37b9bcf3e1af3d97c5834ff48d04715/ruff-0.11.8-py3-none-win32.whl", hash = "sha256:5b18caa297a786465cc511d7f8be19226acf9c0a1127e06e736cd4e1878c3ea2", size = 10451102, upload-time = "2025-05-01T14:53:14.303Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a9/eaa571eb70648c9bde3120a1d5892597de57766e376b831b06e7c1e43945/ruff-0.11.8-py3-none-win_amd64.whl", hash = "sha256:6e70d11043bef637c5617297bdedec9632af15d53ac1e1ba29c448da9341b0c4", size = 11597410, upload-time = "2025-05-01T14:53:16.571Z" }, + { url = "https://files.pythonhosted.org/packages/cd/be/f6b790d6ae98f1f32c645f8540d5c96248b72343b0a56fab3a07f2941897/ruff-0.11.8-py3-none-win_arm64.whl", hash = "sha256:304432e4c4a792e3da85b7699feb3426a0908ab98bf29df22a31b0cdd098fac2", size = 10713129, upload-time = "2025-05-01T14:53:22.27Z" }, ] [[package]] @@ -2320,23 +2324,23 @@ dependencies = [ { name = "scipy" }, { name = "tifffile" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/c1/a49da20845f0f0e1afbb1c2586d406dc0acb84c26ae293bad6d7e7f718bc/scikit_image-0.22.0.tar.gz", hash = "sha256:018d734df1d2da2719087d15f679d19285fce97cd37695103deadfaef2873236", size = 22685018, upload_time = "2023-10-03T21:36:34.274Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/c1/a49da20845f0f0e1afbb1c2586d406dc0acb84c26ae293bad6d7e7f718bc/scikit_image-0.22.0.tar.gz", hash = "sha256:018d734df1d2da2719087d15f679d19285fce97cd37695103deadfaef2873236", size = 22685018, upload-time = "2023-10-03T21:36:34.274Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/8c/381ae42b37cf3e9e99a1deb3ffe76ca5ff5dd18ffa368293476164507fad/scikit_image-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74ec5c1d4693506842cc7c9487c89d8fc32aed064e9363def7af08b8f8cbb31d", size = 13905039, upload_time = "2023-10-03T21:35:27.279Z" }, - { url = "https://files.pythonhosted.org/packages/16/06/4bfba08f5cce26d5070bb2cf4e3f9f479480978806355d1c5bea6f26a17c/scikit_image-0.22.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a05ae4fe03d802587ed8974e900b943275548cde6a6807b785039d63e9a7a5ff", size = 13279212, upload_time = "2023-10-03T21:35:30.864Z" }, - { url = "https://files.pythonhosted.org/packages/74/57/dbf744ca00eea2a09b1848c9dec28a43978c16dc049b1fba949cb050bedf/scikit_image-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a92dca3d95b1301442af055e196a54b5a5128c6768b79fc0a4098f1d662dee6", size = 14091779, upload_time = "2023-10-03T21:35:34.273Z" }, - { url = "https://files.pythonhosted.org/packages/f1/6c/49f5a0ce8ddcdbdac5ac69c129654938cc6de0a936303caa6cad495ceb2a/scikit_image-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3663d063d8bf2fb9bdfb0ca967b9ee3b6593139c860c7abc2d2351a8a8863938", size = 14682042, upload_time = "2023-10-03T21:35:37.787Z" }, - { url = "https://files.pythonhosted.org/packages/86/f0/18895318109f9b508f2310f136922e455a453550826a8240b412063c2528/scikit_image-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebdbdc901bae14dab637f8d5c99f6d5cc7aaf4a3b6f4003194e003e9f688a6fc", size = 24492345, upload_time = "2023-10-03T21:35:41.122Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d9/dc99e527d1a0050f0353d2fff3548273b4df6151884806e324f26572fd6b/scikit_image-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95d6da2d8a44a36ae04437c76d32deb4e3c993ffc846b394b9949fd8ded73cb2", size = 13883619, upload_time = "2023-10-03T21:35:44.88Z" }, - { url = "https://files.pythonhosted.org/packages/80/37/7670020b112ff9a47e49b1e36f438d000db5b632aab8a8fd7e6be545d065/scikit_image-0.22.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:2c6ef454a85f569659b813ac2a93948022b0298516b757c9c6c904132be327e2", size = 13264761, upload_time = "2023-10-03T21:35:48.865Z" }, - { url = "https://files.pythonhosted.org/packages/ad/85/dadf1194793ac1c895370f3ed048bb91dda083775b42e11d9672a50494d5/scikit_image-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87872f067444ee90a00dd49ca897208308645382e8a24bd3e76f301af2352cd", size = 14070710, upload_time = "2023-10-03T21:35:51.711Z" }, - { url = "https://files.pythonhosted.org/packages/d4/34/e27bf2bfe7b52b884b49bd71ea91ff81e4737246735ee5ea383314c31876/scikit_image-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5c378db54e61b491b9edeefff87e49fcf7fdf729bb93c777d7a5f15d36f743e", size = 14664172, upload_time = "2023-10-03T21:35:55.752Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d0/a3f60c9f57ed295b3076e4acdb29a37bbd8823452562ab2ad51b03d6f377/scikit_image-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bcb74adb0634258a67f66c2bb29978c9a3e222463e003b67ba12056c003971b", size = 24491321, upload_time = "2023-10-03T21:35:58.847Z" }, - { url = "https://files.pythonhosted.org/packages/da/a4/b0b69bde4d6360e801d647691591dc9967a25a18a4c63ecf7f87d94e3fac/scikit_image-0.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:003ca2274ac0fac252280e7179ff986ff783407001459ddea443fe7916e38cff", size = 13968808, upload_time = "2023-10-03T21:36:02.526Z" }, - { url = "https://files.pythonhosted.org/packages/e4/65/3c0f77e7a9bae100a8f7f5cebde410fca1a3cf64e1ecdd343666e27b11d4/scikit_image-0.22.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:cf3c0c15b60ae3e557a0c7575fbd352f0c3ce0afca562febfe3ab80efbeec0e9", size = 13323763, upload_time = "2023-10-03T21:36:05.504Z" }, - { url = "https://files.pythonhosted.org/packages/4a/ed/7faf9f7a55d5b3095d33990a85603b66866cce2a608b27f0e1487d70a451/scikit_image-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b23908dd4d120e6aecb1ed0277563e8cbc8d6c0565bdc4c4c6475d53608452", size = 13877233, upload_time = "2023-10-03T21:36:08.352Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/09d06f36ce71fa276e1d9453fb4b04250a7038292b13b8c273a5a1a8f7c0/scikit_image-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be79d7493f320a964f8fcf603121595ba82f84720de999db0fcca002266a549a", size = 14954814, upload_time = "2023-10-03T21:36:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/dc/35/e6327ae498c6f557cb0a7c3fc284effe7958d2d1c43fb61cd77804fc2c4f/scikit_image-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:722b970aa5da725dca55252c373b18bbea7858c1cdb406e19f9b01a4a73b30b2", size = 25004857, upload_time = "2023-10-03T21:36:15.457Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/381ae42b37cf3e9e99a1deb3ffe76ca5ff5dd18ffa368293476164507fad/scikit_image-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74ec5c1d4693506842cc7c9487c89d8fc32aed064e9363def7af08b8f8cbb31d", size = 13905039, upload-time = "2023-10-03T21:35:27.279Z" }, + { url = "https://files.pythonhosted.org/packages/16/06/4bfba08f5cce26d5070bb2cf4e3f9f479480978806355d1c5bea6f26a17c/scikit_image-0.22.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a05ae4fe03d802587ed8974e900b943275548cde6a6807b785039d63e9a7a5ff", size = 13279212, upload-time = "2023-10-03T21:35:30.864Z" }, + { url = "https://files.pythonhosted.org/packages/74/57/dbf744ca00eea2a09b1848c9dec28a43978c16dc049b1fba949cb050bedf/scikit_image-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a92dca3d95b1301442af055e196a54b5a5128c6768b79fc0a4098f1d662dee6", size = 14091779, upload-time = "2023-10-03T21:35:34.273Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6c/49f5a0ce8ddcdbdac5ac69c129654938cc6de0a936303caa6cad495ceb2a/scikit_image-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3663d063d8bf2fb9bdfb0ca967b9ee3b6593139c860c7abc2d2351a8a8863938", size = 14682042, upload-time = "2023-10-03T21:35:37.787Z" }, + { url = "https://files.pythonhosted.org/packages/86/f0/18895318109f9b508f2310f136922e455a453550826a8240b412063c2528/scikit_image-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebdbdc901bae14dab637f8d5c99f6d5cc7aaf4a3b6f4003194e003e9f688a6fc", size = 24492345, upload-time = "2023-10-03T21:35:41.122Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d9/dc99e527d1a0050f0353d2fff3548273b4df6151884806e324f26572fd6b/scikit_image-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95d6da2d8a44a36ae04437c76d32deb4e3c993ffc846b394b9949fd8ded73cb2", size = 13883619, upload-time = "2023-10-03T21:35:44.88Z" }, + { url = "https://files.pythonhosted.org/packages/80/37/7670020b112ff9a47e49b1e36f438d000db5b632aab8a8fd7e6be545d065/scikit_image-0.22.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:2c6ef454a85f569659b813ac2a93948022b0298516b757c9c6c904132be327e2", size = 13264761, upload-time = "2023-10-03T21:35:48.865Z" }, + { url = "https://files.pythonhosted.org/packages/ad/85/dadf1194793ac1c895370f3ed048bb91dda083775b42e11d9672a50494d5/scikit_image-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87872f067444ee90a00dd49ca897208308645382e8a24bd3e76f301af2352cd", size = 14070710, upload-time = "2023-10-03T21:35:51.711Z" }, + { url = "https://files.pythonhosted.org/packages/d4/34/e27bf2bfe7b52b884b49bd71ea91ff81e4737246735ee5ea383314c31876/scikit_image-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5c378db54e61b491b9edeefff87e49fcf7fdf729bb93c777d7a5f15d36f743e", size = 14664172, upload-time = "2023-10-03T21:35:55.752Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d0/a3f60c9f57ed295b3076e4acdb29a37bbd8823452562ab2ad51b03d6f377/scikit_image-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bcb74adb0634258a67f66c2bb29978c9a3e222463e003b67ba12056c003971b", size = 24491321, upload-time = "2023-10-03T21:35:58.847Z" }, + { url = "https://files.pythonhosted.org/packages/da/a4/b0b69bde4d6360e801d647691591dc9967a25a18a4c63ecf7f87d94e3fac/scikit_image-0.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:003ca2274ac0fac252280e7179ff986ff783407001459ddea443fe7916e38cff", size = 13968808, upload-time = "2023-10-03T21:36:02.526Z" }, + { url = "https://files.pythonhosted.org/packages/e4/65/3c0f77e7a9bae100a8f7f5cebde410fca1a3cf64e1ecdd343666e27b11d4/scikit_image-0.22.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:cf3c0c15b60ae3e557a0c7575fbd352f0c3ce0afca562febfe3ab80efbeec0e9", size = 13323763, upload-time = "2023-10-03T21:36:05.504Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ed/7faf9f7a55d5b3095d33990a85603b66866cce2a608b27f0e1487d70a451/scikit_image-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b23908dd4d120e6aecb1ed0277563e8cbc8d6c0565bdc4c4c6475d53608452", size = 13877233, upload-time = "2023-10-03T21:36:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/09d06f36ce71fa276e1d9453fb4b04250a7038292b13b8c273a5a1a8f7c0/scikit_image-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be79d7493f320a964f8fcf603121595ba82f84720de999db0fcca002266a549a", size = 14954814, upload-time = "2023-10-03T21:36:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/dc/35/e6327ae498c6f557cb0a7c3fc284effe7958d2d1c43fb61cd77804fc2c4f/scikit_image-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:722b970aa5da725dca55252c373b18bbea7858c1cdb406e19f9b01a4a73b30b2", size = 25004857, upload-time = "2023-10-03T21:36:15.457Z" }, ] [[package]] @@ -2349,23 +2353,23 @@ dependencies = [ { name = "scipy" }, { name = "threadpoolctl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/00/835e3d280fdd7784e76bdef91dd9487582d7951a7254f59fc8004fc8b213/scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05", size = 7510251, upload_time = "2023-10-23T13:47:55.287Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/00/835e3d280fdd7784e76bdef91dd9487582d7951a7254f59fc8004fc8b213/scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05", size = 7510251, upload-time = "2023-10-23T13:47:55.287Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/53/570b55a6e10b8694ac1e3024d2df5cd443f1b4ff6d28430845da8b9019b3/scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1", size = 10209999, upload_time = "2023-10-23T13:46:30.373Z" }, - { url = "https://files.pythonhosted.org/packages/70/d0/50ace22129f79830e3cf682d0a2bd4843ef91573299d43112d52790163a8/scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a", size = 9479353, upload_time = "2023-10-23T13:46:34.368Z" }, - { url = "https://files.pythonhosted.org/packages/8f/46/fcc35ed7606c50d3072eae5a107a45cfa5b7f5fa8cc48610edd8cc8e8550/scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c", size = 10304705, upload_time = "2023-10-23T13:46:37.868Z" }, - { url = "https://files.pythonhosted.org/packages/d0/0b/26ad95cf0b747be967b15fb71a06f5ac67aba0fd2f9cd174de6edefc4674/scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161", size = 10827807, upload_time = "2023-10-23T13:46:41.59Z" }, - { url = "https://files.pythonhosted.org/packages/69/8a/cf17d6443f5f537e099be81535a56ab68a473f9393fbffda38cd19899fc8/scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c", size = 9255427, upload_time = "2023-10-23T13:46:44.826Z" }, - { url = "https://files.pythonhosted.org/packages/08/5d/e5acecd6e99a6b656e42e7a7b18284e2f9c9f512e8ed6979e1e75d25f05f/scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66", size = 10116376, upload_time = "2023-10-23T13:46:48.147Z" }, - { url = "https://files.pythonhosted.org/packages/40/c6/2e91eefb757822e70d351e02cc38d07c137212ae7c41ac12746415b4860a/scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157", size = 9383415, upload_time = "2023-10-23T13:46:51.324Z" }, - { url = "https://files.pythonhosted.org/packages/fa/fd/b3637639e73bb72b12803c5245f2a7299e09b2acd85a0f23937c53369a1c/scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb", size = 10279163, upload_time = "2023-10-23T13:46:54.642Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2a/d3ff6091406bc2207e0adb832ebd15e40ac685811c7e2e3b432bfd969b71/scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433", size = 10884422, upload_time = "2023-10-23T13:46:58.087Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ba/ce9bd1cd4953336a0e213b29cb80bb11816f2a93de8c99f88ef0b446ad0c/scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b", size = 9207060, upload_time = "2023-10-23T13:47:00.948Z" }, - { url = "https://files.pythonhosted.org/packages/26/7e/2c3b82c8c29aa384c8bf859740419278627d2cdd0050db503c8840e72477/scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028", size = 9979322, upload_time = "2023-10-23T13:47:03.977Z" }, - { url = "https://files.pythonhosted.org/packages/cf/fc/6c52ffeb587259b6b893b7cac268f1eb1b5426bcce1aa20e53523bfe6944/scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5", size = 9270688, upload_time = "2023-10-23T13:47:07.316Z" }, - { url = "https://files.pythonhosted.org/packages/e5/a7/6f4ae76f72ae9de162b97acbf1f53acbe404c555f968d13da21e4112a002/scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525", size = 10280398, upload_time = "2023-10-23T13:47:10.796Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b7/ee35904c07a0666784349529412fbb9814a56382b650d30fd9d6be5e5054/scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c", size = 10796478, upload_time = "2023-10-23T13:47:14.077Z" }, - { url = "https://files.pythonhosted.org/packages/fe/6b/db949ed5ac367987b1f250f070f340b7715d22f0c9c965bdf07de6ca75a3/scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107", size = 9133979, upload_time = "2023-10-23T13:47:17.389Z" }, + { url = "https://files.pythonhosted.org/packages/0d/53/570b55a6e10b8694ac1e3024d2df5cd443f1b4ff6d28430845da8b9019b3/scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1", size = 10209999, upload-time = "2023-10-23T13:46:30.373Z" }, + { url = "https://files.pythonhosted.org/packages/70/d0/50ace22129f79830e3cf682d0a2bd4843ef91573299d43112d52790163a8/scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a", size = 9479353, upload-time = "2023-10-23T13:46:34.368Z" }, + { url = "https://files.pythonhosted.org/packages/8f/46/fcc35ed7606c50d3072eae5a107a45cfa5b7f5fa8cc48610edd8cc8e8550/scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c", size = 10304705, upload-time = "2023-10-23T13:46:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/d0/0b/26ad95cf0b747be967b15fb71a06f5ac67aba0fd2f9cd174de6edefc4674/scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161", size = 10827807, upload-time = "2023-10-23T13:46:41.59Z" }, + { url = "https://files.pythonhosted.org/packages/69/8a/cf17d6443f5f537e099be81535a56ab68a473f9393fbffda38cd19899fc8/scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c", size = 9255427, upload-time = "2023-10-23T13:46:44.826Z" }, + { url = "https://files.pythonhosted.org/packages/08/5d/e5acecd6e99a6b656e42e7a7b18284e2f9c9f512e8ed6979e1e75d25f05f/scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66", size = 10116376, upload-time = "2023-10-23T13:46:48.147Z" }, + { url = "https://files.pythonhosted.org/packages/40/c6/2e91eefb757822e70d351e02cc38d07c137212ae7c41ac12746415b4860a/scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157", size = 9383415, upload-time = "2023-10-23T13:46:51.324Z" }, + { url = "https://files.pythonhosted.org/packages/fa/fd/b3637639e73bb72b12803c5245f2a7299e09b2acd85a0f23937c53369a1c/scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb", size = 10279163, upload-time = "2023-10-23T13:46:54.642Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/d3ff6091406bc2207e0adb832ebd15e40ac685811c7e2e3b432bfd969b71/scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433", size = 10884422, upload-time = "2023-10-23T13:46:58.087Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ba/ce9bd1cd4953336a0e213b29cb80bb11816f2a93de8c99f88ef0b446ad0c/scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b", size = 9207060, upload-time = "2023-10-23T13:47:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/26/7e/2c3b82c8c29aa384c8bf859740419278627d2cdd0050db503c8840e72477/scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028", size = 9979322, upload-time = "2023-10-23T13:47:03.977Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fc/6c52ffeb587259b6b893b7cac268f1eb1b5426bcce1aa20e53523bfe6944/scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5", size = 9270688, upload-time = "2023-10-23T13:47:07.316Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a7/6f4ae76f72ae9de162b97acbf1f53acbe404c555f968d13da21e4112a002/scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525", size = 10280398, upload-time = "2023-10-23T13:47:10.796Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/ee35904c07a0666784349529412fbb9814a56382b650d30fd9d6be5e5054/scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c", size = 10796478, upload-time = "2023-10-23T13:47:14.077Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6b/db949ed5ac367987b1f250f070f340b7715d22f0c9c965bdf07de6ca75a3/scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107", size = 9133979, upload-time = "2023-10-23T13:47:17.389Z" }, ] [[package]] @@ -2375,35 +2379,35 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6e/1f/91144ba78dccea567a6466262922786ffc97be1e9b06ed9574ef0edc11e1/scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa", size = 56336202, upload_time = "2023-11-18T21:06:08.277Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/1f/91144ba78dccea567a6466262922786ffc97be1e9b06ed9574ef0edc11e1/scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa", size = 56336202, upload-time = "2023-11-18T21:06:08.277Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/c6/a32add319475d21f89733c034b99c81b3a7c6c7c19f96f80c7ca3ff1bbd4/scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710", size = 37293259, upload_time = "2023-11-18T21:01:18.805Z" }, - { url = "https://files.pythonhosted.org/packages/de/0d/4fa68303568c70fd56fbf40668b6c6807cfee4cad975f07d80bdd26d013e/scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41", size = 29760656, upload_time = "2023-11-18T21:01:41.815Z" }, - { url = "https://files.pythonhosted.org/packages/13/e5/8012be7857db6cbbbdbeea8a154dbacdfae845e95e1e19c028e82236d4a0/scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4", size = 32922489, upload_time = "2023-11-18T21:01:50.637Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9e/80e2205d138960a49caea391f3710600895dd8292b6868dc9aff7aa593f9/scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56", size = 36442040, upload_time = "2023-11-18T21:02:00.119Z" }, - { url = "https://files.pythonhosted.org/packages/69/60/30a9c3fbe5066a3a93eefe3e2d44553df13587e6f792e1bff20dfed3d17e/scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446", size = 36643257, upload_time = "2023-11-18T21:02:06.798Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ec/b46756f80e3f4c5f0989f6e4492c2851f156d9c239d554754a3c8cffd4e2/scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3", size = 44149285, upload_time = "2023-11-18T21:02:15.592Z" }, - { url = "https://files.pythonhosted.org/packages/b8/f2/1aefbd5e54ebd8c6163ccf7f73e5d17bc8cb38738d312befc524fce84bb4/scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be", size = 37159197, upload_time = "2023-11-18T21:02:21.959Z" }, - { url = "https://files.pythonhosted.org/packages/4b/48/20e77ddb1f473d4717a7d4d3fc8d15557f406f7708496054c59f635b7734/scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8", size = 29675057, upload_time = "2023-11-18T21:02:28.169Z" }, - { url = "https://files.pythonhosted.org/packages/75/2e/a781862190d0e7e76afa74752ef363488a9a9d6ea86e46d5e5506cee8df6/scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c", size = 32882747, upload_time = "2023-11-18T21:02:33.683Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d4/d62ce38ba00dc67d7ec4ec5cc19d36958d8ed70e63778715ad626bcbc796/scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff", size = 36402732, upload_time = "2023-11-18T21:02:39.762Z" }, - { url = "https://files.pythonhosted.org/packages/88/86/827b56aea1ed04adbb044a675672a73c84d81076a350092bbfcfc1ae723b/scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993", size = 36622138, upload_time = "2023-11-18T21:02:45.968Z" }, - { url = "https://files.pythonhosted.org/packages/43/d0/f3cd75b62e1b90f48dbf091261b2fc7ceec14a700e308c50f6a69c83d337/scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd", size = 44095631, upload_time = "2023-11-18T21:02:52.859Z" }, - { url = "https://files.pythonhosted.org/packages/df/64/8a690570485b636da614acff35fd725fcbc487f8b1fa9bdb12871b77412f/scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6", size = 37053653, upload_time = "2023-11-18T21:03:00.107Z" }, - { url = "https://files.pythonhosted.org/packages/5e/43/abf331745a7e5f4af51f13d40e2a72f516048db41ecbcf3ac6f86ada54a3/scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d", size = 29641601, upload_time = "2023-11-18T21:03:06.708Z" }, - { url = "https://files.pythonhosted.org/packages/47/9b/62d0ec086dd2871009da8769c504bec6e39b80f4c182c6ead0fcebd8b323/scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4", size = 32272137, upload_time = "2023-11-18T21:03:14.877Z" }, - { url = "https://files.pythonhosted.org/packages/08/77/f90f7306d755ac68bd159c50bb86fffe38400e533e8c609dd8484bd0f172/scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79", size = 35777534, upload_time = "2023-11-18T21:03:21.451Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/b9f6938090c37b5092969ba1c67118e9114e8e6ef9d197251671444e839c/scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660", size = 35963721, upload_time = "2023-11-18T21:03:27.85Z" }, - { url = "https://files.pythonhosted.org/packages/c6/a1/357e4cd43af2748e1e0407ae0e9a5ea8aaaa6b702833c81be11670dcbad8/scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97", size = 43730653, upload_time = "2023-11-18T21:03:34.758Z" }, + { url = "https://files.pythonhosted.org/packages/34/c6/a32add319475d21f89733c034b99c81b3a7c6c7c19f96f80c7ca3ff1bbd4/scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710", size = 37293259, upload-time = "2023-11-18T21:01:18.805Z" }, + { url = "https://files.pythonhosted.org/packages/de/0d/4fa68303568c70fd56fbf40668b6c6807cfee4cad975f07d80bdd26d013e/scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41", size = 29760656, upload-time = "2023-11-18T21:01:41.815Z" }, + { url = "https://files.pythonhosted.org/packages/13/e5/8012be7857db6cbbbdbeea8a154dbacdfae845e95e1e19c028e82236d4a0/scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4", size = 32922489, upload-time = "2023-11-18T21:01:50.637Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9e/80e2205d138960a49caea391f3710600895dd8292b6868dc9aff7aa593f9/scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56", size = 36442040, upload-time = "2023-11-18T21:02:00.119Z" }, + { url = "https://files.pythonhosted.org/packages/69/60/30a9c3fbe5066a3a93eefe3e2d44553df13587e6f792e1bff20dfed3d17e/scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446", size = 36643257, upload-time = "2023-11-18T21:02:06.798Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ec/b46756f80e3f4c5f0989f6e4492c2851f156d9c239d554754a3c8cffd4e2/scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3", size = 44149285, upload-time = "2023-11-18T21:02:15.592Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f2/1aefbd5e54ebd8c6163ccf7f73e5d17bc8cb38738d312befc524fce84bb4/scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be", size = 37159197, upload-time = "2023-11-18T21:02:21.959Z" }, + { url = "https://files.pythonhosted.org/packages/4b/48/20e77ddb1f473d4717a7d4d3fc8d15557f406f7708496054c59f635b7734/scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8", size = 29675057, upload-time = "2023-11-18T21:02:28.169Z" }, + { url = "https://files.pythonhosted.org/packages/75/2e/a781862190d0e7e76afa74752ef363488a9a9d6ea86e46d5e5506cee8df6/scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c", size = 32882747, upload-time = "2023-11-18T21:02:33.683Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d4/d62ce38ba00dc67d7ec4ec5cc19d36958d8ed70e63778715ad626bcbc796/scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff", size = 36402732, upload-time = "2023-11-18T21:02:39.762Z" }, + { url = "https://files.pythonhosted.org/packages/88/86/827b56aea1ed04adbb044a675672a73c84d81076a350092bbfcfc1ae723b/scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993", size = 36622138, upload-time = "2023-11-18T21:02:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/43/d0/f3cd75b62e1b90f48dbf091261b2fc7ceec14a700e308c50f6a69c83d337/scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd", size = 44095631, upload-time = "2023-11-18T21:02:52.859Z" }, + { url = "https://files.pythonhosted.org/packages/df/64/8a690570485b636da614acff35fd725fcbc487f8b1fa9bdb12871b77412f/scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6", size = 37053653, upload-time = "2023-11-18T21:03:00.107Z" }, + { url = "https://files.pythonhosted.org/packages/5e/43/abf331745a7e5f4af51f13d40e2a72f516048db41ecbcf3ac6f86ada54a3/scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d", size = 29641601, upload-time = "2023-11-18T21:03:06.708Z" }, + { url = "https://files.pythonhosted.org/packages/47/9b/62d0ec086dd2871009da8769c504bec6e39b80f4c182c6ead0fcebd8b323/scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4", size = 32272137, upload-time = "2023-11-18T21:03:14.877Z" }, + { url = "https://files.pythonhosted.org/packages/08/77/f90f7306d755ac68bd159c50bb86fffe38400e533e8c609dd8484bd0f172/scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79", size = 35777534, upload-time = "2023-11-18T21:03:21.451Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/b9f6938090c37b5092969ba1c67118e9114e8e6ef9d197251671444e839c/scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660", size = 35963721, upload-time = "2023-11-18T21:03:27.85Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a1/357e4cd43af2748e1e0407ae0e9a5ea8aaaa6b702833c81be11670dcbad8/scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97", size = 43730653, upload-time = "2023-11-18T21:03:34.758Z" }, ] [[package]] name = "setuptools" version = "70.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/d8/10a70e86f6c28ae59f101a9de6d77bf70f147180fbf40c3af0f64080adc3/setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", size = 2333112, upload_time = "2024-07-09T16:08:06.251Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/d8/10a70e86f6c28ae59f101a9de6d77bf70f147180fbf40c3af0f64080adc3/setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", size = 2333112, upload-time = "2024-07-09T16:08:06.251Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/15/88e46eb9387e905704b69849618e699dc2f54407d8953cc4ec4b8b46528d/setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc", size = 931070, upload_time = "2024-07-09T16:07:58.829Z" }, + { url = "https://files.pythonhosted.org/packages/ef/15/88e46eb9387e905704b69849618e699dc2f54407d8953cc4ec4b8b46528d/setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc", size = 931070, upload-time = "2024-07-09T16:07:58.829Z" }, ] [[package]] @@ -2413,27 +2417,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wsproto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b0/d4/bfa032f961103eba93de583b161f0e6a5b63cebb8f2c7d0c6e6efe1e3d2e/simple_websocket-1.1.0.tar.gz", hash = "sha256:7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4", size = 17300, upload_time = "2024-10-10T22:39:31.412Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/d4/bfa032f961103eba93de583b161f0e6a5b63cebb8f2c7d0c6e6efe1e3d2e/simple_websocket-1.1.0.tar.gz", hash = "sha256:7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4", size = 17300, upload-time = "2024-10-10T22:39:31.412Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl", hash = "sha256:4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c", size = 13842, upload_time = "2024-10-10T22:39:29.645Z" }, + { url = "https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl", hash = "sha256:4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c", size = 13842, upload-time = "2024-10-10T22:39:29.645Z" }, ] [[package]] name = "six" version = "1.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041, upload_time = "2021-05-05T14:18:18.379Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041, upload-time = "2021-05-05T14:18:18.379Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053, upload_time = "2021-05-05T14:18:17.237Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053, upload-time = "2021-05-05T14:18:17.237Z" }, ] [[package]] name = "sniffio" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/50/d49c388cae4ec10e8109b1b833fd265511840706808576df3ada99ecb0ac/sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", size = 17103, upload_time = "2022-09-01T12:31:36.968Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/50/d49c388cae4ec10e8109b1b833fd265511840706808576df3ada99ecb0ac/sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", size = 17103, upload-time = "2022-09-01T12:31:36.968Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/a0/5dba8ed157b0136607c7f2151db695885606968d1fae123dc3391e0cfdbf/sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384", size = 10165, upload_time = "2022-09-01T12:31:34.186Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a0/5dba8ed157b0136607c7f2151db695885606968d1fae123dc3391e0cfdbf/sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384", size = 10165, upload-time = "2022-09-01T12:31:34.186Z" }, ] [[package]] @@ -2443,9 +2447,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/da/1fb4bdb72ae12b834becd7e1e7e47001d32f91ec0ce8d7bc1b618d9f0bd9/starlette-0.41.2.tar.gz", hash = "sha256:9834fd799d1a87fd346deb76158668cfa0b0d56f85caefe8268e2d97c3468b62", size = 2573867, upload_time = "2024-10-27T08:20:02.818Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/da/1fb4bdb72ae12b834becd7e1e7e47001d32f91ec0ce8d7bc1b618d9f0bd9/starlette-0.41.2.tar.gz", hash = "sha256:9834fd799d1a87fd346deb76158668cfa0b0d56f85caefe8268e2d97c3468b62", size = 2573867, upload-time = "2024-10-27T08:20:02.818Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/43/f185bfd0ca1d213beb4293bed51d92254df23d8ceaf6c0e17146d508a776/starlette-0.41.2-py3-none-any.whl", hash = "sha256:fbc189474b4731cf30fcef52f18a8d070e3f3b46c6a04c97579e85e6ffca942d", size = 73259, upload_time = "2024-10-27T08:20:00.052Z" }, + { url = "https://files.pythonhosted.org/packages/54/43/f185bfd0ca1d213beb4293bed51d92254df23d8ceaf6c0e17146d508a776/starlette-0.41.2-py3-none-any.whl", hash = "sha256:fbc189474b4731cf30fcef52f18a8d070e3f3b46c6a04c97579e85e6ffca942d", size = 73259, upload-time = "2024-10-27T08:20:00.052Z" }, ] [[package]] @@ -2455,18 +2459,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mpmath" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/57/3485a1a3dff51bfd691962768b14310dae452431754bfc091250be50dd29/sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8", size = 6722203, upload_time = "2023-05-10T18:23:00.378Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/57/3485a1a3dff51bfd691962768b14310dae452431754bfc091250be50dd29/sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8", size = 6722203, upload-time = "2023-05-10T18:23:00.378Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/05/e6600db80270777c4a64238a98d442f0fd07cc8915be2a1c16da7f2b9e74/sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5", size = 5742435, upload_time = "2023-05-10T18:22:14.76Z" }, + { url = "https://files.pythonhosted.org/packages/d2/05/e6600db80270777c4a64238a98d442f0fd07cc8915be2a1c16da7f2b9e74/sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5", size = 5742435, upload-time = "2023-05-10T18:22:14.76Z" }, ] [[package]] name = "threadpoolctl" version = "3.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/8a/c05f7831beb32aff70f808766224f11c650f7edfd49b27a8fc6666107006/threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355", size = 36266, upload_time = "2023-07-13T14:53:53.299Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/8a/c05f7831beb32aff70f808766224f11c650f7edfd49b27a8fc6666107006/threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355", size = 36266, upload-time = "2023-07-13T14:53:53.299Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/12/fd4dea011af9d69e1cad05c75f3f7202cdcbeac9b712eea58ca779a72865/threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032", size = 15539, upload_time = "2023-07-13T14:53:39.336Z" }, + { url = "https://files.pythonhosted.org/packages/81/12/fd4dea011af9d69e1cad05c75f3f7202cdcbeac9b712eea58ca779a72865/threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032", size = 15539, upload-time = "2023-07-13T14:53:39.336Z" }, ] [[package]] @@ -2476,9 +2480,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/a4/6c0eadea1ccfcda27e6cce400c366098b5b082138a073f4252fe399f4148/tifffile-2023.12.9.tar.gz", hash = "sha256:9dd1da91180a6453018a241ff219e1905f169384355cd89c9ef4034c1b46cdb8", size = 353467, upload_time = "2023-12-09T20:46:29.203Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/a4/6c0eadea1ccfcda27e6cce400c366098b5b082138a073f4252fe399f4148/tifffile-2023.12.9.tar.gz", hash = "sha256:9dd1da91180a6453018a241ff219e1905f169384355cd89c9ef4034c1b46cdb8", size = 353467, upload-time = "2023-12-09T20:46:29.203Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/a4/569fc717831969cf48bced350bdaf070cdeab06918d179429899e144358d/tifffile-2023.12.9-py3-none-any.whl", hash = "sha256:9b066e4b1a900891ea42ffd33dab8ba34c537935618b9893ddef42d7d422692f", size = 223627, upload_time = "2023-12-09T20:46:26.569Z" }, + { url = "https://files.pythonhosted.org/packages/54/a4/569fc717831969cf48bced350bdaf070cdeab06918d179429899e144358d/tifffile-2023.12.9-py3-none-any.whl", hash = "sha256:9b066e4b1a900891ea42ffd33dab8ba34c537935618b9893ddef42d7d422692f", size = 223627, upload-time = "2023-12-09T20:46:26.569Z" }, ] [[package]] @@ -2488,31 +2492,31 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/76/5ac0c97f1117b91b7eb7323dcd61af80d72f790b4df71249a7850c195f30/tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab", size = 343256, upload_time = "2025-03-13T10:51:18.189Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/76/5ac0c97f1117b91b7eb7323dcd61af80d72f790b4df71249a7850c195f30/tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab", size = 343256, upload-time = "2025-03-13T10:51:18.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/1f/328aee25f9115bf04262e8b4e5a2050b7b7cf44b59c74e982db7270c7f30/tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41", size = 2780767, upload_time = "2025-03-13T10:51:09.459Z" }, - { url = "https://files.pythonhosted.org/packages/ae/1a/4526797f3719b0287853f12c5ad563a9be09d446c44ac784cdd7c50f76ab/tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3", size = 2650555, upload_time = "2025-03-13T10:51:07.692Z" }, - { url = "https://files.pythonhosted.org/packages/4d/7a/a209b29f971a9fdc1da86f917fe4524564924db50d13f0724feed37b2a4d/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28da6b72d4fb14ee200a1bd386ff74ade8992d7f725f2bde2c495a9a98cf4d9f", size = 2937541, upload_time = "2025-03-13T10:50:56.679Z" }, - { url = "https://files.pythonhosted.org/packages/3c/1e/b788b50ffc6191e0b1fc2b0d49df8cff16fe415302e5ceb89f619d12c5bc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34d8cfde551c9916cb92014e040806122295a6800914bab5865deb85623931cf", size = 2819058, upload_time = "2025-03-13T10:50:59.525Z" }, - { url = "https://files.pythonhosted.org/packages/36/aa/3626dfa09a0ecc5b57a8c58eeaeb7dd7ca9a37ad9dd681edab5acd55764c/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaa852d23e125b73d283c98f007e06d4595732104b65402f46e8ef24b588d9f8", size = 3133278, upload_time = "2025-03-13T10:51:04.678Z" }, - { url = "https://files.pythonhosted.org/packages/a4/4d/8fbc203838b3d26269f944a89459d94c858f5b3f9a9b6ee9728cdcf69161/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a21a15d5c8e603331b8a59548bbe113564136dc0f5ad8306dd5033459a226da0", size = 3144253, upload_time = "2025-03-13T10:51:01.261Z" }, - { url = "https://files.pythonhosted.org/packages/d8/1b/2bd062adeb7c7511b847b32e356024980c0ffcf35f28947792c2d8ad2288/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fdbd4c067c60a0ac7eca14b6bd18a5bebace54eb757c706b47ea93204f7a37c", size = 3398225, upload_time = "2025-03-13T10:51:03.243Z" }, - { url = "https://files.pythonhosted.org/packages/8a/63/38be071b0c8e06840bc6046991636bcb30c27f6bb1e670f4f4bc87cf49cc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd9a0061e403546f7377df940e866c3e678d7d4e9643d0461ea442b4f89e61a", size = 3038874, upload_time = "2025-03-13T10:51:06.235Z" }, - { url = "https://files.pythonhosted.org/packages/ec/83/afa94193c09246417c23a3c75a8a0a96bf44ab5630a3015538d0c316dd4b/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db9484aeb2e200c43b915a1a0150ea885e35f357a5a8fabf7373af333dcc8dbf", size = 9014448, upload_time = "2025-03-13T10:51:10.927Z" }, - { url = "https://files.pythonhosted.org/packages/ae/b3/0e1a37d4f84c0f014d43701c11eb8072704f6efe8d8fc2dcdb79c47d76de/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed248ab5279e601a30a4d67bdb897ecbe955a50f1e7bb62bd99f07dd11c2f5b6", size = 8937877, upload_time = "2025-03-13T10:51:12.688Z" }, - { url = "https://files.pythonhosted.org/packages/ac/33/ff08f50e6d615eb180a4a328c65907feb6ded0b8f990ec923969759dc379/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:9ac78b12e541d4ce67b4dfd970e44c060a2147b9b2a21f509566d556a509c67d", size = 9186645, upload_time = "2025-03-13T10:51:14.723Z" }, - { url = "https://files.pythonhosted.org/packages/5f/aa/8ae85f69a9f6012c6f8011c6f4aa1c96154c816e9eea2e1b758601157833/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5a69c1a4496b81a5ee5d2c1f3f7fbdf95e90a0196101b0ee89ed9956b8a168f", size = 9384380, upload_time = "2025-03-13T10:51:16.526Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5b/a5d98c89f747455e8b7a9504910c865d5e51da55e825a7ae641fb5ff0a58/tokenizers-0.21.1-cp39-abi3-win32.whl", hash = "sha256:1039a3a5734944e09de1d48761ade94e00d0fa760c0e0551151d4dd851ba63e3", size = 2239506, upload_time = "2025-03-13T10:51:20.643Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382", size = 2435481, upload_time = "2025-03-13T10:51:19.243Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1f/328aee25f9115bf04262e8b4e5a2050b7b7cf44b59c74e982db7270c7f30/tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41", size = 2780767, upload-time = "2025-03-13T10:51:09.459Z" }, + { url = "https://files.pythonhosted.org/packages/ae/1a/4526797f3719b0287853f12c5ad563a9be09d446c44ac784cdd7c50f76ab/tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3", size = 2650555, upload-time = "2025-03-13T10:51:07.692Z" }, + { url = "https://files.pythonhosted.org/packages/4d/7a/a209b29f971a9fdc1da86f917fe4524564924db50d13f0724feed37b2a4d/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28da6b72d4fb14ee200a1bd386ff74ade8992d7f725f2bde2c495a9a98cf4d9f", size = 2937541, upload-time = "2025-03-13T10:50:56.679Z" }, + { url = "https://files.pythonhosted.org/packages/3c/1e/b788b50ffc6191e0b1fc2b0d49df8cff16fe415302e5ceb89f619d12c5bc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34d8cfde551c9916cb92014e040806122295a6800914bab5865deb85623931cf", size = 2819058, upload-time = "2025-03-13T10:50:59.525Z" }, + { url = "https://files.pythonhosted.org/packages/36/aa/3626dfa09a0ecc5b57a8c58eeaeb7dd7ca9a37ad9dd681edab5acd55764c/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaa852d23e125b73d283c98f007e06d4595732104b65402f46e8ef24b588d9f8", size = 3133278, upload-time = "2025-03-13T10:51:04.678Z" }, + { url = "https://files.pythonhosted.org/packages/a4/4d/8fbc203838b3d26269f944a89459d94c858f5b3f9a9b6ee9728cdcf69161/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a21a15d5c8e603331b8a59548bbe113564136dc0f5ad8306dd5033459a226da0", size = 3144253, upload-time = "2025-03-13T10:51:01.261Z" }, + { url = "https://files.pythonhosted.org/packages/d8/1b/2bd062adeb7c7511b847b32e356024980c0ffcf35f28947792c2d8ad2288/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fdbd4c067c60a0ac7eca14b6bd18a5bebace54eb757c706b47ea93204f7a37c", size = 3398225, upload-time = "2025-03-13T10:51:03.243Z" }, + { url = "https://files.pythonhosted.org/packages/8a/63/38be071b0c8e06840bc6046991636bcb30c27f6bb1e670f4f4bc87cf49cc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd9a0061e403546f7377df940e866c3e678d7d4e9643d0461ea442b4f89e61a", size = 3038874, upload-time = "2025-03-13T10:51:06.235Z" }, + { url = "https://files.pythonhosted.org/packages/ec/83/afa94193c09246417c23a3c75a8a0a96bf44ab5630a3015538d0c316dd4b/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db9484aeb2e200c43b915a1a0150ea885e35f357a5a8fabf7373af333dcc8dbf", size = 9014448, upload-time = "2025-03-13T10:51:10.927Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b3/0e1a37d4f84c0f014d43701c11eb8072704f6efe8d8fc2dcdb79c47d76de/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed248ab5279e601a30a4d67bdb897ecbe955a50f1e7bb62bd99f07dd11c2f5b6", size = 8937877, upload-time = "2025-03-13T10:51:12.688Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/ff08f50e6d615eb180a4a328c65907feb6ded0b8f990ec923969759dc379/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:9ac78b12e541d4ce67b4dfd970e44c060a2147b9b2a21f509566d556a509c67d", size = 9186645, upload-time = "2025-03-13T10:51:14.723Z" }, + { url = "https://files.pythonhosted.org/packages/5f/aa/8ae85f69a9f6012c6f8011c6f4aa1c96154c816e9eea2e1b758601157833/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5a69c1a4496b81a5ee5d2c1f3f7fbdf95e90a0196101b0ee89ed9956b8a168f", size = 9384380, upload-time = "2025-03-13T10:51:16.526Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5b/a5d98c89f747455e8b7a9504910c865d5e51da55e825a7ae641fb5ff0a58/tokenizers-0.21.1-cp39-abi3-win32.whl", hash = "sha256:1039a3a5734944e09de1d48761ade94e00d0fa760c0e0551151d4dd851ba63e3", size = 2239506, upload-time = "2025-03-13T10:51:20.643Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl", hash = "sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382", size = 2435481, upload-time = "2025-03-13T10:51:19.243Z" }, ] [[package]] name = "tomli" version = "2.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload_time = "2022-02-08T10:54:04.006Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload-time = "2022-02-08T10:54:04.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload_time = "2022-02-08T10:54:02.017Z" }, + { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload-time = "2022-02-08T10:54:02.017Z" }, ] [[package]] @@ -2522,18 +2526,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/00/6a9b3aedb0b60a80995ade30f718f1a9902612f22a1aaf531c85a02987f7/tqdm-4.66.3.tar.gz", hash = "sha256:23097a41eba115ba99ecae40d06444c15d1c0c698d527a01c6c8bd1c5d0647e5", size = 169551, upload_time = "2024-05-02T21:44:05.084Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/00/6a9b3aedb0b60a80995ade30f718f1a9902612f22a1aaf531c85a02987f7/tqdm-4.66.3.tar.gz", hash = "sha256:23097a41eba115ba99ecae40d06444c15d1c0c698d527a01c6c8bd1c5d0647e5", size = 169551, upload-time = "2024-05-02T21:44:05.084Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/ad/7d47bbf2cae78ff79f29db0bed5016ec9c56b212a93fca624bb88b551a7c/tqdm-4.66.3-py3-none-any.whl", hash = "sha256:4f41d54107ff9a223dca80b53efe4fb654c67efaba7f47bada3ee9d50e05bd53", size = 78374, upload_time = "2024-05-02T21:44:01.541Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ad/7d47bbf2cae78ff79f29db0bed5016ec9c56b212a93fca624bb88b551a7c/tqdm-4.66.3-py3-none-any.whl", hash = "sha256:4f41d54107ff9a223dca80b53efe4fb654c67efaba7f47bada3ee9d50e05bd53", size = 78374, upload-time = "2024-05-02T21:44:01.541Z" }, ] [[package]] name = "types-pyyaml" version = "6.0.12.20250402" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/68/609eed7402f87c9874af39d35942744e39646d1ea9011765ec87b01b2a3c/types_pyyaml-6.0.12.20250402.tar.gz", hash = "sha256:d7c13c3e6d335b6af4b0122a01ff1d270aba84ab96d1a1a1063ecba3e13ec075", size = 17282, upload_time = "2025-04-02T02:56:00.235Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/68/609eed7402f87c9874af39d35942744e39646d1ea9011765ec87b01b2a3c/types_pyyaml-6.0.12.20250402.tar.gz", hash = "sha256:d7c13c3e6d335b6af4b0122a01ff1d270aba84ab96d1a1a1063ecba3e13ec075", size = 17282, upload-time = "2025-04-02T02:56:00.235Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/56/1fe61db05685fbb512c07ea9323f06ea727125951f1eb4dff110b3311da3/types_pyyaml-6.0.12.20250402-py3-none-any.whl", hash = "sha256:652348fa9e7a203d4b0d21066dfb00760d3cbd5a15ebb7cf8d33c88a49546681", size = 20329, upload_time = "2025-04-02T02:55:59.382Z" }, + { url = "https://files.pythonhosted.org/packages/ed/56/1fe61db05685fbb512c07ea9323f06ea727125951f1eb4dff110b3311da3/types_pyyaml-6.0.12.20250402-py3-none-any.whl", hash = "sha256:652348fa9e7a203d4b0d21066dfb00760d3cbd5a15ebb7cf8d33c88a49546681", size = 20329, upload-time = "2025-04-02T02:55:59.382Z" }, ] [[package]] @@ -2543,9 +2547,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995, upload_time = "2025-03-28T02:55:13.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995, upload-time = "2025-03-28T02:55:13.271Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663, upload_time = "2025-03-28T02:55:11.946Z" }, + { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663, upload-time = "2025-03-28T02:55:11.946Z" }, ] [[package]] @@ -2555,36 +2559,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b8/0f/2d1d000c2be3919bcdea15e5da48456bf1e55c18d02c5509ea59dade1408/types_setuptools-76.0.0.20250313.tar.gz", hash = "sha256:b2be66f550f95f3cad2a7d46177b273c7e9c80df7d257fa57addbbcfc8126a9e", size = 43627, upload_time = "2025-03-13T02:51:28.3Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/0f/2d1d000c2be3919bcdea15e5da48456bf1e55c18d02c5509ea59dade1408/types_setuptools-76.0.0.20250313.tar.gz", hash = "sha256:b2be66f550f95f3cad2a7d46177b273c7e9c80df7d257fa57addbbcfc8126a9e", size = 43627, upload-time = "2025-03-13T02:51:28.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/89/ea9669a0a76b160ffb312d0b02b15bad053c1bc81d2a54e42e3a402ca754/types_setuptools-76.0.0.20250313-py3-none-any.whl", hash = "sha256:bf454b2a49b8cfd7ebcf5844d4dd5fe4c8666782df1e3663c5866fd51a47460e", size = 65845, upload_time = "2025-03-13T02:51:27.055Z" }, + { url = "https://files.pythonhosted.org/packages/ca/89/ea9669a0a76b160ffb312d0b02b15bad053c1bc81d2a54e42e3a402ca754/types_setuptools-76.0.0.20250313-py3-none-any.whl", hash = "sha256:bf454b2a49b8cfd7ebcf5844d4dd5fe4c8666782df1e3663c5866fd51a47460e", size = 65845, upload-time = "2025-03-13T02:51:27.055Z" }, ] [[package]] name = "types-simplejson" version = "3.20.0.20250326" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/14/e26fc55e1ea56f9ea470917d3e2f8240e6d043ca914181021d04115ae0f7/types_simplejson-3.20.0.20250326.tar.gz", hash = "sha256:b2689bc91e0e672d7a5a947b4cb546b76ae7ddc2899c6678e72a10bf96cd97d2", size = 10489, upload_time = "2025-03-26T02:53:35.825Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/14/e26fc55e1ea56f9ea470917d3e2f8240e6d043ca914181021d04115ae0f7/types_simplejson-3.20.0.20250326.tar.gz", hash = "sha256:b2689bc91e0e672d7a5a947b4cb546b76ae7ddc2899c6678e72a10bf96cd97d2", size = 10489, upload-time = "2025-03-26T02:53:35.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/bf/d3f3a5ba47fd18115e8446d39f025b85905d2008677c29ee4d03b4cddd57/types_simplejson-3.20.0.20250326-py3-none-any.whl", hash = "sha256:db1ddea7b8f7623b27a137578f22fc6c618db8c83ccfb1828ca0d2f0ec11efa7", size = 10462, upload_time = "2025-03-26T02:53:35.036Z" }, + { url = "https://files.pythonhosted.org/packages/76/bf/d3f3a5ba47fd18115e8446d39f025b85905d2008677c29ee4d03b4cddd57/types_simplejson-3.20.0.20250326-py3-none-any.whl", hash = "sha256:db1ddea7b8f7623b27a137578f22fc6c618db8c83ccfb1828ca0d2f0ec11efa7", size = 10462, upload-time = "2025-03-26T02:53:35.036Z" }, ] [[package]] name = "types-ujson" version = "5.10.0.20250326" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/5c/c974451c4babdb4ae3588925487edde492d59a8403010b4642a554d09954/types_ujson-5.10.0.20250326.tar.gz", hash = "sha256:5469e05f2c31ecb3c4c0267cc8fe41bcd116826fbb4ded69801a645c687dd014", size = 8340, upload_time = "2025-03-26T02:53:39.197Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/5c/c974451c4babdb4ae3588925487edde492d59a8403010b4642a554d09954/types_ujson-5.10.0.20250326.tar.gz", hash = "sha256:5469e05f2c31ecb3c4c0267cc8fe41bcd116826fbb4ded69801a645c687dd014", size = 8340, upload-time = "2025-03-26T02:53:39.197Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/c9/8a73a5f8fa6e70fc02eed506d5ac0ae9ceafbd2b8c9ad34a7de0f29900d6/types_ujson-5.10.0.20250326-py3-none-any.whl", hash = "sha256:acc0913f569def62ef6a892c8a47703f65d05669a3252391a97765cf207dca5b", size = 7644, upload_time = "2025-03-26T02:53:38.2Z" }, + { url = "https://files.pythonhosted.org/packages/3e/c9/8a73a5f8fa6e70fc02eed506d5ac0ae9ceafbd2b8c9ad34a7de0f29900d6/types_ujson-5.10.0.20250326-py3-none-any.whl", hash = "sha256:acc0913f569def62ef6a892c8a47703f65d05669a3252391a97765cf207dca5b", size = 7644, upload-time = "2025-03-26T02:53:38.2Z" }, ] [[package]] name = "typing-extensions" version = "4.12.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321, upload_time = "2024-06-07T18:52:15.995Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321, upload-time = "2024-06-07T18:52:15.995Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload_time = "2024-06-07T18:52:13.582Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload-time = "2024-06-07T18:52:13.582Z" }, ] [[package]] @@ -2594,18 +2598,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload_time = "2025-02-25T17:27:59.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload_time = "2025-02-25T17:27:57.754Z" }, + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, ] [[package]] name = "urllib3" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/dd/a6b232f449e1bc71802a5b7950dc3675d32c6dbc2a1bd6d71f065551adb6/urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54", size = 263900, upload_time = "2023-11-13T12:29:45.049Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/dd/a6b232f449e1bc71802a5b7950dc3675d32c6dbc2a1bd6d71f065551adb6/urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54", size = 263900, upload-time = "2023-11-13T12:29:45.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/94/c31f58c7a7f470d5665935262ebd7455c7e4c7782eb525658d3dbf4b9403/urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", size = 104579, upload_time = "2023-11-13T12:29:42.719Z" }, + { url = "https://files.pythonhosted.org/packages/96/94/c31f58c7a7f470d5665935262ebd7455c7e4c7782eb525658d3dbf4b9403/urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", size = 104579, upload-time = "2023-11-13T12:29:42.719Z" }, ] [[package]] @@ -2617,9 +2621,9 @@ dependencies = [ { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload_time = "2025-04-19T06:02:50.101Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload-time = "2025-04-19T06:02:50.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload_time = "2025-04-19T06:02:48.42Z" }, + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload-time = "2025-04-19T06:02:48.42Z" }, ] [package.optional-dependencies] @@ -2637,26 +2641,26 @@ standard = [ name = "uvloop" version = "0.19.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/16/728cc5dde368e6eddb299c5aec4d10eaf25335a5af04e8c0abd68e2e9d32/uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd", size = 2318492, upload_time = "2023-10-22T22:03:57.665Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/16/728cc5dde368e6eddb299c5aec4d10eaf25335a5af04e8c0abd68e2e9d32/uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd", size = 2318492, upload-time = "2023-10-22T22:03:57.665Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/c2/27bf858a576b1fa35b5c2c2029c8cec424a8789e87545ed2f25466d1f21d/uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e", size = 1443484, upload_time = "2023-10-22T22:02:54.169Z" }, - { url = "https://files.pythonhosted.org/packages/4e/35/05b6064b93f4113412d1fd92bdcb6018607e78ae94d1712e63e533f9b2fa/uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428", size = 793850, upload_time = "2023-10-22T22:02:56.311Z" }, - { url = "https://files.pythonhosted.org/packages/aa/56/b62ab4e10458ce96bb30c98d327c127f989d3bb4ef899e4c410c739f7ef6/uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8", size = 3418601, upload_time = "2023-10-22T22:02:58.717Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ed/12729fba5e3b7e02ee70b3ea230b88e60a50375cf63300db22607694d2f0/uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849", size = 3416731, upload_time = "2023-10-22T22:03:01.043Z" }, - { url = "https://files.pythonhosted.org/packages/a2/23/80381a2d728d2a0c36e2eef202f5b77428990004d8fbdd3865558ff49fa5/uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957", size = 4128572, upload_time = "2023-10-22T22:03:02.874Z" }, - { url = "https://files.pythonhosted.org/packages/6b/23/1ee41a15e1ad15182e2bd12cbfd37bcb6802f01d6bbcaddf6ca136cbb308/uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd", size = 4129235, upload_time = "2023-10-22T22:03:05.361Z" }, - { url = "https://files.pythonhosted.org/packages/41/2a/608ad69f27f51280098abee440c33e921d3ad203e2c86f7262e241e49c99/uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef", size = 1357681, upload_time = "2023-10-22T22:03:07.158Z" }, - { url = "https://files.pythonhosted.org/packages/13/00/d0923d66d80c8717983493a4d7af747ce47f1c2147d82df057a846ba6bff/uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2", size = 746421, upload_time = "2023-10-22T22:03:09.4Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c7/e494c367b0c6e6453f9bed5a78548f5b2ff49add36302cd915a91d347d88/uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1", size = 3481000, upload_time = "2023-10-22T22:03:11.755Z" }, - { url = "https://files.pythonhosted.org/packages/86/cc/1829b3f740e4cb1baefff8240a1c6fc8db9e3caac7b93169aec7d4386069/uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24", size = 3476361, upload_time = "2023-10-22T22:03:13.841Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4c/ca87e8f5a30629ffa2038c20907c8ab455c5859ff10e810227b76e60d927/uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533", size = 4169571, upload_time = "2023-10-22T22:03:15.618Z" }, - { url = "https://files.pythonhosted.org/packages/d2/a9/f947a00c47b1c87c937cac2423243a41ba08f0fb76d04eb0d1d170606e0a/uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12", size = 4170459, upload_time = "2023-10-22T22:03:17.988Z" }, - { url = "https://files.pythonhosted.org/packages/85/57/6736733bb0e86a4b5380d04082463b289c0baecaa205934ba81e8a1d5ea4/uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650", size = 1355376, upload_time = "2023-10-22T22:03:20.075Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0c/51339463da912ed34b48d470538d98a91660749b2db56902f23db9b42fdd/uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec", size = 745031, upload_time = "2023-10-22T22:03:21.404Z" }, - { url = "https://files.pythonhosted.org/packages/e6/fc/f0daaf19f5b2116a2d26eb9f98c4a45084aea87bf03c33bcca7aa1ff36e5/uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc", size = 4077630, upload_time = "2023-10-22T22:03:23.568Z" }, - { url = "https://files.pythonhosted.org/packages/fd/96/fdc318ffe82ae567592b213ec2fcd8ecedd927b5da068cf84d56b28c51a4/uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6", size = 4159957, upload_time = "2023-10-22T22:03:25.278Z" }, - { url = "https://files.pythonhosted.org/packages/71/bc/092068ae7fc16dcf20f3e389126ba7800cee75ffba83f78bf1d167aee3cd/uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593", size = 4014951, upload_time = "2023-10-22T22:03:27.055Z" }, - { url = "https://files.pythonhosted.org/packages/a6/f2/6ce1e73933eb038c89f929e26042e64b2cb8d4453410153eed14918ca9a8/uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3", size = 4100911, upload_time = "2023-10-22T22:03:29.39Z" }, + { url = "https://files.pythonhosted.org/packages/36/c2/27bf858a576b1fa35b5c2c2029c8cec424a8789e87545ed2f25466d1f21d/uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e", size = 1443484, upload-time = "2023-10-22T22:02:54.169Z" }, + { url = "https://files.pythonhosted.org/packages/4e/35/05b6064b93f4113412d1fd92bdcb6018607e78ae94d1712e63e533f9b2fa/uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428", size = 793850, upload-time = "2023-10-22T22:02:56.311Z" }, + { url = "https://files.pythonhosted.org/packages/aa/56/b62ab4e10458ce96bb30c98d327c127f989d3bb4ef899e4c410c739f7ef6/uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8", size = 3418601, upload-time = "2023-10-22T22:02:58.717Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ed/12729fba5e3b7e02ee70b3ea230b88e60a50375cf63300db22607694d2f0/uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849", size = 3416731, upload-time = "2023-10-22T22:03:01.043Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/80381a2d728d2a0c36e2eef202f5b77428990004d8fbdd3865558ff49fa5/uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957", size = 4128572, upload-time = "2023-10-22T22:03:02.874Z" }, + { url = "https://files.pythonhosted.org/packages/6b/23/1ee41a15e1ad15182e2bd12cbfd37bcb6802f01d6bbcaddf6ca136cbb308/uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd", size = 4129235, upload-time = "2023-10-22T22:03:05.361Z" }, + { url = "https://files.pythonhosted.org/packages/41/2a/608ad69f27f51280098abee440c33e921d3ad203e2c86f7262e241e49c99/uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef", size = 1357681, upload-time = "2023-10-22T22:03:07.158Z" }, + { url = "https://files.pythonhosted.org/packages/13/00/d0923d66d80c8717983493a4d7af747ce47f1c2147d82df057a846ba6bff/uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2", size = 746421, upload-time = "2023-10-22T22:03:09.4Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c7/e494c367b0c6e6453f9bed5a78548f5b2ff49add36302cd915a91d347d88/uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1", size = 3481000, upload-time = "2023-10-22T22:03:11.755Z" }, + { url = "https://files.pythonhosted.org/packages/86/cc/1829b3f740e4cb1baefff8240a1c6fc8db9e3caac7b93169aec7d4386069/uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24", size = 3476361, upload-time = "2023-10-22T22:03:13.841Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4c/ca87e8f5a30629ffa2038c20907c8ab455c5859ff10e810227b76e60d927/uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533", size = 4169571, upload-time = "2023-10-22T22:03:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/d2/a9/f947a00c47b1c87c937cac2423243a41ba08f0fb76d04eb0d1d170606e0a/uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12", size = 4170459, upload-time = "2023-10-22T22:03:17.988Z" }, + { url = "https://files.pythonhosted.org/packages/85/57/6736733bb0e86a4b5380d04082463b289c0baecaa205934ba81e8a1d5ea4/uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650", size = 1355376, upload-time = "2023-10-22T22:03:20.075Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0c/51339463da912ed34b48d470538d98a91660749b2db56902f23db9b42fdd/uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec", size = 745031, upload-time = "2023-10-22T22:03:21.404Z" }, + { url = "https://files.pythonhosted.org/packages/e6/fc/f0daaf19f5b2116a2d26eb9f98c4a45084aea87bf03c33bcca7aa1ff36e5/uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc", size = 4077630, upload-time = "2023-10-22T22:03:23.568Z" }, + { url = "https://files.pythonhosted.org/packages/fd/96/fdc318ffe82ae567592b213ec2fcd8ecedd927b5da068cf84d56b28c51a4/uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6", size = 4159957, upload-time = "2023-10-22T22:03:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/092068ae7fc16dcf20f3e389126ba7800cee75ffba83f78bf1d167aee3cd/uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593", size = 4014951, upload-time = "2023-10-22T22:03:27.055Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f2/6ce1e73933eb038c89f929e26042e64b2cb8d4453410153eed14918ca9a8/uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3", size = 4100911, upload-time = "2023-10-22T22:03:29.39Z" }, ] [[package]] @@ -2666,115 +2670,115 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/79/0ee412e1228aaf6f9568aa180b43cb482472de52560fbd7c283c786534af/watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3", size = 37098, upload_time = "2023-10-13T13:06:39.809Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/79/0ee412e1228aaf6f9568aa180b43cb482472de52560fbd7c283c786534af/watchfiles-0.21.0.tar.gz", hash = "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3", size = 37098, upload-time = "2023-10-13T13:06:39.809Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/85/ea2a035b7d86bf0a29ee1c32bc2df8ad4da77e6602806e679d9735ff28cb/watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa", size = 428182, upload_time = "2023-10-13T13:04:34.803Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e5/240e5eb3ff0ee3da3b028ac5be2019c407bdd0f3fdb02bd75fdf3bd10aff/watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e", size = 418275, upload_time = "2023-10-13T13:04:36.632Z" }, - { url = "https://files.pythonhosted.org/packages/5b/79/ecd0dfb04443a1900cd3952d7ea6493bf655c2db9a0d3736a5d98a15da39/watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03", size = 1379785, upload_time = "2023-10-13T13:04:38.641Z" }, - { url = "https://files.pythonhosted.org/packages/41/0e/3333b986b1889bb71f0e44b3fac0591824a679619b8b8ddd70ff8858edc4/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124", size = 1349374, upload_time = "2023-10-13T13:04:41.711Z" }, - { url = "https://files.pythonhosted.org/packages/18/c4/ad5ad16cad900a29aaa792e0ed121ff70d76f74062b051661090d88c6dfd/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab", size = 1348033, upload_time = "2023-10-13T13:04:43.324Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d2/769254ff04ba88ceb179a6e892606ac4da17338eb010e85ca7a9c3339234/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303", size = 1464393, upload_time = "2023-10-13T13:04:44.818Z" }, - { url = "https://files.pythonhosted.org/packages/14/d0/662800e778ca20e7664dd5df57751aa79ef18b6abb92224b03c8c2e852a6/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d", size = 1542953, upload_time = "2023-10-13T13:04:46.714Z" }, - { url = "https://files.pythonhosted.org/packages/f7/4b/b90dcdc3bbaf3bb2db733e1beea2d01566b601c15fcf8e71dfcc8686c097/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c", size = 1346961, upload_time = "2023-10-13T13:04:48.072Z" }, - { url = "https://files.pythonhosted.org/packages/92/ff/75cc1b30c5abcad13a2a72e75625ec619c7a393028a111d7d24dba578d5e/watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9", size = 1464393, upload_time = "2023-10-13T13:04:49.638Z" }, - { url = "https://files.pythonhosted.org/packages/9a/65/12cbeb363bf220482a559c48107edfd87f09248f55e1ac315a36c2098a0f/watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9", size = 1463409, upload_time = "2023-10-13T13:04:51.762Z" }, - { url = "https://files.pythonhosted.org/packages/f2/08/92e28867c66f0d9638bb131feca739057efc48dbcd391fd7f0a55507e470/watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293", size = 268101, upload_time = "2023-10-13T13:04:53.78Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ea/80527adf1ad51488a96fc201715730af5879f4dfeccb5e2069ff82d890d4/watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235", size = 279675, upload_time = "2023-10-13T13:04:55.113Z" }, - { url = "https://files.pythonhosted.org/packages/57/b9/2667286003dd305b81d3a3aa824d3dfc63dacbf2a96faae09e72d953c430/watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7", size = 428210, upload_time = "2023-10-13T13:04:56.894Z" }, - { url = "https://files.pythonhosted.org/packages/a3/87/6793ac60d2e20c9c1883aec7431c2e7b501ee44a839f6da1b747c13baa23/watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef", size = 418196, upload_time = "2023-10-13T13:04:58.19Z" }, - { url = "https://files.pythonhosted.org/packages/5d/12/e1d1d220c5b99196eea38c9a878964f30a2b55ec9d72fd713191725b35e8/watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586", size = 1380287, upload_time = "2023-10-13T13:04:59.923Z" }, - { url = "https://files.pythonhosted.org/packages/0e/cf/126f0a8683f326d190c3539a769e45e747a80a5fcbf797de82e738c946ae/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317", size = 1349653, upload_time = "2023-10-13T13:05:01.622Z" }, - { url = "https://files.pythonhosted.org/packages/20/6e/6cffd795ec65dbc82f15d95b73d3042c1ddaffc4dd25f6c8240bfcf0640f/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b", size = 1348844, upload_time = "2023-10-13T13:05:03.805Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2a/f9633279d8937ad84c532997405dd106fa6100e8d2b83e364f1c87561f96/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1", size = 1464343, upload_time = "2023-10-13T13:05:05.248Z" }, - { url = "https://files.pythonhosted.org/packages/d7/49/9b2199bbf3c89e7c8dd795fced9dac29f201be8a28a5df0c8ff625737df6/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d", size = 1542858, upload_time = "2023-10-13T13:05:06.791Z" }, - { url = "https://files.pythonhosted.org/packages/35/e0/e8a9c1fe30e98c5b3507ad381abc4d9ee2c3b9c0ae62ffe9c164a5838186/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7", size = 1347464, upload_time = "2023-10-13T13:05:08.622Z" }, - { url = "https://files.pythonhosted.org/packages/ba/66/873739dd7defdfaee4b880114de9463fae18ba13ae2ddd784806b0ee33b6/watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0", size = 1464343, upload_time = "2023-10-13T13:05:10.584Z" }, - { url = "https://files.pythonhosted.org/packages/bd/51/d7539aa258d8f0e5d7b870af8b9b8964b4f88a1e4517eeb8a2efb838e9b3/watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365", size = 1463338, upload_time = "2023-10-13T13:05:12.671Z" }, - { url = "https://files.pythonhosted.org/packages/ee/92/219c539a2a93b6870fa7b84eace946983126b20a7e15c6c034d8d0472682/watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400", size = 267658, upload_time = "2023-10-13T13:05:13.972Z" }, - { url = "https://files.pythonhosted.org/packages/f3/dc/2a8a447b783f5059c4bf7a6bad8fe59375a5a9ce872774763b25c21c2860/watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe", size = 280113, upload_time = "2023-10-13T13:05:15.289Z" }, - { url = "https://files.pythonhosted.org/packages/22/15/e4085181cf0210a6ec6eb29fee0c6088de867ee33d81555076a4a2726e8b/watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078", size = 268688, upload_time = "2023-10-13T13:05:17.144Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fd/2f009eb17809afd32a143b442856628585c9ce3a9c6d5c1841e44e35a16c/watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a", size = 426902, upload_time = "2023-10-13T13:05:18.828Z" }, - { url = "https://files.pythonhosted.org/packages/e0/62/a2605f212a136e06f2d056ee7491ede9935ba0f1d5ceafd1f7da2a0c8625/watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1", size = 417300, upload_time = "2023-10-13T13:05:20.116Z" }, - { url = "https://files.pythonhosted.org/packages/69/0e/29f158fa22eb2cc1f188b5ec20fb5c0a64eb801e3901ad5b7ad546cbaed0/watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a", size = 1378126, upload_time = "2023-10-13T13:05:21.508Z" }, - { url = "https://files.pythonhosted.org/packages/e8/f3/c67865cb5a174201c52d34e870cc7956b8408ee83ce9a02909d6a2a93a14/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915", size = 1348275, upload_time = "2023-10-13T13:05:22.995Z" }, - { url = "https://files.pythonhosted.org/packages/d7/eb/b6f1184d1c7b9670f5bd1e184e4c221ecf25fd817cf2fcac6adc387882b5/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360", size = 1347255, upload_time = "2023-10-13T13:05:24.618Z" }, - { url = "https://files.pythonhosted.org/packages/c8/27/e534e4b3fe739f4bf8bd5dc4c26cbc5d3baa427125d8ef78a6556acd6ff4/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6", size = 1462845, upload_time = "2023-10-13T13:05:26.531Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ba/a0d1c1c55f75e7e47c8f79f2314f7ec670b5177596f6d27764aecc7048cd/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7", size = 1528957, upload_time = "2023-10-13T13:05:28.365Z" }, - { url = "https://files.pythonhosted.org/packages/1c/3a/4e38518c4dff58090c01fc8cc051fa08ac9ae00b361c855075809b0058ce/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c", size = 1345542, upload_time = "2023-10-13T13:05:29.862Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b7/783097f8137a710d5cd9ccbfcd92e4b453d38dab05cfcb5dbd2c587752e5/watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235", size = 1462238, upload_time = "2023-10-13T13:05:32.245Z" }, - { url = "https://files.pythonhosted.org/packages/6b/4c/b741eb38f2c408ae9c5a25235f6506b1dda43486ae0fdb4c462ef75bce11/watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7", size = 1462406, upload_time = "2023-10-13T13:05:34.339Z" }, - { url = "https://files.pythonhosted.org/packages/77/e4/8d2b3c67364671b0e1c0ce383895a5415f45ecb3e8586982deff4a8e85c9/watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3", size = 266789, upload_time = "2023-10-13T13:05:35.606Z" }, - { url = "https://files.pythonhosted.org/packages/da/f2/6b1de38aeb21eb9dac1ae6a1ee4521566e79690117032036c737cfab52fa/watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094", size = 280292, upload_time = "2023-10-13T13:05:37.357Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a5/7aba9435beb863c2490bae3173a45f42044ac7a48155d3dd42ab49cfae45/watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6", size = 268026, upload_time = "2023-10-13T13:05:38.591Z" }, - { url = "https://files.pythonhosted.org/packages/62/66/7463ceb43eabc6deaa795c7969ff4d4fd938de54e655035483dfd1e97c84/watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994", size = 429092, upload_time = "2023-10-13T13:06:21.419Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a3/42686af3a089f34aba35c39abac852869661938dae7025c1a0580dfe0fbf/watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f", size = 419188, upload_time = "2023-10-13T13:06:22.934Z" }, - { url = "https://files.pythonhosted.org/packages/37/17/4825999346f15d650f4c69093efa64fb040fbff4f706a20e8c4745f64070/watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c", size = 1350366, upload_time = "2023-10-13T13:06:24.254Z" }, - { url = "https://files.pythonhosted.org/packages/70/76/8d124e14cf51af4d6bba926c7473f253c6efd1539ba62577f079a2d71537/watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc", size = 1346270, upload_time = "2023-10-13T13:06:25.742Z" }, + { url = "https://files.pythonhosted.org/packages/6e/85/ea2a035b7d86bf0a29ee1c32bc2df8ad4da77e6602806e679d9735ff28cb/watchfiles-0.21.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa", size = 428182, upload-time = "2023-10-13T13:04:34.803Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e5/240e5eb3ff0ee3da3b028ac5be2019c407bdd0f3fdb02bd75fdf3bd10aff/watchfiles-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e", size = 418275, upload-time = "2023-10-13T13:04:36.632Z" }, + { url = "https://files.pythonhosted.org/packages/5b/79/ecd0dfb04443a1900cd3952d7ea6493bf655c2db9a0d3736a5d98a15da39/watchfiles-0.21.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03", size = 1379785, upload-time = "2023-10-13T13:04:38.641Z" }, + { url = "https://files.pythonhosted.org/packages/41/0e/3333b986b1889bb71f0e44b3fac0591824a679619b8b8ddd70ff8858edc4/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124", size = 1349374, upload-time = "2023-10-13T13:04:41.711Z" }, + { url = "https://files.pythonhosted.org/packages/18/c4/ad5ad16cad900a29aaa792e0ed121ff70d76f74062b051661090d88c6dfd/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab", size = 1348033, upload-time = "2023-10-13T13:04:43.324Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d2/769254ff04ba88ceb179a6e892606ac4da17338eb010e85ca7a9c3339234/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303", size = 1464393, upload-time = "2023-10-13T13:04:44.818Z" }, + { url = "https://files.pythonhosted.org/packages/14/d0/662800e778ca20e7664dd5df57751aa79ef18b6abb92224b03c8c2e852a6/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d", size = 1542953, upload-time = "2023-10-13T13:04:46.714Z" }, + { url = "https://files.pythonhosted.org/packages/f7/4b/b90dcdc3bbaf3bb2db733e1beea2d01566b601c15fcf8e71dfcc8686c097/watchfiles-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c", size = 1346961, upload-time = "2023-10-13T13:04:48.072Z" }, + { url = "https://files.pythonhosted.org/packages/92/ff/75cc1b30c5abcad13a2a72e75625ec619c7a393028a111d7d24dba578d5e/watchfiles-0.21.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9", size = 1464393, upload-time = "2023-10-13T13:04:49.638Z" }, + { url = "https://files.pythonhosted.org/packages/9a/65/12cbeb363bf220482a559c48107edfd87f09248f55e1ac315a36c2098a0f/watchfiles-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9", size = 1463409, upload-time = "2023-10-13T13:04:51.762Z" }, + { url = "https://files.pythonhosted.org/packages/f2/08/92e28867c66f0d9638bb131feca739057efc48dbcd391fd7f0a55507e470/watchfiles-0.21.0-cp310-none-win32.whl", hash = "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293", size = 268101, upload-time = "2023-10-13T13:04:53.78Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ea/80527adf1ad51488a96fc201715730af5879f4dfeccb5e2069ff82d890d4/watchfiles-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235", size = 279675, upload-time = "2023-10-13T13:04:55.113Z" }, + { url = "https://files.pythonhosted.org/packages/57/b9/2667286003dd305b81d3a3aa824d3dfc63dacbf2a96faae09e72d953c430/watchfiles-0.21.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7", size = 428210, upload-time = "2023-10-13T13:04:56.894Z" }, + { url = "https://files.pythonhosted.org/packages/a3/87/6793ac60d2e20c9c1883aec7431c2e7b501ee44a839f6da1b747c13baa23/watchfiles-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef", size = 418196, upload-time = "2023-10-13T13:04:58.19Z" }, + { url = "https://files.pythonhosted.org/packages/5d/12/e1d1d220c5b99196eea38c9a878964f30a2b55ec9d72fd713191725b35e8/watchfiles-0.21.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586", size = 1380287, upload-time = "2023-10-13T13:04:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/0e/cf/126f0a8683f326d190c3539a769e45e747a80a5fcbf797de82e738c946ae/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317", size = 1349653, upload-time = "2023-10-13T13:05:01.622Z" }, + { url = "https://files.pythonhosted.org/packages/20/6e/6cffd795ec65dbc82f15d95b73d3042c1ddaffc4dd25f6c8240bfcf0640f/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b", size = 1348844, upload-time = "2023-10-13T13:05:03.805Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2a/f9633279d8937ad84c532997405dd106fa6100e8d2b83e364f1c87561f96/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1", size = 1464343, upload-time = "2023-10-13T13:05:05.248Z" }, + { url = "https://files.pythonhosted.org/packages/d7/49/9b2199bbf3c89e7c8dd795fced9dac29f201be8a28a5df0c8ff625737df6/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d", size = 1542858, upload-time = "2023-10-13T13:05:06.791Z" }, + { url = "https://files.pythonhosted.org/packages/35/e0/e8a9c1fe30e98c5b3507ad381abc4d9ee2c3b9c0ae62ffe9c164a5838186/watchfiles-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7", size = 1347464, upload-time = "2023-10-13T13:05:08.622Z" }, + { url = "https://files.pythonhosted.org/packages/ba/66/873739dd7defdfaee4b880114de9463fae18ba13ae2ddd784806b0ee33b6/watchfiles-0.21.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0", size = 1464343, upload-time = "2023-10-13T13:05:10.584Z" }, + { url = "https://files.pythonhosted.org/packages/bd/51/d7539aa258d8f0e5d7b870af8b9b8964b4f88a1e4517eeb8a2efb838e9b3/watchfiles-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365", size = 1463338, upload-time = "2023-10-13T13:05:12.671Z" }, + { url = "https://files.pythonhosted.org/packages/ee/92/219c539a2a93b6870fa7b84eace946983126b20a7e15c6c034d8d0472682/watchfiles-0.21.0-cp311-none-win32.whl", hash = "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400", size = 267658, upload-time = "2023-10-13T13:05:13.972Z" }, + { url = "https://files.pythonhosted.org/packages/f3/dc/2a8a447b783f5059c4bf7a6bad8fe59375a5a9ce872774763b25c21c2860/watchfiles-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe", size = 280113, upload-time = "2023-10-13T13:05:15.289Z" }, + { url = "https://files.pythonhosted.org/packages/22/15/e4085181cf0210a6ec6eb29fee0c6088de867ee33d81555076a4a2726e8b/watchfiles-0.21.0-cp311-none-win_arm64.whl", hash = "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078", size = 268688, upload-time = "2023-10-13T13:05:17.144Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fd/2f009eb17809afd32a143b442856628585c9ce3a9c6d5c1841e44e35a16c/watchfiles-0.21.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a", size = 426902, upload-time = "2023-10-13T13:05:18.828Z" }, + { url = "https://files.pythonhosted.org/packages/e0/62/a2605f212a136e06f2d056ee7491ede9935ba0f1d5ceafd1f7da2a0c8625/watchfiles-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1", size = 417300, upload-time = "2023-10-13T13:05:20.116Z" }, + { url = "https://files.pythonhosted.org/packages/69/0e/29f158fa22eb2cc1f188b5ec20fb5c0a64eb801e3901ad5b7ad546cbaed0/watchfiles-0.21.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a", size = 1378126, upload-time = "2023-10-13T13:05:21.508Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f3/c67865cb5a174201c52d34e870cc7956b8408ee83ce9a02909d6a2a93a14/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915", size = 1348275, upload-time = "2023-10-13T13:05:22.995Z" }, + { url = "https://files.pythonhosted.org/packages/d7/eb/b6f1184d1c7b9670f5bd1e184e4c221ecf25fd817cf2fcac6adc387882b5/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360", size = 1347255, upload-time = "2023-10-13T13:05:24.618Z" }, + { url = "https://files.pythonhosted.org/packages/c8/27/e534e4b3fe739f4bf8bd5dc4c26cbc5d3baa427125d8ef78a6556acd6ff4/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6", size = 1462845, upload-time = "2023-10-13T13:05:26.531Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ba/a0d1c1c55f75e7e47c8f79f2314f7ec670b5177596f6d27764aecc7048cd/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7", size = 1528957, upload-time = "2023-10-13T13:05:28.365Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3a/4e38518c4dff58090c01fc8cc051fa08ac9ae00b361c855075809b0058ce/watchfiles-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c", size = 1345542, upload-time = "2023-10-13T13:05:29.862Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b7/783097f8137a710d5cd9ccbfcd92e4b453d38dab05cfcb5dbd2c587752e5/watchfiles-0.21.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235", size = 1462238, upload-time = "2023-10-13T13:05:32.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/4c/b741eb38f2c408ae9c5a25235f6506b1dda43486ae0fdb4c462ef75bce11/watchfiles-0.21.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7", size = 1462406, upload-time = "2023-10-13T13:05:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/77/e4/8d2b3c67364671b0e1c0ce383895a5415f45ecb3e8586982deff4a8e85c9/watchfiles-0.21.0-cp312-none-win32.whl", hash = "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3", size = 266789, upload-time = "2023-10-13T13:05:35.606Z" }, + { url = "https://files.pythonhosted.org/packages/da/f2/6b1de38aeb21eb9dac1ae6a1ee4521566e79690117032036c737cfab52fa/watchfiles-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094", size = 280292, upload-time = "2023-10-13T13:05:37.357Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a5/7aba9435beb863c2490bae3173a45f42044ac7a48155d3dd42ab49cfae45/watchfiles-0.21.0-cp312-none-win_arm64.whl", hash = "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6", size = 268026, upload-time = "2023-10-13T13:05:38.591Z" }, + { url = "https://files.pythonhosted.org/packages/62/66/7463ceb43eabc6deaa795c7969ff4d4fd938de54e655035483dfd1e97c84/watchfiles-0.21.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994", size = 429092, upload-time = "2023-10-13T13:06:21.419Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a3/42686af3a089f34aba35c39abac852869661938dae7025c1a0580dfe0fbf/watchfiles-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f", size = 419188, upload-time = "2023-10-13T13:06:22.934Z" }, + { url = "https://files.pythonhosted.org/packages/37/17/4825999346f15d650f4c69093efa64fb040fbff4f706a20e8c4745f64070/watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c", size = 1350366, upload-time = "2023-10-13T13:06:24.254Z" }, + { url = "https://files.pythonhosted.org/packages/70/76/8d124e14cf51af4d6bba926c7473f253c6efd1539ba62577f079a2d71537/watchfiles-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc", size = 1346270, upload-time = "2023-10-13T13:06:25.742Z" }, ] [[package]] name = "wcwidth" version = "0.2.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" }, ] [[package]] name = "websocket-client" version = "1.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648, upload_time = "2024-04-23T22:16:16.976Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648, upload-time = "2024-04-23T22:16:16.976Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826, upload_time = "2024-04-23T22:16:14.422Z" }, + { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826, upload-time = "2024-04-23T22:16:14.422Z" }, ] [[package]] name = "websockets" version = "12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2e/62/7a7874b7285413c954a4cca3c11fd851f11b2fe5b4ae2d9bee4f6d9bdb10/websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b", size = 104994, upload_time = "2023-10-21T14:21:11.88Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/62/7a7874b7285413c954a4cca3c11fd851f11b2fe5b4ae2d9bee4f6d9bdb10/websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b", size = 104994, upload-time = "2023-10-21T14:21:11.88Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/b9/360b86ded0920a93bff0db4e4b0aa31370b0208ca240b2e98d62aad8d082/websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374", size = 124025, upload_time = "2023-10-21T14:19:28.387Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d3/1eca0d8fb6f0665c96f0dc7c0d0ec8aa1a425e8c003e0c18e1451f65d177/websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be", size = 121261, upload_time = "2023-10-21T14:19:30.203Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e1/f6c3ecf7f1bfd9209e13949db027d7fdea2faf090c69b5f2d17d1d796d96/websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547", size = 121328, upload_time = "2023-10-21T14:19:31.765Z" }, - { url = "https://files.pythonhosted.org/packages/74/4d/f88eeceb23cb587c4aeca779e3f356cf54817af2368cb7f2bd41f93c8360/websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2", size = 130925, upload_time = "2023-10-21T14:19:33.36Z" }, - { url = "https://files.pythonhosted.org/packages/16/17/f63d9ee6ffd9afbeea021d5950d6e8db84cd4aead306c6c2ca523805699e/websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558", size = 129930, upload_time = "2023-10-21T14:19:35.109Z" }, - { url = "https://files.pythonhosted.org/packages/9a/12/c7a7504f5bf74d6ee0533f6fc7d30d8f4b79420ab179d1df2484b07602eb/websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480", size = 130245, upload_time = "2023-10-21T14:19:36.761Z" }, - { url = "https://files.pythonhosted.org/packages/e4/6a/3600c7771eb31116d2e77383d7345618b37bb93709d041e328c08e2a8eb3/websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c", size = 134966, upload_time = "2023-10-21T14:19:38.481Z" }, - { url = "https://files.pythonhosted.org/packages/22/26/df77c4b7538caebb78c9b97f43169ef742a4f445e032a5ea1aaef88f8f46/websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8", size = 134196, upload_time = "2023-10-21T14:19:40.264Z" }, - { url = "https://files.pythonhosted.org/packages/e5/18/18ce9a4a08203c8d0d3d561e3ea4f453daf32f099601fc831e60c8a9b0f2/websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603", size = 134822, upload_time = "2023-10-21T14:19:41.836Z" }, - { url = "https://files.pythonhosted.org/packages/45/51/1f823a341fc20a880e67ae62f6c38c4880a24a4b60fbe544a38f516f39a1/websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f", size = 124454, upload_time = "2023-10-21T14:19:43.639Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/5ec054cfcf23adfc88d39359b85e81d043af8a141e3ac8ce40f45a5ce5f4/websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf", size = 124974, upload_time = "2023-10-21T14:19:44.934Z" }, - { url = "https://files.pythonhosted.org/packages/02/73/9c1e168a2e7fdf26841dc98f5f5502e91dea47428da7690a08101f616169/websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4", size = 124047, upload_time = "2023-10-21T14:19:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/e4/2d/9a683359ad2ed11b2303a7a94800db19c61d33fa3bde271df09e99936022/websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f", size = 121282, upload_time = "2023-10-21T14:19:47.739Z" }, - { url = "https://files.pythonhosted.org/packages/95/aa/75fa3b893142d6d98a48cb461169bd268141f2da8bfca97392d6462a02eb/websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3", size = 121325, upload_time = "2023-10-21T14:19:49.4Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a4/51a25e591d645df71ee0dc3a2c880b28e5514c00ce752f98a40a87abcd1e/websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c", size = 131502, upload_time = "2023-10-21T14:19:50.683Z" }, - { url = "https://files.pythonhosted.org/packages/cd/ea/0ceeea4f5b87398fe2d9f5bcecfa00a1bcd542e2bfcac2f2e5dd612c4e9e/websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45", size = 130491, upload_time = "2023-10-21T14:19:51.835Z" }, - { url = "https://files.pythonhosted.org/packages/e3/05/f52a60b66d9faf07a4f7d71dc056bffafe36a7e98c4eb5b78f04fe6e4e85/websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04", size = 130872, upload_time = "2023-10-21T14:19:53.071Z" }, - { url = "https://files.pythonhosted.org/packages/ac/4e/c7361b2d7b964c40fea924d64881145164961fcd6c90b88b7e3ab2c4f431/websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447", size = 136318, upload_time = "2023-10-21T14:19:54.41Z" }, - { url = "https://files.pythonhosted.org/packages/0a/31/337bf35ae5faeaf364c9cddec66681cdf51dc4414ee7a20f92a18e57880f/websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca", size = 135594, upload_time = "2023-10-21T14:19:55.982Z" }, - { url = "https://files.pythonhosted.org/packages/95/aa/1ac767825c96f9d7e43c4c95683757d4ef28cf11fa47a69aca42428d3e3a/websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53", size = 136191, upload_time = "2023-10-21T14:19:57.349Z" }, - { url = "https://files.pythonhosted.org/packages/28/4b/344ec5cfeb6bc417da097f8253607c3aed11d9a305fb58346f506bf556d8/websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402", size = 124453, upload_time = "2023-10-21T14:19:59.11Z" }, - { url = "https://files.pythonhosted.org/packages/d1/40/6b169cd1957476374f51f4486a3e85003149e62a14e6b78a958c2222337a/websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b", size = 124971, upload_time = "2023-10-21T14:20:00.243Z" }, - { url = "https://files.pythonhosted.org/packages/a9/6d/23cc898647c8a614a0d9ca703695dd04322fb5135096a20c2684b7c852b6/websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df", size = 124061, upload_time = "2023-10-21T14:20:02.221Z" }, - { url = "https://files.pythonhosted.org/packages/39/34/364f30fdf1a375e4002a26ee3061138d1571dfda6421126127d379d13930/websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc", size = 121296, upload_time = "2023-10-21T14:20:03.591Z" }, - { url = "https://files.pythonhosted.org/packages/2e/00/96ae1c9dcb3bc316ef683f2febd8c97dde9f254dc36c3afc65c7645f734c/websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b", size = 121326, upload_time = "2023-10-21T14:20:04.956Z" }, - { url = "https://files.pythonhosted.org/packages/af/f1/bba1e64430685dd456c1a1fd6b0c791ae33104967b928aefeff261761e8d/websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb", size = 131807, upload_time = "2023-10-21T14:20:06.153Z" }, - { url = "https://files.pythonhosted.org/packages/62/3b/98ee269712f37d892b93852ce07b3e6d7653160ca4c0d4f8c8663f8021f8/websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92", size = 130751, upload_time = "2023-10-21T14:20:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/f1/00/d6f01ca2b191f8b0808e4132ccd2e7691f0453cbd7d0f72330eb97453c3a/websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed", size = 131176, upload_time = "2023-10-21T14:20:09.212Z" }, - { url = "https://files.pythonhosted.org/packages/af/9c/703ff3cd8109dcdee6152bae055d852ebaa7750117760ded697ab836cbcf/websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5", size = 136246, upload_time = "2023-10-21T14:20:10.423Z" }, - { url = "https://files.pythonhosted.org/packages/0b/a5/1a38fb85a456b9dc874ec984f3ff34f6550eafd17a3da28753cd3c1628e8/websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2", size = 135466, upload_time = "2023-10-21T14:20:11.826Z" }, - { url = "https://files.pythonhosted.org/packages/3c/98/1261f289dff7e65a38d59d2f591de6ed0a2580b729aebddec033c4d10881/websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113", size = 136083, upload_time = "2023-10-21T14:20:13.451Z" }, - { url = "https://files.pythonhosted.org/packages/a9/1c/f68769fba63ccb9c13fe0a25b616bd5aebeef1c7ddebc2ccc32462fb784d/websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d", size = 124460, upload_time = "2023-10-21T14:20:14.719Z" }, - { url = "https://files.pythonhosted.org/packages/20/52/8915f51f9aaef4e4361c89dd6cf69f72a0159f14e0d25026c81b6ad22525/websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f", size = 124985, upload_time = "2023-10-21T14:20:15.817Z" }, - { url = "https://files.pythonhosted.org/packages/43/8b/554a8a8bb6da9dd1ce04c44125e2192af7b7beebf6e3dbfa5d0e285cc20f/websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd", size = 121110, upload_time = "2023-10-21T14:20:48.335Z" }, - { url = "https://files.pythonhosted.org/packages/b0/8e/58b8812940d746ad74d395fb069497255cb5ef50748dfab1e8b386b1f339/websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870", size = 123216, upload_time = "2023-10-21T14:20:50.083Z" }, - { url = "https://files.pythonhosted.org/packages/81/ee/272cb67ace1786ce6d9f39d47b3c55b335e8b75dd1972a7967aad39178b6/websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077", size = 122821, upload_time = "2023-10-21T14:20:51.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/03/387fc902b397729df166763e336f4e5cec09fe7b9d60f442542c94a21be1/websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b", size = 122768, upload_time = "2023-10-21T14:20:52.59Z" }, - { url = "https://files.pythonhosted.org/packages/50/f0/5939fbc9bc1979d79a774ce5b7c4b33c0cefe99af22fb70f7462d0919640/websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30", size = 125009, upload_time = "2023-10-21T14:20:54.419Z" }, - { url = "https://files.pythonhosted.org/packages/79/4d/9cc401e7b07e80532ebc8c8e993f42541534da9e9249c59ee0139dcb0352/websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e", size = 118370, upload_time = "2023-10-21T14:21:10.075Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b9/360b86ded0920a93bff0db4e4b0aa31370b0208ca240b2e98d62aad8d082/websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374", size = 124025, upload-time = "2023-10-21T14:19:28.387Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d3/1eca0d8fb6f0665c96f0dc7c0d0ec8aa1a425e8c003e0c18e1451f65d177/websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be", size = 121261, upload-time = "2023-10-21T14:19:30.203Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/f6c3ecf7f1bfd9209e13949db027d7fdea2faf090c69b5f2d17d1d796d96/websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547", size = 121328, upload-time = "2023-10-21T14:19:31.765Z" }, + { url = "https://files.pythonhosted.org/packages/74/4d/f88eeceb23cb587c4aeca779e3f356cf54817af2368cb7f2bd41f93c8360/websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2", size = 130925, upload-time = "2023-10-21T14:19:33.36Z" }, + { url = "https://files.pythonhosted.org/packages/16/17/f63d9ee6ffd9afbeea021d5950d6e8db84cd4aead306c6c2ca523805699e/websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558", size = 129930, upload-time = "2023-10-21T14:19:35.109Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/c7a7504f5bf74d6ee0533f6fc7d30d8f4b79420ab179d1df2484b07602eb/websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480", size = 130245, upload-time = "2023-10-21T14:19:36.761Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6a/3600c7771eb31116d2e77383d7345618b37bb93709d041e328c08e2a8eb3/websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c", size = 134966, upload-time = "2023-10-21T14:19:38.481Z" }, + { url = "https://files.pythonhosted.org/packages/22/26/df77c4b7538caebb78c9b97f43169ef742a4f445e032a5ea1aaef88f8f46/websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8", size = 134196, upload-time = "2023-10-21T14:19:40.264Z" }, + { url = "https://files.pythonhosted.org/packages/e5/18/18ce9a4a08203c8d0d3d561e3ea4f453daf32f099601fc831e60c8a9b0f2/websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603", size = 134822, upload-time = "2023-10-21T14:19:41.836Z" }, + { url = "https://files.pythonhosted.org/packages/45/51/1f823a341fc20a880e67ae62f6c38c4880a24a4b60fbe544a38f516f39a1/websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f", size = 124454, upload-time = "2023-10-21T14:19:43.639Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/5ec054cfcf23adfc88d39359b85e81d043af8a141e3ac8ce40f45a5ce5f4/websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf", size = 124974, upload-time = "2023-10-21T14:19:44.934Z" }, + { url = "https://files.pythonhosted.org/packages/02/73/9c1e168a2e7fdf26841dc98f5f5502e91dea47428da7690a08101f616169/websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4", size = 124047, upload-time = "2023-10-21T14:19:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/e4/2d/9a683359ad2ed11b2303a7a94800db19c61d33fa3bde271df09e99936022/websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f", size = 121282, upload-time = "2023-10-21T14:19:47.739Z" }, + { url = "https://files.pythonhosted.org/packages/95/aa/75fa3b893142d6d98a48cb461169bd268141f2da8bfca97392d6462a02eb/websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3", size = 121325, upload-time = "2023-10-21T14:19:49.4Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/51a25e591d645df71ee0dc3a2c880b28e5514c00ce752f98a40a87abcd1e/websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c", size = 131502, upload-time = "2023-10-21T14:19:50.683Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ea/0ceeea4f5b87398fe2d9f5bcecfa00a1bcd542e2bfcac2f2e5dd612c4e9e/websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45", size = 130491, upload-time = "2023-10-21T14:19:51.835Z" }, + { url = "https://files.pythonhosted.org/packages/e3/05/f52a60b66d9faf07a4f7d71dc056bffafe36a7e98c4eb5b78f04fe6e4e85/websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04", size = 130872, upload-time = "2023-10-21T14:19:53.071Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4e/c7361b2d7b964c40fea924d64881145164961fcd6c90b88b7e3ab2c4f431/websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447", size = 136318, upload-time = "2023-10-21T14:19:54.41Z" }, + { url = "https://files.pythonhosted.org/packages/0a/31/337bf35ae5faeaf364c9cddec66681cdf51dc4414ee7a20f92a18e57880f/websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca", size = 135594, upload-time = "2023-10-21T14:19:55.982Z" }, + { url = "https://files.pythonhosted.org/packages/95/aa/1ac767825c96f9d7e43c4c95683757d4ef28cf11fa47a69aca42428d3e3a/websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53", size = 136191, upload-time = "2023-10-21T14:19:57.349Z" }, + { url = "https://files.pythonhosted.org/packages/28/4b/344ec5cfeb6bc417da097f8253607c3aed11d9a305fb58346f506bf556d8/websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402", size = 124453, upload-time = "2023-10-21T14:19:59.11Z" }, + { url = "https://files.pythonhosted.org/packages/d1/40/6b169cd1957476374f51f4486a3e85003149e62a14e6b78a958c2222337a/websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b", size = 124971, upload-time = "2023-10-21T14:20:00.243Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6d/23cc898647c8a614a0d9ca703695dd04322fb5135096a20c2684b7c852b6/websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df", size = 124061, upload-time = "2023-10-21T14:20:02.221Z" }, + { url = "https://files.pythonhosted.org/packages/39/34/364f30fdf1a375e4002a26ee3061138d1571dfda6421126127d379d13930/websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc", size = 121296, upload-time = "2023-10-21T14:20:03.591Z" }, + { url = "https://files.pythonhosted.org/packages/2e/00/96ae1c9dcb3bc316ef683f2febd8c97dde9f254dc36c3afc65c7645f734c/websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b", size = 121326, upload-time = "2023-10-21T14:20:04.956Z" }, + { url = "https://files.pythonhosted.org/packages/af/f1/bba1e64430685dd456c1a1fd6b0c791ae33104967b928aefeff261761e8d/websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb", size = 131807, upload-time = "2023-10-21T14:20:06.153Z" }, + { url = "https://files.pythonhosted.org/packages/62/3b/98ee269712f37d892b93852ce07b3e6d7653160ca4c0d4f8c8663f8021f8/websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92", size = 130751, upload-time = "2023-10-21T14:20:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/f1/00/d6f01ca2b191f8b0808e4132ccd2e7691f0453cbd7d0f72330eb97453c3a/websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed", size = 131176, upload-time = "2023-10-21T14:20:09.212Z" }, + { url = "https://files.pythonhosted.org/packages/af/9c/703ff3cd8109dcdee6152bae055d852ebaa7750117760ded697ab836cbcf/websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5", size = 136246, upload-time = "2023-10-21T14:20:10.423Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a5/1a38fb85a456b9dc874ec984f3ff34f6550eafd17a3da28753cd3c1628e8/websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2", size = 135466, upload-time = "2023-10-21T14:20:11.826Z" }, + { url = "https://files.pythonhosted.org/packages/3c/98/1261f289dff7e65a38d59d2f591de6ed0a2580b729aebddec033c4d10881/websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113", size = 136083, upload-time = "2023-10-21T14:20:13.451Z" }, + { url = "https://files.pythonhosted.org/packages/a9/1c/f68769fba63ccb9c13fe0a25b616bd5aebeef1c7ddebc2ccc32462fb784d/websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d", size = 124460, upload-time = "2023-10-21T14:20:14.719Z" }, + { url = "https://files.pythonhosted.org/packages/20/52/8915f51f9aaef4e4361c89dd6cf69f72a0159f14e0d25026c81b6ad22525/websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f", size = 124985, upload-time = "2023-10-21T14:20:15.817Z" }, + { url = "https://files.pythonhosted.org/packages/43/8b/554a8a8bb6da9dd1ce04c44125e2192af7b7beebf6e3dbfa5d0e285cc20f/websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd", size = 121110, upload-time = "2023-10-21T14:20:48.335Z" }, + { url = "https://files.pythonhosted.org/packages/b0/8e/58b8812940d746ad74d395fb069497255cb5ef50748dfab1e8b386b1f339/websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870", size = 123216, upload-time = "2023-10-21T14:20:50.083Z" }, + { url = "https://files.pythonhosted.org/packages/81/ee/272cb67ace1786ce6d9f39d47b3c55b335e8b75dd1972a7967aad39178b6/websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077", size = 122821, upload-time = "2023-10-21T14:20:51.237Z" }, + { url = "https://files.pythonhosted.org/packages/a8/03/387fc902b397729df166763e336f4e5cec09fe7b9d60f442542c94a21be1/websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b", size = 122768, upload-time = "2023-10-21T14:20:52.59Z" }, + { url = "https://files.pythonhosted.org/packages/50/f0/5939fbc9bc1979d79a774ce5b7c4b33c0cefe99af22fb70f7462d0919640/websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30", size = 125009, upload-time = "2023-10-21T14:20:54.419Z" }, + { url = "https://files.pythonhosted.org/packages/79/4d/9cc401e7b07e80532ebc8c8e993f42541534da9e9249c59ee0139dcb0352/websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e", size = 118370, upload-time = "2023-10-21T14:21:10.075Z" }, ] [[package]] @@ -2784,9 +2788,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/51/2e0fc149e7a810d300422ab543f87f2bcf64d985eb6f1228c4efd6e4f8d4/werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", size = 803342, upload_time = "2024-05-05T23:10:31.999Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/51/2e0fc149e7a810d300422ab543f87f2bcf64d985eb6f1228c4efd6e4f8d4/werkzeug-3.0.3.tar.gz", hash = "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", size = 803342, upload-time = "2024-05-05T23:10:31.999Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/6e/e792999e816d19d7fcbfa94c730936750036d65656a76a5a688b57a656c4/werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8", size = 227274, upload_time = "2024-05-05T23:10:29.567Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6e/e792999e816d19d7fcbfa94c730936750036d65656a76a5a688b57a656c4/werkzeug-3.0.3-py3-none-any.whl", hash = "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8", size = 227274, upload-time = "2024-05-05T23:10:29.567Z" }, ] [[package]] @@ -2796,9 +2800,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425, upload_time = "2022-08-23T19:58:21.447Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425, upload-time = "2022-08-23T19:58:21.447Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226, upload_time = "2022-08-23T19:58:19.96Z" }, + { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226, upload-time = "2022-08-23T19:58:19.96Z" }, ] [[package]] @@ -2808,9 +2812,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/c2/427f1867bb96555d1d34342f1dd97f8c420966ab564d58d18469a1db8736/zope.event-5.0.tar.gz", hash = "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd", size = 17350, upload_time = "2023-06-23T06:28:35.709Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/c2/427f1867bb96555d1d34342f1dd97f8c420966ab564d58d18469a1db8736/zope.event-5.0.tar.gz", hash = "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd", size = 17350, upload-time = "2023-06-23T06:28:35.709Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/42/f8dbc2b9ad59e927940325a22d6d3931d630c3644dae7e2369ef5d9ba230/zope.event-5.0-py3-none-any.whl", hash = "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", size = 6824, upload_time = "2023-06-23T06:28:32.652Z" }, + { url = "https://files.pythonhosted.org/packages/fe/42/f8dbc2b9ad59e927940325a22d6d3931d630c3644dae7e2369ef5d9ba230/zope.event-5.0-py3-none-any.whl", hash = "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", size = 6824, upload-time = "2023-06-23T06:28:32.652Z" }, ] [[package]] @@ -2820,24 +2824,24 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/03/6b85c1df2dca1b9acca38b423d1e226d8ffdf30ebd78bcb398c511de8b54/zope.interface-6.1.tar.gz", hash = "sha256:2fdc7ccbd6eb6b7df5353012fbed6c3c5d04ceaca0038f75e601060e95345309", size = 293914, upload_time = "2023-10-05T11:24:38.943Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/03/6b85c1df2dca1b9acca38b423d1e226d8ffdf30ebd78bcb398c511de8b54/zope.interface-6.1.tar.gz", hash = "sha256:2fdc7ccbd6eb6b7df5353012fbed6c3c5d04ceaca0038f75e601060e95345309", size = 293914, upload-time = "2023-10-05T11:24:38.943Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/ec/c1e7ce928dc10bfe02c6da7e964342d941aaf168f96f8084636167ea50d2/zope.interface-6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43b576c34ef0c1f5a4981163b551a8781896f2a37f71b8655fd20b5af0386abb", size = 202417, upload_time = "2023-10-05T11:24:25.141Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0b/12f269ad049fc40a7a3ab85445d7855b6bc6f1e774c5ca9dd6f5c32becb3/zope.interface-6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67be3ca75012c6e9b109860820a8b6c9a84bfb036fbd1076246b98e56951ca92", size = 202528, upload_time = "2023-10-05T11:24:27.336Z" }, - { url = "https://files.pythonhosted.org/packages/7f/85/3a35144509eb4a5a2208b48ae8d116a969d67de62cc6513d85602144d9cd/zope.interface-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b9bc671626281f6045ad61d93a60f52fd5e8209b1610972cf0ef1bbe6d808e3", size = 247532, upload_time = "2023-10-05T11:49:20.587Z" }, - { url = "https://files.pythonhosted.org/packages/50/d6/6176aaa1f6588378f5a5a4a9c6ad50a36824e902b2f844ca8de7f1b0c4a7/zope.interface-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe81def9cf3e46f16ce01d9bfd8bea595e06505e51b7baf45115c77352675fd", size = 241703, upload_time = "2023-10-05T11:25:33.542Z" }, - { url = "https://files.pythonhosted.org/packages/4f/20/94d4f221989b4bbdd09004b2afb329958e776b7015b7ea8bc915327e195a/zope.interface-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dc998f6de015723196a904045e5a2217f3590b62ea31990672e31fbc5370b41", size = 247078, upload_time = "2023-10-05T11:25:48.235Z" }, - { url = "https://files.pythonhosted.org/packages/97/7e/b790b4ab9605010816a91df26a715f163e228d60eb36c947c3118fb65190/zope.interface-6.1-cp310-cp310-win_amd64.whl", hash = "sha256:239a4a08525c080ff833560171d23b249f7f4d17fcbf9316ef4159f44997616f", size = 204155, upload_time = "2023-10-05T11:37:56.715Z" }, - { url = "https://files.pythonhosted.org/packages/4a/0b/1d8817b8a3631384a26ff7faa4c1f3e6726f7e4950c3442721cfef2c95eb/zope.interface-6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ffdaa5290422ac0f1688cb8adb1b94ca56cee3ad11f29f2ae301df8aecba7d1", size = 202441, upload_time = "2023-10-05T11:24:20.414Z" }, - { url = "https://files.pythonhosted.org/packages/3e/1f/43557bb2b6e8537002a5a26af9b899171e26ddfcdf17a00ff729b00c036b/zope.interface-6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34c15ca9248f2e095ef2e93af2d633358c5f048c49fbfddf5fdfc47d5e263736", size = 202530, upload_time = "2023-10-05T11:24:22.975Z" }, - { url = "https://files.pythonhosted.org/packages/37/a1/5d2b265f4b7371630cad5873d0873965e35ca3de993d11b9336c720f7259/zope.interface-6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b012d023b4fb59183909b45d7f97fb493ef7a46d2838a5e716e3155081894605", size = 249584, upload_time = "2023-10-05T11:49:22.978Z" }, - { url = "https://files.pythonhosted.org/packages/8b/6d/547bfa7465e5b296adba0aff5c7ace1150f2a9e429fbf6c33d6618275162/zope.interface-6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97806e9ca3651588c1baaebb8d0c5ee3db95430b612db354c199b57378312ee8", size = 243737, upload_time = "2023-10-05T11:25:35.439Z" }, - { url = "https://files.pythonhosted.org/packages/db/5f/46946b588c43eb28efe0e46f4cf455b1ed8b2d1ea62a21b0001c6610662f/zope.interface-6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddbab55a2473f1d3b8833ec6b7ac31e8211b0aa608df5ab09ce07f3727326de", size = 249104, upload_time = "2023-10-05T11:25:51.355Z" }, - { url = "https://files.pythonhosted.org/packages/6c/9c/9d3c0e7e5362ea59da3c42b3b2b9fc073db433a0fe3bc6cae0809ccec395/zope.interface-6.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0da79117952a9a41253696ed3e8b560a425197d4e41634a23b1507efe3273f1", size = 204155, upload_time = "2023-10-05T11:39:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/3c/91/68a0bbc97c2554f87d39572091954e94d043bcd83897cd6a779ca85cb5cc/zope.interface-6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8bb9c990ca9027b4214fa543fd4025818dc95f8b7abce79d61dc8a2112b561a", size = 202757, upload_time = "2023-10-05T11:25:05.865Z" }, - { url = "https://files.pythonhosted.org/packages/e1/84/850092a8ab7e87a3ea615daf3f822f7196c52592e3e92f264621b4cfe5a2/zope.interface-6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b51b64432eed4c0744241e9ce5c70dcfecac866dff720e746d0a9c82f371dfa7", size = 202654, upload_time = "2023-10-05T11:25:08.347Z" }, - { url = "https://files.pythonhosted.org/packages/57/23/508f7f79619ae4e025f5b264a9283efc3c805ed4c0ad75cb28c091179ced/zope.interface-6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa6fd016e9644406d0a61313e50348c706e911dca29736a3266fc9e28ec4ca6d", size = 254400, upload_time = "2023-10-05T11:49:25.326Z" }, - { url = "https://files.pythonhosted.org/packages/7c/0d/db0ccf0d12767015f23b302aebe98d5eca218aaadc70c2e3908b85fecd2a/zope.interface-6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c8cf55261e15590065039696607f6c9c1aeda700ceee40c70478552d323b3ff", size = 248853, upload_time = "2023-10-05T11:25:37.37Z" }, - { url = "https://files.pythonhosted.org/packages/fd/4f/8e80173ebcdefe0ff4164444c22b171cf8bd72533026befc2adf079f3ac8/zope.interface-6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e30506bcb03de8983f78884807e4fd95d8db6e65b69257eea05d13d519b83ac0", size = 255127, upload_time = "2023-10-05T11:25:53.819Z" }, - { url = "https://files.pythonhosted.org/packages/0f/d5/81f9789311d9773a02ed048af7452fc6cedce059748dba956c1dc040340a/zope.interface-6.1-cp312-cp312-win_amd64.whl", hash = "sha256:e33e86fd65f369f10608b08729c8f1c92ec7e0e485964670b4d2633a4812d36b", size = 204268, upload_time = "2023-10-05T11:41:22.778Z" }, + { url = "https://files.pythonhosted.org/packages/3c/ec/c1e7ce928dc10bfe02c6da7e964342d941aaf168f96f8084636167ea50d2/zope.interface-6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:43b576c34ef0c1f5a4981163b551a8781896f2a37f71b8655fd20b5af0386abb", size = 202417, upload-time = "2023-10-05T11:24:25.141Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0b/12f269ad049fc40a7a3ab85445d7855b6bc6f1e774c5ca9dd6f5c32becb3/zope.interface-6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:67be3ca75012c6e9b109860820a8b6c9a84bfb036fbd1076246b98e56951ca92", size = 202528, upload-time = "2023-10-05T11:24:27.336Z" }, + { url = "https://files.pythonhosted.org/packages/7f/85/3a35144509eb4a5a2208b48ae8d116a969d67de62cc6513d85602144d9cd/zope.interface-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b9bc671626281f6045ad61d93a60f52fd5e8209b1610972cf0ef1bbe6d808e3", size = 247532, upload-time = "2023-10-05T11:49:20.587Z" }, + { url = "https://files.pythonhosted.org/packages/50/d6/6176aaa1f6588378f5a5a4a9c6ad50a36824e902b2f844ca8de7f1b0c4a7/zope.interface-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe81def9cf3e46f16ce01d9bfd8bea595e06505e51b7baf45115c77352675fd", size = 241703, upload-time = "2023-10-05T11:25:33.542Z" }, + { url = "https://files.pythonhosted.org/packages/4f/20/94d4f221989b4bbdd09004b2afb329958e776b7015b7ea8bc915327e195a/zope.interface-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dc998f6de015723196a904045e5a2217f3590b62ea31990672e31fbc5370b41", size = 247078, upload-time = "2023-10-05T11:25:48.235Z" }, + { url = "https://files.pythonhosted.org/packages/97/7e/b790b4ab9605010816a91df26a715f163e228d60eb36c947c3118fb65190/zope.interface-6.1-cp310-cp310-win_amd64.whl", hash = "sha256:239a4a08525c080ff833560171d23b249f7f4d17fcbf9316ef4159f44997616f", size = 204155, upload-time = "2023-10-05T11:37:56.715Z" }, + { url = "https://files.pythonhosted.org/packages/4a/0b/1d8817b8a3631384a26ff7faa4c1f3e6726f7e4950c3442721cfef2c95eb/zope.interface-6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ffdaa5290422ac0f1688cb8adb1b94ca56cee3ad11f29f2ae301df8aecba7d1", size = 202441, upload-time = "2023-10-05T11:24:20.414Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1f/43557bb2b6e8537002a5a26af9b899171e26ddfcdf17a00ff729b00c036b/zope.interface-6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34c15ca9248f2e095ef2e93af2d633358c5f048c49fbfddf5fdfc47d5e263736", size = 202530, upload-time = "2023-10-05T11:24:22.975Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/5d2b265f4b7371630cad5873d0873965e35ca3de993d11b9336c720f7259/zope.interface-6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b012d023b4fb59183909b45d7f97fb493ef7a46d2838a5e716e3155081894605", size = 249584, upload-time = "2023-10-05T11:49:22.978Z" }, + { url = "https://files.pythonhosted.org/packages/8b/6d/547bfa7465e5b296adba0aff5c7ace1150f2a9e429fbf6c33d6618275162/zope.interface-6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97806e9ca3651588c1baaebb8d0c5ee3db95430b612db354c199b57378312ee8", size = 243737, upload-time = "2023-10-05T11:25:35.439Z" }, + { url = "https://files.pythonhosted.org/packages/db/5f/46946b588c43eb28efe0e46f4cf455b1ed8b2d1ea62a21b0001c6610662f/zope.interface-6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddbab55a2473f1d3b8833ec6b7ac31e8211b0aa608df5ab09ce07f3727326de", size = 249104, upload-time = "2023-10-05T11:25:51.355Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9c/9d3c0e7e5362ea59da3c42b3b2b9fc073db433a0fe3bc6cae0809ccec395/zope.interface-6.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0da79117952a9a41253696ed3e8b560a425197d4e41634a23b1507efe3273f1", size = 204155, upload-time = "2023-10-05T11:39:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/3c/91/68a0bbc97c2554f87d39572091954e94d043bcd83897cd6a779ca85cb5cc/zope.interface-6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8bb9c990ca9027b4214fa543fd4025818dc95f8b7abce79d61dc8a2112b561a", size = 202757, upload-time = "2023-10-05T11:25:05.865Z" }, + { url = "https://files.pythonhosted.org/packages/e1/84/850092a8ab7e87a3ea615daf3f822f7196c52592e3e92f264621b4cfe5a2/zope.interface-6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b51b64432eed4c0744241e9ce5c70dcfecac866dff720e746d0a9c82f371dfa7", size = 202654, upload-time = "2023-10-05T11:25:08.347Z" }, + { url = "https://files.pythonhosted.org/packages/57/23/508f7f79619ae4e025f5b264a9283efc3c805ed4c0ad75cb28c091179ced/zope.interface-6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa6fd016e9644406d0a61313e50348c706e911dca29736a3266fc9e28ec4ca6d", size = 254400, upload-time = "2023-10-05T11:49:25.326Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0d/db0ccf0d12767015f23b302aebe98d5eca218aaadc70c2e3908b85fecd2a/zope.interface-6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c8cf55261e15590065039696607f6c9c1aeda700ceee40c70478552d323b3ff", size = 248853, upload-time = "2023-10-05T11:25:37.37Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4f/8e80173ebcdefe0ff4164444c22b171cf8bd72533026befc2adf079f3ac8/zope.interface-6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e30506bcb03de8983f78884807e4fd95d8db6e65b69257eea05d13d519b83ac0", size = 255127, upload-time = "2023-10-05T11:25:53.819Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d5/81f9789311d9773a02ed048af7452fc6cedce059748dba956c1dc040340a/zope.interface-6.1-cp312-cp312-win_amd64.whl", hash = "sha256:e33e86fd65f369f10608b08729c8f1c92ec7e0e485964670b4d2633a4812d36b", size = 204268, upload-time = "2023-10-05T11:41:22.778Z" }, ] diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/HttpSSLOptionsPlugin.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/HttpSSLOptionsPlugin.kt new file mode 100644 index 0000000000..44d2aee2ce --- /dev/null +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/HttpSSLOptionsPlugin.kt @@ -0,0 +1,146 @@ +package app.alextran.immich + +import android.annotation.SuppressLint +import android.content.Context +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import java.io.ByteArrayInputStream +import java.net.InetSocketAddress +import java.net.Socket +import java.security.KeyStore +import java.security.cert.X509Certificate +import javax.net.ssl.HostnameVerifier +import javax.net.ssl.HttpsURLConnection +import javax.net.ssl.KeyManager +import javax.net.ssl.KeyManagerFactory +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLEngine +import javax.net.ssl.SSLSession +import javax.net.ssl.TrustManager +import javax.net.ssl.TrustManagerFactory +import javax.net.ssl.X509ExtendedTrustManager + +/** + * Android plugin for Dart `HttpSSLOptions` + */ +class HttpSSLOptionsPlugin : FlutterPlugin, MethodChannel.MethodCallHandler { + private var methodChannel: MethodChannel? = null + + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + onAttachedToEngine(binding.applicationContext, binding.binaryMessenger) + } + + private fun onAttachedToEngine(ctx: Context, messenger: BinaryMessenger) { + methodChannel = MethodChannel(messenger, "immich/httpSSLOptions") + methodChannel?.setMethodCallHandler(this) + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + onDetachedFromEngine() + } + + private fun onDetachedFromEngine() { + methodChannel?.setMethodCallHandler(null) + methodChannel = null + } + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + try { + when (call.method) { + "apply" -> { + val args = call.arguments>()!! + + var tm: Array? = null + if (args[0] as Boolean) { + tm = arrayOf(AllowSelfSignedTrustManager(args[1] as? String)) + } + + var km: Array? = null + if (args[2] != null) { + val cert = ByteArrayInputStream(args[2] as ByteArray) + val password = (args[3] as String).toCharArray() + val keyStore = KeyStore.getInstance("PKCS12") + keyStore.load(cert, password) + val keyManagerFactory = + KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()) + keyManagerFactory.init(keyStore, null) + km = keyManagerFactory.keyManagers + } + + val sslContext = SSLContext.getInstance("TLS") + sslContext.init(km, tm, null) + HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.socketFactory) + + HttpsURLConnection.setDefaultHostnameVerifier(AllowSelfSignedHostnameVerifier(args[1] as? String)) + + result.success(true) + } + + else -> result.notImplemented() + } + } catch (e: Throwable) { + result.error("error", e.message, null) + } + } + + @SuppressLint("CustomX509TrustManager") + class AllowSelfSignedTrustManager(private val serverHost: String?) : X509ExtendedTrustManager() { + private val defaultTrustManager: X509ExtendedTrustManager = getDefaultTrustManager() + + override fun checkClientTrusted(chain: Array?, authType: String?) = + defaultTrustManager.checkClientTrusted(chain, authType) + + override fun checkClientTrusted( + chain: Array?, authType: String?, socket: Socket? + ) = defaultTrustManager.checkClientTrusted(chain, authType, socket) + + override fun checkClientTrusted( + chain: Array?, authType: String?, engine: SSLEngine? + ) = defaultTrustManager.checkClientTrusted(chain, authType, engine) + + override fun checkServerTrusted(chain: Array?, authType: String?) { + if (serverHost == null) return + defaultTrustManager.checkServerTrusted(chain, authType) + } + + override fun checkServerTrusted( + chain: Array?, authType: String?, socket: Socket? + ) { + if (serverHost == null) return + val socketAddress = socket?.remoteSocketAddress + if (socketAddress is InetSocketAddress && socketAddress.hostName == serverHost) return + defaultTrustManager.checkServerTrusted(chain, authType, socket) + } + + override fun checkServerTrusted( + chain: Array?, authType: String?, engine: SSLEngine? + ) { + if (serverHost == null || engine?.peerHost == serverHost) return + defaultTrustManager.checkServerTrusted(chain, authType, engine) + } + + override fun getAcceptedIssuers(): Array = defaultTrustManager.acceptedIssuers + + private fun getDefaultTrustManager(): X509ExtendedTrustManager { + val factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) + factory.init(null as KeyStore?) + return factory.trustManagers.filterIsInstance().first() + } + } + + class AllowSelfSignedHostnameVerifier(private val serverHost: String?) : HostnameVerifier { + companion object { + private val _defaultHostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier() + } + + override fun verify(hostname: String?, session: SSLSession?): Boolean { + if (serverHost == null || hostname == serverHost) { + return true + } else { + return _defaultHostnameVerifier.verify(hostname, session) + } + } + } +} diff --git a/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt b/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt index 2b6bf81148..752ded59ce 100644 --- a/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt +++ b/mobile/android/app/src/main/kotlin/app/alextran/immich/MainActivity.kt @@ -8,6 +8,7 @@ class MainActivity : FlutterActivity() { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) flutterEngine.plugins.add(BackgroundServicePlugin()) + flutterEngine.plugins.add(HttpSSLOptionsPlugin()) // No need to set up method channel here as it's now handled in the plugin } } diff --git a/mobile/lib/constants/locales.dart b/mobile/lib/constants/locales.dart index 836d3cf06f..45c09293f9 100644 --- a/mobile/lib/constants/locales.dart +++ b/mobile/lib/constants/locales.dart @@ -6,8 +6,8 @@ const Map locales = { // Additional locales 'Arabic (ar)': Locale('ar'), 'Catalan (ca)': Locale('ca'), - 'Chinese Simplified (zh_CN)': Locale('zh', 'SIMPLIFIED'), - 'Chinese Traditional (zh_TW)': Locale('zh', 'Hant'), + 'Chinese Simplified (zh_CN)': Locale('zh', 'CN'), + 'Chinese Traditional (zh_TW)': Locale('zh', 'TW'), 'Czech (cs)': Locale('cs'), 'Danish (da)': Locale('da'), 'Dutch (nl)': Locale('nl'), @@ -31,8 +31,10 @@ const Map locales = { 'Portuguese (pt)': Locale('pt'), 'Romanian (ro)': Locale('ro'), 'Russian (ru)': Locale('ru'), - 'Serbian Cyrillic (sr_Cyrl)': Locale('sr', 'Cyrl'), - 'Serbian Latin (sr_Latn)': Locale('sr', 'Latn'), + 'Serbian Cyrillic (sr_Cyrl)': + Locale.fromSubtags(languageCode: 'sr', scriptCode: 'Cyrl'), + 'Serbian Latin (sr_Latn)': + Locale.fromSubtags(languageCode: 'sr', scriptCode: 'Latn'), 'Slovak (sk)': Locale('sk'), 'Slovenian (sl)': Locale('sl'), 'Spanish (es)': Locale('es'), diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index 73af81d69d..c39d5e3a66 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -27,7 +27,7 @@ import 'package:immich_mobile/theme/theme_data.dart'; import 'package:immich_mobile/utils/bootstrap.dart'; import 'package:immich_mobile/utils/cache/widgets_binding.dart'; import 'package:immich_mobile/utils/download.dart'; -import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; +import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/utils/migration.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:logging/logging.dart'; @@ -42,7 +42,7 @@ void main() async { // Warm-up isolate pool for worker manager await workerManager.init(dynamicSpawning: true); await migrateDatabaseIfNeeded(db); - HttpOverrides.global = HttpSSLCertOverride(); + HttpSSLOptions.apply(); runApp( ProviderScope( diff --git a/mobile/lib/pages/album/album_asset_selection.page.dart b/mobile/lib/pages/album/album_asset_selection.page.dart index 617fbfee11..7b0ce8cdc4 100644 --- a/mobile/lib/pages/album/album_asset_selection.page.dart +++ b/mobile/lib/pages/album/album_asset_selection.page.dart @@ -3,13 +3,13 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/asyncvalue_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/models/albums/asset_selection_page_result.model.dart'; import 'package:immich_mobile/providers/timeline.provider.dart'; import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart'; import 'package:immich_mobile/widgets/asset_grid/immich_asset_grid.dart'; -import 'package:immich_mobile/entities/asset.entity.dart'; @RoutePage() class AlbumAssetSelectionPage extends HookConsumerWidget { @@ -59,7 +59,7 @@ class AlbumAssetSelectionPage extends HookConsumerWidget { : const Text( 'share_assets_selected', style: TextStyle(fontSize: 18), - ).tr(args: [selected.value.length.toString()]), + ).tr(namedArgs: {'count': selected.value.length.toString()}), centerTitle: false, actions: [ if (selected.value.isNotEmpty || canDeselect) diff --git a/mobile/lib/pages/albums/albums.page.dart b/mobile/lib/pages/albums/albums.page.dart index 1269fe0a8e..f09cd5a408 100644 --- a/mobile/lib/pages/albums/albums.page.dart +++ b/mobile/lib/pages/albums/albums.page.dart @@ -229,11 +229,13 @@ class AlbumsPage extends HookConsumerWidget { ), subtitle: sorted[index].ownerId != null ? Text( - '${(sorted[index].assetCount == 1 ? 'album_thumbnail_card_item'.tr( - args: ['${sorted[index].assetCount}'], - ) : 'album_thumbnail_card_items'.tr( - args: ['${sorted[index].assetCount}'], - ))} â€ĸ ${sorted[index].ownerId != userId ? 'album_thumbnail_shared_by'.tr(args: [sorted[index].ownerName!]) : 'owned'.tr()}', + '${(sorted[index].assetCount == 1 ? 'album_thumbnail_card_item'.tr() : 'album_thumbnail_card_items'.tr( + namedArgs: { + 'count': sorted[index] + .assetCount + .toString(), + }, + ))} â€ĸ ${sorted[index].ownerId != userId ? 'album_thumbnail_shared_by'.tr(namedArgs: {'user': sorted[index].ownerName!}) : 'owned'.tr()}', overflow: TextOverflow.ellipsis, style: context.textTheme.bodyMedium?.copyWith( diff --git a/mobile/lib/pages/backup/backup_album_selection.page.dart b/mobile/lib/pages/backup/backup_album_selection.page.dart index 671a9bfe16..c4124efb52 100644 --- a/mobile/lib/pages/backup/backup_album_selection.page.dart +++ b/mobile/lib/pages/backup/backup_album_selection.page.dart @@ -214,13 +214,13 @@ class BackupAlbumSelectionPage extends HookConsumerWidget { ListTile( title: Text( "backup_album_selection_page_albums_device".tr( - args: [ - ref + namedArgs: { + 'count': ref .watch(backupProvider) .availableAlbums .length .toString(), - ], + }, ), style: context.textTheme.titleSmall, ), diff --git a/mobile/lib/pages/editing/edit.page.dart b/mobile/lib/pages/editing/edit.page.dart index bfa60eae00..39524df024 100644 --- a/mobile/lib/pages/editing/edit.page.dart +++ b/mobile/lib/pages/editing/edit.page.dart @@ -1,18 +1,18 @@ -import 'dart:typed_data'; import 'dart:async'; +import 'dart:typed_data'; import 'dart:ui'; +import 'package:auto_route/auto_route.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:fluttertoast/fluttertoast.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/repositories/file_media.repository.dart'; -import 'package:immich_mobile/widgets/common/immich_toast.dart'; -import 'package:auto_route/auto_route.dart'; -import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/providers/album/album.provider.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:immich_mobile/repositories/file_media.repository.dart'; +import 'package:immich_mobile/routing/router.dart'; +import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:path/path.dart' as p; /// A stateless widget that provides functionality for editing an image. @@ -81,7 +81,7 @@ class EditImagePage extends ConsumerWidget { ImmichToast.show( durationInSecond: 6, context: context, - msg: "error_saving_image".tr(args: [e.toString()]), + msg: "error_saving_image".tr(namedArgs: {'error': e.toString()}), gravity: ToastGravity.CENTER, ); } diff --git a/mobile/lib/pages/library/archive.page.dart b/mobile/lib/pages/library/archive.page.dart index a13adc21f2..2b4aa64f3b 100644 --- a/mobile/lib/pages/library/archive.page.dart +++ b/mobile/lib/pages/library/archive.page.dart @@ -24,7 +24,7 @@ class ArchivePage extends HookConsumerWidget { automaticallyImplyLeading: false, title: const Text( 'archive_page_title', - ).tr(args: [count]), + ).tr(namedArgs: {'count': count}), ); } diff --git a/mobile/lib/pages/library/partner/partner.page.dart b/mobile/lib/pages/library/partner/partner.page.dart index 90a6a7f04e..91b661e7ce 100644 --- a/mobile/lib/pages/library/partner/partner.page.dart +++ b/mobile/lib/pages/library/partner/partner.page.dart @@ -73,7 +73,8 @@ class PartnerPage extends HookConsumerWidget { builder: (BuildContext context) { return ConfirmDialog( title: "stop_photo_sharing", - content: "partner_page_stop_sharing_content".tr(args: [u.name]), + content: "partner_page_stop_sharing_content" + .tr(namedArgs: {'partner': u.name}), onOk: () => ref.read(partnerServiceProvider).removePartner(u), ); }, diff --git a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart index e4bf1ebe9b..6c18841089 100644 --- a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart +++ b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart @@ -7,11 +7,11 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/models/shared_link/shared_link.model.dart'; +import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/shared_link.provider.dart'; import 'package:immich_mobile/services/shared_link.service.dart'; -import 'package:immich_mobile/providers/server_info.provider.dart'; -import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/utils/url_helper.dart'; +import 'package:immich_mobile/widgets/common/immich_toast.dart'; @RoutePage() class SharedLinkEditPage extends HookConsumerWidget { @@ -241,8 +241,8 @@ class SharedLinkEditPage extends HookConsumerWidget { ), DropdownMenuEntry( value: 30, - label: - "shared_link_edit_expire_after_option_minutes".tr(args: ["30"]), + label: "shared_link_edit_expire_after_option_minutes" + .tr(namedArgs: {'count': "30"}), ), DropdownMenuEntry( value: 60, @@ -250,7 +250,8 @@ class SharedLinkEditPage extends HookConsumerWidget { ), DropdownMenuEntry( value: 60 * 6, - label: "shared_link_edit_expire_after_option_hours".tr(args: ["6"]), + label: "shared_link_edit_expire_after_option_hours" + .tr(namedArgs: {'count': "6"}), ), DropdownMenuEntry( value: 60 * 24, @@ -258,20 +259,23 @@ class SharedLinkEditPage extends HookConsumerWidget { ), DropdownMenuEntry( value: 60 * 24 * 7, - label: "shared_link_edit_expire_after_option_days".tr(args: ["7"]), + label: "shared_link_edit_expire_after_option_days" + .tr(namedArgs: {'count': "7"}), ), DropdownMenuEntry( value: 60 * 24 * 30, - label: "shared_link_edit_expire_after_option_days".tr(args: ["30"]), + label: "shared_link_edit_expire_after_option_days" + .tr(namedArgs: {'count': "30"}), ), DropdownMenuEntry( value: 60 * 24 * 30 * 3, - label: - "shared_link_edit_expire_after_option_months".tr(args: ["3"]), + label: "shared_link_edit_expire_after_option_months" + .tr(namedArgs: {'count': "3"}), ), DropdownMenuEntry( value: 60 * 24 * 30 * 12, - label: "shared_link_edit_expire_after_option_year".tr(args: ["1"]), + label: "shared_link_edit_expire_after_option_year" + .tr(namedArgs: {'count': "1"}), ), ], ); diff --git a/mobile/lib/pages/library/trash.page.dart b/mobile/lib/pages/library/trash.page.dart index f8a1d7605d..c645719974 100644 --- a/mobile/lib/pages/library/trash.page.dart +++ b/mobile/lib/pages/library/trash.page.dart @@ -4,18 +4,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/asyncvalue_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/providers/asset.provider.dart'; -import 'package:immich_mobile/providers/timeline.provider.dart'; -import 'package:immich_mobile/widgets/asset_grid/immich_asset_grid.dart'; -import 'package:immich_mobile/widgets/asset_grid/delete_dialog.dart'; -import 'package:immich_mobile/providers/trash.provider.dart'; -import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/providers/server_info.provider.dart'; +import 'package:immich_mobile/providers/timeline.provider.dart'; +import 'package:immich_mobile/providers/trash.provider.dart'; +import 'package:immich_mobile/utils/immich_loading_overlay.dart'; +import 'package:immich_mobile/widgets/asset_grid/delete_dialog.dart'; +import 'package:immich_mobile/widgets/asset_grid/immich_asset_grid.dart'; import 'package:immich_mobile/widgets/common/confirm_dialog.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart'; -import 'package:immich_mobile/utils/immich_loading_overlay.dart'; @RoutePage() class TrashPage extends HookConsumerWidget { @@ -77,7 +77,7 @@ class TrashPage extends HookConsumerWidget { ImmichToast.show( context: context, msg: 'assets_deleted_permanently' - .tr(args: ["${selection.value.length}"]), + .tr(namedArgs: {'count': "${selection.value.length}"}), gravity: ToastGravity.BOTTOM, ); } @@ -118,7 +118,7 @@ class TrashPage extends HookConsumerWidget { ImmichToast.show( context: context, msg: 'assets_restored_successfully' - .tr(args: ["${selection.value.length}"]), + .tr(namedArgs: {'count': "${selection.value.length}"}), gravity: ToastGravity.BOTTOM, ); } @@ -135,7 +135,7 @@ class TrashPage extends HookConsumerWidget { ? "${selection.value.length}" : "trash_page_select_assets_btn".tr(); } - return 'trash_page_title'.tr(args: [count]); + return 'trash_page_title'.tr(namedArgs: {'count': count}); } AppBar buildAppBar(String count) { @@ -260,7 +260,7 @@ class TrashPage extends HookConsumerWidget { ), child: const Text( "trash_page_info", - ).tr(args: ["$trashDays"]), + ).tr(namedArgs: {"days": "$trashDays"}), ), ), ), diff --git a/mobile/lib/pages/share_intent/share_intent.page.dart b/mobile/lib/pages/share_intent/share_intent.page.dart index d18fd15b6d..ff137ce0aa 100644 --- a/mobile/lib/pages/share_intent/share_intent.page.dart +++ b/mobile/lib/pages/share_intent/share_intent.page.dart @@ -3,12 +3,11 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart' hide Store; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/domain/models/store.model.dart'; -import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/models/upload/share_intent_attachment.model.dart'; import 'package:immich_mobile/pages/common/large_leading_tile.dart'; import 'package:immich_mobile/providers/asset_viewer/share_intent_upload.provider.dart'; +import 'package:immich_mobile/utils/url_helper.dart'; @RoutePage() class ShareIntentPage extends HookConsumerWidget { @@ -18,7 +17,7 @@ class ShareIntentPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final currentEndpoint = Store.get(StoreKey.serverEndpoint); + final currentEndpoint = getServerUrl() ?? '--'; final candidates = ref.watch(shareIntentUploadProvider); final isUploaded = useState(false); @@ -57,9 +56,7 @@ class ShareIntentPage extends HookConsumerWidget { title: Column( children: [ const Text('upload_to_immich').tr( - args: [ - candidates.length.toString(), - ], + namedArgs: {'count': candidates.length.toString()}, ), Text( currentEndpoint, @@ -177,8 +174,12 @@ class UploadingText extends StatelessWidget { return element.status == UploadStatus.complete; }).length; - return const Text("shared_intent_upload_button_progress_text") - .tr(args: [uploadedCount.toString(), candidates.length.toString()]); + return const Text("shared_intent_upload_button_progress_text").tr( + namedArgs: { + 'current': uploadedCount.toString(), + 'total': candidates.length.toString(), + }, + ); } } diff --git a/mobile/lib/providers/auth.provider.dart b/mobile/lib/providers/auth.provider.dart index 3221b80526..297b3a99fe 100644 --- a/mobile/lib/providers/auth.provider.dart +++ b/mobile/lib/providers/auth.provider.dart @@ -185,11 +185,6 @@ class AuthNotifier extends StateNotifier { return Store.tryGet(StoreKey.serverEndpoint); } - /// Returns the current server URL (input by the user) from the store - String? getServerUrl() { - return Store.tryGet(StoreKey.serverUrl); - } - Future setOpenApiServiceEndpoint() { return _authService.setOpenApiServiceEndpoint(); } diff --git a/mobile/lib/providers/backup/manual_upload.provider.dart b/mobile/lib/providers/backup/manual_upload.provider.dart index fc7e4d866c..646a03cebc 100644 --- a/mobile/lib/providers/backup/manual_upload.provider.dart +++ b/mobile/lib/providers/backup/manual_upload.provider.dart @@ -6,27 +6,27 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/widgets.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/entities/backup_album.entity.dart'; import 'package:immich_mobile/models/backup/backup_candidate.model.dart'; -import 'package:immich_mobile/models/backup/success_upload_asset.model.dart'; -import 'package:immich_mobile/repositories/file_media.repository.dart'; -import 'package:immich_mobile/services/background.service.dart'; import 'package:immich_mobile/models/backup/backup_state.model.dart'; import 'package:immich_mobile/models/backup/current_upload_asset.model.dart'; import 'package:immich_mobile/models/backup/error_upload_asset.model.dart'; import 'package:immich_mobile/models/backup/manual_upload_state.model.dart'; +import 'package:immich_mobile/models/backup/success_upload_asset.model.dart'; +import 'package:immich_mobile/providers/app_life_cycle.provider.dart'; +import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/backup/backup.provider.dart'; import 'package:immich_mobile/providers/backup/error_backup_list.provider.dart'; -import 'package:immich_mobile/services/backup.service.dart'; import 'package:immich_mobile/providers/gallery_permission.provider.dart'; -import 'package:immich_mobile/providers/app_settings.provider.dart'; +import 'package:immich_mobile/repositories/file_media.repository.dart'; import 'package:immich_mobile/services/app_settings.service.dart'; -import 'package:immich_mobile/entities/asset.entity.dart'; -import 'package:immich_mobile/providers/app_life_cycle.provider.dart'; +import 'package:immich_mobile/services/background.service.dart'; +import 'package:immich_mobile/services/backup.service.dart'; import 'package:immich_mobile/services/backup_album.service.dart'; import 'package:immich_mobile/services/local_notification.service.dart'; -import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/utils/backup_progress.dart'; +import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:logging/logging.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; @@ -170,7 +170,7 @@ class ManualUploadNotifier extends StateNotifier { if (state.showDetailedNotification) { final title = "backup_background_service_current_upload_notification" - .tr(args: [state.currentUploadAsset.fileName]); + .tr(namedArgs: {'filename': state.currentUploadAsset.fileName}); _throttledDetailNotify(title: title, progress: sent, total: total); } } @@ -186,7 +186,7 @@ class ManualUploadNotifier extends StateNotifier { if (state.showDetailedNotification) { _throttledDetailNotify.title = "backup_background_service_current_upload_notification" - .tr(args: [currentUploadAsset.fileName]); + .tr(namedArgs: {'filename': currentUploadAsset.fileName}); _throttledDetailNotify.progress = 0; _throttledDetailNotify.total = 0; } diff --git a/mobile/lib/services/asset.service.dart b/mobile/lib/services/asset.service.dart index 4bf62eca31..8a24e72fbe 100644 --- a/mobile/lib/services/asset.service.dart +++ b/mobile/lib/services/asset.service.dart @@ -197,7 +197,7 @@ class AssetService { ids: assets.map((e) => e.remoteId!).toList(), dateTimeOriginal: updateAssetDto.dateTimeOriginal, isFavorite: updateAssetDto.isFavorite, - isArchived: updateAssetDto.isArchived, + visibility: updateAssetDto.visibility, latitude: updateAssetDto.latitude, longitude: updateAssetDto.longitude, ), @@ -229,7 +229,13 @@ class AssetService { bool isArchived, ) async { try { - await updateAssets(assets, UpdateAssetDto(isArchived: isArchived)); + await updateAssets( + assets, + UpdateAssetDto( + visibility: + isArchived ? AssetVisibility.archive : AssetVisibility.timeline, + ), + ); for (var element in assets) { element.isArchived = isArchived; diff --git a/mobile/lib/services/background.service.dart b/mobile/lib/services/background.service.dart index 2d63e1fc18..335f71acab 100644 --- a/mobile/lib/services/background.service.dart +++ b/mobile/lib/services/background.service.dart @@ -32,7 +32,7 @@ import 'package:immich_mobile/services/localization.service.dart'; import 'package:immich_mobile/utils/backup_progress.dart'; import 'package:immich_mobile/utils/bootstrap.dart'; import 'package:immich_mobile/utils/diff.dart'; -import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; +import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:path_provider_foundation/path_provider_foundation.dart'; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; @@ -359,7 +359,7 @@ class BackgroundService { ], ); - HttpOverrides.global = HttpSSLCertOverride(); + HttpSSLOptions.apply(); ref .read(apiServiceProvider) .setAccessToken(Store.get(StoreKey.accessToken)); @@ -562,7 +562,7 @@ class BackgroundService { void _onBackupError(ErrorUploadAsset errorAssetInfo) { _showErrorNotification( title: "backup_background_service_upload_failure_notification" - .tr(args: [errorAssetInfo.fileName]), + .tr(namedArgs: {'filename': errorAssetInfo.fileName}), individualTag: errorAssetInfo.id, ); } @@ -577,7 +577,7 @@ class BackgroundService { _throttledDetailNotify.title = "backup_background_service_current_upload_notification" - .tr(args: [currentUploadAsset.fileName]); + .tr(namedArgs: {'filename': currentUploadAsset.fileName}); _throttledDetailNotify.progress = 0; _throttledDetailNotify.total = 0; } diff --git a/mobile/lib/services/memory.service.dart b/mobile/lib/services/memory.service.dart index 6ae8e1d0bb..efd38f1140 100644 --- a/mobile/lib/services/memory.service.dart +++ b/mobile/lib/services/memory.service.dart @@ -42,7 +42,8 @@ class MemoryService { if (dbAssets.isNotEmpty) { final String title = yearsAgo <= 1 ? 'memories_year_ago'.tr() - : 'memories_years_ago'.tr(args: [yearsAgo.toString()]); + : 'memories_years_ago' + .tr(namedArgs: {'years': yearsAgo.toString()}); memories.add( Memory( title: title, diff --git a/mobile/lib/services/search.service.dart b/mobile/lib/services/search.service.dart index 44ace78852..bcf67889c0 100644 --- a/mobile/lib/services/search.service.dart +++ b/mobile/lib/services/search.service.dart @@ -68,7 +68,9 @@ class SearchService { model: filter.camera.model, takenAfter: filter.date.takenAfter, takenBefore: filter.date.takenBefore, - isArchived: filter.display.isArchive ? true : null, + visibility: filter.display.isArchive + ? AssetVisibility.archive + : AssetVisibility.timeline, isFavorite: filter.display.isFavorite ? true : null, isNotInAlbum: filter.display.isNotInAlbum ? true : null, personIds: filter.people.map((e) => e.id).toList(), @@ -95,7 +97,9 @@ class SearchService { model: filter.camera.model, takenAfter: filter.date.takenAfter, takenBefore: filter.date.takenBefore, - isArchived: filter.display.isArchive ? true : null, + visibility: filter.display.isArchive + ? AssetVisibility.archive + : AssetVisibility.timeline, isFavorite: filter.display.isFavorite ? true : null, isNotInAlbum: filter.display.isNotInAlbum ? true : null, personIds: filter.people.map((e) => e.id).toList(), diff --git a/mobile/lib/utils/http_ssl_cert_override.dart b/mobile/lib/utils/http_ssl_cert_override.dart index ce0384b998..f64757cf9d 100644 --- a/mobile/lib/utils/http_ssl_cert_override.dart +++ b/mobile/lib/utils/http_ssl_cert_override.dart @@ -1,16 +1,20 @@ import 'dart:io'; -import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/store.entity.dart'; -import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:logging/logging.dart'; class HttpSSLCertOverride extends HttpOverrides { static final Logger _log = Logger("HttpSSLCertOverride"); + final bool _allowSelfSignedSSLCert; + final String? _serverHost; final SSLClientCertStoreVal? _clientCert; late final SecurityContext? _ctxWithCert; - HttpSSLCertOverride() : _clientCert = SSLClientCertStoreVal.load() { + HttpSSLCertOverride( + this._allowSelfSignedSSLCert, + this._serverHost, + this._clientCert, + ) { if (_clientCert != null) { _ctxWithCert = SecurityContext(withTrustedRoots: true); if (_ctxWithCert != null) { @@ -47,28 +51,15 @@ class HttpSSLCertOverride extends HttpOverrides { return super.createHttpClient(context) ..badCertificateCallback = (X509Certificate cert, String host, int port) { - AppSettingsEnum setting = AppSettingsEnum.allowSelfSignedSSLCert; - - // Check if user has allowed self signed SSL certificates. - bool selfSignedCertsAllowed = - Store.get(setting.storeKey as StoreKey, setting.defaultValue); - - bool isLoggedIn = Store.tryGet(StoreKey.currentUser) != null; - - // Conduct server host checks if user is logged in to avoid making - // insecure SSL connections to services that are not the immich server. - if (isLoggedIn && selfSignedCertsAllowed) { - String serverHost = - Uri.parse(Store.tryGet(StoreKey.serverEndpoint) ?? "").host; - - selfSignedCertsAllowed &= serverHost.contains(host); + if (_allowSelfSignedSSLCert) { + // Conduct server host checks if user is logged in to avoid making + // insecure SSL connections to services that are not the immich server. + if (_serverHost == null || _serverHost.contains(host)) { + return true; + } } - - if (!selfSignedCertsAllowed) { - _log.severe("Invalid SSL certificate for $host:$port"); - } - - return selfSignedCertsAllowed; + _log.severe("Invalid SSL certificate for $host:$port"); + return false; }; } } diff --git a/mobile/lib/utils/http_ssl_options.dart b/mobile/lib/utils/http_ssl_options.dart new file mode 100644 index 0000000000..04c01d36d9 --- /dev/null +++ b/mobile/lib/utils/http_ssl_options.dart @@ -0,0 +1,47 @@ +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:immich_mobile/domain/models/store.model.dart'; +import 'package:immich_mobile/entities/store.entity.dart'; +import 'package:immich_mobile/services/app_settings.service.dart'; +import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; +import 'package:logging/logging.dart'; + +class HttpSSLOptions { + static const MethodChannel _channel = MethodChannel('immich/httpSSLOptions'); + + static void apply() { + AppSettingsEnum setting = AppSettingsEnum.allowSelfSignedSSLCert; + bool allowSelfSignedSSLCert = + Store.get(setting.storeKey as StoreKey, setting.defaultValue); + _apply(allowSelfSignedSSLCert); + } + + static void applyFromSettings(bool newValue) { + _apply(newValue); + } + + static void _apply(bool allowSelfSignedSSLCert) { + String? serverHost; + if (allowSelfSignedSSLCert && Store.tryGet(StoreKey.currentUser) != null) { + serverHost = Uri.parse(Store.tryGet(StoreKey.serverEndpoint) ?? "").host; + } + + SSLClientCertStoreVal? clientCert = SSLClientCertStoreVal.load(); + + HttpOverrides.global = + HttpSSLCertOverride(allowSelfSignedSSLCert, serverHost, clientCert); + + if (Platform.isAndroid) { + _channel.invokeMethod("apply", [ + allowSelfSignedSSLCert, + serverHost, + clientCert?.data, + clientCert?.password, + ]).onError((e, _) { + final log = Logger("HttpSSLOptions"); + log.severe('Failed to set SSL options', e.message); + }); + } + } +} diff --git a/mobile/lib/widgets/album/album_thumbnail_card.dart b/mobile/lib/widgets/album/album_thumbnail_card.dart index f6f834e00d..79944ef15f 100644 --- a/mobile/lib/widgets/album/album_thumbnail_card.dart +++ b/mobile/lib/widgets/album/album_thumbnail_card.dart @@ -61,7 +61,8 @@ class AlbumThumbnailCard extends ConsumerWidget { if (album.ownerId == ref.read(currentUserProvider)?.id) { owner = 'owned'.tr(); } else if (album.ownerName != null) { - owner = 'album_thumbnail_shared_by'.tr(args: [album.ownerName!]); + owner = 'album_thumbnail_shared_by' + .tr(namedArgs: {'user': album.ownerName!}); } } @@ -74,10 +75,9 @@ class AlbumThumbnailCard extends ConsumerWidget { children: [ TextSpan( text: album.assetCount == 1 - ? 'album_thumbnail_card_item' - .tr(args: ['${album.assetCount}']) + ? 'album_thumbnail_card_item'.tr() : 'album_thumbnail_card_items' - .tr(args: ['${album.assetCount}']), + .tr(namedArgs: {'count': '${album.assetCount}'}), ), if (owner != null) const TextSpan(text: ' â€ĸ '), if (owner != null) TextSpan(text: owner), diff --git a/mobile/lib/widgets/album/album_thumbnail_listtile.dart b/mobile/lib/widgets/album/album_thumbnail_listtile.dart index 3c1e3a8ee0..17c2a6bd12 100644 --- a/mobile/lib/widgets/album/album_thumbnail_listtile.dart +++ b/mobile/lib/widgets/album/album_thumbnail_listtile.dart @@ -2,9 +2,9 @@ import 'package:auto_route/auto_route.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:immich_mobile/entities/album.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/routing/router.dart'; -import 'package:immich_mobile/entities/album.entity.dart'; import 'package:immich_mobile/services/api.service.dart'; import 'package:immich_mobile/utils/image_url_builder.dart'; import 'package:openapi/api.dart'; @@ -96,7 +96,7 @@ class AlbumThumbnailListTile extends StatelessWidget { style: const TextStyle( fontSize: 12, ), - ).tr(args: ['${album.assetCount}']), + ).tr(namedArgs: {'count': '${album.assetCount}'}), if (album.shared) const Text( 'album_thumbnail_card_shared', diff --git a/mobile/lib/widgets/asset_grid/multiselect_grid.dart b/mobile/lib/widgets/asset_grid/multiselect_grid.dart index 5ec59e3eeb..ceaee581d2 100644 --- a/mobile/lib/widgets/asset_grid/multiselect_grid.dart +++ b/mobile/lib/widgets/asset_grid/multiselect_grid.dart @@ -7,24 +7,24 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/extensions/collection_extensions.dart'; -import 'package:immich_mobile/providers/album/album.provider.dart'; -import 'package:immich_mobile/services/album.service.dart'; -import 'package:immich_mobile/services/stack.service.dart'; -import 'package:immich_mobile/providers/backup/manual_upload.provider.dart'; -import 'package:immich_mobile/models/asset_selection_state.dart'; -import 'package:immich_mobile/providers/multiselect.provider.dart'; -import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart'; -import 'package:immich_mobile/widgets/asset_grid/immich_asset_grid.dart'; -import 'package:immich_mobile/widgets/asset_grid/control_bottom_app_bar.dart'; -import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/entities/album.entity.dart'; import 'package:immich_mobile/entities/asset.entity.dart'; +import 'package:immich_mobile/extensions/collection_extensions.dart'; +import 'package:immich_mobile/models/asset_selection_state.dart'; +import 'package:immich_mobile/providers/album/album.provider.dart'; import 'package:immich_mobile/providers/asset.provider.dart'; +import 'package:immich_mobile/providers/backup/manual_upload.provider.dart'; +import 'package:immich_mobile/providers/multiselect.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; -import 'package:immich_mobile/widgets/common/immich_toast.dart'; +import 'package:immich_mobile/routing/router.dart'; +import 'package:immich_mobile/services/album.service.dart'; +import 'package:immich_mobile/services/stack.service.dart'; import 'package:immich_mobile/utils/immich_loading_overlay.dart'; import 'package:immich_mobile/utils/selection_handlers.dart'; +import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart'; +import 'package:immich_mobile/widgets/asset_grid/control_bottom_app_bar.dart'; +import 'package:immich_mobile/widgets/asset_grid/immich_asset_grid.dart'; +import 'package:immich_mobile/widgets/common/immich_toast.dart'; class MultiselectGrid extends HookConsumerWidget { const MultiselectGrid({ @@ -190,8 +190,9 @@ class MultiselectGrid extends HookConsumerWidget { context: context, msg: force ? 'assets_deleted_permanently' - .tr(args: ["${selection.value.length}"]) - : 'assets_trashed'.tr(args: ["${selection.value.length}"]), + .tr(namedArgs: {'count': "${selection.value.length}"}) + : 'assets_trashed' + .tr(namedArgs: {'count': "${selection.value.length}"}), gravity: ToastGravity.BOTTOM, ); selectionEnabledHook.value = false; @@ -225,7 +226,7 @@ class MultiselectGrid extends HookConsumerWidget { ImmichToast.show( context: context, msg: 'assets_removed_permanently_from_device' - .tr(args: ["$deletedCount"]), + .tr(namedArgs: {'count': "$deletedCount"}), gravity: ToastGravity.BOTTOM, ); @@ -254,8 +255,9 @@ class MultiselectGrid extends HookConsumerWidget { context: context, msg: shouldDeletePermanently ? 'assets_deleted_permanently_from_server' - .tr(args: ["${toDelete.length}"]) - : 'assets_trashed_from_server'.tr(args: ["${toDelete.length}"]), + .tr(namedArgs: {'count': "${toDelete.length}"}) + : 'assets_trashed_from_server' + .tr(namedArgs: {'count': "${toDelete.length}"}), gravity: ToastGravity.BOTTOM, ); } diff --git a/mobile/lib/widgets/asset_viewer/detail_panel/people_info.dart b/mobile/lib/widgets/asset_viewer/detail_panel/people_info.dart index 712e939ad5..8d2a38c700 100644 --- a/mobile/lib/widgets/asset_viewer/detail_panel/people_info.dart +++ b/mobile/lib/widgets/asset_viewer/detail_panel/people_info.dart @@ -2,13 +2,13 @@ import 'package:auto_route/auto_route.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/providers/asset_viewer/asset_people.provider.dart'; import 'package:immich_mobile/models/search/search_curated_content.model.dart'; +import 'package:immich_mobile/providers/asset_viewer/asset_people.provider.dart'; +import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/widgets/search/curated_people_row.dart'; import 'package:immich_mobile/widgets/search/person_name_edit_form.dart'; -import 'package:immich_mobile/routing/router.dart'; -import 'package:immich_mobile/entities/asset.entity.dart'; class PeopleInfo extends ConsumerWidget { final Asset asset; @@ -109,13 +109,13 @@ class PeopleInfo extends ConsumerWidget { if (ageInMonths <= 11) { return "exif_bottom_sheet_person_age_months" - .tr(args: [ageInMonths.toString()]); + .tr(namedArgs: {'months': ageInMonths.toString()}); } else if (ageInMonths > 12 && ageInMonths <= 23) { return "exif_bottom_sheet_person_age_year_months" - .tr(args: [(ageInMonths - 12).toString()]); + .tr(namedArgs: {'months': (ageInMonths - 12).toString()}); } else { return "exif_bottom_sheet_person_age_years" - .tr(args: [ageInYears.toString()]); + .tr(namedArgs: {'years': ageInYears.toString()}); } } diff --git a/mobile/lib/widgets/backup/asset_info_table.dart b/mobile/lib/widgets/backup/asset_info_table.dart index 222e516cf7..98bcc2b3da 100644 --- a/mobile/lib/widgets/backup/asset_info_table.dart +++ b/mobile/lib/widgets/backup/asset_info_table.dart @@ -56,9 +56,12 @@ class BackupAssetInfoTable extends ConsumerWidget { fontSize: 10.0, ), ).tr( - args: isUploadInProgress - ? [asset.fileName, asset.fileType.toLowerCase()] - : ["-", "-"], + namedArgs: isUploadInProgress + ? { + 'filename': asset.fileName, + 'size': asset.fileType.toLowerCase(), + } + : {'filename': "-", 'size': "-"}, ), ), ), @@ -78,9 +81,11 @@ class BackupAssetInfoTable extends ConsumerWidget { fontSize: 10.0, ), ).tr( - args: [ - isUploadInProgress ? _getAssetCreationDate(asset) : "-", - ], + namedArgs: { + 'date': isUploadInProgress + ? _getAssetCreationDate(asset) + : "-", + }, ), ), ), @@ -99,9 +104,7 @@ class BackupAssetInfoTable extends ConsumerWidget { fontSize: 10.0, ), ).tr( - args: [ - isUploadInProgress ? asset.id : "-", - ], + namedArgs: {'id': isUploadInProgress ? asset.id : "-"}, ), ), ), diff --git a/mobile/lib/widgets/backup/error_chip_text.dart b/mobile/lib/widgets/backup/error_chip_text.dart index 540e136722..38c527ccfa 100644 --- a/mobile/lib/widgets/backup/error_chip_text.dart +++ b/mobile/lib/widgets/backup/error_chip_text.dart @@ -21,8 +21,6 @@ class BackupErrorChipText extends ConsumerWidget { fontWeight: FontWeight.bold, fontSize: 11, ), - ).tr( - args: [count.toString()], - ); + ).tr(namedArgs: {'count': count.toString()}); } } diff --git a/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart b/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart index da863ef142..b2b24bd01c 100644 --- a/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart +++ b/mobile/lib/widgets/common/app_bar_dialog/app_bar_dialog.dart @@ -5,17 +5,17 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/models/backup/backup_state.model.dart'; +import 'package:immich_mobile/providers/asset.provider.dart'; +import 'package:immich_mobile/providers/auth.provider.dart'; import 'package:immich_mobile/providers/backup/backup.provider.dart'; import 'package:immich_mobile/providers/backup/manual_upload.provider.dart'; -import 'package:immich_mobile/providers/auth.provider.dart'; -import 'package:immich_mobile/routing/router.dart'; -import 'package:immich_mobile/providers/asset.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/websocket.provider.dart'; +import 'package:immich_mobile/routing/router.dart'; +import 'package:immich_mobile/utils/bytes_units.dart'; import 'package:immich_mobile/widgets/common/app_bar_dialog/app_bar_profile_info.dart'; import 'package:immich_mobile/widgets/common/app_bar_dialog/app_bar_server_info.dart'; import 'package:immich_mobile/widgets/common/confirm_dialog.dart'; -import 'package:immich_mobile/utils/bytes_units.dart'; import 'package:url_launcher/url_launcher.dart'; class ImmichAppBarDialog extends HookConsumerWidget { @@ -200,10 +200,10 @@ class ImmichAppBarDialog extends HookConsumerWidget { padding: const EdgeInsets.only(top: 12.0), child: const Text('backup_controller_page_storage_format').tr( - args: [ - usedDiskSpace, - totalDiskSpace, - ], + namedArgs: { + 'used': usedDiskSpace, + 'total': totalDiskSpace, + }, ), ), ], diff --git a/mobile/lib/widgets/map/map_asset_grid.dart b/mobile/lib/widgets/map/map_asset_grid.dart index a9ddc86df9..4a3bb69cc0 100644 --- a/mobile/lib/widgets/map/map_asset_grid.dart +++ b/mobile/lib/widgets/map/map_asset_grid.dart @@ -1,20 +1,21 @@ import 'dart:math' as math; + import 'package:collection/collection.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/collection_extensions.dart'; -import 'package:immich_mobile/providers/timeline.provider.dart'; -import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart'; -import 'package:immich_mobile/widgets/asset_grid/immich_asset_grid.dart'; import 'package:immich_mobile/models/map/map_event.model.dart'; -import 'package:immich_mobile/entities/asset.entity.dart'; import 'package:immich_mobile/providers/db.provider.dart'; -import 'package:immich_mobile/widgets/common/drag_sheet.dart'; +import 'package:immich_mobile/providers/timeline.provider.dart'; import 'package:immich_mobile/utils/color_filter_generator.dart'; import 'package:immich_mobile/utils/throttle.dart'; +import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart'; +import 'package:immich_mobile/widgets/asset_grid/immich_asset_grid.dart'; +import 'package:immich_mobile/widgets/common/drag_sheet.dart'; import 'package:logging/logging.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; @@ -252,7 +253,8 @@ class _MapSheetDragRegion extends StatelessWidget { @override Widget build(BuildContext context) { final assetsInBoundsText = assetsInBoundCount > 0 - ? "map_assets_in_bounds".tr(args: [assetsInBoundCount.toString()]) + ? "map_assets_in_bounds" + .tr(namedArgs: {'count': assetsInBoundCount.toString()}) : "map_no_assets_in_bounds".tr(); return SingleChildScrollView( diff --git a/mobile/lib/widgets/map/map_settings/map_settings_time_dropdown.dart b/mobile/lib/widgets/map/map_settings/map_settings_time_dropdown.dart index c613029886..e23716af95 100644 --- a/mobile/lib/widgets/map/map_settings/map_settings_time_dropdown.dart +++ b/mobile/lib/widgets/map/map_settings/map_settings_time_dropdown.dart @@ -44,13 +44,13 @@ class MapTimeDropDown extends StatelessWidget { DropdownMenuEntry( value: 7, label: "map_settings_date_range_option_days".tr( - args: ["7"], + namedArgs: {'days': "7"}, ), ), DropdownMenuEntry( value: 30, label: "map_settings_date_range_option_days".tr( - args: ["30"], + namedArgs: {'days': "30"}, ), ), DropdownMenuEntry( @@ -81,7 +81,8 @@ class MapTimeDropDown extends StatelessWidget { ), ) .inDays, - label: "map_settings_date_range_option_years".tr(args: ["3"]), + label: "map_settings_date_range_option_years" + .tr(namedArgs: {'years': "3"}), ), ], ), diff --git a/mobile/lib/widgets/settings/advanced_settings.dart b/mobile/lib/widgets/settings/advanced_settings.dart index d65186a191..eb13c67640 100644 --- a/mobile/lib/widgets/settings/advanced_settings.dart +++ b/mobile/lib/widgets/settings/advanced_settings.dart @@ -10,7 +10,7 @@ import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/repositories/local_files_manager.repository.dart'; import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart'; -import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; +import 'package:immich_mobile/utils/http_ssl_options.dart'; import 'package:immich_mobile/widgets/settings/custom_proxy_headers_settings/custome_proxy_headers_settings.dart'; import 'package:immich_mobile/widgets/settings/local_storage_settings.dart'; import 'package:immich_mobile/widgets/settings/settings_slider_list_tile.dart'; @@ -85,7 +85,8 @@ class AdvancedSettings extends HookConsumerWidget { }, ), SettingsSliderListTile( - text: "advanced_settings_log_level_title".tr(args: [logLevel]), + text: "advanced_settings_log_level_title" + .tr(namedArgs: {'level': logLevel}), valueNotifier: levelId, maxValue: 8, minValue: 1, @@ -103,7 +104,7 @@ class AdvancedSettings extends HookConsumerWidget { valueNotifier: allowSelfSignedSSLCert, title: "advanced_settings_self_signed_ssl_title".tr(), subtitle: "advanced_settings_self_signed_ssl_subtitle".tr(), - onChanged: (_) => HttpOverrides.global = HttpSSLCertOverride(), + onChanged: HttpSSLOptions.applyFromSettings, ), const CustomeProxyHeaderSettings(), SslClientCertSettings(isLoggedIn: ref.read(currentUserProvider) != null), diff --git a/mobile/lib/widgets/settings/asset_list_settings/asset_list_layout_settings.dart b/mobile/lib/widgets/settings/asset_list_settings/asset_list_layout_settings.dart index 4584b7e688..72402c8d55 100644 --- a/mobile/lib/widgets/settings/asset_list_settings/asset_list_layout_settings.dart +++ b/mobile/lib/widgets/settings/asset_list_settings/asset_list_layout_settings.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/services/app_settings.service.dart'; +import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart'; import 'package:immich_mobile/widgets/settings/settings_slider_list_tile.dart'; import 'package:immich_mobile/widgets/settings/settings_sub_title.dart'; import 'package:immich_mobile/widgets/settings/settings_switch_list_tile.dart'; -import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart'; class LayoutSettings extends HookConsumerWidget { const LayoutSettings({ @@ -30,7 +30,7 @@ class LayoutSettings extends HookConsumerWidget { SettingsSliderListTile( valueNotifier: tilesPerRow, text: 'theme_setting_asset_list_tiles_per_row_title' - .tr(args: ["${tilesPerRow.value}"]), + .tr(namedArgs: {'count': "${tilesPerRow.value}"}), label: "${tilesPerRow.value}", maxValue: 6, minValue: 2, diff --git a/mobile/lib/widgets/settings/backup_settings/background_settings.dart b/mobile/lib/widgets/settings/backup_settings/background_settings.dart index 4cdeb501c1..d628309050 100644 --- a/mobile/lib/widgets/settings/backup_settings/background_settings.dart +++ b/mobile/lib/widgets/settings/backup_settings/background_settings.dart @@ -164,10 +164,14 @@ class _BackgroundSettingsEnabled extends HookConsumerWidget { switch (v) { 0 => 5000, 1 => 30000, 2 => 120000, _ => 600000 }; String formatBackupDelaySliderValue(int v) => switch (v) { - 0 => 'setting_notifications_notify_seconds'.tr(args: const ['5']), - 1 => 'setting_notifications_notify_seconds'.tr(args: const ['30']), - 2 => 'setting_notifications_notify_minutes'.tr(args: const ['2']), - _ => 'setting_notifications_notify_minutes'.tr(args: const ['10']), + 0 => 'setting_notifications_notify_seconds' + .tr(namedArgs: {'count': '5'}), + 1 => 'setting_notifications_notify_seconds' + .tr(namedArgs: {'count': '30'}), + 2 => 'setting_notifications_notify_minutes' + .tr(namedArgs: {'count': '2'}), + _ => 'setting_notifications_notify_minutes' + .tr(namedArgs: {'count': '10'}), }; final backupTriggerDelay = @@ -221,7 +225,9 @@ class _BackgroundSettingsEnabled extends HookConsumerWidget { SettingsSliderListTile( valueNotifier: triggerDelay, text: 'backup_controller_page_background_delay'.tr( - args: [formatBackupDelaySliderValue(triggerDelay.value)], + namedArgs: { + 'duration': formatBackupDelaySliderValue(triggerDelay.value), + }, ), maxValue: 3.0, noDivisons: 3, diff --git a/mobile/lib/widgets/settings/local_storage_settings.dart b/mobile/lib/widgets/settings/local_storage_settings.dart index 5b21d9bd4d..06db78cb97 100644 --- a/mobile/lib/widgets/settings/local_storage_settings.dart +++ b/mobile/lib/widgets/settings/local_storage_settings.dart @@ -1,9 +1,9 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart' show useEffect, useState; -import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/entities/duplicated_asset.entity.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/entities/duplicated_asset.entity.dart'; +import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/theme_extensions.dart'; import 'package:immich_mobile/providers/db.provider.dart'; @@ -35,7 +35,7 @@ class LocalStorageSettings extends HookConsumerWidget { style: context.textTheme.bodyLarge?.copyWith( fontWeight: FontWeight.w500, ), - ).tr(args: ["${cacheItemCount.value}"]), + ).tr(namedArgs: {'count': "${cacheItemCount.value}"}), subtitle: Text( "cache_settings_duplicated_assets_subtitle", style: context.textTheme.bodyMedium?.copyWith( diff --git a/mobile/lib/widgets/settings/notification_setting.dart b/mobile/lib/widgets/settings/notification_setting.dart index 6aef8f29b0..cf6745199e 100644 --- a/mobile/lib/widgets/settings/notification_setting.dart +++ b/mobile/lib/widgets/settings/notification_setting.dart @@ -4,11 +4,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/providers/notification_permission.provider.dart'; import 'package:immich_mobile/services/app_settings.service.dart'; +import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart'; import 'package:immich_mobile/widgets/settings/settings_button_list_tile.dart'; import 'package:immich_mobile/widgets/settings/settings_slider_list_tile.dart'; import 'package:immich_mobile/widgets/settings/settings_sub_page_scaffold.dart'; import 'package:immich_mobile/widgets/settings/settings_switch_list_tile.dart'; -import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart'; import 'package:permission_handler/permission_handler.dart'; class NotificationSetting extends HookConsumerWidget { @@ -90,7 +90,7 @@ class NotificationSetting extends HookConsumerWidget { enabled: hasPermission, valueNotifier: sliderValue, text: 'setting_notifications_notify_failures_grace_period' - .tr(args: [formattedValue]), + .tr(namedArgs: {'duration': formattedValue}), maxValue: 5.0, noDivisons: 5, label: formattedValue, @@ -105,13 +105,14 @@ String _formatSliderValue(double v) { if (v == 0.0) { return 'setting_notifications_notify_immediately'.tr(); } else if (v == 1.0) { - return 'setting_notifications_notify_minutes'.tr(args: const ['30']); + return 'setting_notifications_notify_minutes' + .tr(namedArgs: {'count': '30'}); } else if (v == 2.0) { - return 'setting_notifications_notify_hours'.tr(args: const ['2']); + return 'setting_notifications_notify_hours'.tr(namedArgs: {'count': '2'}); } else if (v == 3.0) { - return 'setting_notifications_notify_hours'.tr(args: const ['8']); + return 'setting_notifications_notify_hours'.tr(namedArgs: {'count': '8'}); } else if (v == 4.0) { - return 'setting_notifications_notify_hours'.tr(args: const ['24']); + return 'setting_notifications_notify_hours'.tr(namedArgs: {'count': '24'}); } else { return 'setting_notifications_notify_never'.tr(); } diff --git a/mobile/lib/widgets/settings/ssl_client_cert_settings.dart b/mobile/lib/widgets/settings/ssl_client_cert_settings.dart index d8ea51dddd..6fdbb156d9 100644 --- a/mobile/lib/widgets/settings/ssl_client_cert_settings.dart +++ b/mobile/lib/widgets/settings/ssl_client_cert_settings.dart @@ -8,6 +8,7 @@ import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/theme_extensions.dart'; import 'package:immich_mobile/utils/http_ssl_cert_override.dart'; +import 'package:immich_mobile/utils/http_ssl_options.dart'; class SslClientCertSettings extends StatefulWidget { const SslClientCertSettings({super.key, required this.isLoggedIn}); @@ -103,7 +104,7 @@ class _SslClientCertSettingsState extends State { return; } cert.save(); - HttpOverrides.global = HttpSSLCertOverride(); + HttpSSLOptions.apply(); setState( () => isCertExist = true, ); @@ -152,7 +153,7 @@ class _SslClientCertSettingsState extends State { void removeCert(BuildContext context) { SSLClientCertStoreVal.delete(); - HttpOverrides.global = HttpSSLCertOverride(); + HttpSSLOptions.apply(); setState( () => isCertExist = false, ); diff --git a/mobile/lib/widgets/shared_link/shared_link_item.dart b/mobile/lib/widgets/shared_link/shared_link_item.dart index 5fdffa0537..69e763ea09 100644 --- a/mobile/lib/widgets/shared_link/shared_link_item.dart +++ b/mobile/lib/widgets/shared_link/shared_link_item.dart @@ -1,4 +1,5 @@ import 'dart:math' as math; + import 'package:auto_route/auto_route.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -6,15 +7,15 @@ import 'package:flutter/services.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; -import 'package:immich_mobile/widgets/search/thumbnail_with_info.dart'; import 'package:immich_mobile/models/shared_link/shared_link.model.dart'; +import 'package:immich_mobile/providers/server_info.provider.dart'; import 'package:immich_mobile/providers/shared_link.provider.dart'; import 'package:immich_mobile/routing/router.dart'; -import 'package:immich_mobile/providers/server_info.provider.dart'; -import 'package:immich_mobile/widgets/common/confirm_dialog.dart'; -import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/utils/image_url_builder.dart'; import 'package:immich_mobile/utils/url_helper.dart'; +import 'package:immich_mobile/widgets/common/confirm_dialog.dart'; +import 'package:immich_mobile/widgets/common/immich_toast.dart'; +import 'package:immich_mobile/widgets/search/thumbnail_with_info.dart'; class SharedLinkItem extends ConsumerWidget { final SharedLink sharedLink; @@ -44,17 +45,17 @@ class SharedLinkItem extends ConsumerWidget { if (difference.inHours % 24 > 12) { dayDifference += 1; } - expiresText = - "shared_link_expires_days".tr(args: [dayDifference.toString()]); + expiresText = "shared_link_expires_days" + .tr(namedArgs: {'count': dayDifference.toString()}); } else if (difference.inHours > 0) { expiresText = "shared_link_expires_hours" - .tr(args: [difference.inHours.toString()]); + .tr(namedArgs: {'count': difference.inHours.toString()}); } else if (difference.inMinutes > 0) { expiresText = "shared_link_expires_minutes" - .tr(args: [difference.inMinutes.toString()]); + .tr(namedArgs: {'count': difference.inMinutes.toString()}); } else if (difference.inSeconds > 0) { expiresText = "shared_link_expires_seconds" - .tr(args: [difference.inSeconds.toString()]); + .tr(namedArgs: {'count': difference.inSeconds.toString()}); } } return Text( diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 7c8afb09e4..a141d465d1 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -109,8 +109,12 @@ Class | Method | HTTP request | Description *AssetsApi* | [**uploadAsset**](doc//AssetsApi.md#uploadasset) | **POST** /assets | *AssetsApi* | [**viewAsset**](doc//AssetsApi.md#viewasset) | **GET** /assets/{id}/thumbnail | *AuthenticationApi* | [**changePassword**](doc//AuthenticationApi.md#changepassword) | **POST** /auth/change-password | +*AuthenticationApi* | [**changePinCode**](doc//AuthenticationApi.md#changepincode) | **PUT** /auth/pin-code | +*AuthenticationApi* | [**getAuthStatus**](doc//AuthenticationApi.md#getauthstatus) | **GET** /auth/status | *AuthenticationApi* | [**login**](doc//AuthenticationApi.md#login) | **POST** /auth/login | *AuthenticationApi* | [**logout**](doc//AuthenticationApi.md#logout) | **POST** /auth/logout | +*AuthenticationApi* | [**resetPinCode**](doc//AuthenticationApi.md#resetpincode) | **DELETE** /auth/pin-code | +*AuthenticationApi* | [**setupPinCode**](doc//AuthenticationApi.md#setuppincode) | **POST** /auth/pin-code | *AuthenticationApi* | [**signUpAdmin**](doc//AuthenticationApi.md#signupadmin) | **POST** /auth/admin-sign-up | *AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | *DeprecatedApi* | [**getRandom**](doc//DeprecatedApi.md#getrandom) | **GET** /assets/random | @@ -302,7 +306,9 @@ Class | Method | HTTP request | Description - [AssetStackResponseDto](doc//AssetStackResponseDto.md) - [AssetStatsResponseDto](doc//AssetStatsResponseDto.md) - [AssetTypeEnum](doc//AssetTypeEnum.md) + - [AssetVisibility](doc//AssetVisibility.md) - [AudioCodec](doc//AudioCodec.md) + - [AuthStatusResponseDto](doc//AuthStatusResponseDto.md) - [AvatarUpdate](doc//AvatarUpdate.md) - [BulkIdResponseDto](doc//BulkIdResponseDto.md) - [BulkIdsDto](doc//BulkIdsDto.md) @@ -382,6 +388,8 @@ Class | Method | HTTP request | Description - [PersonStatisticsResponseDto](doc//PersonStatisticsResponseDto.md) - [PersonUpdateDto](doc//PersonUpdateDto.md) - [PersonWithFacesResponseDto](doc//PersonWithFacesResponseDto.md) + - [PinCodeChangeDto](doc//PinCodeChangeDto.md) + - [PinCodeSetupDto](doc//PinCodeSetupDto.md) - [PlacesResponseDto](doc//PlacesResponseDto.md) - [PurchaseResponse](doc//PurchaseResponse.md) - [PurchaseUpdate](doc//PurchaseUpdate.md) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index ab9b251e01..b2cbe222e8 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -106,7 +106,9 @@ part 'model/asset_response_dto.dart'; part 'model/asset_stack_response_dto.dart'; part 'model/asset_stats_response_dto.dart'; part 'model/asset_type_enum.dart'; +part 'model/asset_visibility.dart'; part 'model/audio_codec.dart'; +part 'model/auth_status_response_dto.dart'; part 'model/avatar_update.dart'; part 'model/bulk_id_response_dto.dart'; part 'model/bulk_ids_dto.dart'; @@ -186,6 +188,8 @@ part 'model/person_response_dto.dart'; part 'model/person_statistics_response_dto.dart'; part 'model/person_update_dto.dart'; part 'model/person_with_faces_response_dto.dart'; +part 'model/pin_code_change_dto.dart'; +part 'model/pin_code_setup_dto.dart'; part 'model/places_response_dto.dart'; part 'model/purchase_response.dart'; part 'model/purchase_update.dart'; diff --git a/mobile/openapi/lib/api/assets_api.dart b/mobile/openapi/lib/api/assets_api.dart index f744988449..06965e1f8b 100644 --- a/mobile/openapi/lib/api/assets_api.dart +++ b/mobile/openapi/lib/api/assets_api.dart @@ -342,12 +342,12 @@ class AssetsApi { /// Performs an HTTP 'GET /assets/statistics' operation and returns the [Response]. /// Parameters: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// /// * [bool] isTrashed: - Future getAssetStatisticsWithHttpInfo({ bool? isArchived, bool? isFavorite, bool? isTrashed, }) async { + /// + /// * [AssetVisibility] visibility: + Future getAssetStatisticsWithHttpInfo({ bool? isFavorite, bool? isTrashed, AssetVisibility? visibility, }) async { // ignore: prefer_const_declarations final apiPath = r'/assets/statistics'; @@ -358,15 +358,15 @@ class AssetsApi { final headerParams = {}; final formParams = {}; - if (isArchived != null) { - queryParams.addAll(_queryParams('', 'isArchived', isArchived)); - } if (isFavorite != null) { queryParams.addAll(_queryParams('', 'isFavorite', isFavorite)); } if (isTrashed != null) { queryParams.addAll(_queryParams('', 'isTrashed', isTrashed)); } + if (visibility != null) { + queryParams.addAll(_queryParams('', 'visibility', visibility)); + } const contentTypes = []; @@ -384,13 +384,13 @@ class AssetsApi { /// Parameters: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// /// * [bool] isTrashed: - Future getAssetStatistics({ bool? isArchived, bool? isFavorite, bool? isTrashed, }) async { - final response = await getAssetStatisticsWithHttpInfo( isArchived: isArchived, isFavorite: isFavorite, isTrashed: isTrashed, ); + /// + /// * [AssetVisibility] visibility: + Future getAssetStatistics({ bool? isFavorite, bool? isTrashed, AssetVisibility? visibility, }) async { + final response = await getAssetStatisticsWithHttpInfo( isFavorite: isFavorite, isTrashed: isTrashed, visibility: visibility, ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -788,16 +788,14 @@ class AssetsApi { /// /// * [String] duration: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// - /// * [bool] isVisible: - /// /// * [String] livePhotoVideoId: /// /// * [MultipartFile] sidecarData: - Future uploadAssetWithHttpInfo(MultipartFile assetData, String deviceAssetId, String deviceId, DateTime fileCreatedAt, DateTime fileModifiedAt, { String? key, String? xImmichChecksum, String? duration, bool? isArchived, bool? isFavorite, bool? isVisible, String? livePhotoVideoId, MultipartFile? sidecarData, }) async { + /// + /// * [AssetVisibility] visibility: + Future uploadAssetWithHttpInfo(MultipartFile assetData, String deviceAssetId, String deviceId, DateTime fileCreatedAt, DateTime fileModifiedAt, { String? key, String? xImmichChecksum, String? duration, bool? isFavorite, String? livePhotoVideoId, MultipartFile? sidecarData, AssetVisibility? visibility, }) async { // ignore: prefer_const_declarations final apiPath = r'/assets'; @@ -845,18 +843,10 @@ class AssetsApi { hasFields = true; mp.fields[r'fileModifiedAt'] = parameterToString(fileModifiedAt); } - if (isArchived != null) { - hasFields = true; - mp.fields[r'isArchived'] = parameterToString(isArchived); - } if (isFavorite != null) { hasFields = true; mp.fields[r'isFavorite'] = parameterToString(isFavorite); } - if (isVisible != null) { - hasFields = true; - mp.fields[r'isVisible'] = parameterToString(isVisible); - } if (livePhotoVideoId != null) { hasFields = true; mp.fields[r'livePhotoVideoId'] = parameterToString(livePhotoVideoId); @@ -866,6 +856,10 @@ class AssetsApi { mp.fields[r'sidecarData'] = sidecarData.field; mp.files.add(sidecarData); } + if (visibility != null) { + hasFields = true; + mp.fields[r'visibility'] = parameterToString(visibility); + } if (hasFields) { postBody = mp; } @@ -900,17 +894,15 @@ class AssetsApi { /// /// * [String] duration: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// - /// * [bool] isVisible: - /// /// * [String] livePhotoVideoId: /// /// * [MultipartFile] sidecarData: - Future uploadAsset(MultipartFile assetData, String deviceAssetId, String deviceId, DateTime fileCreatedAt, DateTime fileModifiedAt, { String? key, String? xImmichChecksum, String? duration, bool? isArchived, bool? isFavorite, bool? isVisible, String? livePhotoVideoId, MultipartFile? sidecarData, }) async { - final response = await uploadAssetWithHttpInfo(assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, key: key, xImmichChecksum: xImmichChecksum, duration: duration, isArchived: isArchived, isFavorite: isFavorite, isVisible: isVisible, livePhotoVideoId: livePhotoVideoId, sidecarData: sidecarData, ); + /// + /// * [AssetVisibility] visibility: + Future uploadAsset(MultipartFile assetData, String deviceAssetId, String deviceId, DateTime fileCreatedAt, DateTime fileModifiedAt, { String? key, String? xImmichChecksum, String? duration, bool? isFavorite, String? livePhotoVideoId, MultipartFile? sidecarData, AssetVisibility? visibility, }) async { + final response = await uploadAssetWithHttpInfo(assetData, deviceAssetId, deviceId, fileCreatedAt, fileModifiedAt, key: key, xImmichChecksum: xImmichChecksum, duration: duration, isFavorite: isFavorite, livePhotoVideoId: livePhotoVideoId, sidecarData: sidecarData, visibility: visibility, ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } diff --git a/mobile/openapi/lib/api/authentication_api.dart b/mobile/openapi/lib/api/authentication_api.dart index bf987f441e..f850bdf403 100644 --- a/mobile/openapi/lib/api/authentication_api.dart +++ b/mobile/openapi/lib/api/authentication_api.dart @@ -63,6 +63,86 @@ class AuthenticationApi { return null; } + /// Performs an HTTP 'PUT /auth/pin-code' operation and returns the [Response]. + /// Parameters: + /// + /// * [PinCodeChangeDto] pinCodeChangeDto (required): + Future changePinCodeWithHttpInfo(PinCodeChangeDto pinCodeChangeDto,) async { + // ignore: prefer_const_declarations + final apiPath = r'/auth/pin-code'; + + // ignore: prefer_final_locals + Object? postBody = pinCodeChangeDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = ['application/json']; + + + return apiClient.invokeAPI( + apiPath, + 'PUT', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// Parameters: + /// + /// * [PinCodeChangeDto] pinCodeChangeDto (required): + Future changePinCode(PinCodeChangeDto pinCodeChangeDto,) async { + final response = await changePinCodeWithHttpInfo(pinCodeChangeDto,); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Performs an HTTP 'GET /auth/status' operation and returns the [Response]. + Future getAuthStatusWithHttpInfo() async { + // ignore: prefer_const_declarations + final apiPath = r'/auth/status'; + + // ignore: prefer_final_locals + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + + return apiClient.invokeAPI( + apiPath, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + Future getAuthStatus() async { + final response = await getAuthStatusWithHttpInfo(); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + // When a remote server returns no body with a status of 204, we shall not decode it. + // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" + // FormatException when trying to decode an empty string. + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AuthStatusResponseDto',) as AuthStatusResponseDto; + + } + return null; + } + /// Performs an HTTP 'POST /auth/login' operation and returns the [Response]. /// Parameters: /// @@ -151,6 +231,84 @@ class AuthenticationApi { return null; } + /// Performs an HTTP 'DELETE /auth/pin-code' operation and returns the [Response]. + /// Parameters: + /// + /// * [PinCodeChangeDto] pinCodeChangeDto (required): + Future resetPinCodeWithHttpInfo(PinCodeChangeDto pinCodeChangeDto,) async { + // ignore: prefer_const_declarations + final apiPath = r'/auth/pin-code'; + + // ignore: prefer_final_locals + Object? postBody = pinCodeChangeDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = ['application/json']; + + + return apiClient.invokeAPI( + apiPath, + 'DELETE', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// Parameters: + /// + /// * [PinCodeChangeDto] pinCodeChangeDto (required): + Future resetPinCode(PinCodeChangeDto pinCodeChangeDto,) async { + final response = await resetPinCodeWithHttpInfo(pinCodeChangeDto,); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + + /// Performs an HTTP 'POST /auth/pin-code' operation and returns the [Response]. + /// Parameters: + /// + /// * [PinCodeSetupDto] pinCodeSetupDto (required): + Future setupPinCodeWithHttpInfo(PinCodeSetupDto pinCodeSetupDto,) async { + // ignore: prefer_const_declarations + final apiPath = r'/auth/pin-code'; + + // ignore: prefer_final_locals + Object? postBody = pinCodeSetupDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = ['application/json']; + + + return apiClient.invokeAPI( + apiPath, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// Parameters: + /// + /// * [PinCodeSetupDto] pinCodeSetupDto (required): + Future setupPinCode(PinCodeSetupDto pinCodeSetupDto,) async { + final response = await setupPinCodeWithHttpInfo(pinCodeSetupDto,); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + } + /// Performs an HTTP 'POST /auth/admin-sign-up' operation and returns the [Response]. /// Parameters: /// diff --git a/mobile/openapi/lib/api/timeline_api.dart b/mobile/openapi/lib/api/timeline_api.dart index 7ea7189b00..1d25a379e8 100644 --- a/mobile/openapi/lib/api/timeline_api.dart +++ b/mobile/openapi/lib/api/timeline_api.dart @@ -25,8 +25,6 @@ class TimelineApi { /// /// * [String] albumId: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// /// * [bool] isTrashed: @@ -41,10 +39,12 @@ class TimelineApi { /// /// * [String] userId: /// + /// * [AssetVisibility] visibility: + /// /// * [bool] withPartners: /// /// * [bool] withStacked: - Future getTimeBucketWithHttpInfo(TimeBucketSize size, String timeBucket, { String? albumId, bool? isArchived, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, bool? withPartners, bool? withStacked, }) async { + Future getTimeBucketWithHttpInfo(TimeBucketSize size, String timeBucket, { String? albumId, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, AssetVisibility? visibility, bool? withPartners, bool? withStacked, }) async { // ignore: prefer_const_declarations final apiPath = r'/timeline/bucket'; @@ -58,9 +58,6 @@ class TimelineApi { if (albumId != null) { queryParams.addAll(_queryParams('', 'albumId', albumId)); } - if (isArchived != null) { - queryParams.addAll(_queryParams('', 'isArchived', isArchived)); - } if (isFavorite != null) { queryParams.addAll(_queryParams('', 'isFavorite', isFavorite)); } @@ -84,6 +81,9 @@ class TimelineApi { if (userId != null) { queryParams.addAll(_queryParams('', 'userId', userId)); } + if (visibility != null) { + queryParams.addAll(_queryParams('', 'visibility', visibility)); + } if (withPartners != null) { queryParams.addAll(_queryParams('', 'withPartners', withPartners)); } @@ -113,8 +113,6 @@ class TimelineApi { /// /// * [String] albumId: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// /// * [bool] isTrashed: @@ -129,11 +127,13 @@ class TimelineApi { /// /// * [String] userId: /// + /// * [AssetVisibility] visibility: + /// /// * [bool] withPartners: /// /// * [bool] withStacked: - Future?> getTimeBucket(TimeBucketSize size, String timeBucket, { String? albumId, bool? isArchived, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, bool? withPartners, bool? withStacked, }) async { - final response = await getTimeBucketWithHttpInfo(size, timeBucket, albumId: albumId, isArchived: isArchived, isFavorite: isFavorite, isTrashed: isTrashed, key: key, order: order, personId: personId, tagId: tagId, userId: userId, withPartners: withPartners, withStacked: withStacked, ); + Future?> getTimeBucket(TimeBucketSize size, String timeBucket, { String? albumId, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, AssetVisibility? visibility, bool? withPartners, bool? withStacked, }) async { + final response = await getTimeBucketWithHttpInfo(size, timeBucket, albumId: albumId, isFavorite: isFavorite, isTrashed: isTrashed, key: key, order: order, personId: personId, tagId: tagId, userId: userId, visibility: visibility, withPartners: withPartners, withStacked: withStacked, ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -157,8 +157,6 @@ class TimelineApi { /// /// * [String] albumId: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// /// * [bool] isTrashed: @@ -173,10 +171,12 @@ class TimelineApi { /// /// * [String] userId: /// + /// * [AssetVisibility] visibility: + /// /// * [bool] withPartners: /// /// * [bool] withStacked: - Future getTimeBucketsWithHttpInfo(TimeBucketSize size, { String? albumId, bool? isArchived, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, bool? withPartners, bool? withStacked, }) async { + Future getTimeBucketsWithHttpInfo(TimeBucketSize size, { String? albumId, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, AssetVisibility? visibility, bool? withPartners, bool? withStacked, }) async { // ignore: prefer_const_declarations final apiPath = r'/timeline/buckets'; @@ -190,9 +190,6 @@ class TimelineApi { if (albumId != null) { queryParams.addAll(_queryParams('', 'albumId', albumId)); } - if (isArchived != null) { - queryParams.addAll(_queryParams('', 'isArchived', isArchived)); - } if (isFavorite != null) { queryParams.addAll(_queryParams('', 'isFavorite', isFavorite)); } @@ -215,6 +212,9 @@ class TimelineApi { if (userId != null) { queryParams.addAll(_queryParams('', 'userId', userId)); } + if (visibility != null) { + queryParams.addAll(_queryParams('', 'visibility', visibility)); + } if (withPartners != null) { queryParams.addAll(_queryParams('', 'withPartners', withPartners)); } @@ -242,8 +242,6 @@ class TimelineApi { /// /// * [String] albumId: /// - /// * [bool] isArchived: - /// /// * [bool] isFavorite: /// /// * [bool] isTrashed: @@ -258,11 +256,13 @@ class TimelineApi { /// /// * [String] userId: /// + /// * [AssetVisibility] visibility: + /// /// * [bool] withPartners: /// /// * [bool] withStacked: - Future?> getTimeBuckets(TimeBucketSize size, { String? albumId, bool? isArchived, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, bool? withPartners, bool? withStacked, }) async { - final response = await getTimeBucketsWithHttpInfo(size, albumId: albumId, isArchived: isArchived, isFavorite: isFavorite, isTrashed: isTrashed, key: key, order: order, personId: personId, tagId: tagId, userId: userId, withPartners: withPartners, withStacked: withStacked, ); + Future?> getTimeBuckets(TimeBucketSize size, { String? albumId, bool? isFavorite, bool? isTrashed, String? key, AssetOrder? order, String? personId, String? tagId, String? userId, AssetVisibility? visibility, bool? withPartners, bool? withStacked, }) async { + final response = await getTimeBucketsWithHttpInfo(size, albumId: albumId, isFavorite: isFavorite, isTrashed: isTrashed, key: key, order: order, personId: personId, tagId: tagId, userId: userId, visibility: visibility, withPartners: withPartners, withStacked: withStacked, ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index ec5eb09729..cdd69307ad 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -268,8 +268,12 @@ class ApiClient { return AssetStatsResponseDto.fromJson(value); case 'AssetTypeEnum': return AssetTypeEnumTypeTransformer().decode(value); + case 'AssetVisibility': + return AssetVisibilityTypeTransformer().decode(value); case 'AudioCodec': return AudioCodecTypeTransformer().decode(value); + case 'AuthStatusResponseDto': + return AuthStatusResponseDto.fromJson(value); case 'AvatarUpdate': return AvatarUpdate.fromJson(value); case 'BulkIdResponseDto': @@ -428,6 +432,10 @@ class ApiClient { return PersonUpdateDto.fromJson(value); case 'PersonWithFacesResponseDto': return PersonWithFacesResponseDto.fromJson(value); + case 'PinCodeChangeDto': + return PinCodeChangeDto.fromJson(value); + case 'PinCodeSetupDto': + return PinCodeSetupDto.fromJson(value); case 'PlacesResponseDto': return PlacesResponseDto.fromJson(value); case 'PurchaseResponse': diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index eec991e903..4928adf767 100644 --- a/mobile/openapi/lib/api_helper.dart +++ b/mobile/openapi/lib/api_helper.dart @@ -73,6 +73,9 @@ String parameterToString(dynamic value) { if (value is AssetTypeEnum) { return AssetTypeEnumTypeTransformer().encode(value).toString(); } + if (value is AssetVisibility) { + return AssetVisibilityTypeTransformer().encode(value).toString(); + } if (value is AudioCodec) { return AudioCodecTypeTransformer().encode(value).toString(); } diff --git a/mobile/openapi/lib/model/asset_bulk_update_dto.dart b/mobile/openapi/lib/model/asset_bulk_update_dto.dart index 0b5a2c30d9..39d7cd996f 100644 --- a/mobile/openapi/lib/model/asset_bulk_update_dto.dart +++ b/mobile/openapi/lib/model/asset_bulk_update_dto.dart @@ -16,11 +16,11 @@ class AssetBulkUpdateDto { this.dateTimeOriginal, this.duplicateId, this.ids = const [], - this.isArchived, this.isFavorite, this.latitude, this.longitude, this.rating, + this.visibility, }); /// @@ -35,14 +35,6 @@ class AssetBulkUpdateDto { List ids; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isArchived; - /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated @@ -77,16 +69,24 @@ class AssetBulkUpdateDto { /// num? rating; + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + AssetVisibility? visibility; + @override bool operator ==(Object other) => identical(this, other) || other is AssetBulkUpdateDto && other.dateTimeOriginal == dateTimeOriginal && other.duplicateId == duplicateId && _deepEquality.equals(other.ids, ids) && - other.isArchived == isArchived && other.isFavorite == isFavorite && other.latitude == latitude && other.longitude == longitude && - other.rating == rating; + other.rating == rating && + other.visibility == visibility; @override int get hashCode => @@ -94,14 +94,14 @@ class AssetBulkUpdateDto { (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + (duplicateId == null ? 0 : duplicateId!.hashCode) + (ids.hashCode) + - (isArchived == null ? 0 : isArchived!.hashCode) + (isFavorite == null ? 0 : isFavorite!.hashCode) + (latitude == null ? 0 : latitude!.hashCode) + (longitude == null ? 0 : longitude!.hashCode) + - (rating == null ? 0 : rating!.hashCode); + (rating == null ? 0 : rating!.hashCode) + + (visibility == null ? 0 : visibility!.hashCode); @override - String toString() => 'AssetBulkUpdateDto[dateTimeOriginal=$dateTimeOriginal, duplicateId=$duplicateId, ids=$ids, isArchived=$isArchived, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude, rating=$rating]'; + String toString() => 'AssetBulkUpdateDto[dateTimeOriginal=$dateTimeOriginal, duplicateId=$duplicateId, ids=$ids, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude, rating=$rating, visibility=$visibility]'; Map toJson() { final json = {}; @@ -116,11 +116,6 @@ class AssetBulkUpdateDto { // json[r'duplicateId'] = null; } json[r'ids'] = this.ids; - if (this.isArchived != null) { - json[r'isArchived'] = this.isArchived; - } else { - // json[r'isArchived'] = null; - } if (this.isFavorite != null) { json[r'isFavorite'] = this.isFavorite; } else { @@ -141,6 +136,11 @@ class AssetBulkUpdateDto { } else { // json[r'rating'] = null; } + if (this.visibility != null) { + json[r'visibility'] = this.visibility; + } else { + // json[r'visibility'] = null; + } return json; } @@ -158,11 +158,11 @@ class AssetBulkUpdateDto { ids: json[r'ids'] is Iterable ? (json[r'ids'] as Iterable).cast().toList(growable: false) : const [], - isArchived: mapValueOfType(json, r'isArchived'), isFavorite: mapValueOfType(json, r'isFavorite'), latitude: num.parse('${json[r'latitude']}'), longitude: num.parse('${json[r'longitude']}'), rating: num.parse('${json[r'rating']}'), + visibility: AssetVisibility.fromJson(json[r'visibility']), ); } return null; diff --git a/mobile/openapi/lib/model/asset_visibility.dart b/mobile/openapi/lib/model/asset_visibility.dart new file mode 100644 index 0000000000..4d0c7ee8d3 --- /dev/null +++ b/mobile/openapi/lib/model/asset_visibility.dart @@ -0,0 +1,88 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + + +class AssetVisibility { + /// Instantiate a new enum with the provided [value]. + const AssetVisibility._(this.value); + + /// The underlying value of this enum member. + final String value; + + @override + String toString() => value; + + String toJson() => value; + + static const archive = AssetVisibility._(r'archive'); + static const timeline = AssetVisibility._(r'timeline'); + static const hidden = AssetVisibility._(r'hidden'); + + /// List of all possible values in this [enum][AssetVisibility]. + static const values = [ + archive, + timeline, + hidden, + ]; + + static AssetVisibility? fromJson(dynamic value) => AssetVisibilityTypeTransformer().decode(value); + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = AssetVisibility.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } +} + +/// Transformation class that can [encode] an instance of [AssetVisibility] to String, +/// and [decode] dynamic data back to [AssetVisibility]. +class AssetVisibilityTypeTransformer { + factory AssetVisibilityTypeTransformer() => _instance ??= const AssetVisibilityTypeTransformer._(); + + const AssetVisibilityTypeTransformer._(); + + String encode(AssetVisibility data) => data.value; + + /// Decodes a [dynamic value][data] to a AssetVisibility. + /// + /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, + /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] + /// cannot be decoded successfully, then an [UnimplementedError] is thrown. + /// + /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, + /// and users are still using an old app with the old code. + AssetVisibility? decode(dynamic data, {bool allowNull = true}) { + if (data != null) { + switch (data) { + case r'archive': return AssetVisibility.archive; + case r'timeline': return AssetVisibility.timeline; + case r'hidden': return AssetVisibility.hidden; + default: + if (!allowNull) { + throw ArgumentError('Unknown enum value to decode: $data'); + } + } + } + return null; + } + + /// Singleton [AssetVisibilityTypeTransformer] instance. + static AssetVisibilityTypeTransformer? _instance; +} + diff --git a/mobile/openapi/lib/model/auth_status_response_dto.dart b/mobile/openapi/lib/model/auth_status_response_dto.dart new file mode 100644 index 0000000000..203923164f --- /dev/null +++ b/mobile/openapi/lib/model/auth_status_response_dto.dart @@ -0,0 +1,107 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class AuthStatusResponseDto { + /// Returns a new [AuthStatusResponseDto] instance. + AuthStatusResponseDto({ + required this.password, + required this.pinCode, + }); + + bool password; + + bool pinCode; + + @override + bool operator ==(Object other) => identical(this, other) || other is AuthStatusResponseDto && + other.password == password && + other.pinCode == pinCode; + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (password.hashCode) + + (pinCode.hashCode); + + @override + String toString() => 'AuthStatusResponseDto[password=$password, pinCode=$pinCode]'; + + Map toJson() { + final json = {}; + json[r'password'] = this.password; + json[r'pinCode'] = this.pinCode; + return json; + } + + /// Returns a new [AuthStatusResponseDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static AuthStatusResponseDto? fromJson(dynamic value) { + upgradeDto(value, "AuthStatusResponseDto"); + if (value is Map) { + final json = value.cast(); + + return AuthStatusResponseDto( + password: mapValueOfType(json, r'password')!, + pinCode: mapValueOfType(json, r'pinCode')!, + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = AuthStatusResponseDto.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = AuthStatusResponseDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of AuthStatusResponseDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + // ignore: parameter_assignments + json = json.cast(); + for (final entry in json.entries) { + map[entry.key] = AuthStatusResponseDto.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'password', + 'pinCode', + }; +} + diff --git a/mobile/openapi/lib/model/metadata_search_dto.dart b/mobile/openapi/lib/model/metadata_search_dto.dart index 3fb003d164..7f1184467b 100644 --- a/mobile/openapi/lib/model/metadata_search_dto.dart +++ b/mobile/openapi/lib/model/metadata_search_dto.dart @@ -23,13 +23,11 @@ class MetadataSearchDto { this.deviceId, this.encodedVideoPath, this.id, - this.isArchived, this.isEncoded, this.isFavorite, this.isMotion, this.isNotInAlbum, this.isOffline, - this.isVisible, this.lensModel, this.libraryId, this.make, @@ -52,7 +50,7 @@ class MetadataSearchDto { this.type, this.updatedAfter, this.updatedBefore, - this.withArchived = false, + this.visibility, this.withDeleted, this.withExif, this.withPeople, @@ -127,14 +125,6 @@ class MetadataSearchDto { /// String? id; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isArchived; - /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated @@ -175,14 +165,6 @@ class MetadataSearchDto { /// bool? isOffline; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isVisible; - String? lensModel; String? libraryId; @@ -322,7 +304,13 @@ class MetadataSearchDto { /// DateTime? updatedBefore; - bool withArchived; + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + AssetVisibility? visibility; /// /// Please note: This property should have been non-nullable! Since the specification file @@ -368,13 +356,11 @@ class MetadataSearchDto { other.deviceId == deviceId && other.encodedVideoPath == encodedVideoPath && other.id == id && - other.isArchived == isArchived && other.isEncoded == isEncoded && other.isFavorite == isFavorite && other.isMotion == isMotion && other.isNotInAlbum == isNotInAlbum && other.isOffline == isOffline && - other.isVisible == isVisible && other.lensModel == lensModel && other.libraryId == libraryId && other.make == make && @@ -397,7 +383,7 @@ class MetadataSearchDto { other.type == type && other.updatedAfter == updatedAfter && other.updatedBefore == updatedBefore && - other.withArchived == withArchived && + other.visibility == visibility && other.withDeleted == withDeleted && other.withExif == withExif && other.withPeople == withPeople && @@ -416,13 +402,11 @@ class MetadataSearchDto { (deviceId == null ? 0 : deviceId!.hashCode) + (encodedVideoPath == null ? 0 : encodedVideoPath!.hashCode) + (id == null ? 0 : id!.hashCode) + - (isArchived == null ? 0 : isArchived!.hashCode) + (isEncoded == null ? 0 : isEncoded!.hashCode) + (isFavorite == null ? 0 : isFavorite!.hashCode) + (isMotion == null ? 0 : isMotion!.hashCode) + (isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) + (isOffline == null ? 0 : isOffline!.hashCode) + - (isVisible == null ? 0 : isVisible!.hashCode) + (lensModel == null ? 0 : lensModel!.hashCode) + (libraryId == null ? 0 : libraryId!.hashCode) + (make == null ? 0 : make!.hashCode) + @@ -445,14 +429,14 @@ class MetadataSearchDto { (type == null ? 0 : type!.hashCode) + (updatedAfter == null ? 0 : updatedAfter!.hashCode) + (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (withArchived.hashCode) + + (visibility == null ? 0 : visibility!.hashCode) + (withDeleted == null ? 0 : withDeleted!.hashCode) + (withExif == null ? 0 : withExif!.hashCode) + (withPeople == null ? 0 : withPeople!.hashCode) + (withStacked == null ? 0 : withStacked!.hashCode); @override - String toString() => 'MetadataSearchDto[checksum=$checksum, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, description=$description, deviceAssetId=$deviceAssetId, deviceId=$deviceId, encodedVideoPath=$encodedVideoPath, id=$id, isArchived=$isArchived, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, isVisible=$isVisible, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, order=$order, originalFileName=$originalFileName, originalPath=$originalPath, page=$page, personIds=$personIds, previewPath=$previewPath, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, thumbnailPath=$thumbnailPath, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, withArchived=$withArchived, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; + String toString() => 'MetadataSearchDto[checksum=$checksum, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, description=$description, deviceAssetId=$deviceAssetId, deviceId=$deviceId, encodedVideoPath=$encodedVideoPath, id=$id, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, order=$order, originalFileName=$originalFileName, originalPath=$originalPath, page=$page, personIds=$personIds, previewPath=$previewPath, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, thumbnailPath=$thumbnailPath, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; Map toJson() { final json = {}; @@ -506,11 +490,6 @@ class MetadataSearchDto { } else { // json[r'id'] = null; } - if (this.isArchived != null) { - json[r'isArchived'] = this.isArchived; - } else { - // json[r'isArchived'] = null; - } if (this.isEncoded != null) { json[r'isEncoded'] = this.isEncoded; } else { @@ -536,11 +515,6 @@ class MetadataSearchDto { } else { // json[r'isOffline'] = null; } - if (this.isVisible != null) { - json[r'isVisible'] = this.isVisible; - } else { - // json[r'isVisible'] = null; - } if (this.lensModel != null) { json[r'lensModel'] = this.lensModel; } else { @@ -639,7 +613,11 @@ class MetadataSearchDto { } else { // json[r'updatedBefore'] = null; } - json[r'withArchived'] = this.withArchived; + if (this.visibility != null) { + json[r'visibility'] = this.visibility; + } else { + // json[r'visibility'] = null; + } if (this.withDeleted != null) { json[r'withDeleted'] = this.withDeleted; } else { @@ -682,13 +660,11 @@ class MetadataSearchDto { deviceId: mapValueOfType(json, r'deviceId'), encodedVideoPath: mapValueOfType(json, r'encodedVideoPath'), id: mapValueOfType(json, r'id'), - isArchived: mapValueOfType(json, r'isArchived'), isEncoded: mapValueOfType(json, r'isEncoded'), isFavorite: mapValueOfType(json, r'isFavorite'), isMotion: mapValueOfType(json, r'isMotion'), isNotInAlbum: mapValueOfType(json, r'isNotInAlbum'), isOffline: mapValueOfType(json, r'isOffline'), - isVisible: mapValueOfType(json, r'isVisible'), lensModel: mapValueOfType(json, r'lensModel'), libraryId: mapValueOfType(json, r'libraryId'), make: mapValueOfType(json, r'make'), @@ -715,7 +691,7 @@ class MetadataSearchDto { type: AssetTypeEnum.fromJson(json[r'type']), updatedAfter: mapDateTime(json, r'updatedAfter', r''), updatedBefore: mapDateTime(json, r'updatedBefore', r''), - withArchived: mapValueOfType(json, r'withArchived') ?? false, + visibility: AssetVisibility.fromJson(json[r'visibility']), withDeleted: mapValueOfType(json, r'withDeleted'), withExif: mapValueOfType(json, r'withExif'), withPeople: mapValueOfType(json, r'withPeople'), diff --git a/mobile/openapi/lib/model/pin_code_change_dto.dart b/mobile/openapi/lib/model/pin_code_change_dto.dart new file mode 100644 index 0000000000..2e9967aa6b --- /dev/null +++ b/mobile/openapi/lib/model/pin_code_change_dto.dart @@ -0,0 +1,133 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class PinCodeChangeDto { + /// Returns a new [PinCodeChangeDto] instance. + PinCodeChangeDto({ + required this.newPinCode, + this.password, + this.pinCode, + }); + + String newPinCode; + + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + String? password; + + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + String? pinCode; + + @override + bool operator ==(Object other) => identical(this, other) || other is PinCodeChangeDto && + other.newPinCode == newPinCode && + other.password == password && + other.pinCode == pinCode; + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (newPinCode.hashCode) + + (password == null ? 0 : password!.hashCode) + + (pinCode == null ? 0 : pinCode!.hashCode); + + @override + String toString() => 'PinCodeChangeDto[newPinCode=$newPinCode, password=$password, pinCode=$pinCode]'; + + Map toJson() { + final json = {}; + json[r'newPinCode'] = this.newPinCode; + if (this.password != null) { + json[r'password'] = this.password; + } else { + // json[r'password'] = null; + } + if (this.pinCode != null) { + json[r'pinCode'] = this.pinCode; + } else { + // json[r'pinCode'] = null; + } + return json; + } + + /// Returns a new [PinCodeChangeDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static PinCodeChangeDto? fromJson(dynamic value) { + upgradeDto(value, "PinCodeChangeDto"); + if (value is Map) { + final json = value.cast(); + + return PinCodeChangeDto( + newPinCode: mapValueOfType(json, r'newPinCode')!, + password: mapValueOfType(json, r'password'), + pinCode: mapValueOfType(json, r'pinCode'), + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = PinCodeChangeDto.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = PinCodeChangeDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of PinCodeChangeDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + // ignore: parameter_assignments + json = json.cast(); + for (final entry in json.entries) { + map[entry.key] = PinCodeChangeDto.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'newPinCode', + }; +} + diff --git a/mobile/openapi/lib/model/pin_code_setup_dto.dart b/mobile/openapi/lib/model/pin_code_setup_dto.dart new file mode 100644 index 0000000000..09933790de --- /dev/null +++ b/mobile/openapi/lib/model/pin_code_setup_dto.dart @@ -0,0 +1,99 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class PinCodeSetupDto { + /// Returns a new [PinCodeSetupDto] instance. + PinCodeSetupDto({ + required this.pinCode, + }); + + String pinCode; + + @override + bool operator ==(Object other) => identical(this, other) || other is PinCodeSetupDto && + other.pinCode == pinCode; + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (pinCode.hashCode); + + @override + String toString() => 'PinCodeSetupDto[pinCode=$pinCode]'; + + Map toJson() { + final json = {}; + json[r'pinCode'] = this.pinCode; + return json; + } + + /// Returns a new [PinCodeSetupDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static PinCodeSetupDto? fromJson(dynamic value) { + upgradeDto(value, "PinCodeSetupDto"); + if (value is Map) { + final json = value.cast(); + + return PinCodeSetupDto( + pinCode: mapValueOfType(json, r'pinCode')!, + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = PinCodeSetupDto.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = PinCodeSetupDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of PinCodeSetupDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + // ignore: parameter_assignments + json = json.cast(); + for (final entry in json.entries) { + map[entry.key] = PinCodeSetupDto.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'pinCode', + }; +} + diff --git a/mobile/openapi/lib/model/random_search_dto.dart b/mobile/openapi/lib/model/random_search_dto.dart index 10727ec10d..0284212efc 100644 --- a/mobile/openapi/lib/model/random_search_dto.dart +++ b/mobile/openapi/lib/model/random_search_dto.dart @@ -18,13 +18,11 @@ class RandomSearchDto { this.createdAfter, this.createdBefore, this.deviceId, - this.isArchived, this.isEncoded, this.isFavorite, this.isMotion, this.isNotInAlbum, this.isOffline, - this.isVisible, this.lensModel, this.libraryId, this.make, @@ -41,7 +39,7 @@ class RandomSearchDto { this.type, this.updatedAfter, this.updatedBefore, - this.withArchived = false, + this.visibility, this.withDeleted, this.withExif, this.withPeople, @@ -76,14 +74,6 @@ class RandomSearchDto { /// String? deviceId; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isArchived; - /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated @@ -124,14 +114,6 @@ class RandomSearchDto { /// bool? isOffline; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isVisible; - String? lensModel; String? libraryId; @@ -228,7 +210,13 @@ class RandomSearchDto { /// DateTime? updatedBefore; - bool withArchived; + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + AssetVisibility? visibility; /// /// Please note: This property should have been non-nullable! Since the specification file @@ -269,13 +257,11 @@ class RandomSearchDto { other.createdAfter == createdAfter && other.createdBefore == createdBefore && other.deviceId == deviceId && - other.isArchived == isArchived && other.isEncoded == isEncoded && other.isFavorite == isFavorite && other.isMotion == isMotion && other.isNotInAlbum == isNotInAlbum && other.isOffline == isOffline && - other.isVisible == isVisible && other.lensModel == lensModel && other.libraryId == libraryId && other.make == make && @@ -292,7 +278,7 @@ class RandomSearchDto { other.type == type && other.updatedAfter == updatedAfter && other.updatedBefore == updatedBefore && - other.withArchived == withArchived && + other.visibility == visibility && other.withDeleted == withDeleted && other.withExif == withExif && other.withPeople == withPeople && @@ -306,13 +292,11 @@ class RandomSearchDto { (createdAfter == null ? 0 : createdAfter!.hashCode) + (createdBefore == null ? 0 : createdBefore!.hashCode) + (deviceId == null ? 0 : deviceId!.hashCode) + - (isArchived == null ? 0 : isArchived!.hashCode) + (isEncoded == null ? 0 : isEncoded!.hashCode) + (isFavorite == null ? 0 : isFavorite!.hashCode) + (isMotion == null ? 0 : isMotion!.hashCode) + (isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) + (isOffline == null ? 0 : isOffline!.hashCode) + - (isVisible == null ? 0 : isVisible!.hashCode) + (lensModel == null ? 0 : lensModel!.hashCode) + (libraryId == null ? 0 : libraryId!.hashCode) + (make == null ? 0 : make!.hashCode) + @@ -329,14 +313,14 @@ class RandomSearchDto { (type == null ? 0 : type!.hashCode) + (updatedAfter == null ? 0 : updatedAfter!.hashCode) + (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (withArchived.hashCode) + + (visibility == null ? 0 : visibility!.hashCode) + (withDeleted == null ? 0 : withDeleted!.hashCode) + (withExif == null ? 0 : withExif!.hashCode) + (withPeople == null ? 0 : withPeople!.hashCode) + (withStacked == null ? 0 : withStacked!.hashCode); @override - String toString() => 'RandomSearchDto[city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceId=$deviceId, isArchived=$isArchived, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, isVisible=$isVisible, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, personIds=$personIds, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, withArchived=$withArchived, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; + String toString() => 'RandomSearchDto[city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceId=$deviceId, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, personIds=$personIds, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; Map toJson() { final json = {}; @@ -365,11 +349,6 @@ class RandomSearchDto { } else { // json[r'deviceId'] = null; } - if (this.isArchived != null) { - json[r'isArchived'] = this.isArchived; - } else { - // json[r'isArchived'] = null; - } if (this.isEncoded != null) { json[r'isEncoded'] = this.isEncoded; } else { @@ -395,11 +374,6 @@ class RandomSearchDto { } else { // json[r'isOffline'] = null; } - if (this.isVisible != null) { - json[r'isVisible'] = this.isVisible; - } else { - // json[r'isVisible'] = null; - } if (this.lensModel != null) { json[r'lensModel'] = this.lensModel; } else { @@ -472,7 +446,11 @@ class RandomSearchDto { } else { // json[r'updatedBefore'] = null; } - json[r'withArchived'] = this.withArchived; + if (this.visibility != null) { + json[r'visibility'] = this.visibility; + } else { + // json[r'visibility'] = null; + } if (this.withDeleted != null) { json[r'withDeleted'] = this.withDeleted; } else { @@ -510,13 +488,11 @@ class RandomSearchDto { createdAfter: mapDateTime(json, r'createdAfter', r''), createdBefore: mapDateTime(json, r'createdBefore', r''), deviceId: mapValueOfType(json, r'deviceId'), - isArchived: mapValueOfType(json, r'isArchived'), isEncoded: mapValueOfType(json, r'isEncoded'), isFavorite: mapValueOfType(json, r'isFavorite'), isMotion: mapValueOfType(json, r'isMotion'), isNotInAlbum: mapValueOfType(json, r'isNotInAlbum'), isOffline: mapValueOfType(json, r'isOffline'), - isVisible: mapValueOfType(json, r'isVisible'), lensModel: mapValueOfType(json, r'lensModel'), libraryId: mapValueOfType(json, r'libraryId'), make: mapValueOfType(json, r'make'), @@ -537,7 +513,7 @@ class RandomSearchDto { type: AssetTypeEnum.fromJson(json[r'type']), updatedAfter: mapDateTime(json, r'updatedAfter', r''), updatedBefore: mapDateTime(json, r'updatedBefore', r''), - withArchived: mapValueOfType(json, r'withArchived') ?? false, + visibility: AssetVisibility.fromJson(json[r'visibility']), withDeleted: mapValueOfType(json, r'withDeleted'), withExif: mapValueOfType(json, r'withExif'), withPeople: mapValueOfType(json, r'withPeople'), diff --git a/mobile/openapi/lib/model/smart_search_dto.dart b/mobile/openapi/lib/model/smart_search_dto.dart index 47c800ff09..a915d97b31 100644 --- a/mobile/openapi/lib/model/smart_search_dto.dart +++ b/mobile/openapi/lib/model/smart_search_dto.dart @@ -18,13 +18,11 @@ class SmartSearchDto { this.createdAfter, this.createdBefore, this.deviceId, - this.isArchived, this.isEncoded, this.isFavorite, this.isMotion, this.isNotInAlbum, this.isOffline, - this.isVisible, this.language, this.lensModel, this.libraryId, @@ -44,7 +42,7 @@ class SmartSearchDto { this.type, this.updatedAfter, this.updatedBefore, - this.withArchived = false, + this.visibility, this.withDeleted, this.withExif, }); @@ -77,14 +75,6 @@ class SmartSearchDto { /// String? deviceId; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isArchived; - /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated @@ -125,14 +115,6 @@ class SmartSearchDto { /// bool? isOffline; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isVisible; - /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated @@ -248,7 +230,13 @@ class SmartSearchDto { /// DateTime? updatedBefore; - bool withArchived; + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + AssetVisibility? visibility; /// /// Please note: This property should have been non-nullable! Since the specification file @@ -273,13 +261,11 @@ class SmartSearchDto { other.createdAfter == createdAfter && other.createdBefore == createdBefore && other.deviceId == deviceId && - other.isArchived == isArchived && other.isEncoded == isEncoded && other.isFavorite == isFavorite && other.isMotion == isMotion && other.isNotInAlbum == isNotInAlbum && other.isOffline == isOffline && - other.isVisible == isVisible && other.language == language && other.lensModel == lensModel && other.libraryId == libraryId && @@ -299,7 +285,7 @@ class SmartSearchDto { other.type == type && other.updatedAfter == updatedAfter && other.updatedBefore == updatedBefore && - other.withArchived == withArchived && + other.visibility == visibility && other.withDeleted == withDeleted && other.withExif == withExif; @@ -311,13 +297,11 @@ class SmartSearchDto { (createdAfter == null ? 0 : createdAfter!.hashCode) + (createdBefore == null ? 0 : createdBefore!.hashCode) + (deviceId == null ? 0 : deviceId!.hashCode) + - (isArchived == null ? 0 : isArchived!.hashCode) + (isEncoded == null ? 0 : isEncoded!.hashCode) + (isFavorite == null ? 0 : isFavorite!.hashCode) + (isMotion == null ? 0 : isMotion!.hashCode) + (isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) + (isOffline == null ? 0 : isOffline!.hashCode) + - (isVisible == null ? 0 : isVisible!.hashCode) + (language == null ? 0 : language!.hashCode) + (lensModel == null ? 0 : lensModel!.hashCode) + (libraryId == null ? 0 : libraryId!.hashCode) + @@ -337,12 +321,12 @@ class SmartSearchDto { (type == null ? 0 : type!.hashCode) + (updatedAfter == null ? 0 : updatedAfter!.hashCode) + (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (withArchived.hashCode) + + (visibility == null ? 0 : visibility!.hashCode) + (withDeleted == null ? 0 : withDeleted!.hashCode) + (withExif == null ? 0 : withExif!.hashCode); @override - String toString() => 'SmartSearchDto[city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceId=$deviceId, isArchived=$isArchived, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, isVisible=$isVisible, language=$language, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, page=$page, personIds=$personIds, query=$query, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, withArchived=$withArchived, withDeleted=$withDeleted, withExif=$withExif]'; + String toString() => 'SmartSearchDto[city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceId=$deviceId, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, language=$language, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, page=$page, personIds=$personIds, query=$query, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, visibility=$visibility, withDeleted=$withDeleted, withExif=$withExif]'; Map toJson() { final json = {}; @@ -371,11 +355,6 @@ class SmartSearchDto { } else { // json[r'deviceId'] = null; } - if (this.isArchived != null) { - json[r'isArchived'] = this.isArchived; - } else { - // json[r'isArchived'] = null; - } if (this.isEncoded != null) { json[r'isEncoded'] = this.isEncoded; } else { @@ -401,11 +380,6 @@ class SmartSearchDto { } else { // json[r'isOffline'] = null; } - if (this.isVisible != null) { - json[r'isVisible'] = this.isVisible; - } else { - // json[r'isVisible'] = null; - } if (this.language != null) { json[r'language'] = this.language; } else { @@ -489,7 +463,11 @@ class SmartSearchDto { } else { // json[r'updatedBefore'] = null; } - json[r'withArchived'] = this.withArchived; + if (this.visibility != null) { + json[r'visibility'] = this.visibility; + } else { + // json[r'visibility'] = null; + } if (this.withDeleted != null) { json[r'withDeleted'] = this.withDeleted; } else { @@ -517,13 +495,11 @@ class SmartSearchDto { createdAfter: mapDateTime(json, r'createdAfter', r''), createdBefore: mapDateTime(json, r'createdBefore', r''), deviceId: mapValueOfType(json, r'deviceId'), - isArchived: mapValueOfType(json, r'isArchived'), isEncoded: mapValueOfType(json, r'isEncoded'), isFavorite: mapValueOfType(json, r'isFavorite'), isMotion: mapValueOfType(json, r'isMotion'), isNotInAlbum: mapValueOfType(json, r'isNotInAlbum'), isOffline: mapValueOfType(json, r'isOffline'), - isVisible: mapValueOfType(json, r'isVisible'), language: mapValueOfType(json, r'language'), lensModel: mapValueOfType(json, r'lensModel'), libraryId: mapValueOfType(json, r'libraryId'), @@ -547,7 +523,7 @@ class SmartSearchDto { type: AssetTypeEnum.fromJson(json[r'type']), updatedAfter: mapDateTime(json, r'updatedAfter', r''), updatedBefore: mapDateTime(json, r'updatedBefore', r''), - withArchived: mapValueOfType(json, r'withArchived') ?? false, + visibility: AssetVisibility.fromJson(json[r'visibility']), withDeleted: mapValueOfType(json, r'withDeleted'), withExif: mapValueOfType(json, r'withExif'), ); diff --git a/mobile/openapi/lib/model/sync_asset_v1.dart b/mobile/openapi/lib/model/sync_asset_v1.dart index 6f9d7d7eaf..e1d3199428 100644 --- a/mobile/openapi/lib/model/sync_asset_v1.dart +++ b/mobile/openapi/lib/model/sync_asset_v1.dart @@ -19,11 +19,11 @@ class SyncAssetV1 { required this.fileModifiedAt, required this.id, required this.isFavorite, - required this.isVisible, required this.localDateTime, required this.ownerId, required this.thumbhash, required this.type, + required this.visibility, }); String checksum; @@ -38,8 +38,6 @@ class SyncAssetV1 { bool isFavorite; - bool isVisible; - DateTime? localDateTime; String ownerId; @@ -48,6 +46,8 @@ class SyncAssetV1 { SyncAssetV1TypeEnum type; + SyncAssetV1VisibilityEnum visibility; + @override bool operator ==(Object other) => identical(this, other) || other is SyncAssetV1 && other.checksum == checksum && @@ -56,11 +56,11 @@ class SyncAssetV1 { other.fileModifiedAt == fileModifiedAt && other.id == id && other.isFavorite == isFavorite && - other.isVisible == isVisible && other.localDateTime == localDateTime && other.ownerId == ownerId && other.thumbhash == thumbhash && - other.type == type; + other.type == type && + other.visibility == visibility; @override int get hashCode => @@ -71,14 +71,14 @@ class SyncAssetV1 { (fileModifiedAt == null ? 0 : fileModifiedAt!.hashCode) + (id.hashCode) + (isFavorite.hashCode) + - (isVisible.hashCode) + (localDateTime == null ? 0 : localDateTime!.hashCode) + (ownerId.hashCode) + (thumbhash == null ? 0 : thumbhash!.hashCode) + - (type.hashCode); + (type.hashCode) + + (visibility.hashCode); @override - String toString() => 'SyncAssetV1[checksum=$checksum, deletedAt=$deletedAt, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, id=$id, isFavorite=$isFavorite, isVisible=$isVisible, localDateTime=$localDateTime, ownerId=$ownerId, thumbhash=$thumbhash, type=$type]'; + String toString() => 'SyncAssetV1[checksum=$checksum, deletedAt=$deletedAt, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, id=$id, isFavorite=$isFavorite, localDateTime=$localDateTime, ownerId=$ownerId, thumbhash=$thumbhash, type=$type, visibility=$visibility]'; Map toJson() { final json = {}; @@ -100,7 +100,6 @@ class SyncAssetV1 { } json[r'id'] = this.id; json[r'isFavorite'] = this.isFavorite; - json[r'isVisible'] = this.isVisible; if (this.localDateTime != null) { json[r'localDateTime'] = this.localDateTime!.toUtc().toIso8601String(); } else { @@ -113,6 +112,7 @@ class SyncAssetV1 { // json[r'thumbhash'] = null; } json[r'type'] = this.type; + json[r'visibility'] = this.visibility; return json; } @@ -131,11 +131,11 @@ class SyncAssetV1 { fileModifiedAt: mapDateTime(json, r'fileModifiedAt', r''), id: mapValueOfType(json, r'id')!, isFavorite: mapValueOfType(json, r'isFavorite')!, - isVisible: mapValueOfType(json, r'isVisible')!, localDateTime: mapDateTime(json, r'localDateTime', r''), ownerId: mapValueOfType(json, r'ownerId')!, thumbhash: mapValueOfType(json, r'thumbhash'), type: SyncAssetV1TypeEnum.fromJson(json[r'type'])!, + visibility: SyncAssetV1VisibilityEnum.fromJson(json[r'visibility'])!, ); } return null; @@ -189,11 +189,11 @@ class SyncAssetV1 { 'fileModifiedAt', 'id', 'isFavorite', - 'isVisible', 'localDateTime', 'ownerId', 'thumbhash', 'type', + 'visibility', }; } @@ -277,3 +277,80 @@ class SyncAssetV1TypeEnumTypeTransformer { } + +class SyncAssetV1VisibilityEnum { + /// Instantiate a new enum with the provided [value]. + const SyncAssetV1VisibilityEnum._(this.value); + + /// The underlying value of this enum member. + final String value; + + @override + String toString() => value; + + String toJson() => value; + + static const archive = SyncAssetV1VisibilityEnum._(r'archive'); + static const timeline = SyncAssetV1VisibilityEnum._(r'timeline'); + static const hidden = SyncAssetV1VisibilityEnum._(r'hidden'); + + /// List of all possible values in this [enum][SyncAssetV1VisibilityEnum]. + static const values = [ + archive, + timeline, + hidden, + ]; + + static SyncAssetV1VisibilityEnum? fromJson(dynamic value) => SyncAssetV1VisibilityEnumTypeTransformer().decode(value); + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = SyncAssetV1VisibilityEnum.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } +} + +/// Transformation class that can [encode] an instance of [SyncAssetV1VisibilityEnum] to String, +/// and [decode] dynamic data back to [SyncAssetV1VisibilityEnum]. +class SyncAssetV1VisibilityEnumTypeTransformer { + factory SyncAssetV1VisibilityEnumTypeTransformer() => _instance ??= const SyncAssetV1VisibilityEnumTypeTransformer._(); + + const SyncAssetV1VisibilityEnumTypeTransformer._(); + + String encode(SyncAssetV1VisibilityEnum data) => data.value; + + /// Decodes a [dynamic value][data] to a SyncAssetV1VisibilityEnum. + /// + /// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully, + /// then null is returned. However, if [allowNull] is false and the [dynamic value][data] + /// cannot be decoded successfully, then an [UnimplementedError] is thrown. + /// + /// The [allowNull] is very handy when an API changes and a new enum value is added or removed, + /// and users are still using an old app with the old code. + SyncAssetV1VisibilityEnum? decode(dynamic data, {bool allowNull = true}) { + if (data != null) { + switch (data) { + case r'archive': return SyncAssetV1VisibilityEnum.archive; + case r'timeline': return SyncAssetV1VisibilityEnum.timeline; + case r'hidden': return SyncAssetV1VisibilityEnum.hidden; + default: + if (!allowNull) { + throw ArgumentError('Unknown enum value to decode: $data'); + } + } + } + return null; + } + + /// Singleton [SyncAssetV1VisibilityEnumTypeTransformer] instance. + static SyncAssetV1VisibilityEnumTypeTransformer? _instance; +} + + diff --git a/mobile/openapi/lib/model/update_asset_dto.dart b/mobile/openapi/lib/model/update_asset_dto.dart index c6ae6d8e07..7b364f1387 100644 --- a/mobile/openapi/lib/model/update_asset_dto.dart +++ b/mobile/openapi/lib/model/update_asset_dto.dart @@ -15,12 +15,12 @@ class UpdateAssetDto { UpdateAssetDto({ this.dateTimeOriginal, this.description, - this.isArchived, this.isFavorite, this.latitude, this.livePhotoVideoId, this.longitude, this.rating, + this.visibility, }); /// @@ -39,14 +39,6 @@ class UpdateAssetDto { /// String? description; - /// - /// Please note: This property should have been non-nullable! Since the specification file - /// does not include a default value (using the "default:" property), however, the generated - /// source code must fall back to having a nullable type. - /// Consider adding a "default:" property in the specification file to hide this note. - /// - bool? isArchived; - /// /// Please note: This property should have been non-nullable! Since the specification file /// does not include a default value (using the "default:" property), however, the generated @@ -83,31 +75,39 @@ class UpdateAssetDto { /// num? rating; + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + AssetVisibility? visibility; + @override bool operator ==(Object other) => identical(this, other) || other is UpdateAssetDto && other.dateTimeOriginal == dateTimeOriginal && other.description == description && - other.isArchived == isArchived && other.isFavorite == isFavorite && other.latitude == latitude && other.livePhotoVideoId == livePhotoVideoId && other.longitude == longitude && - other.rating == rating; + other.rating == rating && + other.visibility == visibility; @override int get hashCode => // ignore: unnecessary_parenthesis (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + (description == null ? 0 : description!.hashCode) + - (isArchived == null ? 0 : isArchived!.hashCode) + (isFavorite == null ? 0 : isFavorite!.hashCode) + (latitude == null ? 0 : latitude!.hashCode) + (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) + (longitude == null ? 0 : longitude!.hashCode) + - (rating == null ? 0 : rating!.hashCode); + (rating == null ? 0 : rating!.hashCode) + + (visibility == null ? 0 : visibility!.hashCode); @override - String toString() => 'UpdateAssetDto[dateTimeOriginal=$dateTimeOriginal, description=$description, isArchived=$isArchived, isFavorite=$isFavorite, latitude=$latitude, livePhotoVideoId=$livePhotoVideoId, longitude=$longitude, rating=$rating]'; + String toString() => 'UpdateAssetDto[dateTimeOriginal=$dateTimeOriginal, description=$description, isFavorite=$isFavorite, latitude=$latitude, livePhotoVideoId=$livePhotoVideoId, longitude=$longitude, rating=$rating, visibility=$visibility]'; Map toJson() { final json = {}; @@ -121,11 +121,6 @@ class UpdateAssetDto { } else { // json[r'description'] = null; } - if (this.isArchived != null) { - json[r'isArchived'] = this.isArchived; - } else { - // json[r'isArchived'] = null; - } if (this.isFavorite != null) { json[r'isFavorite'] = this.isFavorite; } else { @@ -151,6 +146,11 @@ class UpdateAssetDto { } else { // json[r'rating'] = null; } + if (this.visibility != null) { + json[r'visibility'] = this.visibility; + } else { + // json[r'visibility'] = null; + } return json; } @@ -165,12 +165,12 @@ class UpdateAssetDto { return UpdateAssetDto( dateTimeOriginal: mapValueOfType(json, r'dateTimeOriginal'), description: mapValueOfType(json, r'description'), - isArchived: mapValueOfType(json, r'isArchived'), isFavorite: mapValueOfType(json, r'isFavorite'), latitude: num.parse('${json[r'latitude']}'), livePhotoVideoId: mapValueOfType(json, r'livePhotoVideoId'), longitude: num.parse('${json[r'longitude']}'), rating: num.parse('${json[r'rating']}'), + visibility: AssetVisibility.fromJson(json[r'visibility']), ); } return null; diff --git a/mobile/openapi/lib/model/user_admin_update_dto.dart b/mobile/openapi/lib/model/user_admin_update_dto.dart index 951ee8ce84..ee5c006840 100644 --- a/mobile/openapi/lib/model/user_admin_update_dto.dart +++ b/mobile/openapi/lib/model/user_admin_update_dto.dart @@ -17,6 +17,7 @@ class UserAdminUpdateDto { this.email, this.name, this.password, + this.pinCode, this.quotaSizeInBytes, this.shouldChangePassword, this.storageLabel, @@ -48,6 +49,8 @@ class UserAdminUpdateDto { /// String? password; + String? pinCode; + /// Minimum value: 0 int? quotaSizeInBytes; @@ -67,6 +70,7 @@ class UserAdminUpdateDto { other.email == email && other.name == name && other.password == password && + other.pinCode == pinCode && other.quotaSizeInBytes == quotaSizeInBytes && other.shouldChangePassword == shouldChangePassword && other.storageLabel == storageLabel; @@ -78,12 +82,13 @@ class UserAdminUpdateDto { (email == null ? 0 : email!.hashCode) + (name == null ? 0 : name!.hashCode) + (password == null ? 0 : password!.hashCode) + + (pinCode == null ? 0 : pinCode!.hashCode) + (quotaSizeInBytes == null ? 0 : quotaSizeInBytes!.hashCode) + (shouldChangePassword == null ? 0 : shouldChangePassword!.hashCode) + (storageLabel == null ? 0 : storageLabel!.hashCode); @override - String toString() => 'UserAdminUpdateDto[avatarColor=$avatarColor, email=$email, name=$name, password=$password, quotaSizeInBytes=$quotaSizeInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel]'; + String toString() => 'UserAdminUpdateDto[avatarColor=$avatarColor, email=$email, name=$name, password=$password, pinCode=$pinCode, quotaSizeInBytes=$quotaSizeInBytes, shouldChangePassword=$shouldChangePassword, storageLabel=$storageLabel]'; Map toJson() { final json = {}; @@ -107,6 +112,11 @@ class UserAdminUpdateDto { } else { // json[r'password'] = null; } + if (this.pinCode != null) { + json[r'pinCode'] = this.pinCode; + } else { + // json[r'pinCode'] = null; + } if (this.quotaSizeInBytes != null) { json[r'quotaSizeInBytes'] = this.quotaSizeInBytes; } else { @@ -138,6 +148,7 @@ class UserAdminUpdateDto { email: mapValueOfType(json, r'email'), name: mapValueOfType(json, r'name'), password: mapValueOfType(json, r'password'), + pinCode: mapValueOfType(json, r'pinCode'), quotaSizeInBytes: mapValueOfType(json, r'quotaSizeInBytes'), shouldChangePassword: mapValueOfType(json, r'shouldChangePassword'), storageLabel: mapValueOfType(json, r'storageLabel'), diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 0951177c72..a98750edaa 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -1781,14 +1781,6 @@ "get": { "operationId": "getAssetStatistics", "parameters": [ - { - "name": "isArchived", - "required": false, - "in": "query", - "schema": { - "type": "boolean" - } - }, { "name": "isFavorite", "required": false, @@ -1804,6 +1796,14 @@ "schema": { "type": "boolean" } + }, + { + "name": "visibility", + "required": false, + "in": "query", + "schema": { + "$ref": "#/components/schemas/AssetVisibility" + } } ], "responses": { @@ -2294,6 +2294,139 @@ ] } }, + "/auth/pin-code": { + "delete": { + "operationId": "resetPinCode", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PinCodeChangeDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "Authentication" + ] + }, + "post": { + "operationId": "setupPinCode", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PinCodeSetupDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "Authentication" + ] + }, + "put": { + "operationId": "changePinCode", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PinCodeChangeDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "Authentication" + ] + } + }, + "/auth/status": { + "get": { + "operationId": "getAuthStatus", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthStatusResponseDto" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "Authentication" + ] + } + }, "/auth/validateToken": { "post": { "operationId": "validateAccessToken", @@ -6909,14 +7042,6 @@ "type": "string" } }, - { - "name": "isArchived", - "required": false, - "in": "query", - "schema": { - "type": "boolean" - } - }, { "name": "isFavorite", "required": false, @@ -6992,6 +7117,14 @@ "type": "string" } }, + { + "name": "visibility", + "required": false, + "in": "query", + "schema": { + "$ref": "#/components/schemas/AssetVisibility" + } + }, { "name": "withPartners", "required": false, @@ -7053,14 +7186,6 @@ "type": "string" } }, - { - "name": "isArchived", - "required": false, - "in": "query", - "schema": { - "type": "boolean" - } - }, { "name": "isFavorite", "required": false, @@ -7128,6 +7253,14 @@ "type": "string" } }, + { + "name": "visibility", + "required": false, + "in": "query", + "schema": { + "$ref": "#/components/schemas/AssetVisibility" + } + }, { "name": "withPartners", "required": false, @@ -8273,9 +8406,6 @@ }, "type": "array" }, - "isArchived": { - "type": "boolean" - }, "isFavorite": { "type": "boolean" }, @@ -8289,6 +8419,13 @@ "maximum": 5, "minimum": -1, "type": "number" + }, + "visibility": { + "allOf": [ + { + "$ref": "#/components/schemas/AssetVisibility" + } + ] } }, "required": [ @@ -8713,15 +8850,9 @@ "format": "date-time", "type": "string" }, - "isArchived": { - "type": "boolean" - }, "isFavorite": { "type": "boolean" }, - "isVisible": { - "type": "boolean" - }, "livePhotoVideoId": { "format": "uuid", "type": "string" @@ -8729,6 +8860,13 @@ "sidecarData": { "format": "binary", "type": "string" + }, + "visibility": { + "allOf": [ + { + "$ref": "#/components/schemas/AssetVisibility" + } + ] } }, "required": [ @@ -9009,6 +9147,14 @@ ], "type": "string" }, + "AssetVisibility": { + "enum": [ + "archive", + "timeline", + "hidden" + ], + "type": "string" + }, "AudioCodec": { "enum": [ "mp3", @@ -9018,6 +9164,21 @@ ], "type": "string" }, + "AuthStatusResponseDto": { + "properties": { + "password": { + "type": "boolean" + }, + "pinCode": { + "type": "boolean" + } + }, + "required": [ + "password", + "pinCode" + ], + "type": "object" + }, "AvatarUpdate": { "properties": { "color": { @@ -10204,9 +10365,6 @@ "format": "uuid", "type": "string" }, - "isArchived": { - "type": "boolean" - }, "isEncoded": { "type": "boolean" }, @@ -10222,9 +10380,6 @@ "isOffline": { "type": "boolean" }, - "isVisible": { - "type": "boolean" - }, "lensModel": { "nullable": true, "type": "string" @@ -10324,9 +10479,12 @@ "format": "date-time", "type": "string" }, - "withArchived": { - "default": false, - "type": "boolean" + "visibility": { + "allOf": [ + { + "$ref": "#/components/schemas/AssetVisibility" + } + ] }, "withDeleted": { "type": "boolean" @@ -10954,6 +11112,37 @@ ], "type": "object" }, + "PinCodeChangeDto": { + "properties": { + "newPinCode": { + "example": "123456", + "type": "string" + }, + "password": { + "type": "string" + }, + "pinCode": { + "example": "123456", + "type": "string" + } + }, + "required": [ + "newPinCode" + ], + "type": "object" + }, + "PinCodeSetupDto": { + "properties": { + "pinCode": { + "example": "123456", + "type": "string" + } + }, + "required": [ + "pinCode" + ], + "type": "object" + }, "PlacesResponseDto": { "properties": { "admin1name": { @@ -11041,9 +11230,6 @@ "deviceId": { "type": "string" }, - "isArchived": { - "type": "boolean" - }, "isEncoded": { "type": "boolean" }, @@ -11059,9 +11245,6 @@ "isOffline": { "type": "boolean" }, - "isVisible": { - "type": "boolean" - }, "lensModel": { "nullable": true, "type": "string" @@ -11137,9 +11320,12 @@ "format": "date-time", "type": "string" }, - "withArchived": { - "default": false, - "type": "boolean" + "visibility": { + "allOf": [ + { + "$ref": "#/components/schemas/AssetVisibility" + } + ] }, "withDeleted": { "type": "boolean" @@ -11989,9 +12175,6 @@ "deviceId": { "type": "string" }, - "isArchived": { - "type": "boolean" - }, "isEncoded": { "type": "boolean" }, @@ -12007,9 +12190,6 @@ "isOffline": { "type": "boolean" }, - "isVisible": { - "type": "boolean" - }, "language": { "type": "string" }, @@ -12095,9 +12275,12 @@ "format": "date-time", "type": "string" }, - "withArchived": { - "default": false, - "type": "boolean" + "visibility": { + "allOf": [ + { + "$ref": "#/components/schemas/AssetVisibility" + } + ] }, "withDeleted": { "type": "boolean" @@ -12381,9 +12564,6 @@ "isFavorite": { "type": "boolean" }, - "isVisible": { - "type": "boolean" - }, "localDateTime": { "format": "date-time", "nullable": true, @@ -12404,6 +12584,14 @@ "OTHER" ], "type": "string" + }, + "visibility": { + "enum": [ + "archive", + "timeline", + "hidden" + ], + "type": "string" } }, "required": [ @@ -12413,11 +12601,11 @@ "fileModifiedAt", "id", "isFavorite", - "isVisible", "localDateTime", "ownerId", "thumbhash", - "type" + "type", + "visibility" ], "type": "object" }, @@ -13671,9 +13859,6 @@ "description": { "type": "string" }, - "isArchived": { - "type": "boolean" - }, "isFavorite": { "type": "boolean" }, @@ -13692,6 +13877,13 @@ "maximum": 5, "minimum": -1, "type": "number" + }, + "visibility": { + "allOf": [ + { + "$ref": "#/components/schemas/AssetVisibility" + } + ] } }, "type": "object" @@ -13945,6 +14137,11 @@ "password": { "type": "string" }, + "pinCode": { + "example": "123456", + "nullable": true, + "type": "string" + }, "quotaSizeInBytes": { "format": "int64", "minimum": 0, diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 20fb72b486..41898e12da 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -123,6 +123,7 @@ export type UserAdminUpdateDto = { email?: string; name?: string; password?: string; + pinCode?: string | null; quotaSizeInBytes?: number | null; shouldChangePassword?: boolean; storageLabel?: string | null; @@ -413,11 +414,10 @@ export type AssetMediaCreateDto = { duration?: string; fileCreatedAt: string; fileModifiedAt: string; - isArchived?: boolean; isFavorite?: boolean; - isVisible?: boolean; livePhotoVideoId?: string; sidecarData?: Blob; + visibility?: AssetVisibility; }; export type AssetMediaResponseDto = { id: string; @@ -427,11 +427,11 @@ export type AssetBulkUpdateDto = { dateTimeOriginal?: string; duplicateId?: string | null; ids: string[]; - isArchived?: boolean; isFavorite?: boolean; latitude?: number; longitude?: number; rating?: number; + visibility?: AssetVisibility; }; export type AssetBulkUploadCheckItem = { /** base64 or hex encoded sha1 hash */ @@ -470,12 +470,12 @@ export type AssetStatsResponseDto = { export type UpdateAssetDto = { dateTimeOriginal?: string; description?: string; - isArchived?: boolean; isFavorite?: boolean; latitude?: number; livePhotoVideoId?: string | null; longitude?: number; rating?: number; + visibility?: AssetVisibility; }; export type AssetMediaReplaceDto = { assetData: Blob; @@ -511,6 +511,18 @@ export type LogoutResponseDto = { redirectUri: string; successful: boolean; }; +export type PinCodeChangeDto = { + newPinCode: string; + password?: string; + pinCode?: string; +}; +export type PinCodeSetupDto = { + pinCode: string; +}; +export type AuthStatusResponseDto = { + password: boolean; + pinCode: boolean; +}; export type ValidateAccessTokenResponseDto = { authStatus: boolean; }; @@ -815,13 +827,11 @@ export type MetadataSearchDto = { deviceId?: string; encodedVideoPath?: string; id?: string; - isArchived?: boolean; isEncoded?: boolean; isFavorite?: boolean; isMotion?: boolean; isNotInAlbum?: boolean; isOffline?: boolean; - isVisible?: boolean; lensModel?: string | null; libraryId?: string | null; make?: string; @@ -844,7 +854,7 @@ export type MetadataSearchDto = { "type"?: AssetTypeEnum; updatedAfter?: string; updatedBefore?: string; - withArchived?: boolean; + visibility?: AssetVisibility; withDeleted?: boolean; withExif?: boolean; withPeople?: boolean; @@ -888,13 +898,11 @@ export type RandomSearchDto = { createdAfter?: string; createdBefore?: string; deviceId?: string; - isArchived?: boolean; isEncoded?: boolean; isFavorite?: boolean; isMotion?: boolean; isNotInAlbum?: boolean; isOffline?: boolean; - isVisible?: boolean; lensModel?: string | null; libraryId?: string | null; make?: string; @@ -911,7 +919,7 @@ export type RandomSearchDto = { "type"?: AssetTypeEnum; updatedAfter?: string; updatedBefore?: string; - withArchived?: boolean; + visibility?: AssetVisibility; withDeleted?: boolean; withExif?: boolean; withPeople?: boolean; @@ -923,13 +931,11 @@ export type SmartSearchDto = { createdAfter?: string; createdBefore?: string; deviceId?: string; - isArchived?: boolean; isEncoded?: boolean; isFavorite?: boolean; isMotion?: boolean; isNotInAlbum?: boolean; isOffline?: boolean; - isVisible?: boolean; language?: string; lensModel?: string | null; libraryId?: string | null; @@ -949,7 +955,7 @@ export type SmartSearchDto = { "type"?: AssetTypeEnum; updatedAfter?: string; updatedBefore?: string; - withArchived?: boolean; + visibility?: AssetVisibility; withDeleted?: boolean; withExif?: boolean; }; @@ -1877,18 +1883,18 @@ export function getRandom({ count }: { ...opts })); } -export function getAssetStatistics({ isArchived, isFavorite, isTrashed }: { - isArchived?: boolean; +export function getAssetStatistics({ isFavorite, isTrashed, visibility }: { isFavorite?: boolean; isTrashed?: boolean; + visibility?: AssetVisibility; }, opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; data: AssetStatsResponseDto; }>(`/assets/statistics${QS.query(QS.explode({ - isArchived, isFavorite, - isTrashed + isTrashed, + visibility }))}`, { ...opts })); @@ -2024,6 +2030,41 @@ export function logout(opts?: Oazapfts.RequestOpts) { method: "POST" })); } +export function resetPinCode({ pinCodeChangeDto }: { + pinCodeChangeDto: PinCodeChangeDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchText("/auth/pin-code", oazapfts.json({ + ...opts, + method: "DELETE", + body: pinCodeChangeDto + }))); +} +export function setupPinCode({ pinCodeSetupDto }: { + pinCodeSetupDto: PinCodeSetupDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchText("/auth/pin-code", oazapfts.json({ + ...opts, + method: "POST", + body: pinCodeSetupDto + }))); +} +export function changePinCode({ pinCodeChangeDto }: { + pinCodeChangeDto: PinCodeChangeDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchText("/auth/pin-code", oazapfts.json({ + ...opts, + method: "PUT", + body: pinCodeChangeDto + }))); +} +export function getAuthStatus(opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchJson<{ + status: 200; + data: AuthStatusResponseDto; + }>("/auth/status", { + ...opts + })); +} export function validateAccessToken(opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; @@ -3242,9 +3283,8 @@ export function tagAssets({ id, bulkIdsDto }: { body: bulkIdsDto }))); } -export function getTimeBucket({ albumId, isArchived, isFavorite, isTrashed, key, order, personId, size, tagId, timeBucket, userId, withPartners, withStacked }: { +export function getTimeBucket({ albumId, isFavorite, isTrashed, key, order, personId, size, tagId, timeBucket, userId, visibility, withPartners, withStacked }: { albumId?: string; - isArchived?: boolean; isFavorite?: boolean; isTrashed?: boolean; key?: string; @@ -3254,6 +3294,7 @@ export function getTimeBucket({ albumId, isArchived, isFavorite, isTrashed, key, tagId?: string; timeBucket: string; userId?: string; + visibility?: AssetVisibility; withPartners?: boolean; withStacked?: boolean; }, opts?: Oazapfts.RequestOpts) { @@ -3262,7 +3303,6 @@ export function getTimeBucket({ albumId, isArchived, isFavorite, isTrashed, key, data: AssetResponseDto[]; }>(`/timeline/bucket${QS.query(QS.explode({ albumId, - isArchived, isFavorite, isTrashed, key, @@ -3272,15 +3312,15 @@ export function getTimeBucket({ albumId, isArchived, isFavorite, isTrashed, key, tagId, timeBucket, userId, + visibility, withPartners, withStacked }))}`, { ...opts })); } -export function getTimeBuckets({ albumId, isArchived, isFavorite, isTrashed, key, order, personId, size, tagId, userId, withPartners, withStacked }: { +export function getTimeBuckets({ albumId, isFavorite, isTrashed, key, order, personId, size, tagId, userId, visibility, withPartners, withStacked }: { albumId?: string; - isArchived?: boolean; isFavorite?: boolean; isTrashed?: boolean; key?: string; @@ -3289,6 +3329,7 @@ export function getTimeBuckets({ albumId, isArchived, isFavorite, isTrashed, key size: TimeBucketSize; tagId?: string; userId?: string; + visibility?: AssetVisibility; withPartners?: boolean; withStacked?: boolean; }, opts?: Oazapfts.RequestOpts) { @@ -3297,7 +3338,6 @@ export function getTimeBuckets({ albumId, isArchived, isFavorite, isTrashed, key data: TimeBucketResponseDto[]; }>(`/timeline/buckets${QS.query(QS.explode({ albumId, - isArchived, isFavorite, isTrashed, key, @@ -3306,6 +3346,7 @@ export function getTimeBuckets({ albumId, isArchived, isFavorite, isTrashed, key size, tagId, userId, + visibility, withPartners, withStacked }))}`, { @@ -3620,6 +3661,11 @@ export enum Permission { AdminUserUpdate = "admin.user.update", AdminUserDelete = "admin.user.delete" } +export enum AssetVisibility { + Archive = "archive", + Timeline = "timeline", + Hidden = "hidden" +} export enum AssetMediaStatus { Created = "created", Replaced = "replaced", diff --git a/server/package-lock.json b/server/package-lock.json index 06152e9335..464b2925d4 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -23,7 +23,7 @@ "@opentelemetry/context-async-hooks": "^2.0.0", "@opentelemetry/exporter-prometheus": "^0.200.0", "@opentelemetry/sdk-node": "^0.200.0", - "@react-email/components": "^0.0.36", + "@react-email/components": "^0.0.38", "@socket.io/redis-adapter": "^8.3.0", "archiver": "^7.0.0", "async-lock": "^1.4.0", @@ -1016,9 +1016,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", - "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, "license": "MIT", "engines": { @@ -2118,6 +2118,28 @@ "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", "license": "MIT" }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", + "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", @@ -2608,9 +2630,9 @@ } }, "node_modules/@nestjs/swagger": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.1.5.tgz", - "integrity": "sha512-qVkyUSCvEmfTVWK92hsCeOQaOODlyBGkZC4ldqb4Fi0Gg8/kOWlcPJVN6i4a9edYYSdICUkGnt6UVFgi59fSrQ==", + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.1.6.tgz", + "integrity": "sha512-W5OyhLqUHg8CDy4GC5LBYOyGIq3dxhKNliBZ7xf2Q95+oDzptb3LGp8vwwf1ItEjyGdxM+USDStQPg2oAcxEgw==", "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.15.1", @@ -2952,22 +2974,22 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.58.0.tgz", - "integrity": "sha512-gtqPqkXp8TG6vrmbzAJUKjJm3nrCiVGgImlV1tj8lsVqpnKDCB1Kl7bCcXod36+Tq/O4rCeTDmW90dCHeuv9jQ==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.58.1.tgz", + "integrity": "sha512-hAsNw5XtFTytQ6GrCspIwKKSamXQGfAvRfqOL93VTqaI1WFBhndyXsNrjAzqULvK0JwMJOuZb77ckdrvJrW3vA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", "@opentelemetry/instrumentation-amqplib": "^0.47.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.51.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.51.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.51.1", + "@opentelemetry/instrumentation-aws-sdk": "^0.52.0", "@opentelemetry/instrumentation-bunyan": "^0.46.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.46.0", "@opentelemetry/instrumentation-connect": "^0.44.0", "@opentelemetry/instrumentation-cucumber": "^0.15.0", "@opentelemetry/instrumentation-dataloader": "^0.17.0", "@opentelemetry/instrumentation-dns": "^0.44.0", - "@opentelemetry/instrumentation-express": "^0.48.1", + "@opentelemetry/instrumentation-express": "^0.49.0", "@opentelemetry/instrumentation-fastify": "^0.45.0", "@opentelemetry/instrumentation-fs": "^0.20.0", "@opentelemetry/instrumentation-generic-pool": "^0.44.0", @@ -2976,13 +2998,13 @@ "@opentelemetry/instrumentation-hapi": "^0.46.0", "@opentelemetry/instrumentation-http": "^0.200.0", "@opentelemetry/instrumentation-ioredis": "^0.48.0", - "@opentelemetry/instrumentation-kafkajs": "^0.9.1", + "@opentelemetry/instrumentation-kafkajs": "^0.9.2", "@opentelemetry/instrumentation-knex": "^0.45.0", "@opentelemetry/instrumentation-koa": "^0.48.0", "@opentelemetry/instrumentation-lru-memoizer": "^0.45.0", "@opentelemetry/instrumentation-memcached": "^0.44.0", "@opentelemetry/instrumentation-mongodb": "^0.53.0", - "@opentelemetry/instrumentation-mongoose": "^0.47.0", + "@opentelemetry/instrumentation-mongoose": "^0.47.1", "@opentelemetry/instrumentation-mysql": "^0.46.0", "@opentelemetry/instrumentation-mysql2": "^0.46.0", "@opentelemetry/instrumentation-nestjs-core": "^0.46.0", @@ -3308,9 +3330,9 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.51.0.tgz", - "integrity": "sha512-yPtnDum6vykhxA1xZ2kKc3DGmrLdbRAkJG0HiQUcOas47j716wmtqsLCctHyXgO0NpmS/BCzbUnOxxPG6kln7A==", + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.51.1.tgz", + "integrity": "sha512-DxUihz1ZcJtkCKFMnsr5IpQtU1TFnz/QhTEkcb95yfVvmdWx97ezbcxE4lGFjvQYMT8q2NsZjor8s8W/jrMU2w==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", @@ -3325,9 +3347,9 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.51.0.tgz", - "integrity": "sha512-NfmdJqrgJyAPGzPJk2bNl8vBn2kbDIHyTmKVNWhcQWh0VCA5aspi75Gsp5tHmLqk26VAtVtUEDZwK3nApFEtzw==", + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.52.0.tgz", + "integrity": "sha512-xMnghwQP/vO9hNNufaHW3SgNprifLPqmssAQ/zjRopbxa6wpBqunWfKYRRoyu89Xlw0X8/hGNoPEh+CIocCryg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -3440,9 +3462,9 @@ } }, "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.48.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.48.1.tgz", - "integrity": "sha512-j8NYOf9DRWtchbWor/zA0poI42TpZG9tViIKA0e1lC+6MshTqSJYtgNv8Fn1sx1Wn/TRyp+5OgSXiE4LDfvpEg==", + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.49.0.tgz", + "integrity": "sha512-j1hbIZzbu7jLQfI/Hz0wHDaniiSWdC3B8/UdH0CEd4lcO8y0pQlz4UTReBaL1BzbkwUhbg6oHuK+m8DXklQPtA==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -3588,9 +3610,9 @@ } }, "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.9.1.tgz", - "integrity": "sha512-eGl5WKBqd0unOKm7PJKjEa1G+ac9nvpDjyv870nUYuSnUkyDc/Fag5keddIjHixTJwRp3FmyP7n+AadAjh52Vw==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.9.2.tgz", + "integrity": "sha512-aRnrLK3gQv6LP64oiXEDdRVwxNe7AvS98SCtNWEGhHy4nv3CdxpN7b7NU53g3PCF7uPQZ1fVW2C6Xc2tt1SIkg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.200.0", @@ -3685,9 +3707,9 @@ } }, "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.47.0.tgz", - "integrity": "sha512-zg4ixMNmuACda75eOFa1m5h794zC9wp397stX0LAZvOylSb6dWT52P6ElkVQMV42C/27liEdQWxpabsamB+XPQ==", + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.47.1.tgz", + "integrity": "sha512-0OcL5YpZX9PtF55Oi1RtWUdjElJscR9u6NzAdww81EQc3wFfQWmdREUEBeWaDH5jpiomdFp6zDXms622ofEOjg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^2.0.0", @@ -4407,12 +4429,12 @@ } }, "node_modules/@react-email/code-block": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.12.tgz", - "integrity": "sha512-Faw3Ij9+/Qwq6moWaeHnV8Hn7ekc/EqyAzPi6yUar21dhcqYugCC4Da1x4d9nA9zC0H9KU3lYVJczh8D3cA+Eg==", + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.0.13.tgz", + "integrity": "sha512-4DE4yPSgKEOnZMzcrDvRuD6mxsNxOex0hCYEG9F9q23geYgb2WCCeGBvIUXVzK69l703Dg4Vzrd5qUjl+JfcwA==", "license": "MIT", "dependencies": { - "prismjs": "1.30.0" + "prismjs": "^1.30.0" }, "engines": { "node": ">=18.0.0" @@ -4446,14 +4468,14 @@ } }, "node_modules/@react-email/components": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.36.tgz", - "integrity": "sha512-VMh+OQplAnG8JMLlJjdnjt+ThJZ+JVkp0q2YMS2NEz+T88N22bLD2p7DZO0QgtNaKgumOhJI/0a2Q7VzCrwu5g==", + "version": "0.0.38", + "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.38.tgz", + "integrity": "sha512-2cjMBZsSPjD1Iyur/MzGrgW/n5A6ONOJQ97pNaVOClxz/EaqNZTo1lFmKdH7p54P7LG9ZxRXxoTe2075VCCGQA==", "license": "MIT", "dependencies": { "@react-email/body": "0.0.11", "@react-email/button": "0.0.19", - "@react-email/code-block": "0.0.12", + "@react-email/code-block": "0.0.13", "@react-email/code-inline": "0.0.5", "@react-email/column": "0.0.13", "@react-email/container": "0.0.15", @@ -4464,13 +4486,13 @@ "@react-email/html": "0.0.11", "@react-email/img": "0.0.11", "@react-email/link": "0.0.12", - "@react-email/markdown": "0.0.14", + "@react-email/markdown": "0.0.15", "@react-email/preview": "0.0.12", - "@react-email/render": "1.0.6", + "@react-email/render": "1.1.0", "@react-email/row": "0.0.12", "@react-email/section": "0.0.16", - "@react-email/tailwind": "1.0.4", - "@react-email/text": "0.1.1" + "@react-email/tailwind": "1.0.5", + "@react-email/text": "0.1.3" }, "engines": { "node": ">=18.0.0" @@ -4573,12 +4595,12 @@ } }, "node_modules/@react-email/markdown": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/@react-email/markdown/-/markdown-0.0.14.tgz", - "integrity": "sha512-5IsobCyPkb4XwnQO8uFfGcNOxnsg3311GRXhJ3uKv51P7Jxme4ycC/MITnwIZ10w2zx7HIyTiqVzTj4XbuIHbg==", + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@react-email/markdown/-/markdown-0.0.15.tgz", + "integrity": "sha512-UQA9pVm5sbflgtg3EX3FquUP4aMBzmLReLbGJ6DZQZnAskBF36aI56cRykDq1o+1jT+CKIK1CducPYziaXliag==", "license": "MIT", "dependencies": { - "md-to-react-email": "5.0.5" + "md-to-react-email": "^5.0.5" }, "engines": { "node": ">=18.0.0" @@ -4600,14 +4622,14 @@ } }, "node_modules/@react-email/render": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.0.6.tgz", - "integrity": "sha512-zNueW5Wn/4jNC1c5LFgXzbUdv5Lhms+FWjOvWAhal7gx5YVf0q6dPJ0dnR70+ifo59gcMLwCZEaTS9EEuUhKvQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-1.1.0.tgz", + "integrity": "sha512-X4CsHvXi5X7kTn5NgXNGg8Y5U1VtVJmlpNLlTc2E8RVHKFS3bpr+o/ZXhEPN4yRkdY+ZYN5eqVTV922Hujqsxw==", "license": "MIT", "dependencies": { - "html-to-text": "9.0.5", - "prettier": "3.5.3", - "react-promise-suspense": "0.3.4" + "html-to-text": "^9.0.5", + "prettier": "^3.5.3", + "react-promise-suspense": "^0.3.4" }, "engines": { "node": ">=18.0.0" @@ -4642,9 +4664,9 @@ } }, "node_modules/@react-email/tailwind": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-1.0.4.tgz", - "integrity": "sha512-tJdcusncdqgvTUYZIuhNC6LYTfL9vNTSQpwWdTCQhQ1lsrNCEE4OKCSdzSV3S9F32pi0i0xQ+YPJHKIzGjdTSA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-1.0.5.tgz", + "integrity": "sha512-BH00cZSeFfP9HiDASl+sPHi7Hh77W5nzDgdnxtsVr/m3uQD9g180UwxcE3PhOfx0vRdLzQUU8PtmvvDfbztKQg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -4654,9 +4676,9 @@ } }, "node_modules/@react-email/text": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.1.1.tgz", - "integrity": "sha512-Zo9tSEzkO3fODLVH1yVhzVCiwETfeEL5wU93jXKWo2DHoMuiZ9Iabaso3T0D0UjhrCB1PBMeq2YiejqeToTyIQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.1.3.tgz", + "integrity": "sha512-H22KR54MXUg29a+1/lTfg9oCQA65V8+TL4v19OzV7RsOxnEnzGOc287XKh8vc+v7ENewrMV97BzUPOnKz3bqkA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -4804,9 +4826,9 @@ "license": "MIT" }, "node_modules/@swc/core": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.21.tgz", - "integrity": "sha512-/Y3BJLcwd40pExmdar8MH2UGGvCBrqNN7hauOMckrEX2Ivcbv3IMhrbGX4od1dnF880Ed8y/E9aStZCIQi0EGw==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz", + "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -4822,16 +4844,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.21", - "@swc/core-darwin-x64": "1.11.21", - "@swc/core-linux-arm-gnueabihf": "1.11.21", - "@swc/core-linux-arm64-gnu": "1.11.21", - "@swc/core-linux-arm64-musl": "1.11.21", - "@swc/core-linux-x64-gnu": "1.11.21", - "@swc/core-linux-x64-musl": "1.11.21", - "@swc/core-win32-arm64-msvc": "1.11.21", - "@swc/core-win32-ia32-msvc": "1.11.21", - "@swc/core-win32-x64-msvc": "1.11.21" + "@swc/core-darwin-arm64": "1.11.24", + "@swc/core-darwin-x64": "1.11.24", + "@swc/core-linux-arm-gnueabihf": "1.11.24", + "@swc/core-linux-arm64-gnu": "1.11.24", + "@swc/core-linux-arm64-musl": "1.11.24", + "@swc/core-linux-x64-gnu": "1.11.24", + "@swc/core-linux-x64-musl": "1.11.24", + "@swc/core-win32-arm64-msvc": "1.11.24", + "@swc/core-win32-ia32-msvc": "1.11.24", + "@swc/core-win32-x64-msvc": "1.11.24" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" @@ -4842,10 +4864,95 @@ } } }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz", + "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz", + "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz", + "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz", + "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz", + "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.21.tgz", - "integrity": "sha512-NesdBXv4CvVEaFUlqKj+GA4jJMNUzK2NtKOrUNEtTbXaVyNiXjFCSaDajMTedEB0jTAd9ybB0aBvwhgkJUWkWA==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz", + "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==", "cpu": [ "x64" ], @@ -4860,9 +4967,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.21.tgz", - "integrity": "sha512-qFV60pwpKVOdmX67wqQzgtSrUGWX9Cibnp1CXyqZ9Mmt8UyYGvmGu7p6PMbTyX7vdpVUvWVRf8DzrW2//wmVHg==", + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz", + "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==", "cpu": [ "x64" ], @@ -4876,6 +4983,57 @@ "node": ">=10" } }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz", + "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz", + "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz", + "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -4905,23 +5063,23 @@ } }, "node_modules/@testcontainers/postgresql": { - "version": "10.24.2", - "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-10.24.2.tgz", - "integrity": "sha512-s4k/QVSmpXFzxNBeft84x172Hx5tNiGeDRWwU8iOAHjtcnyXd4aBORF0GruNojTo7TOIuAM0ArBZUMqRBLJKwQ==", + "version": "10.25.0", + "resolved": "https://registry.npmjs.org/@testcontainers/postgresql/-/postgresql-10.25.0.tgz", + "integrity": "sha512-VkpqpX9YZ8aq4wfk6sJRopGTmlBdE1kErzAFWJ/1pY/XrEZ7nxdfFBG+En2icQnbv3BIFQYysEKxEFMNB+hQVw==", "dev": true, "license": "MIT", "dependencies": { - "testcontainers": "^10.24.2" + "testcontainers": "^10.25.0" } }, "node_modules/@testcontainers/redis": { - "version": "10.24.2", - "resolved": "https://registry.npmjs.org/@testcontainers/redis/-/redis-10.24.2.tgz", - "integrity": "sha512-m4/FZW5ltZPaK9pQTKNipjpBk73Vdj7Ql3sFr26A9dOr0wJyM3Wnc9jeHTNRal7RDnY5rvumXAIUWbBlvKMJEw==", + "version": "10.25.0", + "resolved": "https://registry.npmjs.org/@testcontainers/redis/-/redis-10.25.0.tgz", + "integrity": "sha512-ALNrrnYnB59kV5c/EjiUkzn0roCtcnOu2KfHHF8xBi3vq3dYSqzADL8rL2BExeoFhyaEtlUT9P4ZecRB60O+/Q==", "dev": true, "license": "MIT", "dependencies": { - "testcontainers": "^10.24.2" + "testcontainers": "^10.25.0" } }, "node_modules/@tokenizer/inflate": { @@ -5527,17 +5685,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.0.tgz", - "integrity": "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", + "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/type-utils": "8.31.0", - "@typescript-eslint/utils": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/type-utils": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -5557,16 +5715,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.0.tgz", - "integrity": "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", + "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4" }, "engines": { @@ -5582,14 +5740,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", - "integrity": "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", + "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0" + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5600,14 +5758,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.0.tgz", - "integrity": "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", + "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/utils": "8.31.0", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/utils": "8.31.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -5624,9 +5782,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", - "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", + "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", "dev": true, "license": "MIT", "engines": { @@ -5638,14 +5796,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", - "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", + "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5691,16 +5849,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.0.tgz", - "integrity": "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", + "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0" + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5715,13 +5873,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", - "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", + "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/types": "8.31.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -6886,9 +7044,9 @@ } }, "node_modules/bullmq": { - "version": "5.51.0", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.51.0.tgz", - "integrity": "sha512-YjX+CO2U4nmbCq2ZgNb/Hnu6Xk953j8EFmp0eehTuudavPyNstoZsbnyvvM6PX9rfD9clhcc5kRLyyWoFEM3Lg==", + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.52.1.tgz", + "integrity": "sha512-u7CSV9wID3MBEX2DNubEErbAlrADgm8abUBAi6h8rQTnuTkhhgMs2iD7uhqplK8lIgUOkBIW3sDJWaMSInH47A==", "license": "MIT", "dependencies": { "cron-parser": "^4.9.0", @@ -7332,13 +7490,13 @@ "license": "MIT" }, "node_modules/class-validator": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", - "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.2.tgz", + "integrity": "sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==", "license": "MIT", "dependencies": { "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.10.53", + "libphonenumber-js": "^1.11.1", "validator": "^13.9.0" } }, @@ -8739,9 +8897,9 @@ } }, "node_modules/eslint": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", - "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8751,11 +8909,12 @@ "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.25.1", + "@eslint/js": "9.26.0", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -8779,7 +8938,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" @@ -8813,9 +8973,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.3.1.tgz", + "integrity": "sha512-vad9VWgEm9xaVXRNmb4aeOt0PWDc61IAdzghkbYQ2wavgax148iKoX1rNJcgkBGCipzLzOnHYVgL7xudM9yccQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9051,6 +9211,29 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/exiftool-vendored": { "version": "28.8.0", "resolved": "https://registry.npmjs.org/exiftool-vendored/-/exiftool-vendored-28.8.0.tgz", @@ -9137,6 +9320,22 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -13108,13 +13307,13 @@ } }, "node_modules/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-EpAhHFQc+aH9VfeffWIVC+XXk6lmAhS9W1FxtxcPXs94yxhrI1I6w/zkWfIOII/OkBv3Be04X3xMOj0kQ78l6w==", + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==", "license": "MIT", "dependencies": { "pg-connection-string": "^2.8.5", - "pg-pool": "^3.9.5", + "pg-pool": "^3.9.6", "pg-protocol": "^1.9.5", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -13234,6 +13433,16 @@ "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -16198,9 +16407,9 @@ } }, "node_modules/testcontainers": { - "version": "10.24.2", - "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.24.2.tgz", - "integrity": "sha512-Don3EXEQuSw14+nFG9pj48fL9ck/jXDfR9Rb0K3acOyn/gg97+gsnfZaLzpdejl9GcPJVKxACNRe3SYVC2uWqg==", + "version": "10.25.0", + "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.25.0.tgz", + "integrity": "sha512-X3x6cjorEMgei1vVx3M7dnTMzWoWOTi4krpUf3C2iOvOcwsaMUHbca9J4yzpN65ieiWhcK2dA5dxpZyUonwC2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -16822,15 +17031,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.0.tgz", - "integrity": "sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", + "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.31.0", - "@typescript-eslint/parser": "8.31.0", - "@typescript-eslint/utils": "8.31.0" + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "@typescript-eslint/utils": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -17986,6 +18195,26 @@ "engines": { "node": ">= 14" } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/server/package.json b/server/package.json index b4a8841156..fa52fcb009 100644 --- a/server/package.json +++ b/server/package.json @@ -48,7 +48,7 @@ "@opentelemetry/context-async-hooks": "^2.0.0", "@opentelemetry/exporter-prometheus": "^0.200.0", "@opentelemetry/sdk-node": "^0.200.0", - "@react-email/components": "^0.0.36", + "@react-email/components": "^0.0.38", "@socket.io/redis-adapter": "^8.3.0", "archiver": "^7.0.0", "async-lock": "^1.4.0", diff --git a/server/src/controllers/activity.controller.spec.ts b/server/src/controllers/activity.controller.spec.ts new file mode 100644 index 0000000000..bf2038048f --- /dev/null +++ b/server/src/controllers/activity.controller.spec.ts @@ -0,0 +1,81 @@ +import { ActivityController } from 'src/controllers/activity.controller'; +import { ActivityService } from 'src/services/activity.service'; +import request from 'supertest'; +import { factory } from 'test/small.factory'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(ActivityController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(ActivityService); + + beforeAll(async () => { + ctx = await controllerSetup(ActivityController, [{ provide: ActivityService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('GET /activities', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/activities'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require an albumId', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/activities'); + expect(status).toEqual(400); + expect(body).toEqual(factory.responses.badRequest(expect.arrayContaining(['albumId must be a UUID']))); + }); + + it('should reject an invalid albumId', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/activities').query({ albumId: '123' }); + expect(status).toEqual(400); + expect(body).toEqual(factory.responses.badRequest(expect.arrayContaining(['albumId must be a UUID']))); + }); + + it('should reject an invalid assetId', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .get('/activities') + .query({ albumId: factory.uuid(), assetId: '123' }); + expect(status).toEqual(400); + expect(body).toEqual(factory.responses.badRequest(expect.arrayContaining(['assetId must be a UUID']))); + }); + }); + + describe('POST /activities', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/activities'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require an albumId', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/activities').send({ albumId: '123' }); + expect(status).toEqual(400); + expect(body).toEqual(factory.responses.badRequest(expect.arrayContaining(['albumId must be a UUID']))); + }); + + it('should require a comment when type is comment', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/activities') + .send({ albumId: factory.uuid(), type: 'comment', comment: null }); + expect(status).toEqual(400); + expect(body).toEqual(factory.responses.badRequest(['comment must be a string', 'comment should not be empty'])); + }); + }); + + describe('DELETE /activities/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).delete(`/activities/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid uuid', async () => { + const { status, body } = await request(ctx.getHttpServer()).delete(`/activities/123`); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['id must be a UUID'])); + }); + }); +}); diff --git a/server/src/controllers/album.controller.spec.ts b/server/src/controllers/album.controller.spec.ts new file mode 100644 index 0000000000..9b8a19c129 --- /dev/null +++ b/server/src/controllers/album.controller.spec.ts @@ -0,0 +1,88 @@ +import { AlbumController } from 'src/controllers/album.controller'; +import { AlbumService } from 'src/services/album.service'; +import request from 'supertest'; +import { factory } from 'test/small.factory'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(AlbumController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(AlbumService); + + beforeAll(async () => { + ctx = await controllerSetup(AlbumController, [{ provide: AlbumService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('GET /albums', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/albums'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should reject an invalid shared param', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/albums?shared=invalid'); + expect(status).toEqual(400); + expect(body).toEqual(factory.responses.badRequest(['shared must be a boolean value'])); + }); + + it('should reject an invalid assetId param', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/albums?assetId=invalid'); + expect(status).toEqual(400); + expect(body).toEqual(factory.responses.badRequest(['assetId must be a UUID'])); + }); + }); + + describe('GET /albums/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/albums/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /albums/statistics', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/albums/statistics'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('POST /albums', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/albums').send({ albumName: 'New album' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('PUT /albums/:id/assets', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put(`/albums/${factory.uuid()}/assets`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('PATCH /albums/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).patch(`/albums/${factory.uuid()}`).send({ albumName: 'New album name' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('DELETE /albums/:id/assets', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).delete(`/albums/${factory.uuid()}/assets`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('PUT :id/users', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put(`/albums/${factory.uuid()}/users`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); +}); diff --git a/server/src/controllers/api-key.controller.spec.ts b/server/src/controllers/api-key.controller.spec.ts new file mode 100644 index 0000000000..3246eb9b77 --- /dev/null +++ b/server/src/controllers/api-key.controller.spec.ts @@ -0,0 +1,73 @@ +import { APIKeyController } from 'src/controllers/api-key.controller'; +import { ApiKeyService } from 'src/services/api-key.service'; +import request from 'supertest'; +import { factory } from 'test/small.factory'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(APIKeyController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(ApiKeyService); + + beforeAll(async () => { + ctx = await controllerSetup(APIKeyController, [{ provide: ApiKeyService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('POST /api-keys', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/api-keys').send({ name: 'API Key' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /api-keys', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/api-keys'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /api-keys/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/api-keys/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid uuid', async () => { + const { status, body } = await request(ctx.getHttpServer()).get(`/api-keys/123`); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['id must be a UUID'])); + }); + }); + + describe('PUT /api-keys/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put(`/api-keys/${factory.uuid()}`).send({ name: 'new name' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid uuid', async () => { + const { status, body } = await request(ctx.getHttpServer()).put(`/api-keys/123`).send({ name: 'new name' }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['id must be a UUID'])); + }); + }); + + describe('DELETE /api-keys/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).delete(`/api-keys/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid uuid', async () => { + const { status, body } = await request(ctx.getHttpServer()).delete(`/api-keys/123`); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['id must be a UUID'])); + }); + }); +}); diff --git a/server/src/controllers/app.controller.spec.ts b/server/src/controllers/app.controller.spec.ts new file mode 100644 index 0000000000..4cc00e78c5 --- /dev/null +++ b/server/src/controllers/app.controller.spec.ts @@ -0,0 +1,49 @@ +import { AppController } from 'src/controllers/app.controller'; +import { SystemConfigService } from 'src/services/system-config.service'; +import request from 'supertest'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(AppController.name, () => { + let ctx: ControllerContext; + + beforeAll(async () => { + ctx = await controllerSetup(AppController, [ + { provide: SystemConfigService, useValue: mockBaseService(SystemConfigService) }, + ]); + return () => ctx.close(); + }); + + beforeEach(() => { + ctx.reset(); + }); + + describe('GET /.well-known/immich', () => { + it('should not be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/.well-known/immich'); + expect(ctx.authenticate).not.toHaveBeenCalled(); + }); + + it('should return a 200 status code', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/.well-known/immich'); + expect(status).toBe(200); + expect(body).toEqual({ + api: { + endpoint: '/api', + }, + }); + }); + }); + + describe('GET /custom.css', () => { + it('should not be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/custom.css'); + expect(ctx.authenticate).not.toHaveBeenCalled(); + }); + + it('should reply with text/css', async () => { + const { status, headers } = await request(ctx.getHttpServer()).get('/custom.css'); + expect(status).toBe(200); + expect(headers['content-type']).toEqual('text/css; charset=utf-8'); + }); + }); +}); diff --git a/server/src/controllers/asset-media.controller.spec.ts b/server/src/controllers/asset-media.controller.spec.ts new file mode 100644 index 0000000000..67bdeff222 --- /dev/null +++ b/server/src/controllers/asset-media.controller.spec.ts @@ -0,0 +1,128 @@ +import { AssetMediaController } from 'src/controllers/asset-media.controller'; +import { LoggingRepository } from 'src/repositories/logging.repository'; +import { AssetMediaService } from 'src/services/asset-media.service'; +import request from 'supertest'; +import { factory } from 'test/small.factory'; +import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +const makeUploadDto = (options?: { omit: string }): Record => { + const dto: Record = { + deviceAssetId: 'example-image', + deviceId: 'TEST', + fileCreatedAt: new Date().toISOString(), + fileModifiedAt: new Date().toISOString(), + isFavorite: 'testing', + duration: '0:00:00.000000', + }; + + const omit = options?.omit; + if (omit) { + delete dto[omit]; + } + + return dto; +}; + +describe(AssetMediaController.name, () => { + let ctx: ControllerContext; + const assetData = Buffer.from('123'); + const filename = 'example.png'; + + beforeAll(async () => { + ctx = await controllerSetup(AssetMediaController, [ + { provide: LoggingRepository, useValue: automock(LoggingRepository, { strict: false }) }, + { provide: AssetMediaService, useValue: mockBaseService(AssetMediaService) }, + ]); + return () => ctx.close(); + }); + + beforeEach(() => { + ctx.reset(); + }); + + describe('POST /assets', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post(`/assets`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require `deviceAssetId`', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/assets') + .attach('assetData', assetData, filename) + .field({ ...makeUploadDto({ omit: 'deviceAssetId' }) }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + }); + + it('should require `deviceId`', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/assets') + .attach('assetData', assetData, filename) + .field({ ...makeUploadDto({ omit: 'deviceId' }) }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + }); + + it('should require `fileCreatedAt`', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/assets') + .attach('assetData', assetData, filename) + .field({ ...makeUploadDto({ omit: 'fileCreatedAt' }) }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + }); + + it('should require `fileModifiedAt`', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/assets') + .attach('assetData', assetData, filename) + .field({ ...makeUploadDto({ omit: 'fileModifiedAt' }) }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + }); + + it('should require `duration`', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/assets') + .attach('assetData', assetData, filename) + .field({ ...makeUploadDto({ omit: 'duration' }) }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + }); + + it('should throw if `isFavorite` is not a boolean', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/assets') + .attach('assetData', assetData, filename) + .field({ ...makeUploadDto(), isFavorite: 'not-a-boolean' }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + }); + + it('should throw if `visibility` is not an enum', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/assets') + .attach('assetData', assetData, filename) + .field({ ...makeUploadDto(), visibility: 'not-a-boolean' }); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + }); + + // TODO figure out how to deal with `sendFile` + describe.skip('GET /assets/:id/original', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/assets/${factory.uuid()}/original`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + // TODO figure out how to deal with `sendFile` + describe.skip('GET /assets/:id/thumbnail', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/assets/${factory.uuid()}/thumbnail`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/server/src/controllers/asset.controller.spec.ts b/server/src/controllers/asset.controller.spec.ts new file mode 100644 index 0000000000..66d2d7c206 --- /dev/null +++ b/server/src/controllers/asset.controller.spec.ts @@ -0,0 +1,118 @@ +import { AssetController } from 'src/controllers/asset.controller'; +import { AssetService } from 'src/services/asset.service'; +import request from 'supertest'; +import { factory } from 'test/small.factory'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(AssetController.name, () => { + let ctx: ControllerContext; + + beforeAll(async () => { + ctx = await controllerSetup(AssetController, [{ provide: AssetService, useValue: mockBaseService(AssetService) }]); + return () => ctx.close(); + }); + + beforeEach(() => { + ctx.reset(); + }); + + describe('PUT /assets', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put(`/assets`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('DELETE /assets', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()) + .delete(`/assets`) + .send({ ids: [factory.uuid()] }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid uuid', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .delete(`/assets`) + .send({ ids: ['123'] }); + + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['each value in ids must be a UUID'])); + }); + }); + + describe('GET /assets/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/assets/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid id', async () => { + const { status, body } = await request(ctx.getHttpServer()).get(`/assets/123`); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['id must be a UUID'])); + }); + }); + + describe('PUT /assets/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/assets/123`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid id', async () => { + const { status, body } = await request(ctx.getHttpServer()).put(`/assets/123`); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest(['id must be a UUID'])); + }); + + it('should reject invalid gps coordinates', async () => { + for (const test of [ + { latitude: 12 }, + { longitude: 12 }, + { latitude: 12, longitude: 'abc' }, + { latitude: 'abc', longitude: 12 }, + { latitude: null, longitude: 12 }, + { latitude: 12, longitude: null }, + { latitude: 91, longitude: 12 }, + { latitude: -91, longitude: 12 }, + { latitude: 12, longitude: -181 }, + { latitude: 12, longitude: 181 }, + ]) { + const { status, body } = await request(ctx.getHttpServer()).put(`/assets/${factory.uuid()}`).send(test); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + } + }); + + it('should reject invalid rating', async () => { + for (const test of [{ rating: 7 }, { rating: 3.5 }, { rating: null }]) { + const { status, body } = await request(ctx.getHttpServer()).put(`/assets/${factory.uuid()}`).send(test); + expect(status).toBe(400); + expect(body).toEqual(factory.responses.badRequest()); + } + }); + }); + + describe('GET /assets/statistics', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/assets/statistics`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /assets/random', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/assets/random`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should not allow count to be a string', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/assets/random?count=ABC'); + expect(status).toBe(400); + expect(body).toEqual( + factory.responses.badRequest(['count must be a positive number', 'count must be an integer number']), + ); + }); + }); +}); diff --git a/server/src/controllers/auth.controller.spec.ts b/server/src/controllers/auth.controller.spec.ts new file mode 100644 index 0000000000..4129b24124 --- /dev/null +++ b/server/src/controllers/auth.controller.spec.ts @@ -0,0 +1,191 @@ +import { AuthController } from 'src/controllers/auth.controller'; +import { LoginResponseDto } from 'src/dtos/auth.dto'; +import { AuthService } from 'src/services/auth.service'; +import request from 'supertest'; +import { errorDto } from 'test/medium/responses'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(AuthController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(AuthService); + + beforeAll(async () => { + ctx = await controllerSetup(AuthController, [{ provide: AuthService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('POST /auth/admin-sign-up', () => { + const name = 'admin'; + const email = 'admin@immich.cloud'; + const password = 'password'; + + it('should require an email address', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/auth/admin-sign-up').send({ name, password }); + expect(status).toEqual(400); + expect(body).toEqual(errorDto.badRequest()); + }); + + it('should require a password', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/auth/admin-sign-up').send({ name, email }); + expect(status).toEqual(400); + expect(body).toEqual(errorDto.badRequest()); + }); + + it('should require a name', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/auth/admin-sign-up').send({ email, password }); + expect(status).toEqual(400); + expect(body).toEqual(errorDto.badRequest()); + }); + + it('should require a valid email', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/auth/admin-sign-up') + .send({ name, email: 'immich', password }); + expect(status).toEqual(400); + expect(body).toEqual(errorDto.badRequest()); + }); + + it('should transform email to lower case', async () => { + service.adminSignUp.mockReset(); + const { status } = await request(ctx.getHttpServer()) + .post('/auth/admin-sign-up') + .send({ name: 'admin', password: 'password', email: 'aDmIn@IMMICH.cloud' }); + expect(status).toEqual(201); + expect(service.adminSignUp).toHaveBeenCalledWith(expect.objectContaining({ email: 'admin@immich.cloud' })); + }); + + it('should accept an email with a local domain', async () => { + const { status } = await request(ctx.getHttpServer()) + .post('/auth/admin-sign-up') + .send({ name: 'admin', password: 'password', email: 'admin@local' }); + expect(status).toEqual(201); + }); + }); + + describe('POST /auth/login', () => { + it(`should require an email and password`, async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/auth/login').send({ name: 'admin' }); + expect(status).toBe(400); + expect(body).toEqual( + errorDto.badRequest([ + 'email should not be empty', + 'email must be an email', + 'password should not be empty', + 'password must be a string', + ]), + ); + }); + + it(`should not allow null email`, async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/auth/login') + .send({ name: 'admin', email: null, password: 'password' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['email should not be empty', 'email must be an email'])); + }); + + it(`should not allow null password`, async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/auth/login') + .send({ name: 'admin', email: 'admin@immich.cloud', password: null }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['password should not be empty', 'password must be a string'])); + }); + + it('should reject an invalid email', async () => { + service.login.mockResolvedValue({ accessToken: 'access-token' } as LoginResponseDto); + + const { status, body } = await request(ctx.getHttpServer()) + .post('/auth/login') + .send({ name: 'admin', email: [], password: 'password' }); + + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['email must be an email'])); + }); + + it('should transform the email to all lowercase', async () => { + service.login.mockResolvedValue({ accessToken: 'access-token' } as LoginResponseDto); + + const { status } = await request(ctx.getHttpServer()) + .post('/auth/login') + .send({ name: 'admin', email: 'aDmIn@iMmIcH.ApP', password: 'password' }); + + expect(status).toBe(201); + expect(service.login).toHaveBeenCalledWith( + expect.objectContaining({ email: 'admin@immich.app' }), + expect.anything(), + ); + }); + + it('should accept an email with a local domain', async () => { + service.login.mockResolvedValue({ accessToken: 'access-token' } as LoginResponseDto); + + const { status } = await request(ctx.getHttpServer()) + .post('/auth/login') + .send({ name: 'admin', email: 'admin@local', password: 'password' }); + + expect(status).toEqual(201); + expect(service.login).toHaveBeenCalledWith(expect.objectContaining({ email: 'admin@local' }), expect.anything()); + }); + }); + + describe('POST /auth/change-password', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()) + .post('/auth/change-password') + .send({ password: 'password', newPassword: 'Password1234' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('POST /auth/pin-code', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/auth/pin-code').send({ pinCode: '123456' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should reject 5 digits', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/auth/pin-code').send({ pinCode: '12345' }); + expect(status).toEqual(400); + expect(body).toEqual(errorDto.badRequest(['pinCode must be a 6-digit numeric string'])); + }); + + it('should reject 7 digits', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/auth/pin-code').send({ pinCode: '1234567' }); + expect(status).toEqual(400); + expect(body).toEqual(errorDto.badRequest(['pinCode must be a 6-digit numeric string'])); + }); + + it('should reject non-numbers', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/auth/pin-code').send({ pinCode: 'A12345' }); + expect(status).toEqual(400); + expect(body).toEqual(errorDto.badRequest(['pinCode must be a 6-digit numeric string'])); + }); + }); + + describe('PUT /auth/pin-code', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put('/auth/pin-code').send({ pinCode: '123456', newPinCode: '654321' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('DELETE /auth/pin-code', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).delete('/auth/pin-code').send({ pinCode: '123456' }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /auth/status', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/auth/status'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); +}); diff --git a/server/src/controllers/auth.controller.ts b/server/src/controllers/auth.controller.ts index 92fa59f6bf..56acaa5c6d 100644 --- a/server/src/controllers/auth.controller.ts +++ b/server/src/controllers/auth.controller.ts @@ -1,12 +1,15 @@ -import { Body, Controller, HttpCode, HttpStatus, Post, Req, Res } from '@nestjs/common'; +import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Post, Put, Req, Res } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { Request, Response } from 'express'; import { AuthDto, + AuthStatusResponseDto, ChangePasswordDto, LoginCredentialDto, LoginResponseDto, LogoutResponseDto, + PinCodeChangeDto, + PinCodeSetupDto, SignUpDto, ValidateAccessTokenResponseDto, } from 'src/dtos/auth.dto'; @@ -23,8 +26,8 @@ export class AuthController { @Post('login') async login( - @Body() loginCredential: LoginCredentialDto, @Res({ passthrough: true }) res: Response, + @Body() loginCredential: LoginCredentialDto, @GetLoginDetails() loginDetails: LoginDetails, ): Promise { const body = await this.service.login(loginCredential, loginDetails); @@ -74,4 +77,28 @@ export class AuthController { ImmichCookie.IS_AUTHENTICATED, ]); } + + @Get('status') + @Authenticated() + getAuthStatus(@Auth() auth: AuthDto): Promise { + return this.service.getAuthStatus(auth); + } + + @Post('pin-code') + @Authenticated() + setupPinCode(@Auth() auth: AuthDto, @Body() dto: PinCodeSetupDto): Promise { + return this.service.setupPinCode(auth, dto); + } + + @Put('pin-code') + @Authenticated() + async changePinCode(@Auth() auth: AuthDto, @Body() dto: PinCodeChangeDto): Promise { + return this.service.changePinCode(auth, dto); + } + + @Delete('pin-code') + @Authenticated() + async resetPinCode(@Auth() auth: AuthDto, @Body() dto: PinCodeChangeDto): Promise { + return this.service.resetPinCode(auth, dto); + } } diff --git a/server/src/controllers/download.controller.spec.ts b/server/src/controllers/download.controller.spec.ts new file mode 100644 index 0000000000..9385c445b5 --- /dev/null +++ b/server/src/controllers/download.controller.spec.ts @@ -0,0 +1,46 @@ +import { DownloadController } from 'src/controllers/download.controller'; +import { DownloadService } from 'src/services/download.service'; +import request from 'supertest'; +import { factory } from 'test/small.factory'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; +import { Readable } from 'typeorm/platform/PlatformTools.js'; + +describe(DownloadController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(DownloadService); + + beforeAll(async () => { + ctx = await controllerSetup(DownloadController, [{ provide: DownloadService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('POST /download/info', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()) + .post('/download/info') + .send({ assetIds: [factory.uuid()] }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('POST /download/archive', () => { + it('should be an authenticated route', async () => { + const stream = new Readable({ + read() { + this.push('test'); + this.push(null); + }, + }); + service.downloadArchive.mockResolvedValue({ stream }); + await request(ctx.getHttpServer()) + .post('/download/archive') + .send({ assetIds: [factory.uuid()] }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); +}); diff --git a/server/src/controllers/notification.controller.spec.ts b/server/src/controllers/notification.controller.spec.ts new file mode 100644 index 0000000000..0dce7d73b5 --- /dev/null +++ b/server/src/controllers/notification.controller.spec.ts @@ -0,0 +1,64 @@ +import { NotificationController } from 'src/controllers/notification.controller'; +import { NotificationService } from 'src/services/notification.service'; +import request from 'supertest'; +import { errorDto } from 'test/medium/responses'; +import { factory } from 'test/small.factory'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(NotificationController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(NotificationService); + + beforeAll(async () => { + ctx = await controllerSetup(NotificationController, [{ provide: NotificationService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('GET /notifications', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/notifications'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it(`should reject an invalid notification level`, async () => { + const { status, body } = await request(ctx.getHttpServer()) + .get(`/notifications`) + .query({ level: 'invalid' }) + .set('Authorization', `Bearer token`); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest([expect.stringContaining('level must be one of the following values')])); + }); + }); + + describe('PUT /notifications', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/notifications'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /notifications/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/notifications/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a valid uuid', async () => { + const { status, body } = await request(ctx.getHttpServer()).get(`/notifications/123`); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest([expect.stringContaining('id must be a UUID')])); + }); + }); + + describe('PUT /notifications/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put(`/notifications/${factory.uuid()}`).send({ readAt: factory.date() }); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); +}); diff --git a/server/src/controllers/search.controller.spec.ts b/server/src/controllers/search.controller.spec.ts new file mode 100644 index 0000000000..14130fabcb --- /dev/null +++ b/server/src/controllers/search.controller.spec.ts @@ -0,0 +1,197 @@ +import { SearchController } from 'src/controllers/search.controller'; +import { SearchService } from 'src/services/search.service'; +import request from 'supertest'; +import { errorDto } from 'test/medium/responses'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(SearchController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(SearchService); + + beforeAll(async () => { + ctx = await controllerSetup(SearchController, [{ provide: SearchService, useValue: service }]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('POST /search/metadata', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/search/metadata'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should reject page as a string', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/search/metadata').send({ page: 'abc' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['page must not be less than 1', 'page must be an integer number'])); + }); + + it('should reject page as a negative number', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/search/metadata').send({ page: -10 }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['page must not be less than 1'])); + }); + + it('should reject page as 0', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/search/metadata').send({ page: 0 }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['page must not be less than 1'])); + }); + + it('should reject size as a string', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/search/metadata').send({ size: 'abc' }); + expect(status).toBe(400); + expect(body).toEqual( + errorDto.badRequest([ + 'size must not be greater than 1000', + 'size must not be less than 1', + 'size must be an integer number', + ]), + ); + }); + + it('should reject an invalid size', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/search/metadata').send({ size: -1.5 }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['size must not be less than 1', 'size must be an integer number'])); + }); + + it('should reject an visibility as not an enum', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/search/metadata') + .send({ visibility: 'immich' }); + expect(status).toBe(400); + expect(body).toEqual( + errorDto.badRequest(['visibility must be one of the following values: archive, timeline, hidden']), + ); + }); + + it('should reject an isFavorite as not a boolean', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/search/metadata') + .send({ isFavorite: 'immich' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['isFavorite must be a boolean value'])); + }); + + it('should reject an isEncoded as not a boolean', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/search/metadata') + .send({ isEncoded: 'immich' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['isEncoded must be a boolean value'])); + }); + + it('should reject an isOffline as not a boolean', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/search/metadata') + .send({ isOffline: 'immich' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['isOffline must be a boolean value'])); + }); + + it('should reject an isMotion as not a boolean', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/search/metadata').send({ isMotion: 'immich' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['isMotion must be a boolean value'])); + }); + + describe('POST /search/random', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/search/random'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should reject if withStacked is not a boolean', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/search/random') + .send({ withStacked: 'immich' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['withStacked must be a boolean value'])); + }); + + it('should reject if withPeople is not a boolean', async () => { + const { status, body } = await request(ctx.getHttpServer()) + .post('/search/random') + .send({ withPeople: 'immich' }); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['withPeople must be a boolean value'])); + }); + }); + + describe('POST /search/smart', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).post('/search/smart'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a query', async () => { + const { status, body } = await request(ctx.getHttpServer()).post('/search/smart').send({}); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['query should not be empty', 'query must be a string'])); + }); + }); + + describe('GET /search/explore', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/search/explore'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('POST /search/person', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/search/person'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a name', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/search/person').send({}); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['name should not be empty', 'name must be a string'])); + }); + }); + + describe('GET /search/places', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/search/places'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a name', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/search/places').send({}); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest(['name should not be empty', 'name must be a string'])); + }); + }); + + describe('GET /search/cities', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/search/cities'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /search/suggestions', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/search/suggestions'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + it('should require a type', async () => { + const { status, body } = await request(ctx.getHttpServer()).get('/search/suggestions').send({}); + expect(status).toBe(400); + expect(body).toEqual( + errorDto.badRequest([ + 'type should not be empty', + expect.stringContaining('type must be one of the following values:'), + ]), + ); + }); + }); + }); +}); diff --git a/server/src/controllers/server.controller.spec.ts b/server/src/controllers/server.controller.spec.ts new file mode 100644 index 0000000000..cc373162eb --- /dev/null +++ b/server/src/controllers/server.controller.spec.ts @@ -0,0 +1,32 @@ +import { ServerController } from 'src/controllers/server.controller'; +import { ServerService } from 'src/services/server.service'; +import { VersionService } from 'src/services/version.service'; +import request from 'supertest'; +import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(ServerController.name, () => { + let ctx: ControllerContext; + const serverService = mockBaseService(ServerService); + const versionService = mockBaseService(VersionService); + + beforeAll(async () => { + ctx = await controllerSetup(ServerController, [ + { provide: ServerService, useValue: serverService }, + { provide: VersionService, useValue: versionService }, + ]); + return () => ctx.close(); + }); + + beforeEach(() => { + serverService.resetAllMocks(); + versionService.resetAllMocks(); + ctx.reset(); + }); + + describe('GET /server/license', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/server/license'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); +}); diff --git a/server/src/controllers/user.controller.spec.ts b/server/src/controllers/user.controller.spec.ts new file mode 100644 index 0000000000..19f9e919de --- /dev/null +++ b/server/src/controllers/user.controller.spec.ts @@ -0,0 +1,79 @@ +import { UserController } from 'src/controllers/user.controller'; +import { LoggingRepository } from 'src/repositories/logging.repository'; +import { UserService } from 'src/services/user.service'; +import request from 'supertest'; +import { errorDto } from 'test/medium/responses'; +import { factory } from 'test/small.factory'; +import { automock, ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; + +describe(UserController.name, () => { + let ctx: ControllerContext; + const service = mockBaseService(UserService); + + beforeAll(async () => { + ctx = await controllerSetup(UserController, [ + { provide: LoggingRepository, useValue: automock(LoggingRepository, { strict: false }) }, + { provide: UserService, useValue: service }, + ]); + return () => ctx.close(); + }); + + beforeEach(() => { + service.resetAllMocks(); + ctx.reset(); + }); + + describe('GET /users', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/users'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('GET /users/me', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get('/users/me'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('PUT /users/me', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put('/users/me'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + + for (const key of ['email', 'name']) { + it(`should not allow null ${key}`, async () => { + const dto = { [key]: null }; + const { status, body } = await request(ctx.getHttpServer()) + .put(`/users/me`) + .set('Authorization', `Bearer token`) + .send(dto); + expect(status).toBe(400); + expect(body).toEqual(errorDto.badRequest()); + }); + } + }); + + describe('GET /users/:id', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).get(`/users/${factory.uuid()}`); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('PUT /users/me/license', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).put('/users/me/license'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); + + describe('DELETE /users/me/license', () => { + it('should be an authenticated route', async () => { + await request(ctx.getHttpServer()).delete('/users/me/license'); + expect(ctx.authenticate).toHaveBeenCalled(); + }); + }); +}); diff --git a/server/src/database.ts b/server/src/database.ts index a93873ef42..a13b074448 100644 --- a/server/src/database.ts +++ b/server/src/database.ts @@ -5,6 +5,7 @@ import { AlbumUserRole, AssetFileType, AssetType, + AssetVisibility, MemoryType, Permission, SharedLinkType, @@ -108,7 +109,7 @@ export type Asset = { fileCreatedAt: Date; fileModifiedAt: Date; isExternal: boolean; - isVisible: boolean; + visibility: AssetVisibility; libraryId: string | null; livePhotoVideoId: string | null; localDateTime: Date; @@ -285,7 +286,7 @@ export const columns = { 'assets.fileCreatedAt', 'assets.fileModifiedAt', 'assets.isExternal', - 'assets.isVisible', + 'assets.visibility', 'assets.libraryId', 'assets.livePhotoVideoId', 'assets.localDateTime', @@ -345,7 +346,7 @@ export const columns = { 'type', 'deletedAt', 'isFavorite', - 'isVisible', + 'visibility', 'updateId', ], stack: ['stack.id', 'stack.primaryAssetId', 'ownerId'], diff --git a/server/src/db.d.ts b/server/src/db.d.ts index 85be9d5208..1b039f9982 100644 --- a/server/src/db.d.ts +++ b/server/src/db.d.ts @@ -10,6 +10,7 @@ import { AssetOrder, AssetStatus, AssetType, + AssetVisibility, MemoryType, NotificationLevel, NotificationType, @@ -148,11 +149,10 @@ export interface Assets { fileCreatedAt: Timestamp; fileModifiedAt: Timestamp; id: Generated; - isArchived: Generated; isExternal: Generated; isFavorite: Generated; isOffline: Generated; - isVisible: Generated; + visibility: Generated; libraryId: string | null; livePhotoVideoId: string | null; localDateTime: Timestamp; diff --git a/server/src/dtos/asset-media.dto.ts b/server/src/dtos/asset-media.dto.ts index 8837138599..a647b4515f 100644 --- a/server/src/dtos/asset-media.dto.ts +++ b/server/src/dtos/asset-media.dto.ts @@ -1,7 +1,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { ArrayNotEmpty, IsArray, IsEnum, IsNotEmpty, IsString, ValidateNested } from 'class-validator'; -import { Optional, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation'; +import { AssetVisibility } from 'src/enum'; +import { Optional, ValidateAssetVisibility, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation'; export enum AssetMediaSize { /** @@ -55,11 +56,8 @@ export class AssetMediaCreateDto extends AssetMediaBase { @ValidateBoolean({ optional: true }) isFavorite?: boolean; - @ValidateBoolean({ optional: true }) - isArchived?: boolean; - - @ValidateBoolean({ optional: true }) - isVisible?: boolean; + @ValidateAssetVisibility({ optional: true }) + visibility?: AssetVisibility; @ValidateUUID({ optional: true }) livePhotoVideoId?: string; diff --git a/server/src/dtos/asset-response.dto.ts b/server/src/dtos/asset-response.dto.ts index 3732e665cd..480ad0b9b9 100644 --- a/server/src/dtos/asset-response.dto.ts +++ b/server/src/dtos/asset-response.dto.ts @@ -12,7 +12,7 @@ import { } from 'src/dtos/person.dto'; import { TagResponseDto, mapTag } from 'src/dtos/tag.dto'; import { UserResponseDto, mapUser } from 'src/dtos/user.dto'; -import { AssetStatus, AssetType } from 'src/enum'; +import { AssetStatus, AssetType, AssetVisibility } from 'src/enum'; import { mimeTypes } from 'src/utils/mime-types'; export class SanitizedAssetResponseDto { @@ -74,11 +74,10 @@ export type MapAsset = { fileCreatedAt: Date; fileModifiedAt: Date; files?: AssetFile[]; - isArchived: boolean; isExternal: boolean; isFavorite: boolean; isOffline: boolean; - isVisible: boolean; + visibility: AssetVisibility; libraryId: string | null; livePhotoVideoId: string | null; localDateTime: Date; @@ -183,7 +182,7 @@ export function mapAsset(entity: MapAsset, options: AssetMapOptions = {}): Asset localDateTime: entity.localDateTime, updatedAt: entity.updatedAt, isFavorite: options.auth?.user.id === entity.ownerId ? entity.isFavorite : false, - isArchived: entity.isArchived, + isArchived: entity.visibility === AssetVisibility.ARCHIVE, isTrashed: !!entity.deletedAt, duration: entity.duration ?? '0:00:00.00000', exifInfo: entity.exifInfo ? mapExif(entity.exifInfo) : undefined, diff --git a/server/src/dtos/asset.dto.ts b/server/src/dtos/asset.dto.ts index 32b14055d5..0789633878 100644 --- a/server/src/dtos/asset.dto.ts +++ b/server/src/dtos/asset.dto.ts @@ -14,9 +14,9 @@ import { ValidateIf, } from 'class-validator'; import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto'; -import { AssetType } from 'src/enum'; +import { AssetType, AssetVisibility } from 'src/enum'; import { AssetStats } from 'src/repositories/asset.repository'; -import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation'; +import { Optional, ValidateAssetVisibility, ValidateBoolean, ValidateUUID } from 'src/validation'; export class DeviceIdDto { @IsNotEmpty() @@ -32,8 +32,8 @@ export class UpdateAssetBase { @ValidateBoolean({ optional: true }) isFavorite?: boolean; - @ValidateBoolean({ optional: true }) - isArchived?: boolean; + @ValidateAssetVisibility({ optional: true }) + visibility?: AssetVisibility; @Optional() @IsDateString() @@ -105,8 +105,8 @@ export class AssetJobsDto extends AssetIdsDto { } export class AssetStatsDto { - @ValidateBoolean({ optional: true }) - isArchived?: boolean; + @ValidateAssetVisibility({ optional: true }) + visibility?: AssetVisibility; @ValidateBoolean({ optional: true }) isFavorite?: boolean; diff --git a/server/src/dtos/auth.dto.ts b/server/src/dtos/auth.dto.ts index a1978d39dd..cc05d2d860 100644 --- a/server/src/dtos/auth.dto.ts +++ b/server/src/dtos/auth.dto.ts @@ -3,7 +3,7 @@ import { Transform } from 'class-transformer'; import { IsEmail, IsNotEmpty, IsString, MinLength } from 'class-validator'; import { AuthApiKey, AuthSession, AuthSharedLink, AuthUser, UserAdmin } from 'src/database'; import { ImmichCookie } from 'src/enum'; -import { Optional, toEmail } from 'src/validation'; +import { Optional, PinCode, toEmail } from 'src/validation'; export type CookieResponse = { isSecure: boolean; @@ -78,6 +78,26 @@ export class ChangePasswordDto { newPassword!: string; } +export class PinCodeSetupDto { + @PinCode() + pinCode!: string; +} + +export class PinCodeResetDto { + @PinCode({ optional: true }) + pinCode?: string; + + @Optional() + @IsString() + @IsNotEmpty() + password?: string; +} + +export class PinCodeChangeDto extends PinCodeResetDto { + @PinCode() + newPinCode!: string; +} + export class ValidateAccessTokenResponseDto { authStatus!: boolean; } @@ -114,3 +134,8 @@ export class OAuthConfigDto { export class OAuthAuthorizeResponseDto { url!: string; } + +export class AuthStatusResponseDto { + pinCode!: boolean; + password!: boolean; +} diff --git a/server/src/dtos/env.dto.ts b/server/src/dtos/env.dto.ts index 6c238252a6..7f0df8abb9 100644 --- a/server/src/dtos/env.dto.ts +++ b/server/src/dtos/env.dto.ts @@ -1,6 +1,6 @@ import { Transform, Type } from 'class-transformer'; import { IsEnum, IsInt, IsString } from 'class-validator'; -import { ImmichEnvironment, LogLevel } from 'src/enum'; +import { DatabaseSslMode, ImmichEnvironment, LogLevel } from 'src/enum'; import { IsIPRange, Optional, ValidateBoolean } from 'src/validation'; export class EnvDto { @@ -142,6 +142,10 @@ export class EnvDto { @ValidateBoolean({ optional: true }) DB_SKIP_MIGRATIONS?: boolean; + @IsEnum(DatabaseSslMode) + @Optional() + DB_SSL_MODE?: DatabaseSslMode; + @IsString() @Optional() DB_URL?: string; diff --git a/server/src/dtos/search.dto.ts b/server/src/dtos/search.dto.ts index a7633dce78..579cba680e 100644 --- a/server/src/dtos/search.dto.ts +++ b/server/src/dtos/search.dto.ts @@ -5,8 +5,8 @@ import { Place } from 'src/database'; import { PropertyLifecycle } from 'src/decorators'; import { AlbumResponseDto } from 'src/dtos/album.dto'; import { AssetResponseDto } from 'src/dtos/asset-response.dto'; -import { AssetOrder, AssetType } from 'src/enum'; -import { Optional, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation'; +import { AssetOrder, AssetType, AssetVisibility } from 'src/enum'; +import { Optional, ValidateAssetVisibility, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation'; class BaseSearchDto { @ValidateUUID({ optional: true, nullable: true }) @@ -22,13 +22,6 @@ class BaseSearchDto { @ApiProperty({ enumName: 'AssetTypeEnum', enum: AssetType }) type?: AssetType; - @ValidateBoolean({ optional: true }) - isArchived?: boolean; - - @ValidateBoolean({ optional: true }) - @ApiProperty({ default: false }) - withArchived?: boolean; - @ValidateBoolean({ optional: true }) isEncoded?: boolean; @@ -41,8 +34,8 @@ class BaseSearchDto { @ValidateBoolean({ optional: true }) isOffline?: boolean; - @ValidateBoolean({ optional: true }) - isVisible?: boolean; + @ValidateAssetVisibility({ optional: true }) + visibility?: AssetVisibility; @ValidateBoolean({ optional: true }) withDeleted?: boolean; diff --git a/server/src/dtos/sync.dto.ts b/server/src/dtos/sync.dto.ts index a035f8ecb9..cc11c3410b 100644 --- a/server/src/dtos/sync.dto.ts +++ b/server/src/dtos/sync.dto.ts @@ -1,7 +1,7 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsEnum, IsInt, IsPositive, IsString } from 'class-validator'; import { AssetResponseDto } from 'src/dtos/asset-response.dto'; -import { AssetType, SyncEntityType, SyncRequestType } from 'src/enum'; +import { AssetType, AssetVisibility, SyncEntityType, SyncRequestType } from 'src/enum'; import { Optional, ValidateDate, ValidateUUID } from 'src/validation'; export class AssetFullSyncDto { @@ -67,7 +67,7 @@ export class SyncAssetV1 { type!: AssetType; deletedAt!: Date | null; isFavorite!: boolean; - isVisible!: boolean; + visibility!: AssetVisibility; } export class SyncAssetDeleteV1 { diff --git a/server/src/dtos/time-bucket.dto.ts b/server/src/dtos/time-bucket.dto.ts index a9dfa49a07..51d46871ae 100644 --- a/server/src/dtos/time-bucket.dto.ts +++ b/server/src/dtos/time-bucket.dto.ts @@ -1,8 +1,8 @@ import { ApiProperty } from '@nestjs/swagger'; import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; -import { AssetOrder } from 'src/enum'; +import { AssetOrder, AssetVisibility } from 'src/enum'; import { TimeBucketSize } from 'src/repositories/asset.repository'; -import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation'; +import { Optional, ValidateAssetVisibility, ValidateBoolean, ValidateUUID } from 'src/validation'; export class TimeBucketDto { @IsNotEmpty() @@ -22,9 +22,6 @@ export class TimeBucketDto { @ValidateUUID({ optional: true }) tagId?: string; - @ValidateBoolean({ optional: true }) - isArchived?: boolean; - @ValidateBoolean({ optional: true }) isFavorite?: boolean; @@ -41,6 +38,9 @@ export class TimeBucketDto { @Optional() @ApiProperty({ enum: AssetOrder, enumName: 'AssetOrder' }) order?: AssetOrder; + + @ValidateAssetVisibility({ optional: true }) + visibility?: AssetVisibility; } export class TimeBucketAssetDto extends TimeBucketDto { diff --git a/server/src/dtos/user.dto.ts b/server/src/dtos/user.dto.ts index 31275f9c28..9efb531bc7 100644 --- a/server/src/dtos/user.dto.ts +++ b/server/src/dtos/user.dto.ts @@ -4,7 +4,7 @@ import { IsBoolean, IsEmail, IsEnum, IsNotEmpty, IsNumber, IsString, Min } from import { User, UserAdmin } from 'src/database'; import { UserAvatarColor, UserMetadataKey, UserStatus } from 'src/enum'; import { UserMetadataItem } from 'src/types'; -import { Optional, ValidateBoolean, toEmail, toSanitized } from 'src/validation'; +import { Optional, PinCode, ValidateBoolean, toEmail, toSanitized } from 'src/validation'; export class UserUpdateMeDto { @Optional() @@ -116,6 +116,9 @@ export class UserAdminUpdateDto { @IsString() password?: string; + @PinCode({ optional: true, nullable: true, emptyToNull: true }) + pinCode?: string | null; + @Optional() @IsString() @IsNotEmpty() diff --git a/server/src/enum.ts b/server/src/enum.ts index 4e725e1c13..f214593975 100644 --- a/server/src/enum.ts +++ b/server/src/enum.ts @@ -610,3 +610,21 @@ export enum OAuthTokenEndpointAuthMethod { CLIENT_SECRET_POST = 'client_secret_post', CLIENT_SECRET_BASIC = 'client_secret_basic', } + +export enum DatabaseSslMode { + Disable = 'disable', + Allow = 'allow', + Prefer = 'prefer', + Require = 'require', + VerifyFull = 'verify-full', +} + +export enum AssetVisibility { + ARCHIVE = 'archive', + TIMELINE = 'timeline', + + /** + * Video part of the LivePhotos and MotionPhotos + */ + HIDDEN = 'hidden', +} diff --git a/server/src/queries/access.repository.sql b/server/src/queries/access.repository.sql index 03f1af3b28..f550c5b0c1 100644 --- a/server/src/queries/access.repository.sql +++ b/server/src/queries/access.repository.sql @@ -110,8 +110,11 @@ from and "assets"."deletedAt" is null where "partner"."sharedWithId" = $1 - and "assets"."isArchived" = $2 - and "assets"."id" in ($3) + and ( + "assets"."visibility" = 'timeline' + or "assets"."visibility" = 'hidden' + ) + and "assets"."id" in ($2) -- AccessRepository.asset.checkSharedLinkAccess select diff --git a/server/src/queries/asset.job.repository.sql b/server/src/queries/asset.job.repository.sql index d8e8430be7..577635a912 100644 --- a/server/src/queries/asset.job.repository.sql +++ b/server/src/queries/asset.job.repository.sql @@ -7,7 +7,7 @@ select "ownerId", "duplicateId", "stackId", - "isVisible", + "visibility", "smart_search"."embedding", ( select @@ -83,7 +83,7 @@ from inner join "asset_job_status" on "asset_job_status"."assetId" = "assets"."id" where "assets"."deletedAt" is null - and "assets"."isVisible" = $1 + and "assets"."visibility" != $1 and ( "asset_job_status"."previewAt" is null or "asset_job_status"."thumbnailAt" is null @@ -118,7 +118,7 @@ where -- AssetJobRepository.getForGenerateThumbnailJob select "assets"."id", - "assets"."isVisible", + "assets"."visibility", "assets"."originalFileName", "assets"."originalPath", "assets"."ownerId", @@ -155,7 +155,7 @@ select "assets"."fileCreatedAt", "assets"."fileModifiedAt", "assets"."isExternal", - "assets"."isVisible", + "assets"."visibility", "assets"."libraryId", "assets"."livePhotoVideoId", "assets"."localDateTime", @@ -201,7 +201,7 @@ from "assets" inner join "asset_job_status" as "job_status" on "assetId" = "assets"."id" where - "assets"."isVisible" = $1 + "assets"."visibility" != $1 and "assets"."deletedAt" is null and "job_status"."previewAt" is not null and not exists ( @@ -220,7 +220,7 @@ from "assets" inner join "asset_job_status" as "job_status" on "assetId" = "assets"."id" where - "assets"."isVisible" = $1 + "assets"."visibility" != $1 and "assets"."deletedAt" is null and "job_status"."previewAt" is not null and not exists ( @@ -234,7 +234,7 @@ where -- AssetJobRepository.getForClipEncoding select "assets"."id", - "assets"."isVisible", + "assets"."visibility", ( select coalesce(json_agg(agg), '[]') @@ -259,7 +259,7 @@ where -- AssetJobRepository.getForDetectFacesJob select "assets"."id", - "assets"."isVisible", + "assets"."visibility", to_json("exif") as "exifInfo", ( select @@ -312,7 +312,7 @@ where -- AssetJobRepository.getForAssetDeletion select "assets"."id", - "assets"."isVisible", + "assets"."visibility", "assets"."libraryId", "assets"."ownerId", "assets"."livePhotoVideoId", @@ -372,7 +372,7 @@ from "assets" as "stacked" where "stacked"."deletedAt" is not null - and "stacked"."isArchived" = $1 + and "stacked"."visibility" != $1 and "stacked"."stackId" = "asset_stack"."id" group by "asset_stack"."id" @@ -391,7 +391,7 @@ where "assets"."encodedVideoPath" is null or "assets"."encodedVideoPath" = $2 ) - and "assets"."isVisible" = $3 + and "assets"."visibility" != $3 and "assets"."deletedAt" is null -- AssetJobRepository.getForVideoConversion @@ -417,7 +417,7 @@ where "asset_job_status"."metadataExtractedAt" is null or "asset_job_status"."assetId" is null ) - and "assets"."isVisible" = $1 + and "assets"."visibility" != $1 and "assets"."deletedAt" is null -- AssetJobRepository.getForStorageTemplateJob @@ -480,7 +480,7 @@ where "assets"."sidecarPath" = $1 or "assets"."sidecarPath" is null ) - and "assets"."isVisible" = $2 + and "assets"."visibility" != $2 -- AssetJobRepository.streamForDetectFacesJob select @@ -489,7 +489,7 @@ from "assets" inner join "asset_job_status" as "job_status" on "assetId" = "assets"."id" where - "assets"."isVisible" = $1 + "assets"."visibility" != $1 and "assets"."deletedAt" is null and "job_status"."previewAt" is not null and "job_status"."facesRecognizedAt" is null diff --git a/server/src/queries/asset.repository.sql b/server/src/queries/asset.repository.sql index cb438e1c6d..4a3fbf0e39 100644 --- a/server/src/queries/asset.repository.sql +++ b/server/src/queries/asset.repository.sql @@ -43,21 +43,20 @@ with "asset_job_status"."previewAt" is not null and (assets."localDateTime" at time zone 'UTC')::date = today.date and "assets"."ownerId" = any ($3::uuid[]) - and "assets"."isVisible" = $4 - and "assets"."isArchived" = $5 + and "assets"."visibility" = $4 and exists ( select from "asset_files" where "assetId" = "assets"."id" - and "asset_files"."type" = $6 + and "asset_files"."type" = $5 ) and "assets"."deletedAt" is null order by (assets."localDateTime" at time zone 'UTC')::date desc limit - $7 + $6 ) as "a" on true inner join "exif" on "a"."id" = "exif"."assetId" ) @@ -159,7 +158,7 @@ from where "ownerId" = $1::uuid and "deviceId" = $2 - and "isVisible" = $3 + and "visibility" != $3 and "deletedAt" is null -- AssetRepository.getLivePhotoCount @@ -241,7 +240,10 @@ with "assets" where "assets"."deletedAt" is null - and "assets"."isVisible" = $2 + and ( + "assets"."visibility" = $2 + or "assets"."visibility" = $3 + ) ) select "timeBucket", @@ -271,7 +273,7 @@ from where "stacked"."stackId" = "asset_stack"."id" and "stacked"."deletedAt" is null - and "stacked"."isArchived" = $1 + and "stacked"."visibility" != $1 group by "asset_stack"."id" ) as "stacked_assets" on "asset_stack"."id" is not null @@ -281,8 +283,11 @@ where or "assets"."stackId" is null ) and "assets"."deletedAt" is null - and "assets"."isVisible" = $2 - and date_trunc($3, "localDateTime" at time zone 'UTC') at time zone 'UTC' = $4 + and ( + "assets"."visibility" = $2 + or "assets"."visibility" = $3 + ) + and date_trunc($4, "localDateTime" at time zone 'UTC') at time zone 'UTC' = $5 order by "assets"."localDateTime" desc @@ -307,7 +312,7 @@ with "assets"."ownerId" = $1::uuid and "assets"."duplicateId" is not null and "assets"."deletedAt" is null - and "assets"."isVisible" = $2 + and "assets"."visibility" != $2 and "assets"."stackId" is null group by "assets"."duplicateId" @@ -365,12 +370,11 @@ from inner join "cities" on "exif"."city" = "cities"."city" where "ownerId" = $2::uuid - and "isVisible" = $3 - and "isArchived" = $4 - and "type" = $5 + and "visibility" = $3 + and "type" = $4 and "deletedAt" is null limit - $6 + $5 -- AssetRepository.getAllForUserFullSync select @@ -394,7 +398,7 @@ from ) as "stacked_assets" on "asset_stack"."id" is not null where "assets"."ownerId" = $1::uuid - and "assets"."isVisible" = $2 + and "assets"."visibility" != $2 and "assets"."updatedAt" <= $3 and "assets"."id" > $4 order by @@ -424,7 +428,7 @@ from ) as "stacked_assets" on "asset_stack"."id" is not null where "assets"."ownerId" = any ($1::uuid[]) - and "assets"."isVisible" = $2 + and "assets"."visibility" != $2 and "assets"."updatedAt" > $3 limit $4 diff --git a/server/src/queries/library.repository.sql b/server/src/queries/library.repository.sql index 43500a8748..f17d9663d6 100644 --- a/server/src/queries/library.repository.sql +++ b/server/src/queries/library.repository.sql @@ -35,14 +35,14 @@ select where ( "assets"."type" = $1 - and "assets"."isVisible" = $2 + and "assets"."visibility" != $2 ) ) as "photos", count(*) filter ( where ( "assets"."type" = $3 - and "assets"."isVisible" = $4 + and "assets"."visibility" != $4 ) ) as "videos", coalesce(sum("exif"."fileSizeInByte"), $5) as "usage" diff --git a/server/src/queries/map.repository.sql b/server/src/queries/map.repository.sql index b3bb207946..edfdec13d2 100644 --- a/server/src/queries/map.repository.sql +++ b/server/src/queries/map.repository.sql @@ -14,7 +14,7 @@ from and "exif"."latitude" is not null and "exif"."longitude" is not null where - "isVisible" = $1 + "assets"."visibility" = $1 and "deletedAt" is null and ( "ownerId" in ($2) diff --git a/server/src/queries/person.repository.sql b/server/src/queries/person.repository.sql index f9ba32262d..c77d9835fa 100644 --- a/server/src/queries/person.repository.sql +++ b/server/src/queries/person.repository.sql @@ -107,7 +107,7 @@ select ( select "assets"."ownerId", - "assets"."isArchived", + "assets"."visibility", "assets"."fileCreatedAt" from "assets" @@ -143,23 +143,20 @@ select "asset_faces"."boundingBoxY2" as "y2", "asset_faces"."imageWidth" as "oldWidth", "asset_faces"."imageHeight" as "oldHeight", - "exif"."exifImageWidth", - "exif"."exifImageHeight", "assets"."type", "assets"."originalPath", - "asset_files"."path" as "previewPath" + "asset_files"."path" as "previewPath", + "exif"."orientation" as "exifOrientation" from "person" inner join "asset_faces" on "asset_faces"."id" = "person"."faceAssetId" inner join "assets" on "asset_faces"."assetId" = "assets"."id" - inner join "exif" on "exif"."assetId" = "assets"."id" - inner join "asset_files" on "asset_files"."assetId" = "assets"."id" + left join "exif" on "exif"."assetId" = "assets"."id" + left join "asset_files" on "asset_files"."assetId" = "assets"."id" where "person"."id" = $1 and "asset_faces"."deletedAt" is null and "asset_files"."type" = $2 - and "exif"."exifImageWidth" > $3 - and "exif"."exifImageHeight" > $4 -- PersonRepository.reassignFace update "asset_faces" @@ -203,7 +200,7 @@ from "asset_faces" left join "assets" on "assets"."id" = "asset_faces"."assetId" and "asset_faces"."personId" = $1 - and "assets"."isArchived" = $2 + and "assets"."visibility" != $2 and "assets"."deletedAt" is null where "asset_faces"."deletedAt" is null @@ -220,7 +217,7 @@ from inner join "asset_faces" on "asset_faces"."personId" = "person"."id" inner join "assets" on "assets"."id" = "asset_faces"."assetId" and "assets"."deletedAt" is null - and "assets"."isArchived" = $2 + and "assets"."visibility" != $2 where "person"."ownerId" = $3 and "asset_faces"."deletedAt" is null diff --git a/server/src/queries/search.repository.sql b/server/src/queries/search.repository.sql index 4fce272365..c18fe02418 100644 --- a/server/src/queries/search.repository.sql +++ b/server/src/queries/search.repository.sql @@ -7,11 +7,11 @@ from "assets" inner join "exif" on "assets"."id" = "exif"."assetId" where - "assets"."fileCreatedAt" >= $1 - and "exif"."lensModel" = $2 - and "assets"."ownerId" = any ($3::uuid[]) - and "assets"."isFavorite" = $4 - and "assets"."isArchived" = $5 + "assets"."visibility" = $1 + and "assets"."fileCreatedAt" >= $2 + and "exif"."lensModel" = $3 + and "assets"."ownerId" = any ($4::uuid[]) + and "assets"."isFavorite" = $5 and "assets"."deletedAt" is null order by "assets"."fileCreatedAt" desc @@ -28,11 +28,11 @@ offset "assets" inner join "exif" on "assets"."id" = "exif"."assetId" where - "assets"."fileCreatedAt" >= $1 - and "exif"."lensModel" = $2 - and "assets"."ownerId" = any ($3::uuid[]) - and "assets"."isFavorite" = $4 - and "assets"."isArchived" = $5 + "assets"."visibility" = $1 + and "assets"."fileCreatedAt" >= $2 + and "exif"."lensModel" = $3 + and "assets"."ownerId" = any ($4::uuid[]) + and "assets"."isFavorite" = $5 and "assets"."deletedAt" is null and "assets"."id" < $6 order by @@ -48,11 +48,11 @@ union all "assets" inner join "exif" on "assets"."id" = "exif"."assetId" where - "assets"."fileCreatedAt" >= $8 - and "exif"."lensModel" = $9 - and "assets"."ownerId" = any ($10::uuid[]) - and "assets"."isFavorite" = $11 - and "assets"."isArchived" = $12 + "assets"."visibility" = $8 + and "assets"."fileCreatedAt" >= $9 + and "exif"."lensModel" = $10 + and "assets"."ownerId" = any ($11::uuid[]) + and "assets"."isFavorite" = $12 and "assets"."deletedAt" is null and "assets"."id" > $13 order by @@ -71,11 +71,11 @@ from inner join "exif" on "assets"."id" = "exif"."assetId" inner join "smart_search" on "assets"."id" = "smart_search"."assetId" where - "assets"."fileCreatedAt" >= $1 - and "exif"."lensModel" = $2 - and "assets"."ownerId" = any ($3::uuid[]) - and "assets"."isFavorite" = $4 - and "assets"."isArchived" = $5 + "assets"."visibility" = $1 + and "assets"."fileCreatedAt" >= $2 + and "exif"."lensModel" = $3 + and "assets"."ownerId" = any ($4::uuid[]) + and "assets"."isFavorite" = $5 and "assets"."deletedAt" is null order by smart_search.embedding <=> $6 @@ -97,7 +97,7 @@ with where "assets"."ownerId" = any ($2::uuid[]) and "assets"."deletedAt" is null - and "assets"."isVisible" = $3 + and "assets"."visibility" != $3 and "assets"."type" = $4 and "assets"."id" != $5::uuid and "assets"."stackId" is null @@ -176,14 +176,13 @@ with recursive inner join "assets" on "assets"."id" = "exif"."assetId" where "assets"."ownerId" = any ($1::uuid[]) - and "assets"."isVisible" = $2 - and "assets"."isArchived" = $3 - and "assets"."type" = $4 + and "assets"."visibility" = $2 + and "assets"."type" = $3 and "assets"."deletedAt" is null order by "city" limit - $5 + $4 ) union all ( @@ -200,16 +199,15 @@ with recursive "exif" inner join "assets" on "assets"."id" = "exif"."assetId" where - "assets"."ownerId" = any ($6::uuid[]) - and "assets"."isVisible" = $7 - and "assets"."isArchived" = $8 - and "assets"."type" = $9 + "assets"."ownerId" = any ($5::uuid[]) + and "assets"."visibility" = $6 + and "assets"."type" = $7 and "assets"."deletedAt" is null and "exif"."city" > "cte"."city" order by "city" limit - $10 + $8 ) as "l" on true ) ) @@ -231,7 +229,7 @@ from inner join "assets" on "assets"."id" = "exif"."assetId" where "ownerId" = any ($1::uuid[]) - and "isVisible" = $2 + and "visibility" != $2 and "deletedAt" is null and "state" is not null @@ -243,7 +241,7 @@ from inner join "assets" on "assets"."id" = "exif"."assetId" where "ownerId" = any ($1::uuid[]) - and "isVisible" = $2 + and "visibility" != $2 and "deletedAt" is null and "city" is not null @@ -255,7 +253,7 @@ from inner join "assets" on "assets"."id" = "exif"."assetId" where "ownerId" = any ($1::uuid[]) - and "isVisible" = $2 + and "visibility" != $2 and "deletedAt" is null and "make" is not null @@ -267,6 +265,6 @@ from inner join "assets" on "assets"."id" = "exif"."assetId" where "ownerId" = any ($1::uuid[]) - and "isVisible" = $2 + and "visibility" != $2 and "deletedAt" is null and "model" is not null diff --git a/server/src/queries/sync.repository.sql b/server/src/queries/sync.repository.sql index e08335d9f1..54c1292d80 100644 --- a/server/src/queries/sync.repository.sql +++ b/server/src/queries/sync.repository.sql @@ -84,7 +84,7 @@ select "type", "deletedAt", "isFavorite", - "isVisible", + "visibility", "updateId" from "assets" @@ -106,7 +106,7 @@ select "type", "deletedAt", "isFavorite", - "isVisible", + "visibility", "updateId" from "assets" diff --git a/server/src/queries/user.repository.sql b/server/src/queries/user.repository.sql index e8ab5018fc..33f2960266 100644 --- a/server/src/queries/user.repository.sql +++ b/server/src/queries/user.repository.sql @@ -87,6 +87,16 @@ where "users"."isAdmin" = $1 and "users"."deletedAt" is null +-- UserRepository.getForPinCode +select + "users"."pinCode", + "users"."password" +from + "users" +where + "users"."id" = $1 + and "users"."deletedAt" is null + -- UserRepository.getByEmail select "id", @@ -285,14 +295,14 @@ select where ( "assets"."type" = 'IMAGE' - and "assets"."isVisible" = true + and "assets"."visibility" != 'hidden' ) ) as "photos", count(*) filter ( where ( "assets"."type" = 'VIDEO' - and "assets"."isVisible" = true + and "assets"."visibility" != 'hidden' ) ) as "videos", coalesce( diff --git a/server/src/queries/view.repository.sql b/server/src/queries/view.repository.sql index 1510521526..a2260ce5f6 100644 --- a/server/src/queries/view.repository.sql +++ b/server/src/queries/view.repository.sql @@ -7,8 +7,7 @@ from "assets" where "ownerId" = $2::uuid - and "isVisible" = $3 - and "isArchived" = $4 + and "visibility" = $3 and "deletedAt" is null and "fileCreatedAt" is not null and "fileModifiedAt" is not null @@ -23,13 +22,12 @@ from left join "exif" on "assets"."id" = "exif"."assetId" where "ownerId" = $1::uuid - and "isVisible" = $2 - and "isArchived" = $3 + and "visibility" = $2 and "deletedAt" is null and "fileCreatedAt" is not null and "fileModifiedAt" is not null and "localDateTime" is not null - and "originalPath" like $4 - and "originalPath" not like $5 + and "originalPath" like $3 + and "originalPath" not like $4 order by - regexp_replace("assets"."originalPath", $6, $7) asc + regexp_replace("assets"."originalPath", $5, $6) asc diff --git a/server/src/repositories/access.repository.ts b/server/src/repositories/access.repository.ts index c24209e482..5680ce2c64 100644 --- a/server/src/repositories/access.repository.ts +++ b/server/src/repositories/access.repository.ts @@ -3,7 +3,7 @@ import { Kysely, sql } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { DB } from 'src/db'; import { ChunkedSet, DummyValue, GenerateSql } from 'src/decorators'; -import { AlbumUserRole } from 'src/enum'; +import { AlbumUserRole, AssetVisibility } from 'src/enum'; import { asUuid } from 'src/utils/database'; class ActivityAccess { @@ -199,7 +199,13 @@ class AssetAccess { ) .select('assets.id') .where('partner.sharedWithId', '=', userId) - .where('assets.isArchived', '=', false) + .where((eb) => + eb.or([ + eb('assets.visibility', '=', sql.lit(AssetVisibility.TIMELINE)), + eb('assets.visibility', '=', sql.lit(AssetVisibility.HIDDEN)), + ]), + ) + .where('assets.id', 'in', [...assetIds]) .execute() .then((assets) => new Set(assets.map((asset) => asset.id))); diff --git a/server/src/repositories/asset-job.repository.ts b/server/src/repositories/asset-job.repository.ts index 1506f2997f..132bef6988 100644 --- a/server/src/repositories/asset-job.repository.ts +++ b/server/src/repositories/asset-job.repository.ts @@ -5,7 +5,7 @@ import { InjectKysely } from 'nestjs-kysely'; import { Asset, columns } from 'src/database'; import { DB } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; -import { AssetFileType, AssetType } from 'src/enum'; +import { AssetFileType, AssetType, AssetVisibility } from 'src/enum'; import { StorageAsset } from 'src/types'; import { anyUuid, @@ -34,7 +34,7 @@ export class AssetJobRepository { 'ownerId', 'duplicateId', 'stackId', - 'isVisible', + 'visibility', 'smart_search.embedding', withFiles(eb, AssetFileType.PREVIEW), ]) @@ -70,7 +70,7 @@ export class AssetJobRepository { .select(['assets.id', 'assets.thumbhash']) .select(withFiles) .where('assets.deletedAt', 'is', null) - .where('assets.isVisible', '=', true) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) .$if(!force, (qb) => qb // If there aren't any entries, metadata extraction hasn't run yet which is required for thumbnails @@ -102,7 +102,7 @@ export class AssetJobRepository { .selectFrom('assets') .select([ 'assets.id', - 'assets.isVisible', + 'assets.visibility', 'assets.originalFileName', 'assets.originalPath', 'assets.ownerId', @@ -138,7 +138,7 @@ export class AssetJobRepository { private assetsWithPreviews() { return this.db .selectFrom('assets') - .where('assets.isVisible', '=', true) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) .where('assets.deletedAt', 'is', null) .innerJoin('asset_job_status as job_status', 'assetId', 'assets.id') .where('job_status.previewAt', 'is not', null); @@ -169,7 +169,7 @@ export class AssetJobRepository { getForClipEncoding(id: string) { return this.db .selectFrom('assets') - .select(['assets.id', 'assets.isVisible']) + .select(['assets.id', 'assets.visibility']) .select((eb) => withFiles(eb, AssetFileType.PREVIEW)) .where('assets.id', '=', id) .executeTakeFirst(); @@ -179,7 +179,7 @@ export class AssetJobRepository { getForDetectFacesJob(id: string) { return this.db .selectFrom('assets') - .select(['assets.id', 'assets.isVisible']) + .select(['assets.id', 'assets.visibility']) .$call(withExifInner) .select((eb) => withFaces(eb, true)) .select((eb) => withFiles(eb, AssetFileType.PREVIEW)) @@ -209,7 +209,7 @@ export class AssetJobRepository { .selectFrom('assets') .select([ 'assets.id', - 'assets.isVisible', + 'assets.visibility', 'assets.libraryId', 'assets.ownerId', 'assets.livePhotoVideoId', @@ -228,7 +228,7 @@ export class AssetJobRepository { .select(['asset_stack.id', 'asset_stack.primaryAssetId']) .select((eb) => eb.fn('array_agg', [eb.table('stacked')]).as('assets')) .where('stacked.deletedAt', 'is not', null) - .where('stacked.isArchived', '=', false) + .where('stacked.visibility', '!=', AssetVisibility.ARCHIVE) .whereRef('stacked.stackId', '=', 'asset_stack.id') .groupBy('asset_stack.id') .as('stacked_assets'), @@ -248,7 +248,7 @@ export class AssetJobRepository { .$if(!force, (qb) => qb .where((eb) => eb.or([eb('assets.encodedVideoPath', 'is', null), eb('assets.encodedVideoPath', '=', '')])) - .where('assets.isVisible', '=', true), + .where('assets.visibility', '!=', AssetVisibility.HIDDEN), ) .where('assets.deletedAt', 'is', null) .stream(); @@ -275,7 +275,7 @@ export class AssetJobRepository { .where((eb) => eb.or([eb('asset_job_status.metadataExtractedAt', 'is', null), eb('asset_job_status.assetId', 'is', null)]), ) - .where('assets.isVisible', '=', true), + .where('assets.visibility', '!=', AssetVisibility.HIDDEN), ) .where('assets.deletedAt', 'is', null) .stream(); @@ -331,7 +331,7 @@ export class AssetJobRepository { .$if(!force, (qb) => qb.where((eb) => eb.or([eb('assets.sidecarPath', '=', ''), eb('assets.sidecarPath', 'is', null)])), ) - .where('assets.isVisible', '=', true) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) .stream(); } diff --git a/server/src/repositories/asset.repository.ts b/server/src/repositories/asset.repository.ts index 89062c210a..9bd115089f 100644 --- a/server/src/repositories/asset.repository.ts +++ b/server/src/repositories/asset.repository.ts @@ -6,7 +6,7 @@ import { Stack } from 'src/database'; import { AssetFiles, AssetJobStatus, Assets, DB, Exif } from 'src/db'; import { Chunked, ChunkedArray, DummyValue, GenerateSql } from 'src/decorators'; import { MapAsset } from 'src/dtos/asset-response.dto'; -import { AssetFileType, AssetOrder, AssetStatus, AssetType } from 'src/enum'; +import { AssetFileType, AssetOrder, AssetStatus, AssetType, AssetVisibility } from 'src/enum'; import { anyUuid, asUuid, @@ -14,6 +14,7 @@ import { removeUndefinedKeys, truncatedDate, unnest, + withDefaultVisibility, withExif, withFaces, withFacesAndPeople, @@ -30,8 +31,8 @@ export type AssetStats = Record; export interface AssetStatsOptions { isFavorite?: boolean; - isArchived?: boolean; isTrashed?: boolean; + visibility?: AssetVisibility; } export interface LivePhotoSearchOptions { @@ -52,7 +53,6 @@ export enum TimeBucketSize { } export interface AssetBuilderOptions { - isArchived?: boolean; isFavorite?: boolean; isTrashed?: boolean; isDuplicate?: boolean; @@ -64,6 +64,7 @@ export interface AssetBuilderOptions { exifInfo?: boolean; status?: AssetStatus; assetType?: AssetType; + visibility?: AssetVisibility; } export interface TimeBucketOptions extends AssetBuilderOptions { @@ -258,8 +259,7 @@ export class AssetRepository { .where('asset_job_status.previewAt', 'is not', null) .where(sql`(assets."localDateTime" at time zone 'UTC')::date`, '=', sql`today.date`) .where('assets.ownerId', '=', anyUuid(ownerIds)) - .where('assets.isVisible', '=', true) - .where('assets.isArchived', '=', false) + .where('assets.visibility', '=', AssetVisibility.TIMELINE) .where((eb) => eb.exists((qb) => qb @@ -348,7 +348,7 @@ export class AssetRepository { .select(['deviceAssetId']) .where('ownerId', '=', asUuid(ownerId)) .where('deviceId', '=', deviceId) - .where('isVisible', '=', true) + .where('visibility', '!=', AssetVisibility.HIDDEN) .where('deletedAt', 'is', null) .execute(); @@ -393,7 +393,7 @@ export class AssetRepository { .whereRef('stacked.stackId', '=', 'asset_stack.id') .whereRef('stacked.id', '!=', 'asset_stack.primaryAssetId') .where('stacked.deletedAt', 'is', null) - .where('stacked.isArchived', '=', false) + .where('stacked.visibility', '=', AssetVisibility.TIMELINE) .groupBy('asset_stack.id') .as('stacked_assets'), (join) => join.on('asset_stack.id', 'is not', null), @@ -503,7 +503,7 @@ export class AssetRepository { .executeTakeFirst(); } - getStatistics(ownerId: string, { isArchived, isFavorite, isTrashed }: AssetStatsOptions): Promise { + getStatistics(ownerId: string, { visibility, isFavorite, isTrashed }: AssetStatsOptions): Promise { return this.db .selectFrom('assets') .select((eb) => eb.fn.countAll().filterWhere('type', '=', AssetType.AUDIO).as(AssetType.AUDIO)) @@ -511,8 +511,8 @@ export class AssetRepository { .select((eb) => eb.fn.countAll().filterWhere('type', '=', AssetType.VIDEO).as(AssetType.VIDEO)) .select((eb) => eb.fn.countAll().filterWhere('type', '=', AssetType.OTHER).as(AssetType.OTHER)) .where('ownerId', '=', asUuid(ownerId)) - .where('isVisible', '=', true) - .$if(isArchived !== undefined, (qb) => qb.where('isArchived', '=', isArchived!)) + .$if(visibility === undefined, withDefaultVisibility) + .$if(!!visibility, (qb) => qb.where('assets.visibility', '=', visibility!)) .$if(isFavorite !== undefined, (qb) => qb.where('isFavorite', '=', isFavorite!)) .$if(!!isTrashed, (qb) => qb.where('assets.status', '!=', AssetStatus.DELETED)) .where('deletedAt', isTrashed ? 'is not' : 'is', null) @@ -525,7 +525,7 @@ export class AssetRepository { .selectAll('assets') .$call(withExif) .where('ownerId', '=', anyUuid(userIds)) - .where('isVisible', '=', true) + .where('visibility', '!=', AssetVisibility.HIDDEN) .where('deletedAt', 'is', null) .orderBy((eb) => eb.fn('random')) .limit(take) @@ -542,7 +542,8 @@ export class AssetRepository { .select(truncatedDate(options.size).as('timeBucket')) .$if(!!options.isTrashed, (qb) => qb.where('assets.status', '!=', AssetStatus.DELETED)) .where('assets.deletedAt', options.isTrashed ? 'is not' : 'is', null) - .where('assets.isVisible', '=', true) + .$if(options.visibility === undefined, withDefaultVisibility) + .$if(!!options.visibility, (qb) => qb.where('assets.visibility', '=', options.visibility!)) .$if(!!options.albumId, (qb) => qb .innerJoin('albums_assets_assets', 'assets.id', 'albums_assets_assets.assetsId') @@ -559,7 +560,6 @@ export class AssetRepository { .where((eb) => eb.or([eb('assets.stackId', 'is', null), eb(eb.table('asset_stack'), 'is not', null)])), ) .$if(!!options.userIds, (qb) => qb.where('assets.ownerId', '=', anyUuid(options.userIds!))) - .$if(options.isArchived !== undefined, (qb) => qb.where('assets.isArchived', '=', options.isArchived!)) .$if(options.isFavorite !== undefined, (qb) => qb.where('assets.isFavorite', '=', options.isFavorite!)) .$if(!!options.assetType, (qb) => qb.where('assets.type', '=', options.assetType!)) .$if(options.isDuplicate !== undefined, (qb) => @@ -594,7 +594,6 @@ export class AssetRepository { ) .$if(!!options.personId, (qb) => hasPeople(qb, [options.personId!])) .$if(!!options.userIds, (qb) => qb.where('assets.ownerId', '=', anyUuid(options.userIds!))) - .$if(options.isArchived !== undefined, (qb) => qb.where('assets.isArchived', '=', options.isArchived!)) .$if(options.isFavorite !== undefined, (qb) => qb.where('assets.isFavorite', '=', options.isFavorite!)) .$if(!!options.withStacked, (qb) => qb @@ -610,7 +609,7 @@ export class AssetRepository { .select((eb) => eb.fn.count(eb.table('stacked')).as('assetCount')) .whereRef('stacked.stackId', '=', 'asset_stack.id') .where('stacked.deletedAt', 'is', null) - .where('stacked.isArchived', '=', false) + .where('stacked.visibility', '!=', AssetVisibility.ARCHIVE) .groupBy('asset_stack.id') .as('stacked_assets'), (join) => join.on('asset_stack.id', 'is not', null), @@ -624,7 +623,8 @@ export class AssetRepository { .$if(!!options.isTrashed, (qb) => qb.where('assets.status', '!=', AssetStatus.DELETED)) .$if(!!options.tagId, (qb) => withTagId(qb, options.tagId!)) .where('assets.deletedAt', options.isTrashed ? 'is not' : 'is', null) - .where('assets.isVisible', '=', true) + .$if(options.visibility == undefined, withDefaultVisibility) + .$if(!!options.visibility, (qb) => qb.where('assets.visibility', '=', options.visibility!)) .where(truncatedDate(options.size), '=', timeBucket.replace(/^[+-]/, '')) .orderBy('assets.localDateTime', options.order ?? 'desc') .execute(); @@ -658,7 +658,7 @@ export class AssetRepository { .where('assets.duplicateId', 'is not', null) .$narrowType<{ duplicateId: NotNull }>() .where('assets.deletedAt', 'is', null) - .where('assets.isVisible', '=', true) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) .where('assets.stackId', 'is', null) .groupBy('assets.duplicateId'), ) @@ -703,8 +703,7 @@ export class AssetRepository { .select(['assetId as data', 'exif.city as value']) .$narrowType<{ value: NotNull }>() .where('ownerId', '=', asUuid(ownerId)) - .where('isVisible', '=', true) - .where('isArchived', '=', false) + .where('visibility', '=', AssetVisibility.TIMELINE) .where('type', '=', AssetType.IMAGE) .where('deletedAt', 'is', null) .limit(maxFields) @@ -743,7 +742,7 @@ export class AssetRepository { ) .select((eb) => eb.fn.toJson(eb.table('stacked_assets')).$castTo().as('stack')) .where('assets.ownerId', '=', asUuid(ownerId)) - .where('assets.isVisible', '=', true) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) .where('assets.updatedAt', '<=', updatedUntil) .$if(!!lastId, (qb) => qb.where('assets.id', '>', lastId!)) .orderBy('assets.id') @@ -771,7 +770,7 @@ export class AssetRepository { ) .select((eb) => eb.fn.toJson(eb.table('stacked_assets').$castTo()).as('stack')) .where('assets.ownerId', '=', anyUuid(options.userIds)) - .where('assets.isVisible', '=', true) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) .where('assets.updatedAt', '>', options.updatedAfter) .limit(options.limit) .execute(); diff --git a/server/src/repositories/audit.repository.ts b/server/src/repositories/audit.repository.ts index 5961e4f25d..48d7f28d12 100644 --- a/server/src/repositories/audit.repository.ts +++ b/server/src/repositories/audit.repository.ts @@ -29,7 +29,9 @@ export class AuditRepository { .$if(!!options.entityType, (qb) => qb.where('audit.entityType', '=', options.entityType!)) .where('audit.ownerId', 'in', options.userIds) .distinctOn(['audit.entityId', 'audit.entityType']) - .orderBy(['audit.entityId desc', 'audit.entityType desc', 'audit.createdAt desc']) + .orderBy('audit.entityId', 'desc') + .orderBy('audit.entityType', 'desc') + .orderBy('audit.createdAt', 'desc') .select('audit.entityId') .execute(); diff --git a/server/src/repositories/config.repository.spec.ts b/server/src/repositories/config.repository.spec.ts index 9e9ed71191..143892fdd0 100644 --- a/server/src/repositories/config.repository.spec.ts +++ b/server/src/repositories/config.repository.spec.ts @@ -23,6 +23,7 @@ const resetEnv = () => { 'DB_USERNAME', 'DB_PASSWORD', 'DB_DATABASE_NAME', + 'DB_SSL_MODE', 'DB_SKIP_MIGRATIONS', 'DB_VECTOR_EXTENSION', @@ -92,6 +93,17 @@ describe('getEnv', () => { }); }); + it('should validate DB_SSL_MODE', () => { + process.env.DB_SSL_MODE = 'invalid'; + expect(() => getEnv()).toThrowError('Invalid environment variables: DB_SSL_MODE'); + }); + + it('should accept a valid DB_SSL_MODE', () => { + process.env.DB_SSL_MODE = 'prefer'; + const { database } = getEnv(); + expect(database.config).toMatchObject(expect.objectContaining({ ssl: 'prefer' })); + }); + it('should allow skipping migrations', () => { process.env.DB_SKIP_MIGRATIONS = 'true'; const { database } = getEnv(); diff --git a/server/src/repositories/config.repository.ts b/server/src/repositories/config.repository.ts index 9b88a78e6b..9b3e406437 100644 --- a/server/src/repositories/config.repository.ts +++ b/server/src/repositories/config.repository.ts @@ -193,6 +193,7 @@ const getEnv = (): EnvData => { username: dto.DB_USERNAME || 'postgres', password: dto.DB_PASSWORD || 'postgres', database: dto.DB_DATABASE_NAME || 'immich', + ssl: dto.DB_SSL_MODE || undefined, }; return { diff --git a/server/src/repositories/download.repository.ts b/server/src/repositories/download.repository.ts index c9c62c90ce..4c4bed07ff 100644 --- a/server/src/repositories/download.repository.ts +++ b/server/src/repositories/download.repository.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { DB } from 'src/db'; +import { AssetVisibility } from 'src/enum'; import { anyUuid } from 'src/utils/database'; const builder = (db: Kysely) => @@ -31,6 +32,9 @@ export class DownloadRepository { } downloadUserId(userId: string) { - return builder(this.db).where('assets.ownerId', '=', userId).where('assets.isVisible', '=', true).stream(); + return builder(this.db) + .where('assets.ownerId', '=', userId) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) + .stream(); } } diff --git a/server/src/repositories/library.repository.ts b/server/src/repositories/library.repository.ts index fd9dd81b7b..b6c5ebbe08 100644 --- a/server/src/repositories/library.repository.ts +++ b/server/src/repositories/library.repository.ts @@ -4,7 +4,7 @@ import { InjectKysely } from 'nestjs-kysely'; import { DB, Libraries } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; import { LibraryStatsResponseDto } from 'src/dtos/library.dto'; -import { AssetType } from 'src/enum'; +import { AssetType, AssetVisibility } from 'src/enum'; export enum AssetSyncResult { DO_NOTHING, @@ -77,13 +77,17 @@ export class LibraryRepository { .select((eb) => eb.fn .countAll() - .filterWhere((eb) => eb.and([eb('assets.type', '=', AssetType.IMAGE), eb('assets.isVisible', '=', true)])) + .filterWhere((eb) => + eb.and([eb('assets.type', '=', AssetType.IMAGE), eb('assets.visibility', '!=', AssetVisibility.HIDDEN)]), + ) .as('photos'), ) .select((eb) => eb.fn .countAll() - .filterWhere((eb) => eb.and([eb('assets.type', '=', AssetType.VIDEO), eb('assets.isVisible', '=', true)])) + .filterWhere((eb) => + eb.and([eb('assets.type', '=', AssetType.VIDEO), eb('assets.visibility', '!=', AssetVisibility.HIDDEN)]), + ) .as('videos'), ) .select((eb) => eb.fn.coalesce((eb) => eb.fn.sum('exif.fileSizeInByte'), eb.val(0)).as('usage')) diff --git a/server/src/repositories/map.repository.ts b/server/src/repositories/map.repository.ts index f9998ad179..3f559442aa 100644 --- a/server/src/repositories/map.repository.ts +++ b/server/src/repositories/map.repository.ts @@ -8,7 +8,7 @@ import readLine from 'node:readline'; import { citiesFile } from 'src/constants'; import { DB, GeodataPlaces, NaturalearthCountries } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; -import { SystemMetadataKey } from 'src/enum'; +import { AssetVisibility, SystemMetadataKey } from 'src/enum'; import { ConfigRepository } from 'src/repositories/config.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; import { SystemMetadataRepository } from 'src/repositories/system-metadata.repository'; @@ -75,9 +75,11 @@ export class MapRepository { } @GenerateSql({ params: [[DummyValue.UUID], [DummyValue.UUID]] }) - getMapMarkers(ownerIds: string[], albumIds: string[], options: MapMarkerSearchOptions = {}) { - const { isArchived, isFavorite, fileCreatedAfter, fileCreatedBefore } = options; - + getMapMarkers( + ownerIds: string[], + albumIds: string[], + { isArchived, isFavorite, fileCreatedAfter, fileCreatedBefore }: MapMarkerSearchOptions = {}, + ) { return this.db .selectFrom('assets') .innerJoin('exif', (builder) => @@ -88,8 +90,17 @@ export class MapRepository { ) .select(['id', 'exif.latitude as lat', 'exif.longitude as lon', 'exif.city', 'exif.state', 'exif.country']) .$narrowType<{ lat: NotNull; lon: NotNull }>() - .where('isVisible', '=', true) - .$if(isArchived !== undefined, (q) => q.where('isArchived', '=', isArchived!)) + .$if(isArchived === true, (qb) => + qb.where((eb) => + eb.or([ + eb('assets.visibility', '=', AssetVisibility.TIMELINE), + eb('assets.visibility', '=', AssetVisibility.ARCHIVE), + ]), + ), + ) + .$if(isArchived === false || isArchived === undefined, (qb) => + qb.where('assets.visibility', '=', AssetVisibility.TIMELINE), + ) .$if(isFavorite !== undefined, (q) => q.where('isFavorite', '=', isFavorite!)) .$if(fileCreatedAfter !== undefined, (q) => q.where('fileCreatedAt', '>=', fileCreatedAfter!)) .$if(fileCreatedBefore !== undefined, (q) => q.where('fileCreatedAt', '<=', fileCreatedBefore!)) diff --git a/server/src/repositories/person.repository.ts b/server/src/repositories/person.repository.ts index 0383a54a27..789c47ccaf 100644 --- a/server/src/repositories/person.repository.ts +++ b/server/src/repositories/person.repository.ts @@ -4,7 +4,7 @@ import { jsonObjectFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; import { AssetFaces, DB, FaceSearch, Person } from 'src/db'; import { ChunkedArray, DummyValue, GenerateSql } from 'src/decorators'; -import { AssetFileType, SourceType } from 'src/enum'; +import { AssetFileType, AssetVisibility, SourceType } from 'src/enum'; import { removeUndefinedKeys } from 'src/utils/database'; import { paginationHelper, PaginationOptions } from 'src/utils/pagination'; @@ -157,7 +157,7 @@ export class PersonRepository { .innerJoin('assets', (join) => join .onRef('asset_faces.assetId', '=', 'assets.id') - .on('assets.isArchived', '=', false) + .on('assets.visibility', '!=', AssetVisibility.ARCHIVE) .on('assets.deletedAt', 'is', null), ) .where('person.ownerId', '=', userId) @@ -248,7 +248,7 @@ export class PersonRepository { jsonObjectFrom( eb .selectFrom('assets') - .select(['assets.ownerId', 'assets.isArchived', 'assets.fileCreatedAt']) + .select(['assets.ownerId', 'assets.visibility', 'assets.fileCreatedAt']) .whereRef('assets.id', '=', 'asset_faces.assetId'), ).as('asset'), ) @@ -264,8 +264,8 @@ export class PersonRepository { .selectFrom('person') .innerJoin('asset_faces', 'asset_faces.id', 'person.faceAssetId') .innerJoin('assets', 'asset_faces.assetId', 'assets.id') - .innerJoin('exif', 'exif.assetId', 'assets.id') - .innerJoin('asset_files', 'asset_files.assetId', 'assets.id') + .leftJoin('exif', 'exif.assetId', 'assets.id') + .leftJoin('asset_files', 'asset_files.assetId', 'assets.id') .select([ 'person.ownerId', 'asset_faces.boundingBoxX1 as x1', @@ -274,17 +274,14 @@ export class PersonRepository { 'asset_faces.boundingBoxY2 as y2', 'asset_faces.imageWidth as oldWidth', 'asset_faces.imageHeight as oldHeight', - 'exif.exifImageWidth', - 'exif.exifImageHeight', 'assets.type', 'assets.originalPath', 'asset_files.path as previewPath', + 'exif.orientation as exifOrientation', ]) .where('person.id', '=', id) .where('asset_faces.deletedAt', 'is', null) .where('asset_files.type', '=', AssetFileType.PREVIEW) - .where('exif.exifImageWidth', '>', 0) - .where('exif.exifImageHeight', '>', 0) .$narrowType<{ exifImageWidth: NotNull; exifImageHeight: NotNull }>() .executeTakeFirst(); } @@ -346,7 +343,7 @@ export class PersonRepository { join .onRef('assets.id', '=', 'asset_faces.assetId') .on('asset_faces.personId', '=', personId) - .on('assets.isArchived', '=', false) + .on('assets.visibility', '!=', AssetVisibility.ARCHIVE) .on('assets.deletedAt', 'is', null), ) .select((eb) => eb.fn.count(eb.fn('distinct', ['assets.id'])).as('count')) @@ -369,7 +366,7 @@ export class PersonRepository { join .onRef('assets.id', '=', 'asset_faces.assetId') .on('assets.deletedAt', 'is', null) - .on('assets.isArchived', '=', false), + .on('assets.visibility', '!=', AssetVisibility.ARCHIVE), ) .select((eb) => eb.fn.count(eb.fn('distinct', ['person.id'])).as('total')) .select((eb) => diff --git a/server/src/repositories/search.repository.ts b/server/src/repositories/search.repository.ts index b991ecc78b..4e6b6e0fcf 100644 --- a/server/src/repositories/search.repository.ts +++ b/server/src/repositories/search.repository.ts @@ -5,7 +5,7 @@ import { randomUUID } from 'node:crypto'; import { DB, Exif } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; import { MapAsset } from 'src/dtos/asset-response.dto'; -import { AssetStatus, AssetType } from 'src/enum'; +import { AssetStatus, AssetType, AssetVisibility } from 'src/enum'; import { ConfigRepository } from 'src/repositories/config.repository'; import { anyUuid, asUuid, searchAssetBuilder, vectorIndexQuery } from 'src/utils/database'; import { paginationHelper } from 'src/utils/pagination'; @@ -26,17 +26,16 @@ export interface SearchUserIdOptions { export type SearchIdOptions = SearchAssetIdOptions & SearchUserIdOptions; export interface SearchStatusOptions { - isArchived?: boolean; isEncoded?: boolean; isFavorite?: boolean; isMotion?: boolean; isOffline?: boolean; - isVisible?: boolean; isNotInAlbum?: boolean; type?: AssetType; status?: AssetStatus; withArchived?: boolean; withDeleted?: boolean; + visibility?: AssetVisibility; } export interface SearchOneToOneRelationOptions { @@ -276,7 +275,7 @@ export class SearchRepository { .innerJoin('smart_search', 'assets.id', 'smart_search.assetId') .where('assets.ownerId', '=', anyUuid(userIds)) .where('assets.deletedAt', 'is', null) - .where('assets.isVisible', '=', true) + .where('assets.visibility', '!=', AssetVisibility.HIDDEN) .where('assets.type', '=', type) .where('assets.id', '!=', asUuid(assetId)) .where('assets.stackId', 'is', null) @@ -367,8 +366,7 @@ export class SearchRepository { .select(['city', 'assetId']) .innerJoin('assets', 'assets.id', 'exif.assetId') .where('assets.ownerId', '=', anyUuid(userIds)) - .where('assets.isVisible', '=', true) - .where('assets.isArchived', '=', false) + .where('assets.visibility', '=', AssetVisibility.TIMELINE) .where('assets.type', '=', AssetType.IMAGE) .where('assets.deletedAt', 'is', null) .orderBy('city') @@ -384,8 +382,7 @@ export class SearchRepository { .select(['city', 'assetId']) .innerJoin('assets', 'assets.id', 'exif.assetId') .where('assets.ownerId', '=', anyUuid(userIds)) - .where('assets.isVisible', '=', true) - .where('assets.isArchived', '=', false) + .where('assets.visibility', '=', AssetVisibility.TIMELINE) .where('assets.type', '=', AssetType.IMAGE) .where('assets.deletedAt', 'is', null) .whereRef('exif.city', '>', 'cte.city') @@ -518,7 +515,7 @@ export class SearchRepository { .distinctOn(field) .innerJoin('assets', 'assets.id', 'exif.assetId') .where('ownerId', '=', anyUuid(userIds)) - .where('isVisible', '=', true) + .where('visibility', '!=', AssetVisibility.HIDDEN) .where('deletedAt', 'is', null) .where(field, 'is not', null); } diff --git a/server/src/repositories/sync.repository.ts b/server/src/repositories/sync.repository.ts index 613142cb99..f0c535ecf2 100644 --- a/server/src/repositories/sync.repository.ts +++ b/server/src/repositories/sync.repository.ts @@ -159,7 +159,7 @@ export class SyncRepository { return builder .where('deletedAt', '<', sql.raw("now() - interval '1 millisecond'")) .$if(!!ack, (qb) => qb.where('id', '>', ack!.updateId)) - .orderBy(['id asc']) as SelectQueryBuilder; + .orderBy('id', 'asc') as SelectQueryBuilder; } private upsertTableFilters, D>( @@ -170,6 +170,6 @@ export class SyncRepository { return builder .where('updatedAt', '<', sql.raw("now() - interval '1 millisecond'")) .$if(!!ack, (qb) => qb.where('updateId', '>', ack!.updateId)) - .orderBy(['updateId asc']) as SelectQueryBuilder; + .orderBy('updateId', 'asc') as SelectQueryBuilder; } } diff --git a/server/src/repositories/user.repository.ts b/server/src/repositories/user.repository.ts index e2e396f7b2..f8710746aa 100644 --- a/server/src/repositories/user.repository.ts +++ b/server/src/repositories/user.repository.ts @@ -6,7 +6,7 @@ import { InjectKysely } from 'nestjs-kysely'; import { columns } from 'src/database'; import { DB, UserMetadata as DbUserMetadata } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; -import { AssetType, UserStatus } from 'src/enum'; +import { AssetType, AssetVisibility, UserStatus } from 'src/enum'; import { UserTable } from 'src/schema/tables/user.table'; import { UserMetadata, UserMetadataItem } from 'src/types'; import { asUuid } from 'src/utils/database'; @@ -89,13 +89,23 @@ export class UserRepository { return !!admin; } + @GenerateSql({ params: [DummyValue.UUID] }) + getForPinCode(id: string) { + return this.db + .selectFrom('users') + .select(['users.pinCode', 'users.password']) + .where('users.id', '=', id) + .where('users.deletedAt', 'is', null) + .executeTakeFirstOrThrow(); + } + @GenerateSql({ params: [DummyValue.EMAIL] }) - getByEmail(email: string, withPassword?: boolean) { + getByEmail(email: string, options?: { withPassword?: boolean }) { return this.db .selectFrom('users') .select(columns.userAdmin) .select(withMetadata) - .$if(!!withPassword, (eb) => eb.select('password')) + .$if(!!options?.withPassword, (eb) => eb.select('password')) .where('email', '=', email) .where('users.deletedAt', 'is', null) .executeTakeFirst(); @@ -205,13 +215,19 @@ export class UserRepository { eb.fn .countAll() .filterWhere((eb) => - eb.and([eb('assets.type', '=', sql.lit(AssetType.IMAGE)), eb('assets.isVisible', '=', sql.lit(true))]), + eb.and([ + eb('assets.type', '=', sql.lit(AssetType.IMAGE)), + eb('assets.visibility', '!=', sql.lit(AssetVisibility.HIDDEN)), + ]), ) .as('photos'), eb.fn .countAll() .filterWhere((eb) => - eb.and([eb('assets.type', '=', sql.lit(AssetType.VIDEO)), eb('assets.isVisible', '=', sql.lit(true))]), + eb.and([ + eb('assets.type', '=', sql.lit(AssetType.VIDEO)), + eb('assets.visibility', '!=', sql.lit(AssetVisibility.HIDDEN)), + ]), ) .as('videos'), eb.fn diff --git a/server/src/repositories/view-repository.ts b/server/src/repositories/view-repository.ts index e32933065c..03e8b3763f 100644 --- a/server/src/repositories/view-repository.ts +++ b/server/src/repositories/view-repository.ts @@ -2,6 +2,7 @@ import { Kysely } from 'kysely'; import { InjectKysely } from 'nestjs-kysely'; import { DB } from 'src/db'; import { DummyValue, GenerateSql } from 'src/decorators'; +import { AssetVisibility } from 'src/enum'; import { asUuid, withExif } from 'src/utils/database'; export class ViewRepository { @@ -14,8 +15,7 @@ export class ViewRepository { .select((eb) => eb.fn('substring', ['assets.originalPath', eb.val('^(.*/)[^/]*$')]).as('directoryPath')) .distinct() .where('ownerId', '=', asUuid(userId)) - .where('isVisible', '=', true) - .where('isArchived', '=', false) + .where('visibility', '=', AssetVisibility.TIMELINE) .where('deletedAt', 'is', null) .where('fileCreatedAt', 'is not', null) .where('fileModifiedAt', 'is not', null) @@ -34,8 +34,7 @@ export class ViewRepository { .selectAll('assets') .$call(withExif) .where('ownerId', '=', asUuid(userId)) - .where('isVisible', '=', true) - .where('isArchived', '=', false) + .where('visibility', '=', AssetVisibility.TIMELINE) .where('deletedAt', 'is', null) .where('fileCreatedAt', 'is not', null) .where('fileModifiedAt', 'is not', null) diff --git a/server/src/schema/enums.ts b/server/src/schema/enums.ts index 100b92aa63..a1134df6bc 100644 --- a/server/src/schema/enums.ts +++ b/server/src/schema/enums.ts @@ -1,4 +1,4 @@ -import { AssetStatus, SourceType } from 'src/enum'; +import { AssetStatus, AssetVisibility, SourceType } from 'src/enum'; import { registerEnum } from 'src/sql-tools'; export const assets_status_enum = registerEnum({ @@ -10,3 +10,8 @@ export const asset_face_source_type = registerEnum({ name: 'sourcetype', values: Object.values(SourceType), }); + +export const asset_visibility_enum = registerEnum({ + name: 'asset_visibility_enum', + values: Object.values(AssetVisibility), +}); diff --git a/server/src/schema/index.ts b/server/src/schema/index.ts index c62681d049..735dfd3ae9 100644 --- a/server/src/schema/index.ts +++ b/server/src/schema/index.ts @@ -1,4 +1,4 @@ -import { asset_face_source_type, assets_status_enum } from 'src/schema/enums'; +import { asset_face_source_type, asset_visibility_enum, assets_status_enum } from 'src/schema/enums'; import { assets_delete_audit, f_concat_ws, @@ -101,5 +101,5 @@ export class ImmichDatabase { assets_delete_audit, ]; - enum = [assets_status_enum, asset_face_source_type]; + enum = [assets_status_enum, asset_face_source_type, asset_visibility_enum]; } diff --git a/server/src/schema/migrations/1745902563899-AddAssetVisibilityColumn.ts b/server/src/schema/migrations/1745902563899-AddAssetVisibilityColumn.ts new file mode 100644 index 0000000000..6fe9dab1a0 --- /dev/null +++ b/server/src/schema/migrations/1745902563899-AddAssetVisibilityColumn.ts @@ -0,0 +1,37 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + await sql`CREATE TYPE "asset_visibility_enum" AS ENUM ('archive','timeline','hidden');`.execute(db); + await sql`ALTER TABLE "assets" + ADD "visibility" asset_visibility_enum NOT NULL DEFAULT 'timeline';`.execute(db); + + await sql` + UPDATE "assets" + SET "visibility" = CASE + WHEN "isArchived" THEN 'archive'::asset_visibility_enum + WHEN "isVisible" THEN 'timeline'::asset_visibility_enum + ELSE 'hidden'::asset_visibility_enum + END; + `.execute(db); + + await sql`ALTER TABLE "assets" DROP COLUMN "isVisible";`.execute(db); + await sql`ALTER TABLE "assets" DROP COLUMN "isArchived";`.execute(db); +} + +export async function down(db: Kysely): Promise { + await sql`ALTER TABLE "assets" ADD COLUMN "isArchived" BOOLEAN NOT NULL DEFAULT FALSE;`.execute(db); + await sql`ALTER TABLE "assets" ADD COLUMN "isVisible" BOOLEAN NOT NULL DEFAULT TRUE;`.execute(db); + + await sql` + UPDATE "assets" + SET + "isArchived" = ("visibility" = 'archive'::asset_visibility_enum), + "isVisible" = CASE + WHEN "visibility" = 'timeline'::asset_visibility_enum THEN TRUE + WHEN "visibility" = 'archive'::asset_visibility_enum THEN TRUE + ELSE FALSE + END; + `.execute(db); + await sql`ALTER TABLE "assets" DROP COLUMN "visibility";`.execute(db); + await sql`DROP TYPE "asset_visibility_enum";`.execute(db); +} diff --git a/server/src/schema/migrations/1746636476623-DropExtraIndexes.ts b/server/src/schema/migrations/1746636476623-DropExtraIndexes.ts new file mode 100644 index 0000000000..1518593428 --- /dev/null +++ b/server/src/schema/migrations/1746636476623-DropExtraIndexes.ts @@ -0,0 +1,29 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + const { rows } = await sql<{ db: string }>`SELECT current_database() as db`.execute(db); + const databaseName = rows[0].db; + await sql.raw(`ALTER DATABASE "${databaseName}" SET search_path TO "$user", public, vectors`).execute(db); + const naturalearth_pkey = await sql<{ constraint_name: string }>`SELECT constraint_name + FROM information_schema.table_constraints + WHERE table_schema = 'public' + AND table_name = 'naturalearth_countries' + AND constraint_type = 'PRIMARY KEY';`.execute(db); + const naturalearth_pkey_name = naturalearth_pkey.rows[0]?.constraint_name; + if(naturalearth_pkey_name) { + await sql`ALTER TABLE "naturalearth_countries" + DROP CONSTRAINT ${sql.ref(naturalearth_pkey_name)};`.execute(db); + } + await sql`ALTER TABLE "naturalearth_countries" ADD CONSTRAINT "naturalearth_countries_pkey" PRIMARY KEY ("id") WITH (FILLFACTOR = 100);`.execute(db); + await sql`DROP INDEX IF EXISTS "IDX_02a43fd0b3c50fb6d7f0cb7282";`.execute(db); + await sql`DROP INDEX IF EXISTS "IDX_95ad7106dd7b484275443f580f";`.execute(db); + await sql`DROP INDEX IF EXISTS "IDX_7e077a8b70b3530138610ff5e0";`.execute(db); + await sql`DROP INDEX IF EXISTS "IDX_92e67dc508c705dd66c9461557";`.execute(db); + await sql`DROP INDEX IF EXISTS "IDX_6afb43681a21cf7815932bc38a";`.execute(db); +} + +export async function down(db: Kysely): Promise { + const { rows } = await sql<{ db: string }>`SELECT current_database() as db`.execute(db); + const databaseName = rows[0].db; + await sql.raw(`ALTER DATABASE "${databaseName}" RESET "search_path"`).execute(db); +} diff --git a/server/src/schema/migrations/1746768490606-AddUserPincode.ts b/server/src/schema/migrations/1746768490606-AddUserPincode.ts new file mode 100644 index 0000000000..12dc3c2d12 --- /dev/null +++ b/server/src/schema/migrations/1746768490606-AddUserPincode.ts @@ -0,0 +1,9 @@ +import { Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + await sql`ALTER TABLE "users" ADD "pinCode" character varying;`.execute(db); +} + +export async function down(db: Kysely): Promise { + await sql`ALTER TABLE "users" DROP COLUMN "pinCode";`.execute(db); +} diff --git a/server/src/schema/tables/asset.table.ts b/server/src/schema/tables/asset.table.ts index 19ec8d2ef4..d337984a46 100644 --- a/server/src/schema/tables/asset.table.ts +++ b/server/src/schema/tables/asset.table.ts @@ -1,6 +1,6 @@ import { UpdatedAtTrigger, UpdateIdColumn } from 'src/decorators'; -import { AssetStatus, AssetType } from 'src/enum'; -import { assets_status_enum } from 'src/schema/enums'; +import { AssetStatus, AssetType, AssetVisibility } from 'src/enum'; +import { asset_visibility_enum, assets_status_enum } from 'src/schema/enums'; import { assets_delete_audit } from 'src/schema/functions'; import { LibraryTable } from 'src/schema/tables/library.table'; import { StackTable } from 'src/schema/tables/stack.table'; @@ -95,9 +95,6 @@ export class AssetTable { @Column({ type: 'bytea', index: true }) checksum!: Buffer; // sha1 checksum - @Column({ type: 'boolean', default: true }) - isVisible!: boolean; - @ForeignKeyColumn(() => AssetTable, { nullable: true, onUpdate: 'CASCADE', onDelete: 'SET NULL' }) livePhotoVideoId!: string | null; @@ -107,9 +104,6 @@ export class AssetTable { @CreateDateColumn() createdAt!: Date; - @Column({ type: 'boolean', default: false }) - isArchived!: boolean; - @Column({ index: true }) originalFileName!: string; @@ -145,4 +139,7 @@ export class AssetTable { @UpdateIdColumn({ indexName: 'IDX_assets_update_id' }) updateId?: string; + + @Column({ enum: asset_visibility_enum, default: AssetVisibility.TIMELINE }) + visibility!: AssetVisibility; } diff --git a/server/src/schema/tables/natural-earth-countries.table.ts b/server/src/schema/tables/natural-earth-countries.table.ts index df1132d17d..e5e6ead772 100644 --- a/server/src/schema/tables/natural-earth-countries.table.ts +++ b/server/src/schema/tables/natural-earth-countries.table.ts @@ -1,6 +1,6 @@ import { Column, PrimaryGeneratedColumn, Table } from 'src/sql-tools'; -@Table({ name: 'naturalearth_countries' }) +@Table({ name: 'naturalearth_countries', primaryConstraintName: 'naturalearth_countries_pkey' }) export class NaturalEarthCountriesTable { @PrimaryGeneratedColumn({ strategy: 'identity' }) id!: number; diff --git a/server/src/schema/tables/shared-link.table.ts b/server/src/schema/tables/shared-link.table.ts index 3bb36b36ed..39693f3893 100644 --- a/server/src/schema/tables/shared-link.table.ts +++ b/server/src/schema/tables/shared-link.table.ts @@ -16,7 +16,7 @@ export class SharedLinkTable { userId!: string; @Column({ type: 'bytea', indexName: 'IDX_sharedlink_key' }) - key!: Buffer; // use to access the inidividual asset + key!: Buffer; // use to access the individual asset @Column() type!: SharedLinkType; diff --git a/server/src/schema/tables/user.table.ts b/server/src/schema/tables/user.table.ts index 7525a739a6..c806d6e3f7 100644 --- a/server/src/schema/tables/user.table.ts +++ b/server/src/schema/tables/user.table.ts @@ -37,6 +37,9 @@ export class UserTable { @Column({ default: '' }) password!: Generated; + @Column({ nullable: true }) + pinCode!: string | null; + @CreateDateColumn() createdAt!: Generated; diff --git a/server/src/services/asset-media.service.spec.ts b/server/src/services/asset-media.service.spec.ts index d25067f1c9..8490e8aaea 100644 --- a/server/src/services/asset-media.service.spec.ts +++ b/server/src/services/asset-media.service.spec.ts @@ -9,7 +9,7 @@ import { AssetFile } from 'src/database'; import { AssetMediaStatus, AssetRejectReason, AssetUploadAction } from 'src/dtos/asset-media-response.dto'; import { AssetMediaCreateDto, AssetMediaReplaceDto, AssetMediaSize, UploadFieldName } from 'src/dtos/asset-media.dto'; import { MapAsset } from 'src/dtos/asset-response.dto'; -import { AssetFileType, AssetStatus, AssetType, CacheControl, JobName } from 'src/enum'; +import { AssetFileType, AssetStatus, AssetType, AssetVisibility, CacheControl, JobName } from 'src/enum'; import { AuthRequest } from 'src/middleware/auth.guard'; import { AssetMediaService } from 'src/services/asset-media.service'; import { ASSET_CHECKSUM_CONSTRAINT } from 'src/utils/database'; @@ -142,7 +142,6 @@ const createDto = Object.freeze({ fileCreatedAt: new Date('2022-06-19T23:41:36.910Z'), fileModifiedAt: new Date('2022-06-19T23:41:36.910Z'), isFavorite: false, - isArchived: false, duration: '0:00:00.000000', }) as AssetMediaCreateDto; @@ -164,7 +163,6 @@ const assetEntity = Object.freeze({ fileCreatedAt: new Date('2022-06-19T23:41:36.910Z'), updatedAt: new Date('2022-06-19T23:41:36.910Z'), isFavorite: false, - isArchived: false, encodedVideoPath: '', duration: '0:00:00.000000', files: [] as AssetFile[], @@ -437,7 +435,10 @@ describe(AssetMediaService.name, () => { }); it('should hide the linked motion asset', async () => { - mocks.asset.getById.mockResolvedValueOnce({ ...assetStub.livePhotoMotionAsset, isVisible: true }); + mocks.asset.getById.mockResolvedValueOnce({ + ...assetStub.livePhotoMotionAsset, + visibility: AssetVisibility.TIMELINE, + }); mocks.asset.create.mockResolvedValueOnce(assetStub.livePhotoStillAsset); await expect( @@ -452,7 +453,10 @@ describe(AssetMediaService.name, () => { }); expect(mocks.asset.getById).toHaveBeenCalledWith('live-photo-motion-asset'); - expect(mocks.asset.update).toHaveBeenCalledWith({ id: 'live-photo-motion-asset', isVisible: false }); + expect(mocks.asset.update).toHaveBeenCalledWith({ + id: 'live-photo-motion-asset', + visibility: AssetVisibility.HIDDEN, + }); }); it('should handle a sidecar file', async () => { diff --git a/server/src/services/asset-media.service.ts b/server/src/services/asset-media.service.ts index 78e23fa802..87d617ede6 100644 --- a/server/src/services/asset-media.service.ts +++ b/server/src/services/asset-media.service.ts @@ -21,7 +21,7 @@ import { UploadFieldName, } from 'src/dtos/asset-media.dto'; import { AuthDto } from 'src/dtos/auth.dto'; -import { AssetStatus, AssetType, CacheControl, JobName, Permission, StorageFolder } from 'src/enum'; +import { AssetStatus, AssetType, AssetVisibility, CacheControl, JobName, Permission, StorageFolder } from 'src/enum'; import { AuthRequest } from 'src/middleware/auth.guard'; import { BaseService } from 'src/services/base.service'; import { UploadFile } from 'src/types'; @@ -146,7 +146,6 @@ export class AssetMediaService extends BaseService { { userId: auth.user.id, livePhotoVideoId: dto.livePhotoVideoId }, ); } - const asset = await this.create(auth.user.id, dto, file, sidecarFile); await this.userRepository.updateUsage(auth.user.id, file.size); @@ -416,9 +415,8 @@ export class AssetMediaService extends BaseService { type: mimeTypes.assetType(file.originalPath), isFavorite: dto.isFavorite, - isArchived: dto.isArchived ?? false, duration: dto.duration || null, - isVisible: dto.isVisible ?? true, + visibility: dto.visibility ?? AssetVisibility.TIMELINE, livePhotoVideoId: dto.livePhotoVideoId, originalFileName: file.originalName, sidecarPath: sidecarFile?.originalPath, diff --git a/server/src/services/asset.service.spec.ts b/server/src/services/asset.service.spec.ts index ecfb7936d2..1e4cfddcf5 100755 --- a/server/src/services/asset.service.spec.ts +++ b/server/src/services/asset.service.spec.ts @@ -2,7 +2,7 @@ import { BadRequestException } from '@nestjs/common'; import { DateTime } from 'luxon'; import { MapAsset } from 'src/dtos/asset-response.dto'; import { AssetJobName, AssetStatsResponseDto } from 'src/dtos/asset.dto'; -import { AssetStatus, AssetType, JobName, JobStatus } from 'src/enum'; +import { AssetStatus, AssetType, AssetVisibility, JobName, JobStatus } from 'src/enum'; import { AssetStats } from 'src/repositories/asset.repository'; import { AssetService } from 'src/services/asset.service'; import { assetStub } from 'test/fixtures/asset.stub'; @@ -46,14 +46,22 @@ describe(AssetService.name, () => { describe('getStatistics', () => { it('should get the statistics for a user, excluding archived assets', async () => { mocks.asset.getStatistics.mockResolvedValue(stats); - await expect(sut.getStatistics(authStub.admin, { isArchived: false })).resolves.toEqual(statResponse); - expect(mocks.asset.getStatistics).toHaveBeenCalledWith(authStub.admin.user.id, { isArchived: false }); + await expect(sut.getStatistics(authStub.admin, { visibility: AssetVisibility.TIMELINE })).resolves.toEqual( + statResponse, + ); + expect(mocks.asset.getStatistics).toHaveBeenCalledWith(authStub.admin.user.id, { + visibility: AssetVisibility.TIMELINE, + }); }); it('should get the statistics for a user for archived assets', async () => { mocks.asset.getStatistics.mockResolvedValue(stats); - await expect(sut.getStatistics(authStub.admin, { isArchived: true })).resolves.toEqual(statResponse); - expect(mocks.asset.getStatistics).toHaveBeenCalledWith(authStub.admin.user.id, { isArchived: true }); + await expect(sut.getStatistics(authStub.admin, { visibility: AssetVisibility.ARCHIVE })).resolves.toEqual( + statResponse, + ); + expect(mocks.asset.getStatistics).toHaveBeenCalledWith(authStub.admin.user.id, { + visibility: AssetVisibility.ARCHIVE, + }); }); it('should get the statistics for a user for favorite assets', async () => { @@ -192,9 +200,9 @@ describe(AssetService.name, () => { describe('update', () => { it('should require asset write access for the id', async () => { - await expect(sut.update(authStub.admin, 'asset-1', { isArchived: false })).rejects.toBeInstanceOf( - BadRequestException, - ); + await expect( + sut.update(authStub.admin, 'asset-1', { visibility: AssetVisibility.TIMELINE }), + ).rejects.toBeInstanceOf(BadRequestException); expect(mocks.asset.update).not.toHaveBeenCalled(); }); @@ -242,7 +250,10 @@ describe(AssetService.name, () => { id: assetStub.livePhotoStillAsset.id, livePhotoVideoId: assetStub.livePhotoMotionAsset.id, }); - expect(mocks.asset.update).not.toHaveBeenCalledWith({ id: assetStub.livePhotoMotionAsset.id, isVisible: true }); + expect(mocks.asset.update).not.toHaveBeenCalledWith({ + id: assetStub.livePhotoMotionAsset.id, + visibility: AssetVisibility.TIMELINE, + }); expect(mocks.event.emit).not.toHaveBeenCalledWith('asset.show', { assetId: assetStub.livePhotoMotionAsset.id, userId: userStub.admin.id, @@ -263,7 +274,10 @@ describe(AssetService.name, () => { id: assetStub.livePhotoStillAsset.id, livePhotoVideoId: assetStub.livePhotoMotionAsset.id, }); - expect(mocks.asset.update).not.toHaveBeenCalledWith({ id: assetStub.livePhotoMotionAsset.id, isVisible: true }); + expect(mocks.asset.update).not.toHaveBeenCalledWith({ + id: assetStub.livePhotoMotionAsset.id, + visibility: AssetVisibility.TIMELINE, + }); expect(mocks.event.emit).not.toHaveBeenCalledWith('asset.show', { assetId: assetStub.livePhotoMotionAsset.id, userId: userStub.admin.id, @@ -284,7 +298,10 @@ describe(AssetService.name, () => { id: assetStub.livePhotoStillAsset.id, livePhotoVideoId: assetStub.livePhotoMotionAsset.id, }); - expect(mocks.asset.update).not.toHaveBeenCalledWith({ id: assetStub.livePhotoMotionAsset.id, isVisible: true }); + expect(mocks.asset.update).not.toHaveBeenCalledWith({ + id: assetStub.livePhotoMotionAsset.id, + visibility: AssetVisibility.TIMELINE, + }); expect(mocks.event.emit).not.toHaveBeenCalledWith('asset.show', { assetId: assetStub.livePhotoMotionAsset.id, userId: userStub.admin.id, @@ -296,7 +313,7 @@ describe(AssetService.name, () => { mocks.asset.getById.mockResolvedValueOnce({ ...assetStub.livePhotoMotionAsset, ownerId: authStub.admin.user.id, - isVisible: true, + visibility: AssetVisibility.TIMELINE, }); mocks.asset.getById.mockResolvedValueOnce(assetStub.image); mocks.asset.update.mockResolvedValue(assetStub.image); @@ -305,7 +322,10 @@ describe(AssetService.name, () => { livePhotoVideoId: assetStub.livePhotoMotionAsset.id, }); - expect(mocks.asset.update).toHaveBeenCalledWith({ id: assetStub.livePhotoMotionAsset.id, isVisible: false }); + expect(mocks.asset.update).toHaveBeenCalledWith({ + id: assetStub.livePhotoMotionAsset.id, + visibility: AssetVisibility.HIDDEN, + }); expect(mocks.event.emit).toHaveBeenCalledWith('asset.hide', { assetId: assetStub.livePhotoMotionAsset.id, userId: userStub.admin.id, @@ -335,7 +355,10 @@ describe(AssetService.name, () => { id: assetStub.livePhotoStillAsset.id, livePhotoVideoId: null, }); - expect(mocks.asset.update).toHaveBeenCalledWith({ id: assetStub.livePhotoMotionAsset.id, isVisible: true }); + expect(mocks.asset.update).toHaveBeenCalledWith({ + id: assetStub.livePhotoMotionAsset.id, + visibility: assetStub.livePhotoStillAsset.visibility, + }); expect(mocks.event.emit).toHaveBeenCalledWith('asset.show', { assetId: assetStub.livePhotoMotionAsset.id, userId: userStub.admin.id, @@ -361,7 +384,6 @@ describe(AssetService.name, () => { await expect( sut.updateAll(authStub.admin, { ids: ['asset-1'], - isArchived: false, }), ).rejects.toBeInstanceOf(BadRequestException); }); @@ -369,9 +391,11 @@ describe(AssetService.name, () => { it('should update all assets', async () => { mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set(['asset-1', 'asset-2'])); - await sut.updateAll(authStub.admin, { ids: ['asset-1', 'asset-2'], isArchived: true }); + await sut.updateAll(authStub.admin, { ids: ['asset-1', 'asset-2'], visibility: AssetVisibility.ARCHIVE }); - expect(mocks.asset.updateAll).toHaveBeenCalledWith(['asset-1', 'asset-2'], { isArchived: true }); + expect(mocks.asset.updateAll).toHaveBeenCalledWith(['asset-1', 'asset-2'], { + visibility: AssetVisibility.ARCHIVE, + }); }); it('should not update Assets table if no relevant fields are provided', async () => { @@ -381,7 +405,6 @@ describe(AssetService.name, () => { ids: ['asset-1'], latitude: 0, longitude: 0, - isArchived: undefined, isFavorite: undefined, duplicateId: undefined, rating: undefined, @@ -389,14 +412,14 @@ describe(AssetService.name, () => { expect(mocks.asset.updateAll).not.toHaveBeenCalled(); }); - it('should update Assets table if isArchived field is provided', async () => { + it('should update Assets table if visibility field is provided', async () => { mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set(['asset-1'])); await sut.updateAll(authStub.admin, { ids: ['asset-1'], latitude: 0, longitude: 0, - isArchived: undefined, + visibility: undefined, isFavorite: false, duplicateId: undefined, rating: undefined, @@ -416,7 +439,6 @@ describe(AssetService.name, () => { latitude: 30, longitude: 50, dateTimeOriginal, - isArchived: undefined, isFavorite: false, duplicateId: undefined, rating: undefined, @@ -431,6 +453,20 @@ describe(AssetService.name, () => { { name: JobName.SIDECAR_WRITE, data: { id: 'asset-1', dateTimeOriginal, latitude: 30, longitude: 50 } }, ]); }); + + it('should update Assets table if duplicateId is provided as null', async () => { + mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set(['asset-1'])); + + await sut.updateAll(authStub.admin, { + ids: ['asset-1'], + latitude: 0, + longitude: 0, + isFavorite: undefined, + duplicateId: null, + rating: undefined, + }); + expect(mocks.asset.updateAll).toHaveBeenCalled(); + }); }); describe('deleteAll', () => { diff --git a/server/src/services/asset.service.ts b/server/src/services/asset.service.ts index bcbe86875b..3ab6fcb8a7 100644 --- a/server/src/services/asset.service.ts +++ b/server/src/services/asset.service.ts @@ -92,8 +92,12 @@ export class AssetService extends BaseService { const asset = await this.assetRepository.update({ id, ...rest }); - if (previousMotion) { - await onAfterUnlink(repos, { userId: auth.user.id, livePhotoVideoId: previousMotion.id }); + if (previousMotion && asset) { + await onAfterUnlink(repos, { + userId: auth.user.id, + livePhotoVideoId: previousMotion.id, + visibility: asset.visibility, + }); } if (!asset) { @@ -115,10 +119,10 @@ export class AssetService extends BaseService { } if ( - options.isArchived != undefined || - options.isFavorite != undefined || - options.duplicateId != undefined || - options.rating != undefined + options.visibility !== undefined || + options.isFavorite !== undefined || + options.duplicateId !== undefined || + options.rating !== undefined ) { await this.assetRepository.updateAll(ids, options); } diff --git a/server/src/services/auth.service.spec.ts b/server/src/services/auth.service.spec.ts index 75f5b8a52d..82172d6b95 100644 --- a/server/src/services/auth.service.spec.ts +++ b/server/src/services/auth.service.spec.ts @@ -1,5 +1,6 @@ import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common'; import { DateTime } from 'luxon'; +import { SALT_ROUNDS } from 'src/constants'; import { UserAdmin } from 'src/database'; import { AuthDto, SignUpDto } from 'src/dtos/auth.dto'; import { AuthType, Permission } from 'src/enum'; @@ -118,7 +119,7 @@ describe(AuthService.name, () => { await sut.changePassword(auth, dto); - expect(mocks.user.getByEmail).toHaveBeenCalledWith(auth.user.email, true); + expect(mocks.user.getByEmail).toHaveBeenCalledWith(auth.user.email, { withPassword: true }); expect(mocks.crypto.compareBcrypt).toHaveBeenCalledWith('old-password', 'hash-password'); }); @@ -859,4 +860,77 @@ describe(AuthService.name, () => { expect(mocks.user.update).toHaveBeenCalledWith(auth.user.id, { oauthId: '' }); }); }); + + describe('setupPinCode', () => { + it('should setup a PIN code', async () => { + const user = factory.userAdmin(); + const auth = factory.auth({ user }); + const dto = { pinCode: '123456' }; + + mocks.user.getForPinCode.mockResolvedValue({ pinCode: null, password: '' }); + mocks.user.update.mockResolvedValue(user); + + await sut.setupPinCode(auth, dto); + + expect(mocks.user.getForPinCode).toHaveBeenCalledWith(user.id); + expect(mocks.crypto.hashBcrypt).toHaveBeenCalledWith('123456', SALT_ROUNDS); + expect(mocks.user.update).toHaveBeenCalledWith(user.id, { pinCode: expect.any(String) }); + }); + + it('should fail if the user already has a PIN code', async () => { + const user = factory.userAdmin(); + const auth = factory.auth({ user }); + + mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); + + await expect(sut.setupPinCode(auth, { pinCode: '123456' })).rejects.toThrow('User already has a PIN code'); + }); + }); + + describe('changePinCode', () => { + it('should change the PIN code', async () => { + const user = factory.userAdmin(); + const auth = factory.auth({ user }); + const dto = { pinCode: '123456', newPinCode: '012345' }; + + mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); + mocks.user.update.mockResolvedValue(user); + mocks.crypto.compareBcrypt.mockImplementation((a, b) => `${a} (hashed)` === b); + + await sut.changePinCode(auth, dto); + + expect(mocks.crypto.compareBcrypt).toHaveBeenCalledWith('123456', '123456 (hashed)'); + expect(mocks.user.update).toHaveBeenCalledWith(user.id, { pinCode: '012345 (hashed)' }); + }); + + it('should fail if the PIN code does not match', async () => { + const user = factory.userAdmin(); + mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); + mocks.crypto.compareBcrypt.mockImplementation((a, b) => `${a} (hashed)` === b); + + await expect( + sut.changePinCode(factory.auth({ user }), { pinCode: '000000', newPinCode: '012345' }), + ).rejects.toThrow('Wrong PIN code'); + }); + }); + + describe('resetPinCode', () => { + it('should reset the PIN code', async () => { + const user = factory.userAdmin(); + mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); + mocks.crypto.compareBcrypt.mockImplementation((a, b) => `${a} (hashed)` === b); + + await sut.resetPinCode(factory.auth({ user }), { pinCode: '123456' }); + + expect(mocks.user.update).toHaveBeenCalledWith(user.id, { pinCode: null }); + }); + + it('should throw if the PIN code does not match', async () => { + const user = factory.userAdmin(); + mocks.user.getForPinCode.mockResolvedValue({ pinCode: '123456 (hashed)', password: '' }); + mocks.crypto.compareBcrypt.mockImplementation((a, b) => `${a} (hashed)` === b); + + await expect(sut.resetPinCode(factory.auth({ user }), { pinCode: '000000' })).rejects.toThrow('Wrong PIN code'); + }); + }); }); diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts index b250b63a5e..65dd84693b 100644 --- a/server/src/services/auth.service.ts +++ b/server/src/services/auth.service.ts @@ -9,11 +9,15 @@ import { StorageCore } from 'src/cores/storage.core'; import { UserAdmin } from 'src/database'; import { AuthDto, + AuthStatusResponseDto, ChangePasswordDto, LoginCredentialDto, LogoutResponseDto, OAuthCallbackDto, OAuthConfigDto, + PinCodeChangeDto, + PinCodeResetDto, + PinCodeSetupDto, SignUpDto, mapLoginResponse, } from 'src/dtos/auth.dto'; @@ -56,9 +60,9 @@ export class AuthService extends BaseService { throw new UnauthorizedException('Password login has been disabled'); } - let user = await this.userRepository.getByEmail(dto.email, true); + let user = await this.userRepository.getByEmail(dto.email, { withPassword: true }); if (user) { - const isAuthenticated = this.validatePassword(dto.password, user); + const isAuthenticated = this.validateSecret(dto.password, user.password); if (!isAuthenticated) { user = undefined; } @@ -86,12 +90,12 @@ export class AuthService extends BaseService { async changePassword(auth: AuthDto, dto: ChangePasswordDto): Promise { const { password, newPassword } = dto; - const user = await this.userRepository.getByEmail(auth.user.email, true); + const user = await this.userRepository.getByEmail(auth.user.email, { withPassword: true }); if (!user) { throw new UnauthorizedException(); } - const valid = this.validatePassword(password, user); + const valid = this.validateSecret(password, user.password); if (!valid) { throw new BadRequestException('Wrong password'); } @@ -103,6 +107,56 @@ export class AuthService extends BaseService { return mapUserAdmin(updatedUser); } + async setupPinCode(auth: AuthDto, { pinCode }: PinCodeSetupDto) { + const user = await this.userRepository.getForPinCode(auth.user.id); + if (!user) { + throw new UnauthorizedException(); + } + + if (user.pinCode) { + throw new BadRequestException('User already has a PIN code'); + } + + const hashed = await this.cryptoRepository.hashBcrypt(pinCode, SALT_ROUNDS); + await this.userRepository.update(auth.user.id, { pinCode: hashed }); + } + + async resetPinCode(auth: AuthDto, dto: PinCodeResetDto) { + const user = await this.userRepository.getForPinCode(auth.user.id); + this.resetPinChecks(user, dto); + + await this.userRepository.update(auth.user.id, { pinCode: null }); + } + + async changePinCode(auth: AuthDto, dto: PinCodeChangeDto) { + const user = await this.userRepository.getForPinCode(auth.user.id); + this.resetPinChecks(user, dto); + + const hashed = await this.cryptoRepository.hashBcrypt(dto.newPinCode, SALT_ROUNDS); + await this.userRepository.update(auth.user.id, { pinCode: hashed }); + } + + private resetPinChecks( + user: { pinCode: string | null; password: string | null }, + dto: { pinCode?: string; password?: string }, + ) { + if (!user.pinCode) { + throw new BadRequestException('User does not have a PIN code'); + } + + if (dto.password) { + if (!this.validateSecret(dto.password, user.password)) { + throw new BadRequestException('Wrong password'); + } + } else if (dto.pinCode) { + if (!this.validateSecret(dto.pinCode, user.pinCode)) { + throw new BadRequestException('Wrong PIN code'); + } + } else { + throw new BadRequestException('Either password or pinCode is required'); + } + } + async adminSignUp(dto: SignUpDto): Promise { const adminUser = await this.userRepository.getAdmin(); if (adminUser) { @@ -371,11 +425,12 @@ export class AuthService extends BaseService { throw new UnauthorizedException('Invalid API key'); } - private validatePassword(inputPassword: string, user: { password?: string }): boolean { - if (!user || !user.password) { + private validateSecret(inputSecret: string, existingHash?: string | null): boolean { + if (!existingHash) { return false; } - return this.cryptoRepository.compareBcrypt(inputPassword, user.password); + + return this.cryptoRepository.compareBcrypt(inputSecret, existingHash); } private async validateSession(tokenValue: string): Promise { @@ -428,4 +483,16 @@ export class AuthService extends BaseService { } return url; } + + async getAuthStatus(auth: AuthDto): Promise { + const user = await this.userRepository.getForPinCode(auth.user.id); + if (!user) { + throw new UnauthorizedException(); + } + + return { + pinCode: !!user.pinCode, + password: !!user.password, + }; + } } diff --git a/server/src/services/duplicate.service.spec.ts b/server/src/services/duplicate.service.spec.ts index ed8f2cf177..3f08e36a21 100644 --- a/server/src/services/duplicate.service.spec.ts +++ b/server/src/services/duplicate.service.spec.ts @@ -1,4 +1,4 @@ -import { AssetFileType, AssetType, JobName, JobStatus } from 'src/enum'; +import { AssetFileType, AssetType, AssetVisibility, JobName, JobStatus } from 'src/enum'; import { DuplicateService } from 'src/services/duplicate.service'; import { SearchService } from 'src/services/search.service'; import { assetStub } from 'test/fixtures/asset.stub'; @@ -22,11 +22,11 @@ const hasEmbedding = { updateId: 'update-1', }, ], - isVisible: true, stackId: null, type: AssetType.IMAGE, duplicateId: null, embedding: '[1, 2, 3, 4]', + visibility: AssetVisibility.TIMELINE, }; const hasDupe = { @@ -207,7 +207,10 @@ describe(SearchService.name, () => { it('should skip if asset is not visible', async () => { const id = assetStub.livePhotoMotionAsset.id; - mocks.assetJob.getForSearchDuplicatesJob.mockResolvedValue({ ...hasEmbedding, isVisible: false }); + mocks.assetJob.getForSearchDuplicatesJob.mockResolvedValue({ + ...hasEmbedding, + visibility: AssetVisibility.HIDDEN, + }); const result = await sut.handleSearchDuplicates({ id }); diff --git a/server/src/services/duplicate.service.ts b/server/src/services/duplicate.service.ts index 41e3f13c4d..b5e4f573f2 100644 --- a/server/src/services/duplicate.service.ts +++ b/server/src/services/duplicate.service.ts @@ -4,7 +4,7 @@ import { OnJob } from 'src/decorators'; import { mapAsset } from 'src/dtos/asset-response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; import { DuplicateResponseDto } from 'src/dtos/duplicate.dto'; -import { AssetFileType, JobName, JobStatus, QueueName } from 'src/enum'; +import { AssetFileType, AssetVisibility, JobName, JobStatus, QueueName } from 'src/enum'; import { AssetDuplicateResult } from 'src/repositories/search.repository'; import { BaseService } from 'src/services/base.service'; import { JobItem, JobOf } from 'src/types'; @@ -65,7 +65,7 @@ export class DuplicateService extends BaseService { return JobStatus.SKIPPED; } - if (!asset.isVisible) { + if (asset.visibility == AssetVisibility.HIDDEN) { this.logger.debug(`Asset ${id} is not visible, skipping`); return JobStatus.SKIPPED; } diff --git a/server/src/services/job.service.ts b/server/src/services/job.service.ts index cf9b87f4e6..fd573d9b97 100644 --- a/server/src/services/job.service.ts +++ b/server/src/services/job.service.ts @@ -6,6 +6,7 @@ import { mapAsset } from 'src/dtos/asset-response.dto'; import { AllJobStatusResponseDto, JobCommandDto, JobCreateDto, JobStatusDto } from 'src/dtos/job.dto'; import { AssetType, + AssetVisibility, BootstrapEventPriority, ImmichWorker, JobCommand, @@ -301,7 +302,7 @@ export class JobService extends BaseService { } await this.jobRepository.queueAll(jobs); - if (asset.isVisible) { + if (asset.visibility === AssetVisibility.TIMELINE || asset.visibility === AssetVisibility.ARCHIVE) { this.eventRepository.clientSend('on_upload_success', asset.ownerId, mapAsset(asset)); } diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index d747ee0ba8..fa7cfc096a 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -7,6 +7,7 @@ import { AssetType, AudioCodec, Colorspace, + ExifOrientation, ImageFormat, JobName, JobStatus, @@ -20,7 +21,8 @@ import { JobCounts, RawImageInfo } from 'src/types'; import { assetStub } from 'test/fixtures/asset.stub'; import { faceStub } from 'test/fixtures/face.stub'; import { probeStub } from 'test/fixtures/media.stub'; -import { personStub } from 'test/fixtures/person.stub'; +import { personStub, personThumbnailStub } from 'test/fixtures/person.stub'; +import { systemConfigStub } from 'test/fixtures/system-config.stub'; import { makeStream, newTestService, ServiceMocks } from 'test/utils'; describe(MediaService.name, () => { @@ -872,6 +874,323 @@ describe(MediaService.name, () => { }); }); + describe('handleGeneratePersonThumbnail', () => { + it('should skip if machine learning is disabled', async () => { + mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.machineLearningDisabled); + + await expect(sut.handleGeneratePersonThumbnail({ id: 'person-1' })).resolves.toBe(JobStatus.SKIPPED); + expect(mocks.asset.getByIds).not.toHaveBeenCalled(); + expect(mocks.systemMetadata.get).toHaveBeenCalled(); + }); + + it('should skip a person not found', async () => { + await sut.handleGeneratePersonThumbnail({ id: 'person-1' }); + expect(mocks.media.generateThumbnail).not.toHaveBeenCalled(); + }); + + it('should skip a person without a face asset id', async () => { + mocks.person.getById.mockResolvedValue(personStub.noThumbnail); + await sut.handleGeneratePersonThumbnail({ id: 'person-1' }); + expect(mocks.media.generateThumbnail).not.toHaveBeenCalled(); + }); + + it('should skip a person with face not found', async () => { + await sut.handleGeneratePersonThumbnail({ id: 'person-1' }); + expect(mocks.media.generateThumbnail).not.toHaveBeenCalled(); + }); + + it('should generate a thumbnail', async () => { + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailMiddle); + mocks.media.generateThumbnail.mockResolvedValue(); + const data = Buffer.from(''); + const info = { width: 1000, height: 1000 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.person.getDataForThumbnailGenerationJob).toHaveBeenCalledWith(personStub.primaryPerson.id); + expect(mocks.storage.mkdirSync).toHaveBeenCalledWith('upload/thumbs/admin_id/pe/rs'); + expect(mocks.media.decodeImage).toHaveBeenCalledWith(personThumbnailStub.newThumbnailMiddle.originalPath, { + colorspace: Colorspace.P3, + orientation: undefined, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( + data, + { + colorspace: Colorspace.P3, + format: ImageFormat.JPEG, + quality: 80, + crop: { + left: 238, + top: 163, + width: 274, + height: 274, + }, + raw: info, + processInvalidImages: false, + size: 250, + }, + 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', + ); + expect(mocks.person.update).toHaveBeenCalledWith({ + id: 'person-1', + thumbnailPath: 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', + }); + }); + + it('should generate a thumbnail without going negative', async () => { + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailStart); + mocks.media.generateThumbnail.mockResolvedValue(); + const data = Buffer.from(''); + const info = { width: 2160, height: 3840 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.decodeImage).toHaveBeenCalledWith(personThumbnailStub.newThumbnailStart.originalPath, { + colorspace: Colorspace.P3, + orientation: undefined, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( + data, + { + colorspace: Colorspace.P3, + format: ImageFormat.JPEG, + quality: 80, + crop: { + left: 0, + top: 85, + width: 510, + height: 510, + }, + raw: info, + processInvalidImages: false, + size: 250, + }, + 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', + ); + }); + + it('should generate a thumbnail without overflowing', async () => { + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailEnd); + mocks.person.update.mockResolvedValue(personStub.primaryPerson); + mocks.media.generateThumbnail.mockResolvedValue(); + const data = Buffer.from(''); + const info = { width: 1000, height: 1000 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.decodeImage).toHaveBeenCalledWith(personThumbnailStub.newThumbnailEnd.originalPath, { + colorspace: Colorspace.P3, + orientation: undefined, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( + data, + { + colorspace: Colorspace.P3, + format: ImageFormat.JPEG, + quality: 80, + crop: { + left: 591, + top: 591, + width: 408, + height: 408, + }, + raw: info, + processInvalidImages: false, + size: 250, + }, + 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', + ); + }); + + it('should handle negative coordinates', async () => { + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.negativeCoordinate); + mocks.person.update.mockResolvedValue(personStub.primaryPerson); + mocks.media.generateThumbnail.mockResolvedValue(); + const data = Buffer.from(''); + const info = { width: 4624, height: 3080 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.decodeImage).toHaveBeenCalledWith(personThumbnailStub.negativeCoordinate.originalPath, { + colorspace: Colorspace.P3, + orientation: undefined, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( + data, + { + colorspace: Colorspace.P3, + format: ImageFormat.JPEG, + quality: 80, + crop: { + left: 0, + top: 62, + width: 412, + height: 412, + }, + raw: info, + processInvalidImages: false, + size: 250, + }, + 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', + ); + }); + + it('should handle overflowing coordinate', async () => { + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.overflowingCoordinate); + mocks.person.update.mockResolvedValue(personStub.primaryPerson); + mocks.media.generateThumbnail.mockResolvedValue(); + const data = Buffer.from(''); + const info = { width: 4624, height: 3080 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.decodeImage).toHaveBeenCalledWith(personThumbnailStub.overflowingCoordinate.originalPath, { + colorspace: Colorspace.P3, + orientation: undefined, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( + data, + { + colorspace: Colorspace.P3, + format: ImageFormat.JPEG, + quality: 80, + crop: { + left: 4485, + top: 94, + width: 138, + height: 138, + }, + raw: info, + processInvalidImages: false, + size: 250, + }, + 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', + ); + }); + + it('should use embedded preview if enabled and raw image', async () => { + mocks.systemMetadata.get.mockResolvedValue({ image: { extractEmbedded: true } }); + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.rawEmbeddedThumbnail); + mocks.person.update.mockResolvedValue(personStub.primaryPerson); + mocks.media.generateThumbnail.mockResolvedValue(); + const extracted = Buffer.from(''); + const data = Buffer.from(''); + const info = { width: 2160, height: 3840 } as OutputInfo; + mocks.media.extract.mockResolvedValue({ buffer: extracted, format: RawExtractedFormat.JPEG }); + mocks.media.decodeImage.mockResolvedValue({ data, info }); + mocks.media.getImageDimensions.mockResolvedValue(info); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.extract).toHaveBeenCalledWith(personThumbnailStub.rawEmbeddedThumbnail.originalPath); + expect(mocks.media.decodeImage).toHaveBeenCalledWith(extracted, { + colorspace: Colorspace.P3, + orientation: ExifOrientation.Horizontal, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( + data, + { + colorspace: Colorspace.P3, + format: ImageFormat.JPEG, + quality: 80, + crop: { + height: 844, + left: 388, + top: 730, + width: 844, + }, + raw: info, + processInvalidImages: false, + size: 250, + }, + 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', + ); + }); + + it('should not use embedded preview if enabled and not raw image', async () => { + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailMiddle); + mocks.media.generateThumbnail.mockResolvedValue(); + const data = Buffer.from(''); + const info = { width: 2160, height: 3840 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.extract).not.toHaveBeenCalled(); + expect(mocks.media.generateThumbnail).toHaveBeenCalled(); + }); + + it('should not use embedded preview if enabled and raw image if not exists', async () => { + mocks.systemMetadata.get.mockResolvedValue({ image: { extractEmbedded: true } }); + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.rawEmbeddedThumbnail); + mocks.media.generateThumbnail.mockResolvedValue(); + const data = Buffer.from(''); + const info = { width: 2160, height: 3840 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.extract).toHaveBeenCalledWith(personThumbnailStub.rawEmbeddedThumbnail.originalPath); + expect(mocks.media.decodeImage).toHaveBeenCalledWith(personThumbnailStub.rawEmbeddedThumbnail.originalPath, { + colorspace: Colorspace.P3, + orientation: undefined, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalled(); + }); + + it('should not use embedded preview if enabled and raw image if low resolution', async () => { + mocks.systemMetadata.get.mockResolvedValue({ image: { extractEmbedded: true } }); + mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.rawEmbeddedThumbnail); + mocks.media.generateThumbnail.mockResolvedValue(); + const extracted = Buffer.from(''); + const data = Buffer.from(''); + const info = { width: 1000, height: 1000 } as OutputInfo; + mocks.media.decodeImage.mockResolvedValue({ data, info }); + mocks.media.extract.mockResolvedValue({ buffer: extracted, format: RawExtractedFormat.JPEG }); + mocks.media.getImageDimensions.mockResolvedValue(info); + + await expect(sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id })).resolves.toBe( + JobStatus.SUCCESS, + ); + + expect(mocks.media.extract).toHaveBeenCalledWith(personThumbnailStub.rawEmbeddedThumbnail.originalPath); + expect(mocks.media.decodeImage).toHaveBeenCalledWith(personThumbnailStub.rawEmbeddedThumbnail.originalPath, { + colorspace: Colorspace.P3, + orientation: undefined, + processInvalidImages: false, + }); + expect(mocks.media.generateThumbnail).toHaveBeenCalled(); + }); + }); + describe('handleQueueVideoConversion', () => { it('should queue all video assets', async () => { mocks.assetJob.streamForVideoConversion.mockReturnValue(makeStream([assetStub.video])); diff --git a/server/src/services/media.service.ts b/server/src/services/media.service.ts index 546dcc930b..048d03f493 100644 --- a/server/src/services/media.service.ts +++ b/server/src/services/media.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { JOBS_ASSET_PAGINATION_SIZE } from 'src/constants'; +import { FACE_THUMBNAIL_SIZE, JOBS_ASSET_PAGINATION_SIZE } from 'src/constants'; import { StorageCore, ThumbnailPathEntity } from 'src/cores/storage.core'; import { Exif } from 'src/database'; import { OnEvent, OnJob } from 'src/decorators'; @@ -8,8 +8,10 @@ import { AssetFileType, AssetPathType, AssetType, + AssetVisibility, AudioCodec, Colorspace, + ImageFormat, JobName, JobStatus, LogLevel, @@ -23,10 +25,13 @@ import { VideoContainer, } from 'src/enum'; import { UpsertFileOptions } from 'src/repositories/asset.repository'; +import { BoundingBox } from 'src/repositories/machine-learning.repository'; import { BaseService } from 'src/services/base.service'; import { AudioStreamInfo, + CropOptions, DecodeToBufferOptions, + ImageDimensions, JobItem, JobOf, VideoFormat, @@ -36,6 +41,7 @@ import { import { getAssetFiles } from 'src/utils/asset.util'; import { BaseConfig, ThumbnailConfig } from 'src/utils/media'; import { mimeTypes } from 'src/utils/mime-types'; +import { clamp, isFaceImportEnabled, isFacialRecognitionEnabled } from 'src/utils/misc'; @Injectable() export class MediaService extends BaseService { @@ -152,7 +158,7 @@ export class MediaService extends BaseService { return JobStatus.FAILED; } - if (!asset.isVisible) { + if (asset.visibility === AssetVisibility.HIDDEN) { this.logger.verbose(`Thumbnail generation skipped for asset ${id}: not visible`); return JobStatus.SKIPPED; } @@ -307,6 +313,100 @@ export class MediaService extends BaseService { return { previewPath, thumbnailPath, fullsizePath, thumbhash: outputs[0] as Buffer }; } + @OnJob({ name: JobName.GENERATE_PERSON_THUMBNAIL, queue: QueueName.THUMBNAIL_GENERATION }) + async handleGeneratePersonThumbnail({ id }: JobOf): Promise { + const { machineLearning, metadata, image } = await this.getConfig({ withCache: true }); + if (!isFacialRecognitionEnabled(machineLearning) && !isFaceImportEnabled(metadata)) { + return JobStatus.SKIPPED; + } + + const data = await this.personRepository.getDataForThumbnailGenerationJob(id); + if (!data) { + this.logger.error(`Could not generate person thumbnail for ${id}: missing data`); + return JobStatus.FAILED; + } + + const { ownerId, x1, y1, x2, y2, oldWidth, oldHeight, exifOrientation, previewPath, originalPath } = data; + let inputImage: string | Buffer; + if (mimeTypes.isVideo(originalPath)) { + if (!previewPath) { + this.logger.error(`Could not generate person thumbnail for video ${id}: missing preview path`); + return JobStatus.FAILED; + } + inputImage = previewPath; + } + + if (image.extractEmbedded && mimeTypes.isRaw(originalPath)) { + const extracted = await this.extractImage(originalPath, image.preview.size); + inputImage = extracted ? extracted.buffer : originalPath; + } else { + inputImage = originalPath; + } + + const { data: decodedImage, info } = await this.mediaRepository.decodeImage(inputImage, { + colorspace: image.colorspace, + processInvalidImages: process.env.IMMICH_PROCESS_INVALID_IMAGES === 'true', + // if this is an extracted image, it may not have orientation metadata + orientation: Buffer.isBuffer(inputImage) && exifOrientation ? Number(exifOrientation) : undefined, + }); + + const thumbnailPath = StorageCore.getPersonThumbnailPath({ id, ownerId }); + this.storageCore.ensureFolders(thumbnailPath); + + const thumbnailOptions = { + colorspace: image.colorspace, + format: ImageFormat.JPEG, + raw: info, + quality: image.thumbnail.quality, + crop: this.getCrop( + { old: { width: oldWidth, height: oldHeight }, new: { width: info.width, height: info.height } }, + { x1, y1, x2, y2 }, + ), + processInvalidImages: false, + size: FACE_THUMBNAIL_SIZE, + }; + + await this.mediaRepository.generateThumbnail(decodedImage, thumbnailOptions, thumbnailPath); + await this.personRepository.update({ id, thumbnailPath }); + + return JobStatus.SUCCESS; + } + + private getCrop(dims: { old: ImageDimensions; new: ImageDimensions }, { x1, y1, x2, y2 }: BoundingBox): CropOptions { + // face bounding boxes can spill outside the image dimensions + const clampedX1 = clamp(x1, 0, dims.old.width); + const clampedY1 = clamp(y1, 0, dims.old.height); + const clampedX2 = clamp(x2, 0, dims.old.width); + const clampedY2 = clamp(y2, 0, dims.old.height); + + const widthScale = dims.new.width / dims.old.width; + const heightScale = dims.new.height / dims.old.height; + + const halfWidth = (widthScale * (clampedX2 - clampedX1)) / 2; + const halfHeight = (heightScale * (clampedY2 - clampedY1)) / 2; + + const middleX = Math.round(widthScale * clampedX1 + halfWidth); + const middleY = Math.round(heightScale * clampedY1 + halfHeight); + + // zoom out 10% + const targetHalfSize = Math.floor(Math.max(halfWidth, halfHeight) * 1.1); + + // get the longest distance from the center of the image without overflowing + const newHalfSize = Math.min( + middleX - Math.max(0, middleX - targetHalfSize), + middleY - Math.max(0, middleY - targetHalfSize), + Math.min(dims.new.width - 1, middleX + targetHalfSize) - middleX, + Math.min(dims.new.height - 1, middleY + targetHalfSize) - middleY, + ); + + return { + left: middleX - newHalfSize, + top: middleY - newHalfSize, + width: newHalfSize * 2, + height: newHalfSize * 2, + }; + } + private async generateVideoThumbnails(asset: ThumbnailPathEntity & { originalPath: string }) { const { image, ffmpeg } = await this.getConfig({ withCache: true }); const previewPath = StorageCore.getImagePath(asset, AssetPathType.PREVIEW, image.preview.format); diff --git a/server/src/services/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts index 969da6256d..28cb42a16b 100644 --- a/server/src/services/metadata.service.spec.ts +++ b/server/src/services/metadata.service.spec.ts @@ -4,7 +4,7 @@ import { Stats } from 'node:fs'; import { constants } from 'node:fs/promises'; import { defaults } from 'src/config'; import { MapAsset } from 'src/dtos/asset-response.dto'; -import { AssetType, ExifOrientation, ImmichWorker, JobName, JobStatus, SourceType } from 'src/enum'; +import { AssetType, AssetVisibility, ExifOrientation, ImmichWorker, JobName, JobStatus, SourceType } from 'src/enum'; import { ImmichTags } from 'src/repositories/metadata.repository'; import { MetadataService } from 'src/services/metadata.service'; import { assetStub } from 'test/fixtures/asset.stub'; @@ -15,21 +15,18 @@ import { tagStub } from 'test/fixtures/tag.stub'; import { factory } from 'test/small.factory'; import { makeStream, newTestService, ServiceMocks } from 'test/utils'; -const makeFaceTags = (face: Partial<{ Name: string }> = {}) => ({ +const makeFaceTags = (face: Partial<{ Name: string }> = {}, orientation?: ImmichTags['Orientation']) => ({ + Orientation: orientation, RegionInfo: { - AppliedToDimensions: { - W: 100, - H: 100, - Unit: 'normalized', - }, + AppliedToDimensions: { W: 1000, H: 100, Unit: 'pixel' }, RegionList: [ { Type: 'face', Area: { - X: 0.05, - Y: 0.05, - W: 0.1, - H: 0.1, + X: 0.1, + Y: 0.4, + W: 0.2, + H: 0.4, Unit: 'normalized', }, ...face, @@ -507,7 +504,10 @@ describe(MetadataService.name, () => { }); it('should not apply motion photos if asset is video', async () => { - mocks.assetJob.getForMetadataExtraction.mockResolvedValue({ ...assetStub.livePhotoMotionAsset, isVisible: true }); + mocks.assetJob.getForMetadataExtraction.mockResolvedValue({ + ...assetStub.livePhotoMotionAsset, + visibility: AssetVisibility.TIMELINE, + }); mocks.media.probe.mockResolvedValue(probeStub.matroskaContainer); await sut.handleMetadataExtraction({ id: assetStub.livePhotoMotionAsset.id }); @@ -516,7 +516,7 @@ describe(MetadataService.name, () => { expect(mocks.job.queue).not.toHaveBeenCalled(); expect(mocks.job.queueAll).not.toHaveBeenCalled(); expect(mocks.asset.update).not.toHaveBeenCalledWith( - expect.objectContaining({ assetType: AssetType.VIDEO, isVisible: false }), + expect.objectContaining({ assetType: AssetType.VIDEO, visibility: AssetVisibility.HIDDEN }), ); }); @@ -583,7 +583,7 @@ describe(MetadataService.name, () => { fileCreatedAt: assetStub.livePhotoWithOriginalFileName.fileCreatedAt, fileModifiedAt: assetStub.livePhotoWithOriginalFileName.fileModifiedAt, id: fileStub.livePhotoMotion.uuid, - isVisible: false, + visibility: AssetVisibility.HIDDEN, libraryId: assetStub.livePhotoWithOriginalFileName.libraryId, localDateTime: assetStub.livePhotoWithOriginalFileName.fileCreatedAt, originalFileName: 'asset_1.mp4', @@ -641,7 +641,7 @@ describe(MetadataService.name, () => { fileCreatedAt: assetStub.livePhotoWithOriginalFileName.fileCreatedAt, fileModifiedAt: assetStub.livePhotoWithOriginalFileName.fileModifiedAt, id: fileStub.livePhotoMotion.uuid, - isVisible: false, + visibility: AssetVisibility.HIDDEN, libraryId: assetStub.livePhotoWithOriginalFileName.libraryId, localDateTime: assetStub.livePhotoWithOriginalFileName.fileCreatedAt, originalFileName: 'asset_1.mp4', @@ -699,7 +699,7 @@ describe(MetadataService.name, () => { fileCreatedAt: assetStub.livePhotoWithOriginalFileName.fileCreatedAt, fileModifiedAt: assetStub.livePhotoWithOriginalFileName.fileModifiedAt, id: fileStub.livePhotoMotion.uuid, - isVisible: false, + visibility: AssetVisibility.HIDDEN, libraryId: assetStub.livePhotoWithOriginalFileName.libraryId, localDateTime: assetStub.livePhotoWithOriginalFileName.fileCreatedAt, originalFileName: 'asset_1.mp4', @@ -776,14 +776,17 @@ describe(MetadataService.name, () => { MicroVideoOffset: 1, }); mocks.crypto.hashSha1.mockReturnValue(randomBytes(512)); - mocks.asset.getByChecksum.mockResolvedValue({ ...assetStub.livePhotoMotionAsset, isVisible: true }); + mocks.asset.getByChecksum.mockResolvedValue({ + ...assetStub.livePhotoMotionAsset, + visibility: AssetVisibility.TIMELINE, + }); const video = randomBytes(512); mocks.storage.readFile.mockResolvedValue(video); await sut.handleMetadataExtraction({ id: assetStub.livePhotoStillAsset.id }); expect(mocks.asset.update).toHaveBeenCalledWith({ id: assetStub.livePhotoMotionAsset.id, - isVisible: false, + visibility: AssetVisibility.HIDDEN, }); expect(mocks.asset.update).toHaveBeenCalledWith({ id: assetStub.livePhotoStillAsset.id, @@ -1098,11 +1101,11 @@ describe(MetadataService.name, () => { assetId: assetStub.primaryImage.id, personId: 'random-uuid', imageHeight: 100, - imageWidth: 100, + imageWidth: 1000, boundingBoxX1: 0, - boundingBoxX2: 10, - boundingBoxY1: 0, - boundingBoxY2: 10, + boundingBoxX2: 200, + boundingBoxY1: 20, + boundingBoxY2: 60, sourceType: SourceType.EXIF, }, ], @@ -1137,11 +1140,11 @@ describe(MetadataService.name, () => { assetId: assetStub.primaryImage.id, personId: personStub.withName.id, imageHeight: 100, - imageWidth: 100, + imageWidth: 1000, boundingBoxX1: 0, - boundingBoxX2: 10, - boundingBoxY1: 0, - boundingBoxY2: 10, + boundingBoxX2: 200, + boundingBoxY1: 20, + boundingBoxY2: 60, sourceType: SourceType.EXIF, }, ], @@ -1151,6 +1154,104 @@ describe(MetadataService.name, () => { expect(mocks.job.queueAll).not.toHaveBeenCalledWith(); }); + describe('handleFaceTagOrientation', () => { + const orientationTests = [ + { + description: 'undefined', + orientation: undefined, + expected: { imgW: 1000, imgH: 100, x1: 0, x2: 200, y1: 20, y2: 60 }, + }, + { + description: 'Horizontal = 1', + orientation: ExifOrientation.Horizontal, + expected: { imgW: 1000, imgH: 100, x1: 0, x2: 200, y1: 20, y2: 60 }, + }, + { + description: 'MirrorHorizontal = 2', + orientation: ExifOrientation.MirrorHorizontal, + expected: { imgW: 1000, imgH: 100, x1: 800, x2: 1000, y1: 20, y2: 60 }, + }, + { + description: 'Rotate180 = 3', + orientation: ExifOrientation.Rotate180, + expected: { imgW: 1000, imgH: 100, x1: 800, x2: 1000, y1: 40, y2: 80 }, + }, + { + description: 'MirrorVertical = 4', + orientation: ExifOrientation.MirrorVertical, + expected: { imgW: 1000, imgH: 100, x1: 0, x2: 200, y1: 40, y2: 80 }, + }, + { + description: 'MirrorHorizontalRotate270CW = 5', + orientation: ExifOrientation.MirrorHorizontalRotate270CW, + expected: { imgW: 100, imgH: 1000, x1: 20, x2: 60, y1: 0, y2: 200 }, + }, + { + description: 'Rotate90CW = 6', + orientation: ExifOrientation.Rotate90CW, + expected: { imgW: 100, imgH: 1000, x1: 40, x2: 80, y1: 0, y2: 200 }, + }, + { + description: 'MirrorHorizontalRotate90CW = 7', + orientation: ExifOrientation.MirrorHorizontalRotate90CW, + expected: { imgW: 100, imgH: 1000, x1: 40, x2: 80, y1: 800, y2: 1000 }, + }, + { + description: 'Rotate270CW = 8', + orientation: ExifOrientation.Rotate270CW, + expected: { imgW: 100, imgH: 1000, x1: 20, x2: 60, y1: 800, y2: 1000 }, + }, + ]; + + it.each(orientationTests)( + 'should transform RegionInfo geometry according to exif orientation $description', + async ({ orientation, expected }) => { + const { imgW, imgH, x1, x2, y1, y2 } = expected; + + mocks.assetJob.getForMetadataExtraction.mockResolvedValue(assetStub.primaryImage); + mocks.systemMetadata.get.mockResolvedValue({ metadata: { faces: { import: true } } }); + mockReadTags(makeFaceTags({ Name: personStub.withName.name }, orientation)); + mocks.person.getDistinctNames.mockResolvedValue([]); + mocks.person.createAll.mockResolvedValue([personStub.withName.id]); + mocks.person.update.mockResolvedValue(personStub.withName); + await sut.handleMetadataExtraction({ id: assetStub.primaryImage.id }); + expect(mocks.assetJob.getForMetadataExtraction).toHaveBeenCalledWith(assetStub.primaryImage.id); + expect(mocks.person.getDistinctNames).toHaveBeenCalledWith(assetStub.primaryImage.ownerId, { + withHidden: true, + }); + expect(mocks.person.createAll).toHaveBeenCalledWith([ + expect.objectContaining({ name: personStub.withName.name }), + ]); + expect(mocks.person.refreshFaces).toHaveBeenCalledWith( + [ + { + id: 'random-uuid', + assetId: assetStub.primaryImage.id, + personId: 'random-uuid', + imageWidth: imgW, + imageHeight: imgH, + boundingBoxX1: x1, + boundingBoxX2: x2, + boundingBoxY1: y1, + boundingBoxY2: y2, + sourceType: SourceType.EXIF, + }, + ], + [], + ); + expect(mocks.person.updateAll).toHaveBeenCalledWith([ + { id: 'random-uuid', ownerId: 'admin-id', faceAssetId: 'random-uuid' }, + ]); + expect(mocks.job.queueAll).toHaveBeenCalledWith([ + { + name: JobName.GENERATE_PERSON_THUMBNAIL, + data: { id: personStub.withName.id }, + }, + ]); + }, + ); + }); + it('should handle invalid modify date', async () => { mocks.assetJob.getForMetadataExtraction.mockResolvedValue(assetStub.image); mockReadTags({ ModifyDate: '00:00:00.000' }); @@ -1206,7 +1307,9 @@ describe(MetadataService.name, () => { expect(mocks.assetJob.getForMetadataExtraction).toHaveBeenCalledWith(assetStub.image.id); expect(mocks.asset.findLivePhotoMatch).not.toHaveBeenCalled(); - expect(mocks.asset.update).not.toHaveBeenCalledWith(expect.objectContaining({ isVisible: false })); + expect(mocks.asset.update).not.toHaveBeenCalledWith( + expect.objectContaining({ visibility: AssetVisibility.HIDDEN }), + ); expect(mocks.album.removeAsset).not.toHaveBeenCalled(); }); @@ -1225,7 +1328,9 @@ describe(MetadataService.name, () => { libraryId: null, type: AssetType.IMAGE, }); - expect(mocks.asset.update).not.toHaveBeenCalledWith(expect.objectContaining({ isVisible: false })); + expect(mocks.asset.update).not.toHaveBeenCalledWith( + expect.objectContaining({ visibility: AssetVisibility.HIDDEN }), + ); expect(mocks.album.removeAsset).not.toHaveBeenCalled(); }); @@ -1247,7 +1352,10 @@ describe(MetadataService.name, () => { id: assetStub.livePhotoStillAsset.id, livePhotoVideoId: assetStub.livePhotoMotionAsset.id, }); - expect(mocks.asset.update).toHaveBeenCalledWith({ id: assetStub.livePhotoMotionAsset.id, isVisible: false }); + expect(mocks.asset.update).toHaveBeenCalledWith({ + id: assetStub.livePhotoMotionAsset.id, + visibility: AssetVisibility.HIDDEN, + }); expect(mocks.album.removeAsset).toHaveBeenCalledWith(assetStub.livePhotoMotionAsset.id); }); diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index 3f0c353d1d..3497b808da 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -14,6 +14,7 @@ import { AssetFaces, Exif, Person } from 'src/db'; import { OnEvent, OnJob } from 'src/decorators'; import { AssetType, + AssetVisibility, DatabaseLock, ExifOrientation, ImmichWorker, @@ -156,7 +157,7 @@ export class MetadataService extends BaseService { const [photoAsset, motionAsset] = asset.type === AssetType.IMAGE ? [asset, match] : [match, asset]; await Promise.all([ this.assetRepository.update({ id: photoAsset.id, livePhotoVideoId: motionAsset.id }), - this.assetRepository.update({ id: motionAsset.id, isVisible: false }), + this.assetRepository.update({ id: motionAsset.id, visibility: AssetVisibility.HIDDEN }), this.albumRepository.removeAsset(motionAsset.id), ]); @@ -527,8 +528,11 @@ export class MetadataService extends BaseService { }); // Hide the motion photo video asset if it's not already hidden to prepare for linking - if (motionAsset.isVisible) { - await this.assetRepository.update({ id: motionAsset.id, isVisible: false }); + if (motionAsset.visibility === AssetVisibility.TIMELINE) { + await this.assetRepository.update({ + id: motionAsset.id, + visibility: AssetVisibility.HIDDEN, + }); this.logger.log(`Hid unlinked motion photo video asset (${motionAsset.id})`); } } else { @@ -544,7 +548,7 @@ export class MetadataService extends BaseService { ownerId: asset.ownerId, originalPath: StorageCore.getAndroidMotionPath(asset, motionAssetId), originalFileName: `${path.parse(asset.originalFileName).name}.mp4`, - isVisible: false, + visibility: AssetVisibility.HIDDEN, deviceAssetId: 'NONE', deviceId: 'NONE', }); @@ -596,6 +600,80 @@ export class MetadataService extends BaseService { ); } + private orientRegionInfo( + regionInfo: ImmichTagsWithFaces['RegionInfo'], + orientation: ExifOrientation | undefined, + ): ImmichTagsWithFaces['RegionInfo'] { + // skip default Orientation + if (orientation === undefined || orientation === ExifOrientation.Horizontal) { + return regionInfo; + } + + const isSidewards = [ + ExifOrientation.MirrorHorizontalRotate270CW, + ExifOrientation.Rotate90CW, + ExifOrientation.MirrorHorizontalRotate90CW, + ExifOrientation.Rotate270CW, + ].includes(orientation); + + // swap image dimensions in AppliedToDimensions if orientation is sidewards + const adjustedAppliedToDimensions = isSidewards + ? { + ...regionInfo.AppliedToDimensions, + W: regionInfo.AppliedToDimensions.H, + H: regionInfo.AppliedToDimensions.W, + } + : regionInfo.AppliedToDimensions; + + // update area coordinates and dimensions in RegionList assuming "normalized" unit as per MWG guidelines + const adjustedRegionList = regionInfo.RegionList.map((region) => { + let { X, Y, W, H } = region.Area; + switch (orientation) { + case ExifOrientation.MirrorHorizontal: { + X = 1 - X; + break; + } + case ExifOrientation.Rotate180: { + [X, Y] = [1 - X, 1 - Y]; + break; + } + case ExifOrientation.MirrorVertical: { + Y = 1 - Y; + break; + } + case ExifOrientation.MirrorHorizontalRotate270CW: { + [X, Y] = [Y, X]; + break; + } + case ExifOrientation.Rotate90CW: { + [X, Y] = [1 - Y, X]; + break; + } + case ExifOrientation.MirrorHorizontalRotate90CW: { + [X, Y] = [1 - Y, 1 - X]; + break; + } + case ExifOrientation.Rotate270CW: { + [X, Y] = [Y, 1 - X]; + break; + } + } + if (isSidewards) { + [W, H] = [H, W]; + } + return { + ...region, + Area: { ...region.Area, X, Y, W, H }, + }; + }); + + return { + ...regionInfo, + AppliedToDimensions: adjustedAppliedToDimensions, + RegionList: adjustedRegionList, + }; + } + private async applyTaggedFaces( asset: { id: string; ownerId: string; faces: AssetFace[]; originalPath: string }, tags: ImmichTags, @@ -609,13 +687,16 @@ export class MetadataService extends BaseService { const existingNameMap = new Map(existingNames.map(({ id, name }) => [name.toLowerCase(), id])); const missing: (Insertable & { ownerId: string })[] = []; const missingWithFaceAsset: { id: string; ownerId: string; faceAssetId: string }[] = []; - for (const region of tags.RegionInfo.RegionList) { + + const adjustedRegionInfo = this.orientRegionInfo(tags.RegionInfo, tags.Orientation); + const imageWidth = adjustedRegionInfo.AppliedToDimensions.W; + const imageHeight = adjustedRegionInfo.AppliedToDimensions.H; + + for (const region of adjustedRegionInfo.RegionList) { if (!region.Name) { continue; } - const imageWidth = tags.RegionInfo.AppliedToDimensions.W; - const imageHeight = tags.RegionInfo.AppliedToDimensions.H; const loweredName = region.Name.toLowerCase(); const personId = existingNameMap.get(loweredName) || this.cryptoRepository.randomUUID(); @@ -786,7 +867,7 @@ export class MetadataService extends BaseService { return JobStatus.FAILED; } - if (!isSync && (!asset.isVisible || asset.sidecarPath) && !asset.isExternal) { + if (!isSync && (asset.visibility === AssetVisibility.HIDDEN || asset.sidecarPath) && !asset.isExternal) { return JobStatus.FAILED; } diff --git a/server/src/services/person.service.spec.ts b/server/src/services/person.service.spec.ts index 5b88883472..52e5ff03ee 100644 --- a/server/src/services/person.service.spec.ts +++ b/server/src/services/person.service.spec.ts @@ -1,7 +1,7 @@ import { BadRequestException, NotFoundException } from '@nestjs/common'; import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto'; import { mapFaces, mapPerson, PersonResponseDto } from 'src/dtos/person.dto'; -import { CacheControl, Colorspace, ImageFormat, JobName, JobStatus, SourceType, SystemMetadataKey } from 'src/enum'; +import { CacheControl, JobName, JobStatus, SourceType, SystemMetadataKey } from 'src/enum'; import { DetectedFaces } from 'src/repositories/machine-learning.repository'; import { FaceSearchResult } from 'src/repositories/search.repository'; import { PersonService } from 'src/services/person.service'; @@ -9,7 +9,7 @@ import { ImmichFileResponse } from 'src/utils/file'; import { assetStub } from 'test/fixtures/asset.stub'; import { authStub } from 'test/fixtures/auth.stub'; import { faceStub } from 'test/fixtures/face.stub'; -import { personStub, personThumbnailStub } from 'test/fixtures/person.stub'; +import { personStub } from 'test/fixtures/person.stub'; import { systemConfigStub } from 'test/fixtures/system-config.stub'; import { factory } from 'test/small.factory'; import { makeStream, newTestService, ServiceMocks } from 'test/utils'; @@ -1024,114 +1024,6 @@ describe(PersonService.name, () => { }); }); - describe('handleGeneratePersonThumbnail', () => { - it('should skip if machine learning is disabled', async () => { - mocks.systemMetadata.get.mockResolvedValue(systemConfigStub.machineLearningDisabled); - - await expect(sut.handleGeneratePersonThumbnail({ id: 'person-1' })).resolves.toBe(JobStatus.SKIPPED); - expect(mocks.asset.getByIds).not.toHaveBeenCalled(); - expect(mocks.systemMetadata.get).toHaveBeenCalled(); - }); - - it('should skip a person not found', async () => { - await sut.handleGeneratePersonThumbnail({ id: 'person-1' }); - expect(mocks.media.generateThumbnail).not.toHaveBeenCalled(); - }); - - it('should skip a person without a face asset id', async () => { - mocks.person.getById.mockResolvedValue(personStub.noThumbnail); - await sut.handleGeneratePersonThumbnail({ id: 'person-1' }); - expect(mocks.media.generateThumbnail).not.toHaveBeenCalled(); - }); - - it('should skip a person with face not found', async () => { - await sut.handleGeneratePersonThumbnail({ id: 'person-1' }); - expect(mocks.media.generateThumbnail).not.toHaveBeenCalled(); - }); - - it('should generate a thumbnail', async () => { - mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailMiddle); - mocks.media.generateThumbnail.mockResolvedValue(); - - await sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id }); - - expect(mocks.person.getDataForThumbnailGenerationJob).toHaveBeenCalledWith(personStub.primaryPerson.id); - expect(mocks.storage.mkdirSync).toHaveBeenCalledWith('upload/thumbs/admin_id/pe/rs'); - expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( - assetStub.primaryImage.originalPath, - { - colorspace: Colorspace.P3, - format: ImageFormat.JPEG, - size: 250, - quality: 80, - crop: { - left: 238, - top: 163, - width: 274, - height: 274, - }, - processInvalidImages: false, - }, - 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', - ); - expect(mocks.person.update).toHaveBeenCalledWith({ - id: 'person-1', - thumbnailPath: 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', - }); - }); - - it('should generate a thumbnail without going negative', async () => { - mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailStart); - mocks.media.generateThumbnail.mockResolvedValue(); - - await sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id }); - - expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( - assetStub.primaryImage.originalPath, - { - colorspace: Colorspace.P3, - format: ImageFormat.JPEG, - size: 250, - quality: 80, - crop: { - left: 0, - top: 85, - width: 510, - height: 510, - }, - processInvalidImages: false, - }, - 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', - ); - }); - - it('should generate a thumbnail without overflowing', async () => { - mocks.person.getDataForThumbnailGenerationJob.mockResolvedValue(personThumbnailStub.newThumbnailEnd); - mocks.person.update.mockResolvedValue(personStub.primaryPerson); - mocks.media.generateThumbnail.mockResolvedValue(); - - await sut.handleGeneratePersonThumbnail({ id: personStub.primaryPerson.id }); - - expect(mocks.media.generateThumbnail).toHaveBeenCalledWith( - assetStub.primaryImage.originalPath, - { - colorspace: Colorspace.P3, - format: ImageFormat.JPEG, - size: 250, - quality: 80, - crop: { - left: 591, - top: 591, - width: 408, - height: 408, - }, - processInvalidImages: false, - }, - 'upload/thumbs/admin_id/pe/rs/person-1.jpeg', - ); - }); - }); - describe('mergePerson', () => { it('should require person.write and person.merge permission', async () => { mocks.person.getById.mockResolvedValueOnce(personStub.primaryPerson); diff --git a/server/src/services/person.service.ts b/server/src/services/person.service.ts index 227ea3c1c2..e6161b8f9c 100644 --- a/server/src/services/person.service.ts +++ b/server/src/services/person.service.ts @@ -1,7 +1,6 @@ import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { Insertable, Updateable } from 'kysely'; -import { FACE_THUMBNAIL_SIZE, JOBS_ASSET_PAGINATION_SIZE } from 'src/constants'; -import { StorageCore } from 'src/cores/storage.core'; +import { JOBS_ASSET_PAGINATION_SIZE } from 'src/constants'; import { Person } from 'src/database'; import { AssetFaces, FaceSearch } from 'src/db'; import { Chunked, OnJob } from 'src/decorators'; @@ -25,9 +24,8 @@ import { PersonUpdateDto, } from 'src/dtos/person.dto'; import { - AssetType, + AssetVisibility, CacheControl, - ImageFormat, JobName, JobStatus, Permission, @@ -39,10 +37,10 @@ import { import { BoundingBox } from 'src/repositories/machine-learning.repository'; import { UpdateFacesData } from 'src/repositories/person.repository'; import { BaseService } from 'src/services/base.service'; -import { CropOptions, ImageDimensions, InputDimensions, JobItem, JobOf } from 'src/types'; +import { JobItem, JobOf } from 'src/types'; import { ImmichFileResponse } from 'src/utils/file'; import { mimeTypes } from 'src/utils/mime-types'; -import { isFaceImportEnabled, isFacialRecognitionEnabled } from 'src/utils/misc'; +import { isFacialRecognitionEnabled } from 'src/utils/misc'; @Injectable() export class PersonService extends BaseService { @@ -296,7 +294,7 @@ export class PersonService extends BaseService { return JobStatus.FAILED; } - if (!asset.isVisible) { + if (asset.visibility === AssetVisibility.HIDDEN) { return JobStatus.SKIPPED; } @@ -484,7 +482,9 @@ export class PersonService extends BaseService { this.logger.debug(`Face ${id} has ${matches.length} matches`); - const isCore = matches.length >= machineLearning.facialRecognition.minFaces && !face.asset.isArchived; + const isCore = + matches.length >= machineLearning.facialRecognition.minFaces && + face.asset.visibility === AssetVisibility.TIMELINE; if (!isCore && !deferred) { this.logger.debug(`Deferring non-core face ${id} for later processing`); await this.jobRepository.queue({ name: JobName.FACIAL_RECOGNITION, data: { id, deferred: true } }); @@ -534,41 +534,6 @@ export class PersonService extends BaseService { return JobStatus.SUCCESS; } - @OnJob({ name: JobName.GENERATE_PERSON_THUMBNAIL, queue: QueueName.THUMBNAIL_GENERATION }) - async handleGeneratePersonThumbnail({ id }: JobOf): Promise { - const { machineLearning, metadata, image } = await this.getConfig({ withCache: true }); - if (!isFacialRecognitionEnabled(machineLearning) && !isFaceImportEnabled(metadata)) { - return JobStatus.SKIPPED; - } - - const data = await this.personRepository.getDataForThumbnailGenerationJob(id); - if (!data) { - this.logger.error(`Could not generate person thumbnail for ${id}: missing data`); - return JobStatus.FAILED; - } - - const { ownerId, x1, y1, x2, y2, oldWidth, oldHeight } = data; - - const { width, height, inputPath } = await this.getInputDimensions(data); - - const thumbnailPath = StorageCore.getPersonThumbnailPath({ id, ownerId }); - this.storageCore.ensureFolders(thumbnailPath); - - const thumbnailOptions = { - colorspace: image.colorspace, - format: ImageFormat.JPEG, - size: FACE_THUMBNAIL_SIZE, - quality: image.thumbnail.quality, - crop: this.getCrop({ old: { width: oldWidth, height: oldHeight }, new: { width, height } }, { x1, y1, x2, y2 }), - processInvalidImages: process.env.IMMICH_PROCESS_INVALID_IMAGES === 'true', - }; - - await this.mediaRepository.generateThumbnail(inputPath, thumbnailOptions, thumbnailPath); - await this.personRepository.update({ id, thumbnailPath }); - - return JobStatus.SUCCESS; - } - async mergePerson(auth: AuthDto, id: string, dto: MergePersonDto): Promise { const mergeIds = dto.ids; if (mergeIds.includes(id)) { @@ -639,57 +604,6 @@ export class PersonService extends BaseService { return person; } - private async getInputDimensions(asset: { - type: AssetType; - exifImageWidth: number; - exifImageHeight: number; - previewPath: string; - originalPath: string; - oldWidth: number; - oldHeight: number; - }): Promise { - if (asset.type === AssetType.IMAGE) { - let { exifImageWidth: width, exifImageHeight: height } = asset; - if (asset.oldHeight > asset.oldWidth !== height > width) { - [width, height] = [height, width]; - } - - return { width, height, inputPath: asset.originalPath }; - } - - const { width, height } = await this.mediaRepository.getImageDimensions(asset.previewPath); - return { width, height, inputPath: asset.previewPath }; - } - - private getCrop(dims: { old: ImageDimensions; new: ImageDimensions }, { x1, y1, x2, y2 }: BoundingBox): CropOptions { - const widthScale = dims.new.width / dims.old.width; - const heightScale = dims.new.height / dims.old.height; - - const halfWidth = (widthScale * (x2 - x1)) / 2; - const halfHeight = (heightScale * (y2 - y1)) / 2; - - const middleX = Math.round(widthScale * x1 + halfWidth); - const middleY = Math.round(heightScale * y1 + halfHeight); - - // zoom out 10% - const targetHalfSize = Math.floor(Math.max(halfWidth, halfHeight) * 1.1); - - // get the longest distance from the center of the image without overflowing - const newHalfSize = Math.min( - middleX - Math.max(0, middleX - targetHalfSize), - middleY - Math.max(0, middleY - targetHalfSize), - Math.min(dims.new.width - 1, middleX + targetHalfSize) - middleX, - Math.min(dims.new.height - 1, middleY + targetHalfSize) - middleY, - ); - - return { - left: middleX - newHalfSize, - top: middleY - newHalfSize, - width: newHalfSize * 2, - height: newHalfSize * 2, - }; - } - // TODO return a asset face response async createFace(auth: AuthDto, dto: AssetFaceCreateDto): Promise { await Promise.all([ diff --git a/server/src/services/smart-info.service.ts b/server/src/services/smart-info.service.ts index 5ee5dac57e..f3702c2010 100644 --- a/server/src/services/smart-info.service.ts +++ b/server/src/services/smart-info.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { SystemConfig } from 'src/config'; import { JOBS_ASSET_PAGINATION_SIZE } from 'src/constants'; import { OnEvent, OnJob } from 'src/decorators'; -import { DatabaseLock, ImmichWorker, JobName, JobStatus, QueueName } from 'src/enum'; +import { AssetVisibility, DatabaseLock, ImmichWorker, JobName, JobStatus, QueueName } from 'src/enum'; import { ArgOf } from 'src/repositories/event.repository'; import { BaseService } from 'src/services/base.service'; import { JobItem, JobOf } from 'src/types'; @@ -104,7 +104,7 @@ export class SmartInfoService extends BaseService { return JobStatus.FAILED; } - if (!asset.isVisible) { + if (asset.visibility === AssetVisibility.HIDDEN) { return JobStatus.SKIPPED; } diff --git a/server/src/services/sync.service.ts b/server/src/services/sync.service.ts index c88348b39e..6ad488c48d 100644 --- a/server/src/services/sync.service.ts +++ b/server/src/services/sync.service.ts @@ -14,7 +14,7 @@ import { SyncAckSetDto, SyncStreamDto, } from 'src/dtos/sync.dto'; -import { DatabaseAction, EntityType, Permission, SyncEntityType, SyncRequestType } from 'src/enum'; +import { AssetVisibility, DatabaseAction, EntityType, Permission, SyncEntityType, SyncRequestType } from 'src/enum'; import { BaseService } from 'src/services/base.service'; import { SyncAck } from 'src/types'; import { getMyPartnerIds } from 'src/utils/asset.util'; @@ -262,7 +262,10 @@ export class SyncService extends BaseService { needsFullSync: false, upserted: upserted // do not return archived assets for partner users - .filter((a) => a.ownerId === auth.user.id || (a.ownerId !== auth.user.id && !a.isArchived)) + .filter( + (a) => + a.ownerId === auth.user.id || (a.ownerId !== auth.user.id && a.visibility === AssetVisibility.TIMELINE), + ) .map((a) => mapAsset(a, { auth, diff --git a/server/src/services/timeline.service.spec.ts b/server/src/services/timeline.service.spec.ts index c6a09d2fdf..1447594d4e 100644 --- a/server/src/services/timeline.service.spec.ts +++ b/server/src/services/timeline.service.spec.ts @@ -1,4 +1,5 @@ import { BadRequestException } from '@nestjs/common'; +import { AssetVisibility } from 'src/enum'; import { TimeBucketSize } from 'src/repositories/asset.repository'; import { TimelineService } from 'src/services/timeline.service'; import { assetStub } from 'test/fixtures/asset.stub'; @@ -54,7 +55,7 @@ describe(TimelineService.name, () => { sut.getTimeBucket(authStub.admin, { size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: true, + visibility: AssetVisibility.ARCHIVE, userId: authStub.admin.user.id, }), ).resolves.toEqual(expect.arrayContaining([expect.objectContaining({ id: 'asset-id' })])); @@ -63,7 +64,7 @@ describe(TimelineService.name, () => { expect.objectContaining({ size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: true, + visibility: AssetVisibility.ARCHIVE, userIds: [authStub.admin.user.id], }), ); @@ -77,7 +78,7 @@ describe(TimelineService.name, () => { sut.getTimeBucket(authStub.admin, { size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: false, + visibility: AssetVisibility.TIMELINE, userId: authStub.admin.user.id, withPartners: true, }), @@ -85,7 +86,7 @@ describe(TimelineService.name, () => { expect(mocks.asset.getTimeBucket).toHaveBeenCalledWith('bucket', { size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: false, + visibility: AssetVisibility.TIMELINE, withPartners: true, userIds: [authStub.admin.user.id], }); @@ -120,7 +121,7 @@ describe(TimelineService.name, () => { const buckets = await sut.getTimeBucket(auth, { size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: true, + visibility: AssetVisibility.ARCHIVE, albumId: 'album-id', }); @@ -129,7 +130,7 @@ describe(TimelineService.name, () => { expect(mocks.asset.getTimeBucket).toHaveBeenCalledWith('bucket', { size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: true, + visibility: AssetVisibility.ARCHIVE, albumId: 'album-id', }); }); @@ -154,12 +155,12 @@ describe(TimelineService.name, () => { ); }); - it('should throw an error if withParners is true and isArchived true or undefined', async () => { + it('should throw an error if withParners is true and visibility true or undefined', async () => { await expect( sut.getTimeBucket(authStub.admin, { size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: true, + visibility: AssetVisibility.ARCHIVE, withPartners: true, userId: authStub.admin.user.id, }), @@ -169,7 +170,7 @@ describe(TimelineService.name, () => { sut.getTimeBucket(authStub.admin, { size: TimeBucketSize.DAY, timeBucket: 'bucket', - isArchived: undefined, + visibility: undefined, withPartners: true, userId: authStub.admin.user.id, }), diff --git a/server/src/services/timeline.service.ts b/server/src/services/timeline.service.ts index 4c2332afaa..c0cd4786a8 100644 --- a/server/src/services/timeline.service.ts +++ b/server/src/services/timeline.service.ts @@ -2,7 +2,7 @@ import { BadRequestException, Injectable } from '@nestjs/common'; import { AssetResponseDto, SanitizedAssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; import { TimeBucketAssetDto, TimeBucketDto, TimeBucketResponseDto } from 'src/dtos/time-bucket.dto'; -import { Permission } from 'src/enum'; +import { AssetVisibility, Permission } from 'src/enum'; import { TimeBucketOptions } from 'src/repositories/asset.repository'; import { BaseService } from 'src/services/base.service'; import { getMyPartnerIds } from 'src/utils/asset.util'; @@ -55,7 +55,7 @@ export class TimelineService extends BaseService { if (dto.userId) { await this.requireAccess({ auth, permission: Permission.TIMELINE_READ, ids: [dto.userId] }); - if (dto.isArchived !== false) { + if (dto.visibility === AssetVisibility.ARCHIVE) { await this.requireAccess({ auth, permission: Permission.ARCHIVE_READ, ids: [dto.userId] }); } } @@ -65,7 +65,7 @@ export class TimelineService extends BaseService { } if (dto.withPartners) { - const requestedArchived = dto.isArchived === true || dto.isArchived === undefined; + const requestedArchived = dto.visibility === AssetVisibility.ARCHIVE || dto.visibility === undefined; const requestedFavorite = dto.isFavorite === true || dto.isFavorite === false; const requestedTrash = dto.isTrashed === true; diff --git a/server/src/services/user-admin.service.ts b/server/src/services/user-admin.service.ts index c1c6cc49ec..38c0106f4b 100644 --- a/server/src/services/user-admin.service.ts +++ b/server/src/services/user-admin.service.ts @@ -70,6 +70,10 @@ export class UserAdminService extends BaseService { dto.password = await this.cryptoRepository.hashBcrypt(dto.password, SALT_ROUNDS); } + if (dto.pinCode) { + dto.pinCode = await this.cryptoRepository.hashBcrypt(dto.pinCode, SALT_ROUNDS); + } + if (dto.storageLabel === '') { dto.storageLabel = null; } diff --git a/server/src/types.ts b/server/src/types.ts index d18ef297ef..2f5bfad02c 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -2,6 +2,7 @@ import { SystemConfig } from 'src/config'; import { AssetType, DatabaseExtension, + DatabaseSslMode, ExifOrientation, ImageFormat, JobName, @@ -380,6 +381,7 @@ export type DatabaseConnectionParts = { username: string; password: string; database: string; + ssl?: DatabaseSslMode; }; export type DatabaseConnectionParams = DatabaseConnectionURL | DatabaseConnectionParts; diff --git a/server/src/utils/asset.util.ts b/server/src/utils/asset.util.ts index 8905f84165..0f5432da4d 100644 --- a/server/src/utils/asset.util.ts +++ b/server/src/utils/asset.util.ts @@ -4,7 +4,7 @@ import { AssetFile } from 'src/database'; import { BulkIdErrorReason, BulkIdResponseDto } from 'src/dtos/asset-ids.response.dto'; import { UploadFieldName } from 'src/dtos/asset-media.dto'; import { AuthDto } from 'src/dtos/auth.dto'; -import { AssetFileType, AssetType, Permission } from 'src/enum'; +import { AssetFileType, AssetType, AssetVisibility, Permission } from 'src/enum'; import { AuthRequest } from 'src/middleware/auth.guard'; import { AccessRepository } from 'src/repositories/access.repository'; import { AssetRepository } from 'src/repositories/asset.repository'; @@ -150,8 +150,8 @@ export const onBeforeLink = async ( throw new BadRequestException('Live photo video does not belong to the user'); } - if (motionAsset?.isVisible) { - await assetRepository.update({ id: livePhotoVideoId, isVisible: false }); + if (motionAsset && motionAsset.visibility === AssetVisibility.TIMELINE) { + await assetRepository.update({ id: livePhotoVideoId, visibility: AssetVisibility.HIDDEN }); await eventRepository.emit('asset.hide', { assetId: motionAsset.id, userId }); } }; @@ -174,9 +174,9 @@ export const onBeforeUnlink = async ( export const onAfterUnlink = async ( { asset: assetRepository, event: eventRepository }: AssetHookRepositories, - { userId, livePhotoVideoId }: { userId: string; livePhotoVideoId: string }, + { userId, livePhotoVideoId, visibility }: { userId: string; livePhotoVideoId: string; visibility: AssetVisibility }, ) => { - await assetRepository.update({ id: livePhotoVideoId, isVisible: true }); + await assetRepository.update({ id: livePhotoVideoId, visibility }); await eventRepository.emit('asset.show', { assetId: livePhotoVideoId, userId }); }; diff --git a/server/src/utils/database.ts b/server/src/utils/database.ts index b44ea5da46..bacdf06d67 100644 --- a/server/src/utils/database.ts +++ b/server/src/utils/database.ts @@ -17,7 +17,7 @@ import { parse } from 'pg-connection-string'; import postgres, { Notice } from 'postgres'; import { columns, Exif, Person } from 'src/database'; import { DB } from 'src/db'; -import { AssetFileType, DatabaseExtension } from 'src/enum'; +import { AssetFileType, AssetVisibility, DatabaseExtension, DatabaseSslMode } from 'src/enum'; import { TimeBucketSize } from 'src/repositories/asset.repository'; import { AssetSearchBuilderOptions } from 'src/repositories/search.repository'; import { DatabaseConnectionParams, VectorExtension } from 'src/types'; @@ -35,7 +35,7 @@ export const asPostgresConnectionConfig = (params: DatabaseConnectionParams) => username: params.username, password: params.password, database: params.database, - ssl: undefined, + ssl: params.ssl === DatabaseSslMode.Disable ? false : params.ssl, }; } @@ -155,6 +155,15 @@ export function toJson(qb: SelectQueryBuilder) { + return qb.where((qb) => + qb.or([ + qb('assets.visibility', '=', AssetVisibility.TIMELINE), + qb('assets.visibility', '=', AssetVisibility.ARCHIVE), + ]), + ); +} + export function withExif(qb: SelectQueryBuilder) { return qb .leftJoin('exif', 'assets.id', 'exif.assetId') @@ -280,12 +289,14 @@ const joinDeduplicationPlugin = new DeduplicateJoinsPlugin(); /** TODO: This should only be used for search-related queries, not as a general purpose query builder */ export function searchAssetBuilder(kysely: Kysely, options: AssetSearchBuilderOptions) { - options.isArchived ??= options.withArchived ? undefined : false; options.withDeleted ||= !!(options.trashedAfter || options.trashedBefore || options.isOffline); + const visibility = options.visibility == null ? AssetVisibility.TIMELINE : options.visibility; + return kysely .withPlugin(joinDeduplicationPlugin) .selectFrom('assets') .selectAll('assets') + .where('assets.visibility', '=', visibility) .$if(!!options.tagIds && options.tagIds.length > 0, (qb) => hasTags(qb, options.tagIds!)) .$if(!!options.personIds && options.personIds.length > 0, (qb) => hasPeople(qb, options.personIds!)) .$if(!!options.createdBefore, (qb) => qb.where('assets.createdAt', '<=', options.createdBefore!)) @@ -356,8 +367,6 @@ export function searchAssetBuilder(kysely: Kysely, options: AssetSearchBuild .$if(!!options.type, (qb) => qb.where('assets.type', '=', options.type!)) .$if(options.isFavorite !== undefined, (qb) => qb.where('assets.isFavorite', '=', options.isFavorite!)) .$if(options.isOffline !== undefined, (qb) => qb.where('assets.isOffline', '=', options.isOffline!)) - .$if(options.isVisible !== undefined, (qb) => qb.where('assets.isVisible', '=', options.isVisible!)) - .$if(options.isArchived !== undefined, (qb) => qb.where('assets.isArchived', '=', options.isArchived!)) .$if(options.isEncoded !== undefined, (qb) => qb.where('assets.encodedVideoPath', options.isEncoded ? 'is not' : 'is', null), ) diff --git a/server/src/utils/misc.ts b/server/src/utils/misc.ts index ff1656da74..05811350e4 100644 --- a/server/src/utils/misc.ts +++ b/server/src/utils/misc.ts @@ -301,3 +301,7 @@ export const globToSqlPattern = (glob: string) => { const tokens = picomatch.parse(glob).tokens; return tokens.map((token) => convertTokenToSqlPattern(token)).join(''); }; + +export function clamp(value: number, min: number, max: number) { + return Math.max(min, Math.min(max, value)); +} diff --git a/server/src/validation.ts b/server/src/validation.ts index 29e402826d..2d160f43ce 100644 --- a/server/src/validation.ts +++ b/server/src/validation.ts @@ -12,11 +12,13 @@ import { IsArray, IsBoolean, IsDate, + IsEnum, IsHexColor, IsNotEmpty, IsOptional, IsString, IsUUID, + Matches, Validate, ValidateBy, ValidateIf, @@ -29,6 +31,7 @@ import { import { CronJob } from 'cron'; import { DateTime } from 'luxon'; import sanitize from 'sanitize-filename'; +import { AssetVisibility } from 'src/enum'; import { isIP, isIPRange } from 'validator'; @Injectable() @@ -68,6 +71,22 @@ export class UUIDParamDto { id!: string; } +type PinCodeOptions = { optional?: boolean } & OptionalOptions; +export const PinCode = ({ optional, ...options }: PinCodeOptions = {}) => { + const decorators = [ + IsString(), + IsNotEmpty(), + Matches(/^\d{6}$/, { message: ({ property }) => `${property} must be a 6-digit numeric string` }), + ApiProperty({ example: '123456' }), + ]; + + if (optional) { + decorators.push(Optional(options)); + } + + return applyDecorators(...decorators); +}; + export interface OptionalOptions extends ValidationOptions { nullable?: boolean; /** convert empty strings to null */ @@ -146,6 +165,17 @@ export const ValidateDate = (options?: DateOptions) => { return applyDecorators(...decorators); }; +type AssetVisibilityOptions = { optional?: boolean }; +export const ValidateAssetVisibility = (options?: AssetVisibilityOptions) => { + const { optional } = { optional: false, ...options }; + const decorators = [IsEnum(AssetVisibility), ApiProperty({ enumName: 'AssetVisibility', enum: AssetVisibility })]; + + if (optional) { + decorators.push(Optional()); + } + return applyDecorators(...decorators); +}; + type BooleanOptions = { optional?: boolean }; export const ValidateBoolean = (options?: BooleanOptions) => { const { optional } = { optional: false, ...options }; diff --git a/server/test/fixtures/asset.stub.ts b/server/test/fixtures/asset.stub.ts index d1b8e7cf28..a64194361a 100644 --- a/server/test/fixtures/asset.stub.ts +++ b/server/test/fixtures/asset.stub.ts @@ -1,6 +1,6 @@ import { AssetFace, AssetFile, Exif } from 'src/database'; import { MapAsset } from 'src/dtos/asset-response.dto'; -import { AssetFileType, AssetStatus, AssetType } from 'src/enum'; +import { AssetFileType, AssetStatus, AssetType, AssetVisibility } from 'src/enum'; import { StorageAsset } from 'src/types'; import { authStub } from 'test/fixtures/auth.stub'; import { fileStub } from 'test/fixtures/file.stub'; @@ -74,9 +74,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, sharedLinks: [], @@ -90,6 +88,7 @@ export const assetStub = { libraryId: null, stackId: null, updateId: '42', + visibility: AssetVisibility.TIMELINE, }), noWebpPath: Object.freeze({ @@ -111,9 +110,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, sharedLinks: [], @@ -130,6 +127,7 @@ export const assetStub = { libraryId: null, stackId: null, updateId: '42', + visibility: AssetVisibility.TIMELINE, }), noThumbhash: Object.freeze({ @@ -151,9 +149,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -167,6 +163,7 @@ export const assetStub = { libraryId: null, stackId: null, updateId: '42', + visibility: AssetVisibility.TIMELINE, }), primaryImage: Object.freeze({ @@ -188,9 +185,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -214,6 +209,7 @@ export const assetStub = { isOffline: false, updateId: '42', libraryId: null, + visibility: AssetVisibility.TIMELINE, }), image: Object.freeze({ @@ -235,9 +231,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2025-01-01T01:02:03.456Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -257,6 +251,7 @@ export const assetStub = { duplicateId: null, isOffline: false, stack: null, + visibility: AssetVisibility.TIMELINE, }), trashed: Object.freeze({ @@ -278,9 +273,7 @@ export const assetStub = { deletedAt: new Date('2023-02-24T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: false, - isArchived: false, duration: null, - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -299,6 +292,7 @@ export const assetStub = { libraryId: null, stackId: null, updateId: '42', + visibility: AssetVisibility.TIMELINE, }), trashedOffline: Object.freeze({ @@ -321,10 +315,8 @@ export const assetStub = { deletedAt: new Date('2023-02-24T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: false, - isArchived: false, duration: null, libraryId: 'library-id', - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -341,6 +333,7 @@ export const assetStub = { isOffline: true, stackId: null, updateId: '42', + visibility: AssetVisibility.TIMELINE, }), archived: Object.freeze({ id: 'asset-id', @@ -361,9 +354,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: true, duration: null, - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -382,6 +373,7 @@ export const assetStub = { libraryId: null, stackId: null, updateId: '42', + visibility: AssetVisibility.TIMELINE, }), external: Object.freeze({ @@ -403,10 +395,8 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, isExternal: true, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, libraryId: 'library-id', @@ -423,6 +413,7 @@ export const assetStub = { updateId: '42', stackId: null, stack: null, + visibility: AssetVisibility.TIMELINE, }), image1: Object.freeze({ @@ -445,9 +436,7 @@ export const assetStub = { deletedAt: null, localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, isExternal: false, @@ -464,6 +453,7 @@ export const assetStub = { stackId: null, libraryId: null, stack: null, + visibility: AssetVisibility.TIMELINE, }), imageFrom2015: Object.freeze({ @@ -485,10 +475,8 @@ export const assetStub = { updatedAt: new Date('2015-02-23T05:06:29.716Z'), localDateTime: new Date('2015-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, isExternal: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, sharedLinks: [], @@ -501,6 +489,7 @@ export const assetStub = { deletedAt: null, duplicateId: null, isOffline: false, + visibility: AssetVisibility.TIMELINE, }), video: Object.freeze({ @@ -523,10 +512,8 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, isExternal: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, sharedLinks: [], @@ -543,6 +530,7 @@ export const assetStub = { updateId: '42', libraryId: null, stackId: null, + visibility: AssetVisibility.TIMELINE, }), livePhotoMotionAsset: Object.freeze({ @@ -551,7 +539,6 @@ export const assetStub = { originalPath: fileStub.livePhotoMotion.originalPath, ownerId: authStub.user1.user.id, type: AssetType.VIDEO, - isVisible: false, fileModifiedAt: new Date('2022-06-19T23:41:36.910Z'), fileCreatedAt: new Date('2022-06-19T23:41:36.910Z'), exifInfo: { @@ -559,6 +546,7 @@ export const assetStub = { timeZone: `America/New_York`, }, libraryId: null, + visibility: AssetVisibility.HIDDEN, } as MapAsset & { faces: AssetFace[]; files: AssetFile[]; exifInfo: Exif }), livePhotoStillAsset: Object.freeze({ @@ -568,7 +556,6 @@ export const assetStub = { ownerId: authStub.user1.user.id, type: AssetType.IMAGE, livePhotoVideoId: 'live-photo-motion-asset', - isVisible: true, fileModifiedAt: new Date('2022-06-19T23:41:36.910Z'), fileCreatedAt: new Date('2022-06-19T23:41:36.910Z'), exifInfo: { @@ -577,6 +564,7 @@ export const assetStub = { }, files, faces: [] as AssetFace[], + visibility: AssetVisibility.TIMELINE, } as MapAsset & { faces: AssetFace[] }), livePhotoWithOriginalFileName: Object.freeze({ @@ -587,7 +575,6 @@ export const assetStub = { ownerId: authStub.user1.user.id, type: AssetType.IMAGE, livePhotoVideoId: 'live-photo-motion-asset', - isVisible: true, fileModifiedAt: new Date('2022-06-19T23:41:36.910Z'), fileCreatedAt: new Date('2022-06-19T23:41:36.910Z'), exifInfo: { @@ -596,6 +583,7 @@ export const assetStub = { }, libraryId: null, faces: [] as AssetFace[], + visibility: AssetVisibility.TIMELINE, } as MapAsset & { faces: AssetFace[] }), withLocation: Object.freeze({ @@ -618,10 +606,8 @@ export const assetStub = { updatedAt: new Date('2023-02-22T05:06:29.716Z'), localDateTime: new Date('2020-12-31T23:59:00.000Z'), isFavorite: false, - isArchived: false, isExternal: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, updateId: 'foo', @@ -642,6 +628,7 @@ export const assetStub = { duplicateId: null, isOffline: false, tags: [], + visibility: AssetVisibility.TIMELINE, }), sidecar: Object.freeze({ @@ -663,10 +650,8 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, isExternal: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, sharedLinks: [], @@ -679,6 +664,7 @@ export const assetStub = { updateId: 'foo', libraryId: null, stackId: null, + visibility: AssetVisibility.TIMELINE, }), sidecarWithoutExt: Object.freeze({ @@ -700,10 +686,8 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, isExternal: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, sharedLinks: [], @@ -713,6 +697,7 @@ export const assetStub = { deletedAt: null, duplicateId: null, isOffline: false, + visibility: AssetVisibility.TIMELINE, }), hasEncodedVideo: Object.freeze({ @@ -735,10 +720,8 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, isExternal: false, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, sharedLinks: [], @@ -754,6 +737,7 @@ export const assetStub = { libraryId: null, stackId: null, stack: null, + visibility: AssetVisibility.TIMELINE, }), hasFileExtension: Object.freeze({ @@ -775,10 +759,8 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, isExternal: true, duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, libraryId: 'library-id', @@ -792,6 +774,7 @@ export const assetStub = { } as Exif, duplicateId: null, isOffline: false, + visibility: AssetVisibility.TIMELINE, }), imageDng: Object.freeze({ @@ -813,9 +796,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -834,6 +815,7 @@ export const assetStub = { updateId: '42', libraryId: null, stackId: null, + visibility: AssetVisibility.TIMELINE, }), imageHif: Object.freeze({ @@ -855,9 +837,7 @@ export const assetStub = { updatedAt: new Date('2023-02-23T05:06:29.716Z'), localDateTime: new Date('2023-02-23T05:06:29.716Z'), isFavorite: true, - isArchived: false, duration: null, - isVisible: true, isExternal: false, livePhotoVideo: null, livePhotoVideoId: null, @@ -876,5 +856,6 @@ export const assetStub = { updateId: '42', libraryId: null, stackId: null, + visibility: AssetVisibility.TIMELINE, }), }; diff --git a/server/test/fixtures/person.stub.ts b/server/test/fixtures/person.stub.ts index 8457f9ddcd..21a184035a 100644 --- a/server/test/fixtures/person.stub.ts +++ b/server/test/fixtures/person.stub.ts @@ -178,8 +178,7 @@ export const personThumbnailStub = { oldWidth: 2160, type: AssetType.IMAGE, originalPath: '/original/path.jpg', - exifImageHeight: 3840, - exifImageWidth: 2160, + exifOrientation: '1', previewPath: previewFile.path, }), newThumbnailMiddle: Object.freeze({ @@ -192,8 +191,7 @@ export const personThumbnailStub = { oldWidth: 400, type: AssetType.IMAGE, originalPath: '/original/path.jpg', - exifImageHeight: 1000, - exifImageWidth: 1000, + exifOrientation: '1', previewPath: previewFile.path, }), newThumbnailEnd: Object.freeze({ @@ -206,8 +204,46 @@ export const personThumbnailStub = { oldWidth: 500, type: AssetType.IMAGE, originalPath: '/original/path.jpg', - exifImageHeight: 1000, - exifImageWidth: 1000, + exifOrientation: '1', + previewPath: previewFile.path, + }), + rawEmbeddedThumbnail: Object.freeze({ + ownerId: userStub.admin.id, + x1: 100, + y1: 100, + x2: 200, + y2: 200, + oldHeight: 500, + oldWidth: 400, + type: AssetType.IMAGE, + originalPath: '/original/path.dng', + exifOrientation: '1', + previewPath: previewFile.path, + }), + negativeCoordinate: Object.freeze({ + ownerId: userStub.admin.id, + x1: -176, + y1: -230, + x2: 193, + y2: 251, + oldHeight: 1440, + oldWidth: 2162, + type: AssetType.IMAGE, + originalPath: '/original/path.jpg', + exifOrientation: '1', + previewPath: previewFile.path, + }), + overflowingCoordinate: Object.freeze({ + ownerId: userStub.admin.id, + x1: 2097, + y1: 0, + x2: 2171, + y2: 152, + oldHeight: 1440, + oldWidth: 2162, + type: AssetType.IMAGE, + originalPath: '/original/path.jpg', + exifOrientation: '1', previewPath: previewFile.path, }), }; diff --git a/server/test/fixtures/shared-link.stub.ts b/server/test/fixtures/shared-link.stub.ts index a4d83863c7..fc4b74ba2d 100644 --- a/server/test/fixtures/shared-link.stub.ts +++ b/server/test/fixtures/shared-link.stub.ts @@ -4,7 +4,7 @@ import { AssetResponseDto, MapAsset } from 'src/dtos/asset-response.dto'; import { ExifResponseDto } from 'src/dtos/exif.dto'; import { SharedLinkResponseDto } from 'src/dtos/shared-link.dto'; import { mapUser } from 'src/dtos/user.dto'; -import { AssetOrder, AssetStatus, AssetType, SharedLinkType } from 'src/enum'; +import { AssetOrder, AssetStatus, AssetType, AssetVisibility, SharedLinkType } from 'src/enum'; import { assetStub } from 'test/fixtures/asset.stub'; import { authStub } from 'test/fixtures/auth.stub'; import { userStub } from 'test/fixtures/user.stub'; @@ -206,7 +206,6 @@ export const sharedLinkStub = { thumbhash: null, encodedVideoPath: '', duration: null, - isVisible: true, livePhotoVideo: null, livePhotoVideoId: null, originalFileName: 'asset_1.jpeg', @@ -251,6 +250,7 @@ export const sharedLinkStub = { updateId: '42', libraryId: null, stackId: null, + visibility: AssetVisibility.TIMELINE, }, ], }, diff --git a/server/test/medium.factory.ts b/server/test/medium.factory.ts index 89b1921819..6f4f46c075 100644 --- a/server/test/medium.factory.ts +++ b/server/test/medium.factory.ts @@ -5,7 +5,7 @@ import { createHash, randomBytes } from 'node:crypto'; import { Writable } from 'node:stream'; import { AssetFace } from 'src/database'; import { AssetJobStatus, Assets, DB, FaceSearch, Person, Sessions } from 'src/db'; -import { AssetType, SourceType } from 'src/enum'; +import { AssetType, AssetVisibility, SourceType } from 'src/enum'; import { ActivityRepository } from 'src/repositories/activity.repository'; import { AlbumRepository } from 'src/repositories/album.repository'; import { AssetJobRepository } from 'src/repositories/asset-job.repository'; @@ -227,16 +227,37 @@ const getRepositoryMock = (key: K) => { case 'database': { return automock(DatabaseRepository, { - args: [undefined, { setContext: () => {} }, { getEnv: () => ({ database: { vectorExtension: '' } }) }], + args: [ + undefined, + { + setContext: () => {}, + }, + { getEnv: () => ({ database: { vectorExtension: '' } }) }, + ], }); } case 'email': { - return automock(EmailRepository, { args: [{ setContext: () => {} }] }); + return automock(EmailRepository, { + args: [ + { + setContext: () => {}, + }, + ], + }); } case 'job': { - return automock(JobRepository, { args: [undefined, undefined, undefined, { setContext: () => {} }] }); + return automock(JobRepository, { + args: [ + undefined, + undefined, + undefined, + { + setContext: () => {}, + }, + ], + }); } case 'logger': { @@ -345,11 +366,11 @@ const assetInsert = (asset: Partial> = {}) => { type: AssetType.IMAGE, originalPath: '/path/to/something.jpg', ownerId: '@immich.cloud', - isVisible: true, isFavorite: false, fileCreatedAt: now, fileModifiedAt: now, localDateTime: now, + visibility: AssetVisibility.TIMELINE, }; return { diff --git a/server/test/medium/responses.ts b/server/test/medium/responses.ts index 0148f2e1e9..e9f9daaf76 100644 --- a/server/test/medium/responses.ts +++ b/server/test/medium/responses.ts @@ -47,7 +47,6 @@ export const errorDto = { error: 'Bad Request', statusCode: 400, message: message ?? expect.anything(), - correlationId: expect.any(String), }), noPermission: { error: 'Bad Request', @@ -67,12 +66,6 @@ export const errorDto = { message: 'The server already has an admin', correlationId: expect.any(String), }, - invalidEmail: { - error: 'Bad Request', - statusCode: 400, - message: ['email must be an email'], - correlationId: expect.any(String), - }, }; export const signupResponseDto = { diff --git a/server/test/medium/specs/controllers/auth.controller.spec.ts b/server/test/medium/specs/controllers/auth.controller.spec.ts deleted file mode 100644 index ef2b904f48..0000000000 --- a/server/test/medium/specs/controllers/auth.controller.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { AuthController } from 'src/controllers/auth.controller'; -import { AuthService } from 'src/services/auth.service'; -import request from 'supertest'; -import { errorDto } from 'test/medium/responses'; -import { createControllerTestApp, TestControllerApp } from 'test/medium/utils'; - -describe(AuthController.name, () => { - let app: TestControllerApp; - - beforeAll(async () => { - app = await createControllerTestApp(); - }); - - describe('POST /auth/admin-sign-up', () => { - const name = 'admin'; - const email = 'admin@immich.cloud'; - const password = 'password'; - - const invalid = [ - { - should: 'require an email address', - data: { name, password }, - }, - { - should: 'require a password', - data: { name, email }, - }, - { - should: 'require a name', - data: { email, password }, - }, - { - should: 'require a valid email', - data: { name, email: 'immich', password }, - }, - ]; - - for (const { should, data } of invalid) { - it(`should ${should}`, async () => { - const { status, body } = await request(app.getHttpServer()).post('/auth/admin-sign-up').send(data); - expect(status).toEqual(400); - expect(body).toEqual(errorDto.badRequest()); - }); - } - - it('should transform email to lower case', async () => { - const { status } = await request(app.getHttpServer()) - .post('/auth/admin-sign-up') - .send({ name: 'admin', password: 'password', email: 'aDmIn@IMMICH.cloud' }); - expect(status).toEqual(201); - expect(app.getMockedService(AuthService).adminSignUp).toHaveBeenCalledWith( - expect.objectContaining({ email: 'admin@immich.cloud' }), - ); - }); - }); - - afterAll(async () => { - await app.close(); - }); -}); diff --git a/server/test/medium/specs/controllers/notification.controller.spec.ts b/server/test/medium/specs/controllers/notification.controller.spec.ts deleted file mode 100644 index f4a0ec82d5..0000000000 --- a/server/test/medium/specs/controllers/notification.controller.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { NotificationController } from 'src/controllers/notification.controller'; -import { AuthService } from 'src/services/auth.service'; -import { NotificationService } from 'src/services/notification.service'; -import request from 'supertest'; -import { errorDto } from 'test/medium/responses'; -import { createControllerTestApp, TestControllerApp } from 'test/medium/utils'; -import { factory } from 'test/small.factory'; - -describe(NotificationController.name, () => { - let realApp: TestControllerApp; - let mockApp: TestControllerApp; - - beforeEach(async () => { - realApp = await createControllerTestApp({ authType: 'real' }); - mockApp = await createControllerTestApp({ authType: 'mock' }); - }); - - describe('GET /notifications', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()).get('/notifications'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should call the service with an auth dto', async () => { - const auth = factory.auth({ user: factory.user() }); - mockApp.getMockedService(AuthService).authenticate.mockResolvedValue(auth); - const service = mockApp.getMockedService(NotificationService); - - const { status } = await request(mockApp.getHttpServer()) - .get('/notifications') - .set('Authorization', `Bearer token`); - - expect(status).toBe(200); - expect(service.search).toHaveBeenCalledWith(auth, {}); - }); - - it(`should reject an invalid notification level`, async () => { - const auth = factory.auth({ user: factory.user() }); - mockApp.getMockedService(AuthService).authenticate.mockResolvedValue(auth); - const service = mockApp.getMockedService(NotificationService); - - const { status, body } = await request(mockApp.getHttpServer()) - .get(`/notifications`) - .query({ level: 'invalid' }) - .set('Authorization', `Bearer token`); - - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest([expect.stringContaining('level must be one of the following values')])); - expect(service.search).not.toHaveBeenCalled(); - }); - }); - - describe('PUT /notifications', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()) - .put(`/notifications`) - .send({ ids: [], readAt: new Date().toISOString() }); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - }); - - describe('GET /notifications/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()).get(`/notifications/${factory.uuid()}`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - }); - - describe('PUT /notifications/:id', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()) - .put(`/notifications/${factory.uuid()}`) - .send({ readAt: factory.date() }); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - }); - - afterAll(async () => { - await realApp.close(); - await mockApp.close(); - }); -}); diff --git a/server/test/medium/specs/controllers/user.controller.spec.ts b/server/test/medium/specs/controllers/user.controller.spec.ts deleted file mode 100644 index f4d90d5469..0000000000 --- a/server/test/medium/specs/controllers/user.controller.spec.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { UserController } from 'src/controllers/user.controller'; -import { AuthService } from 'src/services/auth.service'; -import { UserService } from 'src/services/user.service'; -import request from 'supertest'; -import { errorDto } from 'test/medium/responses'; -import { createControllerTestApp, TestControllerApp } from 'test/medium/utils'; -import { factory } from 'test/small.factory'; - -describe(UserController.name, () => { - let realApp: TestControllerApp; - let mockApp: TestControllerApp; - - beforeAll(async () => { - realApp = await createControllerTestApp({ authType: 'real' }); - mockApp = await createControllerTestApp({ authType: 'mock' }); - }); - - describe('GET /users', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()).get('/users'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - it('should call the service with an auth dto', async () => { - const user = factory.user(); - const authService = mockApp.getMockedService(AuthService); - const auth = factory.auth({ user }); - authService.authenticate.mockResolvedValue(auth); - - const userService = mockApp.getMockedService(UserService); - const { status } = await request(mockApp.getHttpServer()).get('/users').set('Authorization', `Bearer token`); - - expect(status).toBe(200); - expect(userService.search).toHaveBeenCalledWith(auth); - }); - }); - - describe('GET /users/me', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()).get(`/users/me`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - }); - - describe('PUT /users/me', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()).put(`/users/me`); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - - for (const key of ['email', 'name']) { - it(`should not allow null ${key}`, async () => { - const dto = { [key]: null }; - const { status, body } = await request(mockApp.getHttpServer()) - .put(`/users/me`) - .set('Authorization', `Bearer token`) - .send(dto); - expect(status).toBe(400); - expect(body).toEqual(errorDto.badRequest()); - }); - } - }); - - describe('GET /users/:id', () => { - it('should require authentication', async () => { - const { status } = await request(realApp.getHttpServer()).get(`/users/${factory.uuid()}`); - expect(status).toEqual(401); - }); - }); - - describe('GET /server/license', () => { - it('should require authentication', async () => { - const { status, body } = await request(realApp.getHttpServer()).get('/users/me/license'); - expect(status).toBe(401); - expect(body).toEqual(errorDto.unauthorized); - }); - }); - - describe('PUT /users/me/license', () => { - it('should require authentication', async () => { - const { status } = await request(realApp.getHttpServer()).put(`/users/me/license`); - expect(status).toEqual(401); - }); - }); - - describe('DELETE /users/me/license', () => { - it('should require authentication', async () => { - const { status } = await request(realApp.getHttpServer()).put(`/users/me/license`); - expect(status).toEqual(401); - }); - }); - - afterAll(async () => { - await realApp.close(); - await mockApp.close(); - }); -}); diff --git a/server/test/medium/specs/services/sync.service.spec.ts b/server/test/medium/specs/services/sync.service.spec.ts index 98df296cbf..67cfeafdbf 100644 --- a/server/test/medium/specs/services/sync.service.spec.ts +++ b/server/test/medium/specs/services/sync.service.spec.ts @@ -456,9 +456,9 @@ describe(SyncService.name, () => { fileCreatedAt: asset.fileCreatedAt, fileModifiedAt: asset.fileModifiedAt, isFavorite: asset.isFavorite, - isVisible: asset.isVisible, localDateTime: asset.localDateTime, type: asset.type, + visibility: asset.visibility, }, type: 'AssetV1', }, @@ -573,9 +573,9 @@ describe(SyncService.name, () => { fileCreatedAt: date, fileModifiedAt: date, isFavorite: false, - isVisible: true, localDateTime: date, type: asset.type, + visibility: asset.visibility, }, type: SyncEntityType.PartnerAssetV1, }, diff --git a/server/test/medium/utils.ts b/server/test/medium/utils.ts deleted file mode 100644 index 030780b35b..0000000000 --- a/server/test/medium/utils.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Provider } from '@nestjs/common'; -import { SchedulerRegistry } from '@nestjs/schedule'; -import { Test } from '@nestjs/testing'; -import { ClassConstructor } from 'class-transformer'; -import { ClsService } from 'nestjs-cls'; -import { middleware } from 'src/app.module'; -import { controllers } from 'src/controllers'; -import { GlobalExceptionFilter } from 'src/middleware/global-exception.filter'; -import { LoggingRepository } from 'src/repositories/logging.repository'; -import { services } from 'src/services'; -import { ApiService } from 'src/services/api.service'; -import { AuthService } from 'src/services/auth.service'; -import { BaseService } from 'src/services/base.service'; -import { automock } from 'test/utils'; -import { Mocked } from 'vitest'; - -export const createControllerTestApp = async (options?: { authType?: 'mock' | 'real' }) => { - const { authType = 'mock' } = options || {}; - - const configMock = { getEnv: () => ({ noColor: true }) }; - const clsMock = { getId: vitest.fn().mockReturnValue('cls-id') }; - const loggerMock = automock(LoggingRepository, { args: [clsMock, configMock], strict: false }); - loggerMock.setContext.mockReturnValue(void 0); - loggerMock.error.mockImplementation((...args: any[]) => { - console.log('Logger.error was called with', ...args); - }); - - const mockBaseService = (service: ClassConstructor) => { - return automock(service, { args: [loggerMock], strict: false }); - }; - - const clsServiceMock = clsMock; - - const FAKE_MOCK = vitest.fn(); - - const providers: Provider[] = [ - ...middleware, - ...services.map((Service) => { - if ((authType === 'real' && Service === AuthService) || Service === ApiService) { - return Service; - } - return { provide: Service, useValue: mockBaseService(Service as ClassConstructor) }; - }), - GlobalExceptionFilter, - { provide: LoggingRepository, useValue: loggerMock }, - { provide: ClsService, useValue: clsServiceMock }, - ]; - - const moduleRef = await Test.createTestingModule({ - imports: [], - controllers: [...controllers], - providers, - }) - .useMocker((token) => { - if (token === LoggingRepository) { - return; - } - - if (token === SchedulerRegistry) { - return FAKE_MOCK; - } - - if (typeof token === 'function' && token.name.endsWith('Repository')) { - return FAKE_MOCK; - } - - if (typeof token === 'string' && token === 'KyselyModuleConnectionToken') { - return FAKE_MOCK; - } - }) - - .compile(); - - const app = moduleRef.createNestApplication(); - - await app.init(); - - const getMockedRepository = (token: ClassConstructor) => { - return app.get(token) as Mocked; - }; - - return { - getHttpServer: () => app.getHttpServer(), - getMockedService: (token: ClassConstructor) => { - if (authType === 'real' && token === AuthService) { - throw new Error('Auth type is real, cannot get mocked service'); - } - return app.get(token) as Mocked; - }, - getMockedRepository, - close: () => app.close(), - }; -}; - -export type TestControllerApp = { - getHttpServer: () => any; - getMockedService: (token: ClassConstructor) => Mocked; - getMockedRepository: (token: ClassConstructor) => Mocked; - close: () => Promise; -}; diff --git a/server/test/small.factory.ts b/server/test/small.factory.ts index d2742f7f80..94ae3b74aa 100644 --- a/server/test/small.factory.ts +++ b/server/test/small.factory.ts @@ -15,7 +15,7 @@ import { } from 'src/database'; import { MapAsset } from 'src/dtos/asset-response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; -import { AssetStatus, AssetType, MemoryType, Permission, UserStatus } from 'src/enum'; +import { AssetStatus, AssetType, AssetVisibility, MemoryType, Permission, UserStatus } from 'src/enum'; import { OnThisDayData } from 'src/types'; export const newUuid = () => randomUUID() as string; @@ -202,11 +202,9 @@ const assetFactory = (asset: Partial = {}) => ({ encodedVideoPath: null, fileCreatedAt: newDate(), fileModifiedAt: newDate(), - isArchived: false, isExternal: false, isFavorite: false, isOffline: false, - isVisible: true, libraryId: null, livePhotoVideoId: null, localDateTime: newDate(), @@ -217,6 +215,7 @@ const assetFactory = (asset: Partial = {}) => ({ stackId: null, thumbhash: null, type: AssetType.IMAGE, + visibility: AssetVisibility.TIMELINE, ...asset, }); @@ -315,4 +314,11 @@ export const factory = { }, uuid: newUuid, date: newDate, + responses: { + badRequest: (message: any = null) => ({ + error: 'Bad Request', + statusCode: 400, + message: message ?? expect.anything(), + }), + }, }; diff --git a/server/test/utils.ts b/server/test/utils.ts index 2c444f491e..c1459bac84 100644 --- a/server/test/utils.ts +++ b/server/test/utils.ts @@ -1,3 +1,6 @@ +import { CallHandler, Provider, ValidationPipe } from '@nestjs/common'; +import { APP_GUARD, APP_PIPE } from '@nestjs/core'; +import { Test } from '@nestjs/testing'; import { ClassConstructor } from 'class-transformer'; import { Kysely } from 'kysely'; import { ChildProcessWithoutNullStreams } from 'node:child_process'; @@ -5,6 +8,9 @@ import { Writable } from 'node:stream'; import { PNG } from 'pngjs'; import postgres from 'postgres'; import { DB } from 'src/db'; +import { AssetUploadInterceptor } from 'src/middleware/asset-upload.interceptor'; +import { AuthGuard } from 'src/middleware/auth.guard'; +import { FileUploadInterceptor } from 'src/middleware/file-upload.interceptor'; import { AccessRepository } from 'src/repositories/access.repository'; import { ActivityRepository } from 'src/repositories/activity.repository'; import { AlbumUserRepository } from 'src/repositories/album-user.repository'; @@ -48,6 +54,7 @@ import { TrashRepository } from 'src/repositories/trash.repository'; import { UserRepository } from 'src/repositories/user.repository'; import { VersionHistoryRepository } from 'src/repositories/version-history.repository'; import { ViewRepository } from 'src/repositories/view-repository'; +import { AuthService } from 'src/services/auth.service'; import { BaseService } from 'src/services/base.service'; import { RepositoryInterface } from 'src/types'; import { asPostgresConnectionConfig, getKyselyConfig } from 'src/utils/database'; @@ -64,30 +71,82 @@ import { newStorageRepositoryMock } from 'test/repositories/storage.repository.m import { newSystemMetadataRepositoryMock } from 'test/repositories/system-metadata.repository.mock'; import { ITelemetryRepositoryMock, newTelemetryRepositoryMock } from 'test/repositories/telemetry.repository.mock'; import { Readable } from 'typeorm/platform/PlatformTools'; -import { assert, Mocked, vitest } from 'vitest'; +import { assert, Mock, Mocked, vitest } from 'vitest'; + +export type ControllerContext = { + authenticate: Mock; + getHttpServer: () => any; + reset: () => void; + close: () => Promise; +}; + +export const controllerSetup = async (controller: ClassConstructor, providers: Provider[]) => { + const noopInterceptor = { intercept: (ctx: never, next: CallHandler) => next.handle() }; + const moduleRef = await Test.createTestingModule({ + controllers: [controller], + providers: [ + { provide: APP_PIPE, useValue: new ValidationPipe({ transform: true, whitelist: true }) }, + { provide: APP_GUARD, useClass: AuthGuard }, + { provide: LoggingRepository, useValue: LoggingRepository.create() }, + { provide: AuthService, useValue: { authenticate: vi.fn() } }, + ...providers, + ], + }) + .overrideInterceptor(FileUploadInterceptor) + .useValue(noopInterceptor) + .overrideInterceptor(AssetUploadInterceptor) + .useValue(noopInterceptor) + .compile(); + const app = moduleRef.createNestApplication(); + await app.init(); + + // allow the AuthController to override the AuthService itself + const authenticate = app.get>(AuthService).authenticate as Mock; + + return { + authenticate, + getHttpServer: () => app.getHttpServer(), + reset: () => { + authenticate.mockReset(); + }, + close: async () => { + await app.close(); + }, + }; +}; + +export type AutoMocked = Mocked & { resetAllMocks: () => void }; const mockFn = (label: string, { strict }: { strict: boolean }) => { const message = `Called a mock function without a mock implementation (${label})`; - return vitest.fn().mockImplementation(() => { - if (strict) { - assert.fail(message); - } else { - // console.warn(message); + return vitest.fn(() => { + { + if (strict) { + assert.fail(message); + } else { + // console.warn(message); + } } }); }; +export const mockBaseService = (service: ClassConstructor) => { + return automock(service, { args: [{ setContext: () => {} }], strict: false }); +}; + export const automock = ( Dependency: ClassConstructor, options?: { args?: ConstructorParameters>; strict?: boolean; }, -): Mocked => { +): AutoMocked => { const mock: Record = {}; const strict = options?.strict ?? true; const args = options?.args ?? []; + const mocks: Mock[] = []; + const instance = new Dependency(...args); for (const property of Object.getOwnPropertyNames(Dependency.prototype)) { if (property === 'constructor') { @@ -100,7 +159,9 @@ export const automock = ( const target = instance[property as keyof T]; if (typeof target === 'function') { - mock[property] = mockFn(label, { strict }); + const mockImplementation = mockFn(label, { strict }); + mock[property] = mockImplementation; + mocks.push(mockImplementation); continue; } } catch { @@ -108,7 +169,14 @@ export const automock = ( } } - return mock as Mocked; + const result = mock as AutoMocked; + result.resetAllMocks = () => { + for (const mock of mocks) { + mock.mockReset(); + } + }; + + return result; }; export type ServiceOverrides = { diff --git a/web/package-lock.json b/web/package-lock.json index c76dd64840..d7f087e90e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@formatjs/icu-messageformat-parser": "^2.9.8", "@immich/sdk": "file:../open-api/typescript-sdk", - "@immich/ui": "^0.18.1", + "@immich/ui": "^0.19.1", "@mapbox/mapbox-gl-rtl-text": "0.2.3", "@mdi/js": "^7.4.47", "@photo-sphere-viewer/core": "^5.11.5", @@ -43,7 +43,7 @@ "@faker-js/faker": "^9.3.0", "@socket.io/component-emitter": "^3.1.0", "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/enhanced-img": "^0.4.4", + "@sveltejs/enhanced-img": "^0.5.0", "@sveltejs/kit": "^2.15.2", "@sveltejs/vite-plugin-svelte": "^5.0.3", "@testing-library/jest-dom": "^6.4.2", @@ -59,7 +59,7 @@ "dotenv": "^16.4.7", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.0", - "eslint-p": "^0.21.0", + "eslint-p": "^0.22.0", "eslint-plugin-svelte": "^3.0.0", "eslint-plugin-unicorn": "^57.0.0", "factory.ts": "^1.4.1", @@ -213,9 +213,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.2.tgz", - "integrity": "sha512-+b+3BJl18a0LKeHvy5eLOwPkiaz10C2MUUYKQ25itZS50TlP5FuDh2Q5EiFlB++vAuCS6HnrihqVlbdcRYyp9w==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "dev": true, "license": "MIT", "optional": true, @@ -496,9 +496,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", "cpu": [ "arm64" ], @@ -529,9 +529,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", "cpu": [ "arm64" ], @@ -743,9 +743,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", - "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, "license": "MIT", "engines": { @@ -936,9 +936,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", + "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", "cpu": [ "arm64" ], @@ -955,13 +955,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "@img/sharp-libvips-darwin-arm64": "1.1.0" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", + "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", "cpu": [ "x64" ], @@ -978,13 +978,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "@img/sharp-libvips-darwin-x64": "1.1.0" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", "cpu": [ "arm64" ], @@ -999,9 +999,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", "cpu": [ "x64" ], @@ -1016,9 +1016,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", "cpu": [ "arm" ], @@ -1033,9 +1033,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", "cpu": [ "arm64" ], @@ -1049,10 +1049,27 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", "cpu": [ "s390x" ], @@ -1067,9 +1084,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", "cpu": [ "x64" ], @@ -1084,9 +1101,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", "cpu": [ "arm64" ], @@ -1101,9 +1118,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", "cpu": [ "x64" ], @@ -1118,9 +1135,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", + "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", "cpu": [ "arm" ], @@ -1137,13 +1154,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "@img/sharp-libvips-linux-arm": "1.1.0" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", + "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", "cpu": [ "arm64" ], @@ -1160,13 +1177,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "@img/sharp-libvips-linux-arm64": "1.1.0" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", + "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", "cpu": [ "s390x" ], @@ -1183,13 +1200,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" + "@img/sharp-libvips-linux-s390x": "1.1.0" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", + "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", "cpu": [ "x64" ], @@ -1206,13 +1223,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.1.0" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", + "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", "cpu": [ "arm64" ], @@ -1229,13 +1246,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", + "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", "cpu": [ "x64" ], @@ -1252,13 +1269,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", + "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", "cpu": [ "wasm32" ], @@ -1266,7 +1283,7 @@ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@emnapi/runtime": "^1.4.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1276,9 +1293,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", + "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", "cpu": [ "ia32" ], @@ -1296,9 +1313,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", + "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", "cpu": [ "x64" ], @@ -1320,9 +1337,9 @@ "link": true }, "node_modules/@immich/ui": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@immich/ui/-/ui-0.18.1.tgz", - "integrity": "sha512-XWWO6OTfH3MektyxCn0hWefZyOGyWwwx/2zHinuShpxTHSyfveJ4mOkFP8DkyMz0dnvJ1EfdkPBMkld3y5R/Hw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@immich/ui/-/ui-0.19.1.tgz", + "integrity": "sha512-PyJ+OAEgBu1HTScMMui2KpBjMYkCw3nhVloYorOaB5lKOlNh7mqz5xBCNo/UVwxLXyAOFuBLU05lv3hWNveSKQ==", "license": "GNU Affero General Public License version 3", "dependencies": { "@mdi/js": "^7.4.47", @@ -1647,6 +1664,28 @@ "integrity": "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==", "license": "Apache-2.0" }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", + "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@namnode/store": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@namnode/store/-/store-0.1.0.tgz", @@ -2085,27 +2124,28 @@ } }, "node_modules/@sveltejs/enhanced-img": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@sveltejs/enhanced-img/-/enhanced-img-0.4.4.tgz", - "integrity": "sha512-BlBTGfbLUgHa+zSVrsGLOd+noCKWfipoOjoxE26bAAX97v7zh5eiCAp1KEdpkluL05Tl3+nR14gQdPsATyZqoA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@sveltejs/enhanced-img/-/enhanced-img-0.5.1.tgz", + "integrity": "sha512-TEEwlFFy9k2DW+XFnMDtUucYrGOqIvvOOGP4pIldwwzn9Tso0BcqzIZjvgxC8PRod/DyMK8tpllcZqqkp/9Eqw==", "dev": true, "license": "MIT", "dependencies": { "magic-string": "^0.30.5", - "sharp": "^0.33.5", + "sharp": "^0.34.1", "svelte-parse-markup": "^0.1.5", - "vite-imagetools": "^7.0.1", + "vite-imagetools": "^7.1.0", "zimmerframe": "^1.1.2" }, "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", "svelte": "^5.0.0", "vite": ">= 5.0.0" } }, "node_modules/@sveltejs/kit": { - "version": "2.20.7", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.20.7.tgz", - "integrity": "sha512-dVbLMubpJJSLI4OYB+yWYNHGAhgc2bVevWuBjDj8jFUXIJOAnLwYP3vsmtcgoxNGUXoq0rHS5f7MFCsryb6nzg==", + "version": "2.20.8", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.20.8.tgz", + "integrity": "sha512-ep9qTxL7WALhfm0kFecL3VHeuNew8IccbYGqv5TqL/KSqWRKzEgDG8blNlIu1CkLTTua/kHjI+f5T8eCmWIxKw==", "dev": true, "license": "MIT", "dependencies": { @@ -2443,17 +2483,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.0.tgz", - "integrity": "sha512-evaQJZ/J/S4wisevDvC1KFZkPzRetH8kYZbkgcTRyql3mcKsf+ZFDV1BVWUGTCAW5pQHoqn5gK5b8kn7ou9aFQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", + "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/type-utils": "8.31.0", - "@typescript-eslint/utils": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/type-utils": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2473,16 +2513,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.0.tgz", - "integrity": "sha512-67kYYShjBR0jNI5vsf/c3WG4u+zDnCTHTPqVMQguffaWWFs7artgwKmfwdifl+r6XyM5LYLas/dInj2T0SgJyw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", + "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4" }, "engines": { @@ -2498,14 +2538,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.0.tgz", - "integrity": "sha512-knO8UyF78Nt8O/B64i7TlGXod69ko7z6vJD9uhSlm0qkAbGeRUSudcm0+K/4CrRjrpiHfBCjMWlc08Vav1xwcw==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", + "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0" + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2516,14 +2556,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.0.tgz", - "integrity": "sha512-DJ1N1GdjI7IS7uRlzJuEDCgDQix3ZVYVtgeWEyhyn4iaoitpMBX6Ndd488mXSx0xah/cONAkEaYyylDyAeHMHg==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", + "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.0", - "@typescript-eslint/utils": "8.31.0", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/utils": "8.31.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -2540,9 +2580,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.0.tgz", - "integrity": "sha512-Ch8oSjVyYyJxPQk8pMiP2FFGYatqXQfQIaMp+TpuuLlDachRWpUAeEu1u9B/v/8LToehUIWyiKcA/w5hUFRKuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", + "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", "dev": true, "license": "MIT", "engines": { @@ -2554,14 +2594,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.0.tgz", - "integrity": "sha512-xLmgn4Yl46xi6aDSZ9KkyfhhtnYI15/CvHbpOy/eR5NWhK/BK8wc709KKwhAR0m4ZKRP7h07bm4BWUYOCuRpQQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", + "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/visitor-keys": "8.31.0", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2607,16 +2647,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.0.tgz", - "integrity": "sha512-qi6uPLt9cjTFxAb1zGNgTob4x9ur7xC6mHQJ8GwEzGMGE9tYniublmJaowOJ9V2jUzxrltTPfdG2nKlWsq0+Ww==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", + "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.0", - "@typescript-eslint/types": "8.31.0", - "@typescript-eslint/typescript-estree": "8.31.0" + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2631,13 +2671,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.0.tgz", - "integrity": "sha512-QcGHmlRHWOl93o64ZUMNewCdwKGU6WItOU52H0djgNmn1EOrhVudrDzXz4OycCRSCPwFCDrE2iIt5vmuUdHxuQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", + "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.0", + "@typescript-eslint/types": "8.31.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2848,6 +2888,43 @@ "license": "ISC", "optional": true }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -3131,6 +3208,27 @@ "svelte": "^5.11.0" } }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3207,6 +3305,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -3221,8 +3329,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -3231,6 +3339,23 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3545,6 +3670,29 @@ "license": "ISC", "optional": true }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", @@ -3555,6 +3703,16 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/core-js-compat": { "version": "3.41.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", @@ -3569,6 +3727,20 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3787,6 +3959,16 @@ "license": "MIT", "optional": true }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3875,8 +4057,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -3899,6 +4081,13 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.137", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz", @@ -3912,6 +4101,16 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/engine.io-client": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", @@ -3989,8 +4188,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" } @@ -3999,8 +4198,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" } @@ -4016,8 +4215,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -4141,6 +4340,13 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4177,9 +4383,9 @@ } }, "node_modules/eslint": { - "version": "9.25.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", - "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4189,11 +4395,12 @@ "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.13.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.25.1", + "@eslint/js": "9.26.0", "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -4217,7 +4424,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" @@ -4251,13 +4459,13 @@ } }, "node_modules/eslint-p": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/eslint-p/-/eslint-p-0.21.0.tgz", - "integrity": "sha512-w6krTooDpMF5Rezfc14FOQwX87QyH2ouZoTDySixbL8auiBRsxA4JPBrzOS5IfuLxcJHJPHjf/FnGfjlvI/kDw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/eslint-p/-/eslint-p-0.22.0.tgz", + "integrity": "sha512-D6qiuQG6grnOOdn6h8k1rh1mepgDFvH2HGp1s+yTyf3qbs2bClxSVC6Jnjj56NzC76NsBTGCBQrOdbtXhctNIA==", "dev": true, "license": "ISC", "dependencies": { - "eslint": "9.25.1" + "eslint": "9.26.0" }, "bin": { "eslint-p": "lib/eslint-p.js" @@ -4490,6 +4698,16 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -4500,6 +4718,29 @@ "es5-ext": "~0.10.14" } }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/expect-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", @@ -4510,6 +4751,98 @@ "node": ">=12.0.0" } }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -4650,6 +4983,24 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4745,6 +5096,16 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -4759,6 +5120,16 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -4857,8 +5228,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -4882,8 +5253,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -5011,8 +5382,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" }, @@ -5069,8 +5440,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" }, @@ -5146,6 +5517,23 @@ "dev": true, "license": "MIT" }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", @@ -5179,8 +5567,8 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -5219,9 +5607,9 @@ } }, "node_modules/imagetools-core": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/imagetools-core/-/imagetools-core-7.0.2.tgz", - "integrity": "sha512-nrLdKLJHHXd8MitwlXK6/h1TSwGaH3X1DZ3z6yMv/tX7dJ12ecLxZ6P5jgKetfIFh8IJwH9fCWMoTA8ixg0VVA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagetools-core/-/imagetools-core-7.1.0.tgz", + "integrity": "sha512-8Aa4NecBBGmTkaAUjcuRYgTPKHCsBEWYmCnvKCL6/bxedehtVVFyZPdXe8DD0Nevd6UWBq85ifUaJ8498lgqNQ==", "dev": true, "license": "MIT", "engines": { @@ -5308,8 +5696,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC", - "optional": true + "devOptional": true, + "license": "ISC" }, "node_modules/ini": { "version": "4.1.3", @@ -5347,6 +5735,16 @@ "tslib": "^2.8.0" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -6060,12 +6458,22 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" } }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/memoizee": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", @@ -6085,6 +6493,19 @@ "node": ">=0.12" } }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6310,6 +6731,16 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -6464,12 +6895,38 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "license": "ISC", - "optional": true, "dependencies": { "wrappy": "1" } @@ -6601,6 +7058,16 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6651,6 +7118,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -6718,6 +7195,16 @@ "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -7070,6 +7557,20 @@ "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", "license": "MIT" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -7110,6 +7611,22 @@ "node": ">=10.13.0" } }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -7144,6 +7661,32 @@ "license": "ISC", "peer": true }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -7548,6 +8091,30 @@ "node": ">=12" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7608,6 +8175,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "devOptional": true, "funding": [ { "type": "github", @@ -7622,15 +8190,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "optional": true + "devOptional": true, + "license": "MIT" }, "node_modules/saxes": { "version": "6.0.0", @@ -7658,6 +8225,68 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -7671,6 +8300,13 @@ "dev": true, "license": "MIT" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -7685,16 +8321,16 @@ } }, "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", + "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "semver": "^7.7.1" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -7703,25 +8339,26 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "@img/sharp-darwin-arm64": "0.34.1", + "@img/sharp-darwin-x64": "0.34.1", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.1", + "@img/sharp-linux-arm64": "0.34.1", + "@img/sharp-linux-s390x": "0.34.1", + "@img/sharp-linux-x64": "0.34.1", + "@img/sharp-linuxmusl-arm64": "0.34.1", + "@img/sharp-linuxmusl-x64": "0.34.1", + "@img/sharp-wasm32": "0.34.1", + "@img/sharp-win32-ia32": "0.34.1", + "@img/sharp-win32-x64": "0.34.1" } }, "node_modules/shebang-command": { @@ -7745,6 +8382,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -7951,6 +8664,16 @@ "dev": true, "license": "MIT" }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/std-env": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", @@ -8203,9 +8926,9 @@ } }, "node_modules/svelte-check": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.6.tgz", - "integrity": "sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.7.tgz", + "integrity": "sha512-1jX4BzXrQJhC/Jt3SqYf6Ntu//vmfc6VWp07JkRfK2nn+22yIblspVUo96gzMkg0Zov8lQicxhxsMzOctwcMQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8811,6 +9534,16 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -8907,6 +9640,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -8922,15 +9693,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.31.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.0.tgz", - "integrity": "sha512-u+93F0sB0An8WEAPtwxVhFby573E8ckdjwUUQUj9QA4v8JAvgtoDdIyYR3XFwFHq2W1KJ1AurwJCO+w+Y1ixyQ==", + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", + "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.31.0", - "@typescript-eslint/parser": "8.31.0", - "@typescript-eslint/utils": "8.31.0" + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "@typescript-eslint/utils": "8.31.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8987,6 +9758,16 @@ "node": ">= 4.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -9056,10 +9837,20 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vite": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.3.tgz", - "integrity": "sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9132,15 +9923,15 @@ } }, "node_modules/vite-imagetools": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite-imagetools/-/vite-imagetools-7.0.5.tgz", - "integrity": "sha512-OOvVnaBTqJJ2J7X1cM1qpH4pj9jsfTxia1VSuWeyXtf+OnP8d0YI1LHpv8y2NT47wg+n7XiTgh3BvcSffuBWrw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/vite-imagetools/-/vite-imagetools-7.1.0.tgz", + "integrity": "sha512-Mqh1uUY2DEMuBOogFz5Rd7cAs70VP6wsdQh2IShrJ+qGk5f7yQa4pN8w0YMLlGIKYW1JfM8oXrznUwVkhG+qxg==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.5", - "imagetools-core": "^7.0.2", - "sharp": "^0.33.4" + "imagetools-core": "^7.1.0", + "sharp": "^0.34.1" }, "engines": { "node": ">=18.0.0" @@ -9170,9 +9961,9 @@ } }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", "cpu": [ "ppc64" ], @@ -9187,9 +9978,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -9204,9 +9995,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -9221,9 +10012,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -9238,9 +10029,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -9255,9 +10046,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -9272,9 +10063,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -9289,9 +10080,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -9306,9 +10097,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -9323,9 +10114,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -9340,9 +10131,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -9357,9 +10148,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -9374,9 +10165,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -9391,9 +10182,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -9408,9 +10199,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -9425,9 +10216,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -9442,9 +10233,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -9459,9 +10250,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -9476,9 +10267,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -9493,9 +10284,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -9510,9 +10301,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -9527,9 +10318,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -9544,9 +10335,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -9561,9 +10352,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9574,31 +10365,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.3", - "@esbuild/android-arm": "0.25.3", - "@esbuild/android-arm64": "0.25.3", - "@esbuild/android-x64": "0.25.3", - "@esbuild/darwin-arm64": "0.25.3", - "@esbuild/darwin-x64": "0.25.3", - "@esbuild/freebsd-arm64": "0.25.3", - "@esbuild/freebsd-x64": "0.25.3", - "@esbuild/linux-arm": "0.25.3", - "@esbuild/linux-arm64": "0.25.3", - "@esbuild/linux-ia32": "0.25.3", - "@esbuild/linux-loong64": "0.25.3", - "@esbuild/linux-mips64el": "0.25.3", - "@esbuild/linux-ppc64": "0.25.3", - "@esbuild/linux-riscv64": "0.25.3", - "@esbuild/linux-s390x": "0.25.3", - "@esbuild/linux-x64": "0.25.3", - "@esbuild/netbsd-arm64": "0.25.3", - "@esbuild/netbsd-x64": "0.25.3", - "@esbuild/openbsd-arm64": "0.25.3", - "@esbuild/openbsd-x64": "0.25.3", - "@esbuild/sunos-x64": "0.25.3", - "@esbuild/win32-arm64": "0.25.3", - "@esbuild/win32-ia32": "0.25.3", - "@esbuild/win32-x64": "0.25.3" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/vitefu": { @@ -9862,8 +10653,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "optional": true + "devOptional": true, + "license": "ISC" }, "node_modules/ws": { "version": "8.18.1", @@ -10042,6 +10833,26 @@ "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", "license": "MIT" + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/web/package.json b/web/package.json index 9aa9bee6bc..71c0b334da 100644 --- a/web/package.json +++ b/web/package.json @@ -27,7 +27,7 @@ "dependencies": { "@formatjs/icu-messageformat-parser": "^2.9.8", "@immich/sdk": "file:../open-api/typescript-sdk", - "@immich/ui": "^0.18.1", + "@immich/ui": "^0.19.1", "@mapbox/mapbox-gl-rtl-text": "0.2.3", "@mdi/js": "^7.4.47", "@photo-sphere-viewer/core": "^5.11.5", @@ -59,7 +59,7 @@ "@faker-js/faker": "^9.3.0", "@socket.io/component-emitter": "^3.1.0", "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/enhanced-img": "^0.4.4", + "@sveltejs/enhanced-img": "^0.5.0", "@sveltejs/kit": "^2.15.2", "@sveltejs/vite-plugin-svelte": "^5.0.3", "@testing-library/jest-dom": "^6.4.2", @@ -75,7 +75,7 @@ "dotenv": "^16.4.7", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.0", - "eslint-p": "^0.21.0", + "eslint-p": "^0.22.0", "eslint-plugin-svelte": "^3.0.0", "eslint-plugin-unicorn": "^57.0.0", "factory.ts": "^1.4.1", diff --git a/web/src/app.css b/web/src/app.css index 2c8d150b4f..c3276010c8 100644 --- a/web/src/app.css +++ b/web/src/app.css @@ -8,7 +8,6 @@ --immich-primary: 66 80 175; --immich-bg: 255 255 255; --immich-fg: 0 0 0; - --immich-gray: 246 246 244; --immich-error: 229 115 115; --immich-success: 129 199 132; --immich-warning: 255 183 77; @@ -28,11 +27,12 @@ --immich-ui-primary: 66 80 175; --immich-ui-dark: 58 58 58; --immich-ui-light: 255 255 255; - --immich-ui-success: 34 197 94; - --immich-ui-danger: 180 0 0; - --immich-ui-warning: 255 170 0; - --immich-ui-info: 14 165 233; + --immich-ui-success: 16 188 99; + --immich-ui-danger: 200 60 60; + --immich-ui-warning: 216 143 64; + --immich-ui-info: 8 111 230; --immich-ui-default-border: 209 213 219; + --immich-ui-gray: 246 246 246; } .dark { @@ -40,11 +40,12 @@ --immich-ui-primary: 172 203 250; --immich-ui-light: 0 0 0; --immich-ui-dark: 229 231 235; - /* --immich-success: 56 142 60; */ - --immich-ui-danger: 239 68 68; - --immich-ui-warning: 255 170 0; - --immich-ui-info: 14 165 233; + --immich-ui-danger: 246 125 125; + --immich-ui-success: 72 237 152; + --immich-ui-warning: 254 197 132; + --immich-ui-info: 121 183 254; --immich-ui-default-border: 55 65 81; + --immich-ui-gray: 33 33 33; } } diff --git a/web/src/app.html b/web/src/app.html index 18a873b525..832b3265ef 100644 --- a/web/src/app.html +++ b/web/src/app.html @@ -107,7 +107,7 @@ To use Immich, you must enable JavaScript or use a JavaScript compatible browser. - +

{$t('total_usage').toUpperCase()}

-
- -{#if createPartnerFlag} - (createPartnerFlag = false)} onAddUsers={handleCreatePartners} /> -{/if} diff --git a/web/src/lib/components/user-settings-page/user-api-key-list.svelte b/web/src/lib/components/user-settings-page/user-api-key-list.svelte index 6dae502aca..ab9ffb294c 100644 --- a/web/src/lib/components/user-settings-page/user-api-key-list.svelte +++ b/web/src/lib/components/user-settings-page/user-api-key-list.svelte @@ -1,6 +1,9 @@ -{#if newKey} - handleCreate(key)} - onCancel={() => (newKey = null)} - /> -{/if} - -{#if secret} - (secret = '')} /> -{/if} - -{#if editKey} - handleUpdate(key)} - onCancel={() => (editKey = null)} - /> -{/if} -
- +
{#if keys.length > 0} @@ -140,9 +128,7 @@ {#each keys as key, index (key.id)} {key.name} @@ -155,7 +141,7 @@ icon={mdiPencilOutline} title={$t('edit_key')} size="16" - onclick={() => (editKey = key)} + onclick={() => handleUpdate(key)} /> import { page } from '$app/stores'; + import ChangePinCodeSettings from '$lib/components/user-settings-page/PinCodeSettings.svelte'; + import DownloadSettings from '$lib/components/user-settings-page/download-settings.svelte'; + import FeatureSettings from '$lib/components/user-settings-page/feature-settings.svelte'; + import NotificationsSettings from '$lib/components/user-settings-page/notifications-settings.svelte'; + import UserPurchaseSettings from '$lib/components/user-settings-page/user-purchase-settings.svelte'; + import UserUsageStatistic from '$lib/components/user-settings-page/user-usage-statistic.svelte'; import { OpenSettingQueryParameterValue, QueryParameter } from '$lib/constants'; import { featureFlags } from '$lib/stores/server-config.store'; import { user } from '$lib/stores/user.store'; import { oauth } from '$lib/utils'; import { type ApiKeyResponseDto, type SessionResponseDto } from '@immich/sdk'; - import SettingAccordionState from '../shared-components/settings/setting-accordion-state.svelte'; - import SettingAccordion from '../shared-components/settings/setting-accordion.svelte'; - import AppSettings from './app-settings.svelte'; - import ChangePasswordSettings from './change-password-settings.svelte'; - import DeviceList from './device-list.svelte'; - import OAuthSettings from './oauth-settings.svelte'; - import PartnerSettings from './partner-settings.svelte'; - import UserAPIKeyList from './user-api-key-list.svelte'; - import UserProfileSettings from './user-profile-settings.svelte'; - import NotificationsSettings from '$lib/components/user-settings-page/notifications-settings.svelte'; - import { t } from 'svelte-i18n'; - import DownloadSettings from '$lib/components/user-settings-page/download-settings.svelte'; - import UserPurchaseSettings from '$lib/components/user-settings-page/user-purchase-settings.svelte'; - import FeatureSettings from '$lib/components/user-settings-page/feature-settings.svelte'; import { mdiAccountGroupOutline, mdiAccountOutline, @@ -29,11 +21,21 @@ mdiDownload, mdiFeatureSearchOutline, mdiKeyOutline, + mdiLockSmart, mdiOnepassword, mdiServerOutline, mdiTwoFactorAuthentication, } from '@mdi/js'; - import UserUsageStatistic from '$lib/components/user-settings-page/user-usage-statistic.svelte'; + import { t } from 'svelte-i18n'; + import SettingAccordionState from '../shared-components/settings/setting-accordion-state.svelte'; + import SettingAccordion from '../shared-components/settings/setting-accordion.svelte'; + import AppSettings from './app-settings.svelte'; + import ChangePasswordSettings from './change-password-settings.svelte'; + import DeviceList from './device-list.svelte'; + import OAuthSettings from './oauth-settings.svelte'; + import PartnerSettings from './partner-settings.svelte'; + import UserAPIKeyList from './user-api-key-list.svelte'; + import UserProfileSettings from './user-profile-settings.svelte'; interface Props { keys?: ApiKeyResponseDto[]; @@ -135,6 +137,16 @@ + + + + import { locale } from '$lib/stores/preferences.store'; import { + AssetVisibility, getAlbumStatistics, getAssetStatistics, type AlbumStatisticsResponseDto, @@ -41,9 +42,9 @@ const getUsage = async () => { [timelineStats, favoriteStats, archiveStats, trashStats, albumStats] = await Promise.all([ - getAssetStatistics({ isArchived: false }), + getAssetStatistics({ visibility: AssetVisibility.Timeline }), getAssetStatistics({ isFavorite: true }), - getAssetStatistics({ isArchived: true }), + getAssetStatistics({ visibility: AssetVisibility.Archive }), getAssetStatistics({ isTrashed: true }), getAlbumStatistics(), ]); @@ -56,7 +57,7 @@ {#snippet row(viewName: string, stats: AssetStatsResponseDto)} {viewName} {stats.images.toLocaleString($locale)} diff --git a/web/src/lib/constants.ts b/web/src/lib/constants.ts index f5b044cd41..f13d008a3c 100644 --- a/web/src/lib/constants.ts +++ b/web/src/lib/constants.ts @@ -307,6 +307,7 @@ export const langs = [ { name: 'Latvian', code: 'lv', loader: () => import('$i18n/lv.json') }, { name: 'Malay (Pattani)', code: 'mfa', loader: () => import('$i18n/mfa.json') }, { name: 'Macedonian', code: 'mk', loader: () => import('$i18n/mk.json') }, + { name: 'Malayalam', code: 'ml', loader: () => import('$i18n/ml.json') }, { name: 'Mongolian', code: 'mn', loader: () => import('$i18n/mn.json') }, { name: 'Marathi', code: 'mr', loader: () => import('$i18n/mr.json') }, { name: 'Malay', code: 'ms', loader: () => import('$i18n/ms.json') }, @@ -366,8 +367,6 @@ export enum SettingInputFieldType { } export const AlbumPageViewMode = { - LINK_SHARING: 'link-sharing', - SELECT_USERS: 'select-users', SELECT_THUMBNAIL: 'select-thumbnail', SELECT_ASSETS: 'select-assets', VIEW_USERS: 'view-users', @@ -376,8 +375,6 @@ export const AlbumPageViewMode = { }; export type AlbumPageViewMode = - | typeof AlbumPageViewMode.LINK_SHARING - | typeof AlbumPageViewMode.SELECT_USERS | typeof AlbumPageViewMode.SELECT_THUMBNAIL | typeof AlbumPageViewMode.SELECT_ASSETS | typeof AlbumPageViewMode.VIEW_USERS diff --git a/web/src/lib/forms/password-reset-success.svelte b/web/src/lib/forms/password-reset-success.svelte new file mode 100644 index 0000000000..7091047eb8 --- /dev/null +++ b/web/src/lib/forms/password-reset-success.svelte @@ -0,0 +1,43 @@ + + + + {#snippet promptSnippet()} +
+ {$t('admin.user_password_has_been_reset')} + +
+ {newPassword} + copyToClipboard(newPassword)} + title={$t('copy_password')} + aria-label={$t('copy_password')} + /> +
+ + {$t('admin.user_password_reset_description')} +
+ {/snippet} +
diff --git a/web/src/lib/managers/album-view-map.manager.svelte.ts b/web/src/lib/managers/album-view-map.manager.svelte.ts new file mode 100644 index 0000000000..22ed1b58ea --- /dev/null +++ b/web/src/lib/managers/album-view-map.manager.svelte.ts @@ -0,0 +1,13 @@ +class AlbumMapViewManager { + #isInMapView = $state(false); + + get isInMapView() { + return this.#isInMapView; + } + + set isInMapView(isInMapView: boolean) { + this.#isInMapView = isInMapView; + } +} + +export const albumMapViewManager = new AlbumMapViewManager(); diff --git a/web/src/lib/managers/modal-manager.svelte.ts b/web/src/lib/managers/modal-manager.svelte.ts new file mode 100644 index 0000000000..12f9224018 --- /dev/null +++ b/web/src/lib/managers/modal-manager.svelte.ts @@ -0,0 +1,42 @@ +import ConfirmDialog from '$lib/components/shared-components/dialog/confirm-dialog.svelte'; +import { mount, unmount, type Component, type ComponentProps } from 'svelte'; + +type OnCloseData = T extends { onClose: (data?: infer R) => void } ? R : never; +type ExtendsEmptyObject = keyof T extends never ? Record : T; + +class ModalManager { + show(Component: Component, props: ExtendsEmptyObject>) { + return this.open(Component, props).onClose; + } + + open>(Component: Component, props: ExtendsEmptyObject>) { + let modal: object = {}; + let onClose: () => Promise; + + const deferred = new Promise((resolve) => { + onClose = async (data?: K) => { + await unmount(modal); + resolve(data); + }; + + modal = mount(Component, { + target: document.body, + props: { + ...(props as T), + onClose, + }, + }); + }); + + return { + onClose: deferred, + close: () => onClose(), + }; + } + + openDialog(options: Omit, 'onClose'>) { + return this.show(ConfirmDialog, options); + } +} + +export const modalManager = new ModalManager(); diff --git a/web/src/lib/components/album-page/user-selection-modal.svelte b/web/src/lib/modals/AlbumShareModal.svelte similarity index 88% rename from web/src/lib/components/album-page/user-selection-modal.svelte rename to web/src/lib/modals/AlbumShareModal.svelte index 9ee7cc550d..17279a8e6a 100644 --- a/web/src/lib/components/album-page/user-selection-modal.svelte +++ b/web/src/lib/modals/AlbumShareModal.svelte @@ -3,9 +3,8 @@ import Dropdown from '$lib/components/elements/dropdown.svelte'; import Icon from '$lib/components/elements/icon.svelte'; import FullScreenModal from '$lib/components/shared-components/full-screen-modal.svelte'; - import QrCodeModal from '$lib/components/shared-components/qr-code-modal.svelte'; import { AppRoute } from '$lib/constants'; - import { serverConfig } from '$lib/stores/server-config.store'; + import QrCodeModal from '$lib/modals/QrCodeModal.svelte'; import { makeSharedLinkUrl } from '$lib/utils'; import { AlbumUserRole, @@ -20,23 +19,21 @@ import { mdiCheck, mdiEye, mdiLink, mdiPencil } from '@mdi/js'; import { onMount } from 'svelte'; import { t } from 'svelte-i18n'; - import UserAvatar from '../shared-components/user-avatar.svelte'; + import UserAvatar from '../components/shared-components/user-avatar.svelte'; interface Props { album: AlbumResponseDto; - onClose: () => void; - onSelect: (selectedUsers: AlbumUserAddDto[]) => void; - onShare: () => void; + onClose: (result?: { action: 'sharedLink' } | { action: 'sharedUsers'; data: AlbumUserAddDto[] }) => void; } - let { album, onClose, onSelect, onShare }: Props = $props(); + let { album, onClose }: Props = $props(); let users: UserResponseDto[] = $state([]); let selectedUsers: Record = $state({}); let sharedLinkUrl = $state(''); const handleViewQrCode = (sharedLink: SharedLinkResponseDto) => { - sharedLinkUrl = makeSharedLinkUrl($serverConfig.externalDomain, sharedLink.key); + sharedLinkUrl = makeSharedLinkUrl(sharedLink.key); }; const roleOptions: Array<{ title: string; value: AlbumUserRole | 'none'; icon?: string }> = [ @@ -160,8 +157,10 @@ shape="round" disabled={Object.keys(selectedUsers).length === 0} onclick={() => - onSelect(Object.values(selectedUsers).map(({ user, ...rest }) => ({ userId: user.id, ...rest })))} - >{$t('add')} ({ userId: user.id, ...rest })), + })}>{$t('add')}
{/if} @@ -182,7 +181,13 @@ {/if} - + {/if} diff --git a/web/src/lib/modals/ApiKeyModal.svelte b/web/src/lib/modals/ApiKeyModal.svelte new file mode 100644 index 0000000000..f5e1fb2a7e --- /dev/null +++ b/web/src/lib/modals/ApiKeyModal.svelte @@ -0,0 +1,53 @@ + + + + +
+
+ + +
+
+
+ + +
+ + +
+
+
diff --git a/web/src/lib/modals/ApiKeySecretModal.svelte b/web/src/lib/modals/ApiKeySecretModal.svelte new file mode 100644 index 0000000000..88d34341d9 --- /dev/null +++ b/web/src/lib/modals/ApiKeySecretModal.svelte @@ -0,0 +1,35 @@ + + + + +
+

+ {$t('api_key_description')} +

+
+ +
+ + +
+
+ + +
+ + +
+
+
diff --git a/web/src/lib/components/shared-components/help-and-feedback-modal.svelte b/web/src/lib/modals/HelpAndFeedbackModal.svelte similarity index 94% rename from web/src/lib/components/shared-components/help-and-feedback-modal.svelte rename to web/src/lib/modals/HelpAndFeedbackModal.svelte index 1dcb021d78..edc78b3bf4 100644 --- a/web/src/lib/components/shared-components/help-and-feedback-modal.svelte +++ b/web/src/lib/modals/HelpAndFeedbackModal.svelte @@ -1,11 +1,10 @@ - - + +

{$t('official_immich_resources')}

@@ -130,5 +129,5 @@ {/if}
{/if} - - + + diff --git a/web/src/lib/modals/JobCreateModal.svelte b/web/src/lib/modals/JobCreateModal.svelte new file mode 100644 index 0000000000..6c173f918c --- /dev/null +++ b/web/src/lib/modals/JobCreateModal.svelte @@ -0,0 +1,65 @@ + + + (confirmed ? handleCreate() : onClose(false))} +> + {#snippet promptSnippet()} +
+
+ +
+
+ {/snippet} +
diff --git a/web/src/lib/modals/MapSettingsModal.svelte b/web/src/lib/modals/MapSettingsModal.svelte new file mode 100644 index 0000000000..e7bef2ecaf --- /dev/null +++ b/web/src/lib/modals/MapSettingsModal.svelte @@ -0,0 +1,135 @@ + + + + +
+ + + + + + + + + + + + + + + + + + {#if customDateRange} +
+
+ + +
+
+ + +
+
+ +
+
+ {:else} +
+ +
+ +
+
+ {/if} +
+
+
+ + +
+ + +
+
+
diff --git a/web/src/lib/modals/PartnerSelectionModal.svelte b/web/src/lib/modals/PartnerSelectionModal.svelte new file mode 100644 index 0000000000..729a035ef1 --- /dev/null +++ b/web/src/lib/modals/PartnerSelectionModal.svelte @@ -0,0 +1,79 @@ + + + + +
+ {#if availableUsers.length > 0} + {#each availableUsers as user (user.id)} + + {/each} + {:else} +

+ {$t('photo_shared_all_users')} +

+ {/if} + + + {#if selectedUsers.length > 0} + + {/if} + +
+
+
diff --git a/web/src/lib/components/shared-components/purchasing/purchase-modal.svelte b/web/src/lib/modals/PurchaseModal.svelte similarity index 69% rename from web/src/lib/components/shared-components/purchasing/purchase-modal.svelte rename to web/src/lib/modals/PurchaseModal.svelte index eaf6d14674..f771529ad2 100644 --- a/web/src/lib/components/shared-components/purchasing/purchase-modal.svelte +++ b/web/src/lib/modals/PurchaseModal.svelte @@ -1,9 +1,8 @@ - - + + {#if showProductActivated} {:else} @@ -26,5 +25,5 @@ showMessage={false} /> {/if} - - + + diff --git a/web/src/lib/components/shared-components/qr-code-modal.svelte b/web/src/lib/modals/QrCodeModal.svelte similarity index 75% rename from web/src/lib/components/shared-components/qr-code-modal.svelte rename to web/src/lib/modals/QrCodeModal.svelte index 166b2837ee..c56fda801b 100644 --- a/web/src/lib/components/shared-components/qr-code-modal.svelte +++ b/web/src/lib/modals/QrCodeModal.svelte @@ -1,24 +1,23 @@ - -
+ +
@@ -37,5 +36,5 @@ />
-
- +
+
diff --git a/web/src/lib/components/shared-components/search-bar/search-filter-modal.svelte b/web/src/lib/modals/SearchFilterModal.svelte similarity index 59% rename from web/src/lib/components/shared-components/search-bar/search-filter-modal.svelte rename to web/src/lib/modals/SearchFilterModal.svelte index 576c1af540..7de6f9984a 100644 --- a/web/src/lib/components/shared-components/search-bar/search-filter-modal.svelte +++ b/web/src/lib/modals/SearchFilterModal.svelte @@ -1,8 +1,8 @@ - -
-
- - + + + +
+ + - - + + - - + + - - + + - - + + - - + + - - {#if $preferences?.ratings.enabled} - - {/if} + + {#if $preferences?.ratings.enabled} + + {/if} -
- - +
+ + - - + + +
-
- + +
- {#snippet stickyBottom()} - - - {/snippet} - + +
+ + +
+
+
diff --git a/web/src/lib/components/shared-components/server-about-modal.svelte b/web/src/lib/modals/ServerAboutModal.svelte similarity index 96% rename from web/src/lib/components/shared-components/server-about-modal.svelte rename to web/src/lib/modals/ServerAboutModal.svelte index 1284bb126d..f8f70387e6 100644 --- a/web/src/lib/components/shared-components/server-about-modal.svelte +++ b/web/src/lib/modals/ServerAboutModal.svelte @@ -1,12 +1,11 @@ - - + +
-
-
+ + diff --git a/web/src/lib/modals/SharedLinkCreateModal.svelte b/web/src/lib/modals/SharedLinkCreateModal.svelte new file mode 100644 index 0000000000..b4b9eaf98f --- /dev/null +++ b/web/src/lib/modals/SharedLinkCreateModal.svelte @@ -0,0 +1,235 @@ + + + + + {#if shareType === SharedLinkType.Album} + {#if !editingLink} +
{$t('album_with_link_access')}
+ {:else} +
+ {$t('public_album')} | + {editingLink.album?.albumName} +
+ {/if} + {/if} + + {#if shareType === SharedLinkType.Individual} + {#if !editingLink} +
{$t('create_link_to_share_description')}
+ {:else} +
+ {$t('individual_share')} | + {editingLink.description || ''} +
+ {/if} + {/if} + +
+

{$t('link_options').toUpperCase()}

+
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + {#if editingLink} +
+ +
+ {/if} +
+ +
+
+
+
+ + + {#if editingLink} + + {:else} + + {/if} + +
diff --git a/web/src/lib/modals/ShortcutsModal.svelte b/web/src/lib/modals/ShortcutsModal.svelte new file mode 100644 index 0000000000..2f16eaa817 --- /dev/null +++ b/web/src/lib/modals/ShortcutsModal.svelte @@ -0,0 +1,100 @@ + + + + +
+ {#if shortcuts.general.length > 0} +
+

{$t('general')}

+
+ {#each shortcuts.general as shortcut (shortcut.key.join('-'))} +
+
+ {#each shortcut.key as key (key)} +

+ {key} +

+ {/each} +
+

{shortcut.action}

+
+ {/each} +
+
+ {/if} + {#if shortcuts.actions.length > 0} +
+

{$t('actions')}

+
+ {#each shortcuts.actions as shortcut (shortcut.key.join('-'))} +
+
+ {#each shortcut.key as key (key)} +

+ {key} +

+ {/each} +
+
+

{shortcut.action}

+ {#if shortcut.info} + + {/if} +
+
+ {/each} +
+
+ {/if} +
+
+
diff --git a/web/src/lib/modals/UserCreateModal.svelte b/web/src/lib/modals/UserCreateModal.svelte new file mode 100644 index 0000000000..34e498ce1c --- /dev/null +++ b/web/src/lib/modals/UserCreateModal.svelte @@ -0,0 +1,140 @@ + + + + +
+ {#if error} + + {/if} + + {#if success} +

{$t('new_user_created')}

+ {/if} + + + + + + + {#if $featureFlags.email} + + + + {/if} + + + + + + + + {passwordMismatchMessage} + + + + + + + + + + + + + {#if quotaSizeWarning} + {$t('errors.quota_higher_than_disk_size')} + {/if} + + + +
+ + +
+ + +
+
+
diff --git a/web/src/lib/components/admin-page/delete-confirm-dialogue.svelte b/web/src/lib/modals/UserDeleteConfirmModal.svelte similarity index 89% rename from web/src/lib/components/admin-page/delete-confirm-dialogue.svelte rename to web/src/lib/modals/UserDeleteConfirmModal.svelte index e2d3c86bf3..8bd7d35cd8 100644 --- a/web/src/lib/components/admin-page/delete-confirm-dialogue.svelte +++ b/web/src/lib/modals/UserDeleteConfirmModal.svelte @@ -9,12 +9,10 @@ interface Props { user: UserResponseDto; - onSuccess: () => void; - onFail: () => void; - onCancel: () => void; + onClose: (confirmed?: true) => void; } - let { user, onSuccess, onFail, onCancel }: Props = $props(); + let { user, onClose }: Props = $props(); let forceDelete = $state(false); let deleteButtonDisabled = $state(false); @@ -27,14 +25,11 @@ userAdminDeleteDto: { force: forceDelete }, }); - if (deletedAt == undefined) { - onFail(); - } else { - onSuccess(); + if (deletedAt !== undefined) { + onClose(true); } } catch (error) { handleError(error, $t('errors.unable_to_delete_user')); - onFail(); } }; @@ -47,7 +42,7 @@ (confirmed ? handleDeleteUser() : onCancel())} + onClose={(confirmed) => (confirmed ? handleDeleteUser() : onClose())} disabled={deleteButtonDisabled} > {#snippet promptSnippet()} diff --git a/web/src/lib/modals/UserEditModal.svelte b/web/src/lib/modals/UserEditModal.svelte new file mode 100644 index 0000000000..5ad0a055c4 --- /dev/null +++ b/web/src/lib/modals/UserEditModal.svelte @@ -0,0 +1,205 @@ + + + + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ + + +
+
+ {#if canResetPassword} + + {/if} + + +
+ +
+ +
+
+
+ diff --git a/web/src/lib/components/admin-page/restore-dialogue.svelte b/web/src/lib/modals/UserRestoreConfirmModal.svelte similarity index 75% rename from web/src/lib/components/admin-page/restore-dialogue.svelte rename to web/src/lib/modals/UserRestoreConfirmModal.svelte index 7fd51aaf06..8f8b372c83 100644 --- a/web/src/lib/components/admin-page/restore-dialogue.svelte +++ b/web/src/lib/modals/UserRestoreConfirmModal.svelte @@ -7,24 +7,17 @@ interface Props { user: UserResponseDto; - onSuccess: () => void; - onFail: () => void; - onCancel: () => void; + onClose: (confirmed?: true) => void; } - let { user, onSuccess, onFail, onCancel }: Props = $props(); + let { user, onClose }: Props = $props(); const handleRestoreUser = async () => { try { - const { deletedAt } = await restoreUserAdmin({ id: user.id }); - if (deletedAt == undefined) { - onSuccess(); - } else { - onFail(); - } + await restoreUserAdmin({ id: user.id }); + onClose(true); } catch (error) { handleError(error, $t('errors.unable_to_restore_user')); - onFail(); } }; @@ -33,7 +26,7 @@ title={$t('restore_user')} confirmText={$t('continue')} confirmColor="success" - onClose={(confirmed) => (confirmed ? handleRestoreUser() : onCancel())} + onClose={(confirmed) => (confirmed ? handleRestoreUser() : onClose())} > {#snippet promptSnippet()}

diff --git a/web/src/lib/stores/assets-store.svelte.ts b/web/src/lib/stores/assets-store.svelte.ts index b4b4a4ade2..dda45d74d2 100644 --- a/web/src/lib/stores/assets-store.svelte.ts +++ b/web/src/lib/stores/assets-store.svelte.ts @@ -10,6 +10,7 @@ import { formatDateGroupTitle, fromLocalDateTime } from '$lib/utils/timeline-uti import { TUNABLES } from '$lib/utils/tunables'; import { AssetOrder, + AssetVisibility, getAssetInfo, getTimeBucket, getTimeBuckets, @@ -1375,7 +1376,7 @@ export class AssetStore { isExcluded(asset: AssetResponseDto) { return ( - isMismatched(this.#options.isArchived, asset.isArchived) || + isMismatched(this.#options.visibility === AssetVisibility.Archive, asset.isArchived) || isMismatched(this.#options.isFavorite, asset.isFavorite) || isMismatched(this.#options.isTrashed, asset.isTrashed) ); diff --git a/web/src/lib/utils.ts b/web/src/lib/utils.ts index b7466b5812..645c485cc5 100644 --- a/web/src/lib/utils.ts +++ b/web/src/lib/utils.ts @@ -2,6 +2,7 @@ import { NotificationType, notificationController } from '$lib/components/shared import { defaultLang, langs, locales } from '$lib/constants'; import { authManager } from '$lib/managers/auth-manager.svelte'; import { lang } from '$lib/stores/preferences.store'; +import { serverConfig } from '$lib/stores/server-config.store'; import { handleError } from '$lib/utils/handle-error'; import { AssetJobName, @@ -256,8 +257,8 @@ export const copyToClipboard = async (secret: string) => { } }; -export const makeSharedLinkUrl = (externalDomain: string, key: string) => { - return new URL(`share/${key}`, externalDomain || globalThis.location.origin).href; +export const makeSharedLinkUrl = (key: string) => { + return new URL(`share/${key}`, get(serverConfig).externalDomain || globalThis.location.origin).href; }; export const oauth = { diff --git a/web/src/lib/utils/asset-utils.ts b/web/src/lib/utils/asset-utils.ts index 254b90f08d..c23b9b432c 100644 --- a/web/src/lib/utils/asset-utils.ts +++ b/web/src/lib/utils/asset-utils.ts @@ -1,7 +1,7 @@ import { goto } from '$app/navigation'; import FormatBoldMessage from '$lib/components/i18n/format-bold-message.svelte'; import type { InterpolationValues } from '$lib/components/i18n/format-message'; -import { NotificationType, notificationController } from '$lib/components/shared-components/notification/notification'; +import { notificationController, NotificationType } from '$lib/components/shared-components/notification/notification'; import { AppRoute } from '$lib/constants'; import { authManager } from '$lib/managers/auth-manager.svelte'; import { downloadManager } from '$lib/managers/download-manager.svelte'; @@ -15,6 +15,7 @@ import { getFormatter } from '$lib/utils/i18n'; import { navigate } from '$lib/utils/navigation'; import { addAssetsToAlbum as addAssets, + AssetVisibility, createStack, deleteAssets, deleteStacks, @@ -507,7 +508,7 @@ export const toggleArchive = async (asset: AssetResponseDto) => { const data = await updateAsset({ id: asset.id, updateAssetDto: { - isArchived: !asset.isArchived, + visibility: asset.isArchived ? AssetVisibility.Timeline : AssetVisibility.Archive, }, }); @@ -531,7 +532,9 @@ export const archiveAssets = async (assets: AssetResponseDto[], archive: boolean try { if (ids.length > 0) { - await updateAssets({ assetBulkUpdateDto: { ids, isArchived } }); + await updateAssets({ + assetBulkUpdateDto: { ids, visibility: isArchived ? AssetVisibility.Archive : AssetVisibility.Timeline }, + }); } for (const asset of assets) { diff --git a/web/src/lib/utils/cancellable-task.ts b/web/src/lib/utils/cancellable-task.ts index 168e3e9199..cf6335977a 100644 --- a/web/src/lib/utils/cancellable-task.ts +++ b/web/src/lib/utils/cancellable-task.ts @@ -69,7 +69,7 @@ export class CancellableTask { } catch (error) { // eslint-disable-next-line @typescript-eslint/no-explicit-any if ((error as any).name === 'AbortError') { - // abort error is not treated as an error, but as a cancelation. + // abort error is not treated as an error, but as a cancellation. return 'CANCELED'; } this.#transitionToErrored(error); diff --git a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte index e10fbae139..88840b382d 100644 --- a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -2,11 +2,11 @@ import { afterNavigate, goto, onNavigate } from '$app/navigation'; import { scrollMemoryClearer } from '$lib/actions/scroll-memory'; import AlbumDescription from '$lib/components/album-page/album-description.svelte'; + import AlbumMap from '$lib/components/album-page/album-map.svelte'; import AlbumOptions from '$lib/components/album-page/album-options.svelte'; import AlbumSummary from '$lib/components/album-page/album-summary.svelte'; import AlbumTitle from '$lib/components/album-page/album-title.svelte'; import ShareInfoModal from '$lib/components/album-page/share-info-modal.svelte'; - import UserSelectionModal from '$lib/components/album-page/user-selection-modal.svelte'; import ActivityStatus from '$lib/components/asset-viewer/activity-status.svelte'; import ActivityViewer from '$lib/components/asset-viewer/activity-viewer.svelte'; import Button from '$lib/components/elements/buttons/button.svelte'; @@ -28,7 +28,6 @@ import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import MenuOption from '$lib/components/shared-components/context-menu/menu-option.svelte'; import ControlAppBar from '$lib/components/shared-components/control-app-bar.svelte'; - import CreateSharedLinkModal from '$lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte'; import { NotificationType, notificationController, @@ -36,12 +35,16 @@ import UserAvatar from '$lib/components/shared-components/user-avatar.svelte'; import { AlbumPageViewMode, AppRoute } from '$lib/constants'; import { activityManager } from '$lib/managers/activity-manager.svelte'; + import { modalManager } from '$lib/managers/modal-manager.svelte'; + import AlbumShareModal from '$lib/modals/AlbumShareModal.svelte'; + import QrCodeModal from '$lib/modals/QrCodeModal.svelte'; + import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { AssetStore } from '$lib/stores/assets-store.svelte'; import { SlideshowNavigation, SlideshowState, slideshowStore } from '$lib/stores/slideshow.store'; import { preferences, user } from '$lib/stores/user.store'; - import { handlePromiseError } from '$lib/utils'; + import { handlePromiseError, makeSharedLinkUrl } from '$lib/utils'; import { confirmAlbumDelete } from '$lib/utils/album-utils'; import { cancelMultiselect, downloadAlbum } from '$lib/utils/asset-utils'; import { openFileUploadDialog } from '$lib/utils/file-uploader'; @@ -56,6 +59,7 @@ import { AlbumUserRole, AssetOrder, + AssetVisibility, addAssetsToAlbum, addUsersToAlbum, deleteAlbum, @@ -176,10 +180,6 @@ const handleEscape = async () => { assetStore.suspendTransitions = true; - if (viewMode === AlbumPageViewMode.SELECT_USERS) { - viewMode = AlbumPageViewMode.VIEW; - return; - } if (viewMode === AlbumPageViewMode.SELECT_THUMBNAIL) { viewMode = AlbumPageViewMode.VIEW; return; @@ -188,10 +188,6 @@ await handleCloseSelectAssets(); return; } - if (viewMode === AlbumPageViewMode.LINK_SHARING) { - viewMode = AlbumPageViewMode.VIEW; - return; - } if (viewMode === AlbumPageViewMode.OPTIONS) { viewMode = AlbumPageViewMode.VIEW; return; @@ -371,7 +367,11 @@ if (viewMode === AlbumPageViewMode.VIEW) { void assetStore.updateOptions({ albumId, order: albumOrder }); } else if (viewMode === AlbumPageViewMode.SELECT_ASSETS) { - void assetStore.updateOptions({ isArchived: false, withPartners: true, timelineAlbumId: albumId }); + void assetStore.updateOptions({ + visibility: AssetVisibility.Timeline, + withPartners: true, + timelineAlbumId: albumId, + }); } }); @@ -384,9 +384,6 @@ activityManager.reset(); assetStore.destroy(); }); - // let timelineStore = new AssetStore(); - // $effect(() => void timelineStore.updateOptions({ isArchived: false, withPartners: true, timelineAlbumId: albumId })); - // onDestroy(() => timelineStore.destroy()); let isOwned = $derived($user.id == album.ownerId); @@ -420,6 +417,30 @@ const currentAssetIntersection = $derived( viewMode === AlbumPageViewMode.SELECT_ASSETS ? timelineInteraction : assetInteraction, ); + + const handleShare = async () => { + const result = await modalManager.show(AlbumShareModal, { album }); + + switch (result?.action) { + case 'sharedLink': { + await handleShareLink(); + return; + } + + case 'sharedUsers': { + await handleAddUsers(result.data); + return; + } + } + }; + + const handleShareLink = async () => { + const sharedLink = await modalManager.show(SharedLinkCreateModal, { albumId: album.id }); + + if (sharedLink) { + await modalManager.show(QrCodeModal, { title: $t('view_link'), value: makeSharedLinkUrl(sharedLink.key) }); + } + };

@@ -493,13 +514,11 @@ {/if} {#if isOwned} - (viewMode = AlbumPageViewMode.SELECT_USERS)} - icon={mdiShareVariantOutline} - /> + {/if} + + {#if album.assetCount > 0} @@ -525,12 +544,7 @@ {/if} {#if isCreatingSharedAlbum && album.albumUsers.length === 0} - {/if} @@ -614,7 +628,7 @@ color="gray" size="20" icon={mdiLink} - onclick={() => (viewMode = AlbumPageViewMode.LINK_SHARING)} + onclick={handleShareLink} /> {/if} @@ -646,7 +660,7 @@ color="gray" size="20" icon={mdiPlus} - onclick={() => (viewMode = AlbumPageViewMode.SELECT_USERS)} + onclick={handleShare} title={$t('add_more_users')} /> {/if} @@ -709,18 +723,6 @@
{/if}
-{#if viewMode === AlbumPageViewMode.SELECT_USERS} - (viewMode = AlbumPageViewMode.LINK_SHARING)} - onClose={() => (viewMode = AlbumPageViewMode.VIEW)} - /> -{/if} - -{#if viewMode === AlbumPageViewMode.LINK_SHARING} - (viewMode = AlbumPageViewMode.VIEW)} /> -{/if} {#if viewMode === AlbumPageViewMode.VIEW_USERS} (viewMode = AlbumPageViewMode.VIEW)} onToggleEnabledActivity={handleToggleEnableActivity} - onShowSelectSharedUser={() => (viewMode = AlbumPageViewMode.SELECT_USERS)} + onShowSelectSharedUser={handleShare} /> {/if} diff --git a/web/src/routes/(user)/archive/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/archive/[[photos=photos]]/[[assetId=id]]/+page.svelte index 86cfefff77..647b92c3f8 100644 --- a/web/src/routes/(user)/archive/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/archive/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -8,17 +8,18 @@ import FavoriteAction from '$lib/components/photos-page/actions/favorite-action.svelte'; import SelectAllAssets from '$lib/components/photos-page/actions/select-all-assets.svelte'; import AssetGrid from '$lib/components/photos-page/asset-grid.svelte'; - import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import AssetSelectControlBar from '$lib/components/photos-page/asset-select-control-bar.svelte'; + import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import EmptyPlaceholder from '$lib/components/shared-components/empty-placeholder.svelte'; import { AssetAction } from '$lib/constants'; - import type { PageData } from './$types'; - import { mdiPlus, mdiDotsVertical } from '@mdi/js'; - import { t } from 'svelte-i18n'; - import { onDestroy } from 'svelte'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { AssetStore } from '$lib/stores/assets-store.svelte'; + import { AssetVisibility } from '@immich/sdk'; + import { mdiDotsVertical, mdiPlus } from '@mdi/js'; + import { onDestroy } from 'svelte'; + import { t } from 'svelte-i18n'; + import type { PageData } from './$types'; interface Props { data: PageData; @@ -26,7 +27,7 @@ let { data }: Props = $props(); const assetStore = new AssetStore(); - void assetStore.updateOptions({ isArchived: true }); + void assetStore.updateOptions({ visibility: AssetVisibility.Archive }); onDestroy(() => assetStore.destroy()); const assetInteraction = new AssetInteraction(); diff --git a/web/src/routes/(user)/favorites/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/favorites/[[photos=photos]]/[[assetId=id]]/+page.svelte index 120281b07e..2ed4b0ada7 100644 --- a/web/src/routes/(user)/favorites/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/favorites/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -9,19 +9,19 @@ import DownloadAction from '$lib/components/photos-page/actions/download-action.svelte'; import FavoriteAction from '$lib/components/photos-page/actions/favorite-action.svelte'; import SelectAllAssets from '$lib/components/photos-page/actions/select-all-assets.svelte'; + import TagAction from '$lib/components/photos-page/actions/tag-action.svelte'; import AssetGrid from '$lib/components/photos-page/asset-grid.svelte'; - import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import AssetSelectControlBar from '$lib/components/photos-page/asset-select-control-bar.svelte'; + import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import EmptyPlaceholder from '$lib/components/shared-components/empty-placeholder.svelte'; import { AssetAction } from '$lib/constants'; - import { AssetStore } from '$lib/stores/assets-store.svelte'; - import type { PageData } from './$types'; - import { mdiDotsVertical, mdiPlus } from '@mdi/js'; - import { t } from 'svelte-i18n'; - import { onDestroy } from 'svelte'; - import { preferences } from '$lib/stores/user.store'; - import TagAction from '$lib/components/photos-page/actions/tag-action.svelte'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; + import { AssetStore } from '$lib/stores/assets-store.svelte'; + import { preferences } from '$lib/stores/user.store'; + import { mdiDotsVertical, mdiPlus } from '@mdi/js'; + import { onDestroy } from 'svelte'; + import { t } from 'svelte-i18n'; + import type { PageData } from './$types'; interface Props { data: PageData; diff --git a/web/src/routes/(user)/map/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/map/[[photos=photos]]/[[assetId=id]]/+page.svelte index 0a71f35ff2..5875309b05 100644 --- a/web/src/routes/(user)/map/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/map/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -3,21 +3,15 @@ import { goto } from '$app/navigation'; import UserPageLayout from '$lib/components/layouts/user-page-layout.svelte'; - import MapSettingsModal from '$lib/components/map-page/map-settings-modal.svelte'; import Map from '$lib/components/shared-components/map/map.svelte'; import Portal from '$lib/components/shared-components/portal/portal.svelte'; import { AppRoute } from '$lib/constants'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; - import type { MapSettings } from '$lib/stores/preferences.store'; - import { mapSettings } from '$lib/stores/preferences.store'; import { featureFlags } from '$lib/stores/server-config.store'; - import { getMapMarkers, type MapMarkerResponseDto } from '@immich/sdk'; - import { isEqual } from 'lodash-es'; - import { DateTime, Duration } from 'luxon'; - import { onDestroy, onMount } from 'svelte'; - import type { PageData } from './$types'; import { handlePromiseError } from '$lib/utils'; import { navigate } from '$lib/utils/navigation'; + import { onDestroy } from 'svelte'; + import type { PageData } from './$types'; interface Props { data: PageData; @@ -27,18 +21,10 @@ let { isViewing: showAssetViewer, asset: viewingAsset, setAssetId } = assetViewingStore; - let abortController: AbortController; - let mapMarkers: MapMarkerResponseDto[] = $state([]); let viewingAssets: string[] = $state([]); let viewingAssetCursor = 0; - let showSettingsModal = $state(false); - - onMount(async () => { - mapMarkers = await loadMapMarkers(); - }); onDestroy(() => { - abortController?.abort(); assetViewingStore.showAssetViewer(false); }); @@ -47,55 +33,6 @@ handlePromiseError(goto(AppRoute.PHOTOS)); } }); - const omit = (obj: MapSettings, key: string) => { - return Object.fromEntries(Object.entries(obj).filter(([k]) => k !== key)); - }; - - async function loadMapMarkers() { - if (abortController) { - abortController.abort(); - } - abortController = new AbortController(); - - const { includeArchived, onlyFavorites, withPartners, withSharedAlbums } = $mapSettings; - const { fileCreatedAfter, fileCreatedBefore } = getFileCreatedDates(); - - return await getMapMarkers( - { - isArchived: includeArchived && undefined, - isFavorite: onlyFavorites || undefined, - fileCreatedAfter: fileCreatedAfter || undefined, - fileCreatedBefore, - withPartners: withPartners || undefined, - withSharedAlbums: withSharedAlbums || undefined, - }, - { - signal: abortController.signal, - }, - ); - } - - function getFileCreatedDates() { - const { relativeDate, dateAfter, dateBefore } = $mapSettings; - - if (relativeDate) { - const duration = Duration.fromISO(relativeDate); - return { - fileCreatedAfter: duration.isValid ? DateTime.now().minus(duration).toISO() : undefined, - }; - } - - try { - return { - fileCreatedAfter: dateAfter ? new Date(dateAfter).toISOString() : undefined, - fileCreatedBefore: dateBefore ? new Date(dateBefore).toISOString() : undefined, - }; - } catch { - $mapSettings.dateAfter = ''; - $mapSettings.dateBefore = ''; - return {}; - } - } async function onViewAssets(assetIds: string[]) { viewingAssets = assetIds; @@ -135,7 +72,7 @@ {#if $featureFlags.loaded && $featureFlags.map}
- +
@@ -156,20 +93,4 @@ {/await} {/if} - - {#if showSettingsModal} - (showSettingsModal = false)} - onSave={async (settings) => { - const shouldUpdate = !isEqual(omit(settings, 'allowDarkMode'), omit($mapSettings, 'allowDarkMode')); - showSettingsModal = false; - $mapSettings = settings; - - if (shouldUpdate) { - mapMarkers = await loadMapMarkers(); - } - }} - /> - {/if} {/if} diff --git a/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte index fe8c45f2f5..2f916d732c 100644 --- a/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -4,16 +4,17 @@ import CreateSharedLink from '$lib/components/photos-page/actions/create-shared-link.svelte'; import DownloadAction from '$lib/components/photos-page/actions/download-action.svelte'; import AssetGrid from '$lib/components/photos-page/asset-grid.svelte'; - import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import AssetSelectControlBar from '$lib/components/photos-page/asset-select-control-bar.svelte'; + import ButtonContextMenu from '$lib/components/shared-components/context-menu/button-context-menu.svelte'; import ControlAppBar from '$lib/components/shared-components/control-app-bar.svelte'; import { AppRoute } from '$lib/constants'; - import { AssetStore } from '$lib/stores/assets-store.svelte'; - import { onDestroy } from 'svelte'; - import type { PageData } from './$types'; - import { mdiPlus, mdiArrowLeft } from '@mdi/js'; - import { t } from 'svelte-i18n'; import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; + import { AssetStore } from '$lib/stores/assets-store.svelte'; + import { AssetVisibility } from '@immich/sdk'; + import { mdiArrowLeft, mdiPlus } from '@mdi/js'; + import { onDestroy } from 'svelte'; + import { t } from 'svelte-i18n'; + import type { PageData } from './$types'; interface Props { data: PageData; @@ -22,7 +23,14 @@ let { data }: Props = $props(); const assetStore = new AssetStore(); - $effect(() => void assetStore.updateOptions({ userId: data.partner.id, isArchived: false, withStacked: true })); + $effect( + () => + void assetStore.updateOptions({ + userId: data.partner.id, + visibility: AssetVisibility.Timeline, + withStacked: true, + }), + ); onDestroy(() => assetStore.destroy()); const assetInteraction = new AssetInteraction(); diff --git a/web/src/routes/(user)/people/[personId]/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/people/[personId]/[[photos=photos]]/[[assetId=id]]/+page.svelte index 4c58f52265..6b260cf9c5 100644 --- a/web/src/routes/(user)/people/[personId]/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/people/[personId]/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -34,12 +34,14 @@ import { AssetInteraction } from '$lib/stores/asset-interaction.svelte'; import { assetViewingStore } from '$lib/stores/asset-viewing.store'; import { AssetStore } from '$lib/stores/assets-store.svelte'; + import { locale } from '$lib/stores/preferences.store'; import { preferences } from '$lib/stores/user.store'; import { websocketEvents } from '$lib/stores/websocket'; import { getPeopleThumbnailUrl, handlePromiseError } from '$lib/utils'; import { handleError } from '$lib/utils/handle-error'; import { isExternalUrl } from '$lib/utils/navigation'; import { + AssetVisibility, getPersonStatistics, mergePerson, searchPerson, @@ -59,11 +61,10 @@ mdiHeartOutline, mdiPlus, } from '@mdi/js'; + import { DateTime } from 'luxon'; import { onDestroy, onMount } from 'svelte'; import { t } from 'svelte-i18n'; import type { PageData } from './$types'; - import { locale } from '$lib/stores/preferences.store'; - import { DateTime } from 'luxon'; interface Props { data: PageData; @@ -75,7 +76,7 @@ let { isViewing: showAssetViewer } = assetViewingStore; const assetStore = new AssetStore(); - $effect(() => void assetStore.updateOptions({ isArchived: false, personId: data.person.id })); + $effect(() => void assetStore.updateOptions({ visibility: AssetVisibility.Timeline, personId: data.person.id })); onDestroy(() => assetStore.destroy()); const assetInteraction = new AssetInteraction(); diff --git a/web/src/routes/(user)/photos/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/photos/[[assetId=id]]/+page.svelte index 34498a60a3..e9827c06f5 100644 --- a/web/src/routes/(user)/photos/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/photos/[[assetId=id]]/+page.svelte @@ -32,14 +32,14 @@ type OnUnlink, } from '$lib/utils/actions'; import { openFileUploadDialog } from '$lib/utils/file-uploader'; - import { AssetTypeEnum } from '@immich/sdk'; + import { AssetTypeEnum, AssetVisibility } from '@immich/sdk'; import { mdiDotsVertical, mdiPlus } from '@mdi/js'; import { onDestroy } from 'svelte'; import { t } from 'svelte-i18n'; let { isViewing: showAssetViewer } = assetViewingStore; const assetStore = new AssetStore(); - void assetStore.updateOptions({ isArchived: false, withStacked: true, withPartners: true }); + void assetStore.updateOptions({ visibility: AssetVisibility.Timeline, withStacked: true, withPartners: true }); onDestroy(() => assetStore.destroy()); const assetInteraction = new AssetInteraction(); diff --git a/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte index 9d427e1ea7..dc03a2ae70 100644 --- a/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -1,25 +1,38 @@ @@ -21,7 +20,7 @@ (isShowKeyboardShortcut = !isShowKeyboardShortcut)} + onclick={() => modalManager.show(ShortcutsModal, {})} /> {/snippet}
@@ -30,7 +29,3 @@
- -{#if isShowKeyboardShortcut} - (isShowKeyboardShortcut = false)} /> -{/if} diff --git a/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte index 6c21260f99..14b1420110 100644 --- a/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/utilities/duplicates/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -7,8 +7,9 @@ NotificationType, notificationController, } from '$lib/components/shared-components/notification/notification'; - import ShowShortcuts from '$lib/components/shared-components/show-shortcuts.svelte'; import DuplicatesCompareControl from '$lib/components/utilities-page/duplicates/duplicates-compare-control.svelte'; + import { modalManager } from '$lib/managers/modal-manager.svelte'; + import ShortcutsModal from '$lib/modals/ShortcutsModal.svelte'; import { locale } from '$lib/stores/preferences.store'; import { featureFlags } from '$lib/stores/server-config.store'; import { stackAssets } from '$lib/utils/asset-utils'; @@ -27,7 +28,6 @@ let { data = $bindable() }: Props = $props(); - let isShowKeyboardShortcut = $state(false); let isShowDuplicateInfo = $state(false); interface Shortcuts { @@ -185,7 +185,7 @@ color="secondary" icon={mdiKeyboard} title={$t('show_keyboard_shortcuts')} - onclick={() => (isShowKeyboardShortcut = !isShowKeyboardShortcut)} + onclick={() => modalManager.show(ShortcutsModal, { shortcuts: duplicateShortcuts })} aria-label={$t('show_keyboard_shortcuts')} /> @@ -222,9 +222,6 @@ -{#if isShowKeyboardShortcut} - (isShowKeyboardShortcut = false)} /> -{/if} {#if isShowDuplicateInfo} (isShowDuplicateInfo = false)} /> {/if} diff --git a/web/src/routes/admin/jobs-status/+page.svelte b/web/src/routes/admin/jobs-status/+page.svelte index af7f3d11af..6636d748cf 100644 --- a/web/src/routes/admin/jobs-status/+page.svelte +++ b/web/src/routes/admin/jobs-status/+page.svelte @@ -1,16 +1,11 @@ {#snippet buttons()} - + diff --git a/web/tailwind.config.js b/web/tailwind.config.js index 95611d486d..2e13e5997d 100644 --- a/web/tailwind.config.js +++ b/web/tailwind.config.js @@ -36,7 +36,7 @@ export default { danger: 'rgb(var(--immich-ui-danger) / )', warning: 'rgb(var(--immich-ui-warning) / )', info: 'rgb(var(--immich-ui-info) / )', - subtle: 'rgb(var(--immich-gray) / )', + subtle: 'rgb(var(--immich-ui-gray) / )', }, borderColor: ({ theme }) => ({ ...theme('colors'), diff --git a/web/vite.config.js b/web/vite.config.js index 0ffc0e0eb1..c6ce7a41ea 100644 --- a/web/vite.config.js +++ b/web/vite.config.js @@ -35,6 +35,7 @@ export default defineConfig({ allowedHosts: true, }, plugins: [ + enhancedImages(), sveltekit(), process.env.BUILD_STATS === 'true' ? visualizer({ @@ -42,7 +43,6 @@ export default defineConfig({ filename: 'stats.html', }) : undefined, - enhancedImages(), svelteTesting(), ], optimizeDeps: {